Skip to content

Commit fba3271

Browse files
committed
Post Luma sync status updates to Discord.
Send a new channel message after each imported Luma event with key event details and review setup status so admins can quickly follow up in Discord.
1 parent fba9bad commit fba3271

3 files changed

Lines changed: 103 additions & 1 deletion

File tree

app/src/lib/discord/review-bot.tsx

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@ type ReviewCardInput = {
2727
isDraft: boolean;
2828
};
2929

30+
type LumaSyncStatusUpdateInput = {
31+
eventId: string;
32+
name: string;
33+
slug: string;
34+
lumaEventId: string | null;
35+
isDraft: boolean;
36+
startDate: Date;
37+
endDate: Date;
38+
reviewMessageId: string | null;
39+
reviewSessionCreated: boolean;
40+
reviewSetupError: string | null;
41+
};
42+
3043
type RecentMessageContext = {
3144
author: string;
3245
text: string;
@@ -273,3 +286,41 @@ export async function postEventReviewCard(
273286
rootMessageId: sentMessage.id,
274287
};
275288
}
289+
290+
export async function postLumaSyncStatusUpdate(
291+
input: LumaSyncStatusUpdateInput,
292+
): Promise<void> {
293+
const { guildId, reviewChannelId } = requireDiscordConfig();
294+
const bot = getDiscordReviewBot();
295+
const channel = bot.channel(toReviewChannelId(guildId, reviewChannelId));
296+
297+
const startIso = new Date(input.startDate).toISOString();
298+
const endIso = new Date(input.endDate).toISOString();
299+
const eventUrl = `${mainConfig.instance.origin}/${input.slug}`;
300+
const reviewCardStatus = input.reviewMessageId
301+
? `posted (message id: ${input.reviewMessageId})`
302+
: "not posted";
303+
const reviewSessionStatus = input.reviewSessionCreated
304+
? "created (pending approval)"
305+
: "not created";
306+
const reviewError = input.reviewSetupError
307+
? `\n- Review setup error: ${input.reviewSetupError}`
308+
: "";
309+
310+
await channel.post(
311+
[
312+
"Luma sync status update",
313+
`- Event: ${input.name}`,
314+
`- Event ID: ${input.eventId}`,
315+
`- Slug: ${input.slug}`,
316+
`- Luma Event ID: ${input.lumaEventId ?? "n/a"}`,
317+
`- Draft: ${input.isDraft ? "true" : "false"}`,
318+
`- Start: ${startIso}`,
319+
`- End: ${endIso}`,
320+
`- Event URL: ${eventUrl}`,
321+
`- Review card: ${reviewCardStatus}`,
322+
`- Review session: ${reviewSessionStatus}${reviewError}`,
323+
"- Follow-up: reply in this channel with any edits or approval actions.",
324+
].join("\n"),
325+
);
326+
}

app/src/workflows/luma-sync/index.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import type { LumaEvent } from "@/lib/luma";
22
import { generateEventDraftWithAI } from "./steps/ai";
3-
import { createDiscordReviewThreadForEvent } from "./steps/discord";
3+
import {
4+
createDiscordReviewThreadForEvent,
5+
postDiscordLumaSyncStatusUpdate,
6+
} from "./steps/discord";
47
import {
58
createDiscordReviewSession,
69
createEventFromDraft,
@@ -201,18 +204,24 @@ export async function syncLumaEventsWorkflow(
201204
const createdEvent = await createEventFromDraft(eventDraft);
202205
if (createdEvent) {
203206
createdEvents.push(createdEvent);
207+
let reviewMessageId: string | null = null;
208+
let reviewSessionCreated = false;
209+
let reviewSetupErrorMessage: string | null = null;
204210

205211
try {
206212
const reviewThread =
207213
await createDiscordReviewThreadForEvent(createdEvent);
214+
reviewMessageId = reviewThread.rootMessageId;
208215
await createDiscordReviewSession({
209216
eventId: createdEvent.id,
210217
channelId: reviewThread.channelId,
211218
rootMessageId: reviewThread.rootMessageId,
212219
threadId: reviewThread.threadId,
213220
lastSeenMessageId: reviewThread.lastSeenMessageId,
214221
});
222+
reviewSessionCreated = true;
215223
} catch (reviewSetupError) {
224+
reviewSetupErrorMessage = toErrorMessage(reviewSetupError);
216225
errors.push({
217226
scope: "review",
218227
reference: createdEvent.id,
@@ -221,6 +230,23 @@ export async function syncLumaEventsWorkflow(
221230
)}`,
222231
});
223232
}
233+
234+
try {
235+
await postDiscordLumaSyncStatusUpdate({
236+
event: createdEvent,
237+
reviewMessageId,
238+
reviewSessionCreated,
239+
reviewSetupError: reviewSetupErrorMessage,
240+
});
241+
} catch (statusUpdateError) {
242+
errors.push({
243+
scope: "review",
244+
reference: createdEvent.id,
245+
error: `Failed to post Discord status update: ${toErrorMessage(
246+
statusUpdateError,
247+
)}`,
248+
});
249+
}
224250
}
225251
} catch (error) {
226252
errors.push({

app/src/workflows/luma-sync/steps/discord.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,28 @@ export async function createDiscordReviewThreadForEvent(
3131
lastSeenMessageId: null,
3232
};
3333
}
34+
35+
export async function postDiscordLumaSyncStatusUpdate(input: {
36+
event: LumaSyncCreatedEvent;
37+
reviewMessageId: string | null;
38+
reviewSessionCreated: boolean;
39+
reviewSetupError: string | null;
40+
}): Promise<void> {
41+
"use step";
42+
const { postLumaSyncStatusUpdate } = await import("@/lib/discord/review-bot");
43+
const { event, reviewMessageId, reviewSessionCreated, reviewSetupError } =
44+
input;
45+
46+
await postLumaSyncStatusUpdate({
47+
eventId: event.id,
48+
name: event.name,
49+
slug: event.slug,
50+
lumaEventId: event.lumaEventId,
51+
isDraft: event.isDraft,
52+
startDate: event.startDate,
53+
endDate: event.endDate,
54+
reviewMessageId,
55+
reviewSessionCreated,
56+
reviewSetupError,
57+
});
58+
}

0 commit comments

Comments
 (0)