Skip to content

Commit e8b82d1

Browse files
committed
refactor(discord): split component auth helpers
1 parent 334f462 commit e8b82d1

12 files changed

Lines changed: 646 additions & 690 deletions
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
// Keep bundled registration fast: runtime wiring only needs the store setter,
2-
// while runtime-api.js remains the broad compatibility barrel.
2+
// while runtime-api.js remains the broad runtime surface.
33
export { setDiscordRuntime } from "./src/runtime.js";

extensions/discord/src/actions/runtime.guild.ts

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
resolveEventCoverImage,
3333
} from "../send.js";
3434
import {
35+
createDiscordActionOptions,
3536
readDiscordChannelCreateParams,
3637
readDiscordChannelEditParams,
3738
readDiscordChannelMoveParams,
@@ -70,7 +71,7 @@ type DiscordRoleMutation = (
7071
) => Promise<unknown>;
7172

7273
async function runRoleMutation(params: {
73-
cfgOptions: { cfg: OpenClawConfig };
74+
cfg: OpenClawConfig;
7475
accountId?: string;
7576
values: Record<string, unknown>;
7677
mutate: DiscordRoleMutation;
@@ -80,10 +81,7 @@ async function runRoleMutation(params: {
8081
const roleId = readStringParam(params.values, "roleId", { required: true });
8182
await params.mutate(
8283
{ guildId, userId, roleId },
83-
{
84-
...params.cfgOptions,
85-
...(params.accountId ? { accountId: params.accountId } : {}),
86-
},
84+
createDiscordActionOptions({ cfg: params.cfg, accountId: params.accountId }),
8785
);
8886
}
8987

@@ -105,12 +103,8 @@ export async function handleDiscordGuildAction(
105103
if (!cfg) {
106104
throw new Error("Discord guild actions require a resolved runtime config.");
107105
}
108-
const cfgOptions = { cfg };
109-
const withOpts = (extra?: Record<string, unknown>) => ({
110-
...cfgOptions,
111-
...(accountId ? { accountId } : {}),
112-
...extra,
113-
});
106+
const withOpts = (extra?: Record<string, unknown>) =>
107+
createDiscordActionOptions({ cfg, accountId, extra });
114108
switch (action) {
115109
case "memberInfo": {
116110
if (!isActionEnabled("memberInfo")) {
@@ -123,12 +117,11 @@ export async function handleDiscordGuildAction(
123117
required: true,
124118
});
125119
const effectiveAccountId = accountId ?? resolveDefaultDiscordAccountId(cfg);
126-
const member = effectiveAccountId
127-
? await discordGuildActionRuntime.fetchMemberInfoDiscord(guildId, userId, {
128-
...cfgOptions,
129-
accountId: effectiveAccountId,
130-
})
131-
: await discordGuildActionRuntime.fetchMemberInfoDiscord(guildId, userId, cfgOptions);
120+
const member = await discordGuildActionRuntime.fetchMemberInfoDiscord(
121+
guildId,
122+
userId,
123+
createDiscordActionOptions({ cfg, accountId: effectiveAccountId }),
124+
);
132125
const presence = getPresence(effectiveAccountId, userId);
133126
const activities = presence?.activities ?? undefined;
134127
const status = presence?.status ?? undefined;
@@ -209,7 +202,7 @@ export async function handleDiscordGuildAction(
209202
throw new Error("Discord role changes are disabled.");
210203
}
211204
await runRoleMutation({
212-
cfgOptions,
205+
cfg,
213206
accountId,
214207
values: params,
215208
mutate: discordGuildActionRuntime.addRoleDiscord,
@@ -221,7 +214,7 @@ export async function handleDiscordGuildAction(
221214
throw new Error("Discord role changes are disabled.");
222215
}
223216
await runRoleMutation({
224-
cfgOptions,
217+
cfg,
225218
accountId,
226219
values: params,
227220
mutate: discordGuildActionRuntime.removeRoleDiscord,

extensions/discord/src/actions/runtime.messaging.ts

Lines changed: 58 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import {
4444
type DiscordSendEmbeds,
4545
} from "../send.shared.js";
4646
import { resolveDiscordChannelId } from "../targets.js";
47+
import { createDiscordActionOptions } from "./runtime.shared.js";
4748

4849
export const discordMessagingActionRuntime = {
4950
createThreadDiscord,
@@ -135,6 +136,8 @@ export async function handleDiscordMessagingAction(
135136
throw new Error("Discord messaging actions require a resolved runtime config.");
136137
}
137138
const cfgOptions = { cfg };
139+
const withOpts = (extra?: Record<string, unknown>) =>
140+
createDiscordActionOptions({ cfg, accountId, extra });
138141
const resolvedReactionAccountId = accountId ?? resolveDefaultDiscordAccountId(cfg);
139142
const resolveReactionChannelId = async () => {
140143
const target =
@@ -227,11 +230,7 @@ export async function handleDiscordMessagingAction(
227230
required: true,
228231
label: "stickerIds",
229232
});
230-
await discordMessagingActionRuntime.sendStickerDiscord(to, stickerIds, {
231-
...cfgOptions,
232-
...(accountId ? { accountId } : {}),
233-
content,
234-
});
233+
await discordMessagingActionRuntime.sendStickerDiscord(to, stickerIds, withOpts({ content }));
235234
return jsonResult({ ok: true });
236235
}
237236
case "poll": {
@@ -253,7 +252,7 @@ export async function handleDiscordMessagingAction(
253252
await discordMessagingActionRuntime.sendPollDiscord(
254253
to,
255254
{ question, options: answers, maxSelections, durationHours },
256-
{ ...cfgOptions, ...(accountId ? { accountId } : {}), content },
255+
withOpts({ content }),
257256
);
258257
return jsonResult({ ok: true });
259258
}
@@ -262,12 +261,10 @@ export async function handleDiscordMessagingAction(
262261
throw new Error("Discord permissions are disabled.");
263262
}
264263
const channelId = resolveChannelId();
265-
const permissions = accountId
266-
? await discordMessagingActionRuntime.fetchChannelPermissionsDiscord(channelId, {
267-
...cfgOptions,
268-
accountId,
269-
})
270-
: await discordMessagingActionRuntime.fetchChannelPermissionsDiscord(channelId, cfgOptions);
264+
const permissions = await discordMessagingActionRuntime.fetchChannelPermissionsDiscord(
265+
channelId,
266+
withOpts(),
267+
);
271268
return jsonResult({ ok: true, permissions });
272269
}
273270
case "fetchMessage": {
@@ -289,12 +286,11 @@ export async function handleDiscordMessagingAction(
289286
"Discord message fetch requires guildId, channelId, and messageId (or a valid messageLink).",
290287
);
291288
}
292-
const message = accountId
293-
? await discordMessagingActionRuntime.fetchMessageDiscord(channelId, messageId, {
294-
...cfgOptions,
295-
accountId,
296-
})
297-
: await discordMessagingActionRuntime.fetchMessageDiscord(channelId, messageId, cfgOptions);
289+
const message = await discordMessagingActionRuntime.fetchMessageDiscord(
290+
channelId,
291+
messageId,
292+
withOpts(),
293+
);
298294
return jsonResult({
299295
ok: true,
300296
message: normalizeMessage(message),
@@ -314,12 +310,11 @@ export async function handleDiscordMessagingAction(
314310
after: readStringParam(params, "after"),
315311
around: readStringParam(params, "around"),
316312
};
317-
const messages = accountId
318-
? await discordMessagingActionRuntime.readMessagesDiscord(channelId, query, {
319-
...cfgOptions,
320-
accountId,
321-
})
322-
: await discordMessagingActionRuntime.readMessagesDiscord(channelId, query, cfgOptions);
313+
const messages = await discordMessagingActionRuntime.readMessagesDiscord(
314+
channelId,
315+
query,
316+
withOpts(),
317+
);
323318
return jsonResult({
324319
ok: true,
325320
messages: messages.map((message) => normalizeMessage(message)),
@@ -372,8 +367,7 @@ export async function handleDiscordMessagingAction(
372367
to,
373368
payload,
374369
{
375-
...cfgOptions,
376-
...(accountId ? { accountId } : {}),
370+
...withOpts(),
377371
silent,
378372
replyTo: replyTo ?? undefined,
379373
sessionKey: sessionKey ?? undefined,
@@ -399,17 +393,15 @@ export async function handleDiscordMessagingAction(
399393
}
400394
assertMediaNotDataUrl(mediaUrl);
401395
const result = await discordMessagingActionRuntime.sendVoiceMessageDiscord(to, mediaUrl, {
402-
...cfgOptions,
403-
...(accountId ? { accountId } : {}),
396+
...withOpts(),
404397
replyTo,
405398
silent,
406399
});
407400
return jsonResult({ ok: true, result, voiceMessage: true });
408401
}
409402

410403
const result = await discordMessagingActionRuntime.sendMessageDiscord(to, content ?? "", {
411-
...cfgOptions,
412-
...(accountId ? { accountId } : {}),
404+
...withOpts(),
413405
mediaUrl,
414406
filename: filename ?? undefined,
415407
mediaLocalRoots: options?.mediaLocalRoots,
@@ -432,19 +424,12 @@ export async function handleDiscordMessagingAction(
432424
const content = readStringParam(params, "content", {
433425
required: true,
434426
});
435-
const message = accountId
436-
? await discordMessagingActionRuntime.editMessageDiscord(
437-
channelId,
438-
messageId,
439-
{ content },
440-
{ ...cfgOptions, accountId },
441-
)
442-
: await discordMessagingActionRuntime.editMessageDiscord(
443-
channelId,
444-
messageId,
445-
{ content },
446-
cfgOptions,
447-
);
427+
const message = await discordMessagingActionRuntime.editMessageDiscord(
428+
channelId,
429+
messageId,
430+
{ content },
431+
withOpts(),
432+
);
448433
return jsonResult({ ok: true, message });
449434
}
450435
case "deleteMessage": {
@@ -455,14 +440,7 @@ export async function handleDiscordMessagingAction(
455440
const messageId = readStringParam(params, "messageId", {
456441
required: true,
457442
});
458-
if (accountId) {
459-
await discordMessagingActionRuntime.deleteMessageDiscord(channelId, messageId, {
460-
...cfgOptions,
461-
accountId,
462-
});
463-
} else {
464-
await discordMessagingActionRuntime.deleteMessageDiscord(channelId, messageId, cfgOptions);
465-
}
443+
await discordMessagingActionRuntime.deleteMessageDiscord(channelId, messageId, withOpts());
466444
return jsonResult({ ok: true });
467445
}
468446
case "threadCreate": {
@@ -482,12 +460,11 @@ export async function handleDiscordMessagingAction(
482460
content,
483461
appliedTags: appliedTags ?? undefined,
484462
};
485-
const thread = accountId
486-
? await discordMessagingActionRuntime.createThreadDiscord(channelId, payload, {
487-
...cfgOptions,
488-
accountId,
489-
})
490-
: await discordMessagingActionRuntime.createThreadDiscord(channelId, payload, cfgOptions);
463+
const thread = await discordMessagingActionRuntime.createThreadDiscord(
464+
channelId,
465+
payload,
466+
withOpts(),
467+
);
491468
return jsonResult({ ok: true, thread });
492469
}
493470
case "threadList": {
@@ -501,27 +478,16 @@ export async function handleDiscordMessagingAction(
501478
const includeArchived = readBooleanParam(params, "includeArchived");
502479
const before = readStringParam(params, "before");
503480
const limit = readNumberParam(params, "limit");
504-
const threads = accountId
505-
? await discordMessagingActionRuntime.listThreadsDiscord(
506-
{
507-
guildId,
508-
channelId,
509-
includeArchived,
510-
before,
511-
limit,
512-
},
513-
{ ...cfgOptions, accountId },
514-
)
515-
: await discordMessagingActionRuntime.listThreadsDiscord(
516-
{
517-
guildId,
518-
channelId,
519-
includeArchived,
520-
before,
521-
limit,
522-
},
523-
cfgOptions,
524-
);
481+
const threads = await discordMessagingActionRuntime.listThreadsDiscord(
482+
{
483+
guildId,
484+
channelId,
485+
includeArchived,
486+
before,
487+
limit,
488+
},
489+
withOpts(),
490+
);
525491
return jsonResult({ ok: true, threads });
526492
}
527493
case "threadReply": {
@@ -538,8 +504,7 @@ export async function handleDiscordMessagingAction(
538504
`channel:${channelId}`,
539505
content,
540506
{
541-
...cfgOptions,
542-
...(accountId ? { accountId } : {}),
507+
...withOpts(),
543508
mediaUrl,
544509
mediaLocalRoots: options?.mediaLocalRoots,
545510
mediaReadFile: options?.mediaReadFile,
@@ -556,14 +521,7 @@ export async function handleDiscordMessagingAction(
556521
const messageId = readStringParam(params, "messageId", {
557522
required: true,
558523
});
559-
if (accountId) {
560-
await discordMessagingActionRuntime.pinMessageDiscord(channelId, messageId, {
561-
...cfgOptions,
562-
accountId,
563-
});
564-
} else {
565-
await discordMessagingActionRuntime.pinMessageDiscord(channelId, messageId, cfgOptions);
566-
}
524+
await discordMessagingActionRuntime.pinMessageDiscord(channelId, messageId, withOpts());
567525
return jsonResult({ ok: true });
568526
}
569527
case "unpinMessage": {
@@ -574,27 +532,15 @@ export async function handleDiscordMessagingAction(
574532
const messageId = readStringParam(params, "messageId", {
575533
required: true,
576534
});
577-
if (accountId) {
578-
await discordMessagingActionRuntime.unpinMessageDiscord(channelId, messageId, {
579-
...cfgOptions,
580-
accountId,
581-
});
582-
} else {
583-
await discordMessagingActionRuntime.unpinMessageDiscord(channelId, messageId, cfgOptions);
584-
}
535+
await discordMessagingActionRuntime.unpinMessageDiscord(channelId, messageId, withOpts());
585536
return jsonResult({ ok: true });
586537
}
587538
case "listPins": {
588539
if (!isActionEnabled("pins")) {
589540
throw new Error("Discord pins are disabled.");
590541
}
591542
const channelId = resolveChannelId();
592-
const pins = accountId
593-
? await discordMessagingActionRuntime.listPinsDiscord(channelId, {
594-
...cfgOptions,
595-
accountId,
596-
})
597-
: await discordMessagingActionRuntime.listPinsDiscord(channelId, cfgOptions);
543+
const pins = await discordMessagingActionRuntime.listPinsDiscord(channelId, withOpts());
598544
return jsonResult({ ok: true, pins: pins.map((pin) => normalizeMessage(pin)) });
599545
}
600546
case "searchMessages": {
@@ -614,27 +560,16 @@ export async function handleDiscordMessagingAction(
614560
const limit = readNumberParam(params, "limit");
615561
const channelIdList = [...(channelIds ?? []), ...(channelId ? [channelId] : [])];
616562
const authorIdList = [...(authorIds ?? []), ...(authorId ? [authorId] : [])];
617-
const results = accountId
618-
? await discordMessagingActionRuntime.searchMessagesDiscord(
619-
{
620-
guildId,
621-
content,
622-
channelIds: channelIdList.length ? channelIdList : undefined,
623-
authorIds: authorIdList.length ? authorIdList : undefined,
624-
limit,
625-
},
626-
{ ...cfgOptions, accountId },
627-
)
628-
: await discordMessagingActionRuntime.searchMessagesDiscord(
629-
{
630-
guildId,
631-
content,
632-
channelIds: channelIdList.length ? channelIdList : undefined,
633-
authorIds: authorIdList.length ? authorIdList : undefined,
634-
limit,
635-
},
636-
cfgOptions,
637-
);
563+
const results = await discordMessagingActionRuntime.searchMessagesDiscord(
564+
{
565+
guildId,
566+
content,
567+
channelIds: channelIdList.length ? channelIdList : undefined,
568+
authorIds: authorIdList.length ? authorIdList : undefined,
569+
limit,
570+
},
571+
withOpts(),
572+
);
638573
if (!results || typeof results !== "object") {
639574
return jsonResult({ ok: true, results });
640575
}

0 commit comments

Comments
 (0)