


























@@ -0,0 +1,205 @@
1+import {
2+jsonResult,
3+readNumberParam,
4+readStringArrayParam,
5+readStringParam,
6+} from "../runtime-api.js";
7+import { discordMessagingActionRuntime } from "./runtime.messaging.runtime.js";
8+import type { DiscordMessagingActionContext } from "./runtime.messaging.shared.js";
9+10+function parseDiscordMessageLink(link: string) {
11+const normalized = link.trim();
12+const match = normalized.match(
13+/^(?:https?:\/\/)?(?:ptb\.|canary\.)?discord(?:app)?\.com\/channels\/(\d+)\/(\d+)\/(\d+)(?:\/?|\?.*)$/i,
14+);
15+if (!match) {
16+throw new Error(
17+"Invalid Discord message link. Expected https://discord.com/channels/<guildId>/<channelId>/<messageId>.",
18+);
19+}
20+return {
21+guildId: match[1],
22+channelId: match[2],
23+messageId: match[3],
24+};
25+}
26+27+export async function handleDiscordMessageManagementAction(ctx: DiscordMessagingActionContext) {
28+switch (ctx.action) {
29+case "permissions": {
30+if (!ctx.isActionEnabled("permissions")) {
31+throw new Error("Discord permissions are disabled.");
32+}
33+const channelId = ctx.resolveChannelId();
34+const permissions = await discordMessagingActionRuntime.fetchChannelPermissionsDiscord(
35+channelId,
36+ctx.withOpts(),
37+);
38+return jsonResult({ ok: true, permissions });
39+}
40+case "fetchMessage": {
41+if (!ctx.isActionEnabled("messages")) {
42+throw new Error("Discord message reads are disabled.");
43+}
44+const messageLink = readStringParam(ctx.params, "messageLink");
45+let guildId = readStringParam(ctx.params, "guildId");
46+let channelId = readStringParam(ctx.params, "channelId");
47+let messageId = readStringParam(ctx.params, "messageId");
48+if (messageLink) {
49+const parsed = parseDiscordMessageLink(messageLink);
50+guildId = parsed.guildId;
51+channelId = parsed.channelId;
52+messageId = parsed.messageId;
53+}
54+if (!guildId || !channelId || !messageId) {
55+throw new Error(
56+"Discord message fetch requires guildId, channelId, and messageId (or a valid messageLink).",
57+);
58+}
59+const message = await discordMessagingActionRuntime.fetchMessageDiscord(
60+channelId,
61+messageId,
62+ctx.withOpts(),
63+);
64+return jsonResult({
65+ok: true,
66+message: ctx.normalizeMessage(message),
67+ guildId,
68+ channelId,
69+ messageId,
70+});
71+}
72+case "readMessages": {
73+if (!ctx.isActionEnabled("messages")) {
74+throw new Error("Discord message reads are disabled.");
75+}
76+const channelId = ctx.resolveChannelId();
77+const query = {
78+limit: readNumberParam(ctx.params, "limit"),
79+before: readStringParam(ctx.params, "before"),
80+after: readStringParam(ctx.params, "after"),
81+around: readStringParam(ctx.params, "around"),
82+};
83+const messages = await discordMessagingActionRuntime.readMessagesDiscord(
84+channelId,
85+query,
86+ctx.withOpts(),
87+);
88+return jsonResult({
89+ok: true,
90+messages: messages.map((message) => ctx.normalizeMessage(message)),
91+});
92+}
93+case "editMessage": {
94+if (!ctx.isActionEnabled("messages")) {
95+throw new Error("Discord message edits are disabled.");
96+}
97+const channelId = ctx.resolveChannelId();
98+const messageId = readStringParam(ctx.params, "messageId", {
99+required: true,
100+});
101+const content = readStringParam(ctx.params, "content", {
102+required: true,
103+});
104+const message = await discordMessagingActionRuntime.editMessageDiscord(
105+channelId,
106+messageId,
107+{ content },
108+ctx.withOpts(),
109+);
110+return jsonResult({ ok: true, message });
111+}
112+case "deleteMessage": {
113+if (!ctx.isActionEnabled("messages")) {
114+throw new Error("Discord message deletes are disabled.");
115+}
116+const channelId = ctx.resolveChannelId();
117+const messageId = readStringParam(ctx.params, "messageId", {
118+required: true,
119+});
120+await discordMessagingActionRuntime.deleteMessageDiscord(
121+channelId,
122+messageId,
123+ctx.withOpts(),
124+);
125+return jsonResult({ ok: true });
126+}
127+case "pinMessage": {
128+if (!ctx.isActionEnabled("pins")) {
129+throw new Error("Discord pins are disabled.");
130+}
131+const channelId = ctx.resolveChannelId();
132+const messageId = readStringParam(ctx.params, "messageId", {
133+required: true,
134+});
135+await discordMessagingActionRuntime.pinMessageDiscord(channelId, messageId, ctx.withOpts());
136+return jsonResult({ ok: true });
137+}
138+case "unpinMessage": {
139+if (!ctx.isActionEnabled("pins")) {
140+throw new Error("Discord pins are disabled.");
141+}
142+const channelId = ctx.resolveChannelId();
143+const messageId = readStringParam(ctx.params, "messageId", {
144+required: true,
145+});
146+await discordMessagingActionRuntime.unpinMessageDiscord(channelId, messageId, ctx.withOpts());
147+return jsonResult({ ok: true });
148+}
149+case "listPins": {
150+if (!ctx.isActionEnabled("pins")) {
151+throw new Error("Discord pins are disabled.");
152+}
153+const channelId = ctx.resolveChannelId();
154+const pins = await discordMessagingActionRuntime.listPinsDiscord(channelId, ctx.withOpts());
155+return jsonResult({ ok: true, pins: pins.map((pin) => ctx.normalizeMessage(pin)) });
156+}
157+case "searchMessages": {
158+if (!ctx.isActionEnabled("search")) {
159+throw new Error("Discord search is disabled.");
160+}
161+const guildId = readStringParam(ctx.params, "guildId", {
162+required: true,
163+});
164+const content = readStringParam(ctx.params, "content", {
165+required: true,
166+});
167+const channelId = readStringParam(ctx.params, "channelId");
168+const channelIds = readStringArrayParam(ctx.params, "channelIds");
169+const authorId = readStringParam(ctx.params, "authorId");
170+const authorIds = readStringArrayParam(ctx.params, "authorIds");
171+const limit = readNumberParam(ctx.params, "limit");
172+const channelIdList = [...(channelIds ?? []), ...(channelId ? [channelId] : [])];
173+const authorIdList = [...(authorIds ?? []), ...(authorId ? [authorId] : [])];
174+const results = await discordMessagingActionRuntime.searchMessagesDiscord(
175+{
176+ guildId,
177+ content,
178+channelIds: channelIdList.length ? channelIdList : undefined,
179+authorIds: authorIdList.length ? authorIdList : undefined,
180+ limit,
181+},
182+ctx.withOpts(),
183+);
184+if (!results || typeof results !== "object") {
185+return jsonResult({ ok: true, results });
186+}
187+const resultsRecord = results as Record<string, unknown>;
188+const messages = resultsRecord.messages;
189+const normalizedMessages = Array.isArray(messages)
190+ ? messages.map((group) =>
191+Array.isArray(group) ? group.map((msg) => ctx.normalizeMessage(msg)) : group,
192+)
193+ : messages;
194+return jsonResult({
195+ok: true,
196+results: {
197+ ...resultsRecord,
198+messages: normalizedMessages,
199+},
200+});
201+}
202+default:
203+return undefined;
204+}
205+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。