























@@ -36,6 +36,20 @@ import {
3636uploadEmojiDiscord,
3737uploadStickerDiscord,
3838resolveEventCoverImage,
39+fetchGuildSettingsDiscord,
40+editGuildSettingsDiscord,
41+listGuildRolesDiscord,
42+createGuildRoleDiscord,
43+editGuildRoleDiscord,
44+deleteGuildRoleDiscord,
45+listAutoModerationRulesDiscord,
46+createAutoModerationRuleDiscord,
47+editAutoModerationRuleDiscord,
48+deleteAutoModerationRuleDiscord,
49+listChannelWebhooksDiscord,
50+createChannelWebhookDiscord,
51+editWebhookDiscord,
52+deleteWebhookDiscord,
3953} from "../send.js";
4054import {
4155createDiscordActionOptions,
@@ -68,6 +82,20 @@ export const discordGuildActionRuntime = {
6882 setChannelPermissionDiscord,
6983 uploadEmojiDiscord,
7084 uploadStickerDiscord,
85+ fetchGuildSettingsDiscord,
86+ editGuildSettingsDiscord,
87+ listGuildRolesDiscord,
88+ createGuildRoleDiscord,
89+ editGuildRoleDiscord,
90+ deleteGuildRoleDiscord,
91+ listAutoModerationRulesDiscord,
92+ createAutoModerationRuleDiscord,
93+ editAutoModerationRuleDiscord,
94+ deleteAutoModerationRuleDiscord,
95+ listChannelWebhooksDiscord,
96+ createChannelWebhookDiscord,
97+ editWebhookDiscord,
98+ deleteWebhookDiscord,
7199};
7210073101type DiscordRoleMutationOpts = { cfg: OpenClawConfig; accountId?: string };
@@ -134,6 +162,84 @@ const guildAdminActionGuards: Partial<Record<string, GuildAdminActionGuard>> = {
134162disabledMessage: "Discord role changes are disabled.",
135163permissions: [PermissionFlagsBits.ManageRoles],
136164},
165+roleCreate: {
166+gate: "roleManagement",
167+defaultEnabled: false,
168+disabledMessage: "Discord role management is disabled.",
169+permissions: [PermissionFlagsBits.ManageRoles],
170+},
171+roleEdit: {
172+gate: "roleManagement",
173+defaultEnabled: false,
174+disabledMessage: "Discord role management is disabled.",
175+permissions: [PermissionFlagsBits.ManageRoles],
176+},
177+roleDelete: {
178+gate: "roleManagement",
179+defaultEnabled: false,
180+disabledMessage: "Discord role management is disabled.",
181+permissions: [PermissionFlagsBits.ManageRoles],
182+},
183+serverInfo: {
184+gate: "server",
185+defaultEnabled: false,
186+disabledMessage: "Discord server inspection is disabled.",
187+permissions: [PermissionFlagsBits.ManageGuild],
188+},
189+serverEdit: {
190+gate: "server",
191+defaultEnabled: false,
192+disabledMessage: "Discord server management is disabled.",
193+permissions: [PermissionFlagsBits.ManageGuild],
194+},
195+automodList: {
196+gate: "automod",
197+defaultEnabled: false,
198+disabledMessage: "Discord AutoMod management is disabled.",
199+permissions: [PermissionFlagsBits.ManageGuild],
200+},
201+automodCreate: {
202+gate: "automod",
203+defaultEnabled: false,
204+disabledMessage: "Discord AutoMod management is disabled.",
205+permissions: [PermissionFlagsBits.ManageGuild],
206+},
207+automodEdit: {
208+gate: "automod",
209+defaultEnabled: false,
210+disabledMessage: "Discord AutoMod management is disabled.",
211+permissions: [PermissionFlagsBits.ManageGuild],
212+},
213+automodDelete: {
214+gate: "automod",
215+defaultEnabled: false,
216+disabledMessage: "Discord AutoMod management is disabled.",
217+permissions: [PermissionFlagsBits.ManageGuild],
218+},
219+webhookList: {
220+gate: "webhooks",
221+defaultEnabled: false,
222+disabledMessage: "Discord webhook management is disabled.",
223+permissions: [PermissionFlagsBits.ManageWebhooks],
224+},
225+webhookCreate: {
226+gate: "webhooks",
227+defaultEnabled: false,
228+disabledMessage: "Discord webhook management is disabled.",
229+permissions: [PermissionFlagsBits.ManageWebhooks],
230+},
231+webhookEdit: {
232+gate: "webhooks",
233+defaultEnabled: false,
234+disabledMessage: "Discord webhook management is disabled.",
235+permissions: [PermissionFlagsBits.ManageWebhooks],
236+},
237+webhookDelete: {
238+gate: "webhooks",
239+defaultEnabled: false,
240+disabledMessage: "Discord webhook management is disabled.",
241+permissions: [PermissionFlagsBits.ManageWebhooks],
242+},
137243eventCreate: {
138244gate: "events",
139245disabledMessage: "Discord events are disabled.",
@@ -351,6 +457,18 @@ function readChannelPermissionTarget(params: Record<string, unknown>) {
351457};
352458}
353459460+function readManagementPayload(params: Record<string, unknown>, excluded: readonly string[]) {
461+const excludedSet = new Set(["action", "accountId", "senderUserId", ...excluded]);
462+return Object.fromEntries(
463+Object.entries(params)
464+.filter(([key]) => !excludedSet.has(key))
465+.map(([key, value]) => [
466+key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`),
467+value,
468+]),
469+);
470+}
471+354472export async function handleDiscordGuildAction(
355473action: string,
356474params: Record<string, unknown>,
@@ -482,6 +600,128 @@ export async function handleDiscordGuildAction(
482600});
483601return jsonResult({ ok: true });
484602}
603+case "roleCreate": {
604+const guildId = readStringParam(params, "guildId", { required: true });
605+const role = await discordGuildActionRuntime.createGuildRoleDiscord(
606+guildId,
607+readManagementPayload(params, ["guildId"]),
608+withOpts(),
609+);
610+return jsonResult({ ok: true, role });
611+}
612+case "roleEdit": {
613+const guildId = readStringParam(params, "guildId", { required: true });
614+const roleId = readStringParam(params, "roleId", { required: true });
615+const role = await discordGuildActionRuntime.editGuildRoleDiscord(
616+guildId,
617+roleId,
618+readManagementPayload(params, ["guildId", "roleId"]),
619+withOpts(),
620+);
621+return jsonResult({ ok: true, role });
622+}
623+case "roleDelete": {
624+const guildId = readStringParam(params, "guildId", { required: true });
625+const roleId = readStringParam(params, "roleId", { required: true });
626+return jsonResult(
627+await discordGuildActionRuntime.deleteGuildRoleDiscord(guildId, roleId, withOpts()),
628+);
629+}
630+case "serverInfo": {
631+const guildId = readStringParam(params, "guildId", { required: true });
632+return jsonResult({
633+ok: true,
634+guild: await discordGuildActionRuntime.fetchGuildSettingsDiscord(guildId, withOpts()),
635+});
636+}
637+case "serverEdit": {
638+const guildId = readStringParam(params, "guildId", { required: true });
639+return jsonResult({
640+ok: true,
641+guild: await discordGuildActionRuntime.editGuildSettingsDiscord(
642+guildId,
643+readManagementPayload(params, ["guildId"]),
644+withOpts(),
645+),
646+});
647+}
648+case "automodList": {
649+const guildId = readStringParam(params, "guildId", { required: true });
650+return jsonResult({
651+ok: true,
652+rules: await discordGuildActionRuntime.listAutoModerationRulesDiscord(guildId, withOpts()),
653+});
654+}
655+case "automodCreate": {
656+const guildId = readStringParam(params, "guildId", { required: true });
657+return jsonResult({
658+ok: true,
659+rule: await discordGuildActionRuntime.createAutoModerationRuleDiscord(
660+guildId,
661+readManagementPayload(params, ["guildId"]),
662+withOpts(),
663+),
664+});
665+}
666+case "automodEdit": {
667+const guildId = readStringParam(params, "guildId", { required: true });
668+const ruleId = readStringParam(params, "ruleId", { required: true });
669+return jsonResult({
670+ok: true,
671+rule: await discordGuildActionRuntime.editAutoModerationRuleDiscord(
672+guildId,
673+ruleId,
674+readManagementPayload(params, ["guildId", "ruleId"]),
675+withOpts(),
676+),
677+});
678+}
679+case "automodDelete": {
680+const guildId = readStringParam(params, "guildId", { required: true });
681+const ruleId = readStringParam(params, "ruleId", { required: true });
682+return jsonResult(
683+await discordGuildActionRuntime.deleteAutoModerationRuleDiscord(
684+guildId,
685+ruleId,
686+withOpts(),
687+),
688+);
689+}
690+case "webhookList": {
691+const channelId = readStringParam(params, "channelId", { required: true });
692+return jsonResult({
693+ok: true,
694+webhooks: await discordGuildActionRuntime.listChannelWebhooksDiscord(channelId, withOpts()),
695+});
696+}
697+case "webhookCreate": {
698+const channelId = readStringParam(params, "channelId", { required: true });
699+return jsonResult({
700+ok: true,
701+webhook: await discordGuildActionRuntime.createChannelWebhookDiscord(
702+channelId,
703+readManagementPayload(params, ["channelId"]),
704+withOpts(),
705+),
706+});
707+}
708+case "webhookEdit": {
709+const webhookId = readStringParam(params, "webhookId", { required: true });
710+return jsonResult({
711+ok: true,
712+webhook: await discordGuildActionRuntime.editWebhookDiscord(
713+webhookId,
714+readManagementPayload(params, ["webhookId"]),
715+withOpts(),
716+),
717+});
718+}
719+case "webhookDelete": {
720+const webhookId = readStringParam(params, "webhookId", { required: true });
721+return jsonResult(
722+await discordGuildActionRuntime.deleteWebhookDiscord(webhookId, withOpts()),
723+);
724+}
485725case "channelInfo": {
486726if (!isActionEnabled("channelInfo")) {
487727throw new Error("Discord channel info is disabled.");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。