@kodelyth/discord 2026.5.39 → 2026.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account-inspect-Dqw-enky.js +81 -0
- package/dist/account-inspect-api.js +10 -0
- package/dist/accounts-B7OBFePq.js +224 -0
- package/dist/action-runtime-api.js +2 -0
- package/dist/agent-components.runtime-DVY_1VB4.js +4 -0
- package/dist/allow-list-B0s7evD7.js +354 -0
- package/dist/api-CXAcv9nZ.js +130 -0
- package/dist/api.js +23 -0
- package/dist/approval-handler.runtime-B9xUAF3n.js +426 -0
- package/dist/audit-DoiK49WO.js +24 -0
- package/dist/audit-core-BGrq3G7r.js +105 -0
- package/dist/channel-U_aeoFwW.js +795 -0
- package/dist/channel-actions-BxEBnEuv.js +173 -0
- package/dist/channel-actions.runtime-CPtpH-yl.js +263 -0
- package/dist/channel-api-BfjklLby.js +21 -0
- package/dist/channel-config-api.js +2 -0
- package/dist/channel-plugin-api.js +2 -0
- package/dist/channel.setup-BUSC0apv.js +337 -0
- package/dist/components-luonoe13.js +909 -0
- package/dist/config-api-DSYGqaLQ.js +2 -0
- package/dist/config-schema-DIqJBGwC.js +357 -0
- package/dist/configured-state.js +6 -0
- package/dist/contract-api.js +8 -0
- package/dist/conversation-identity-DXAm0_Mk.js +270 -0
- package/dist/directory-config-CYbuMmPS.js +49 -0
- package/dist/directory-contract-api.js +2 -0
- package/dist/directory-live-DX4dLRpJ.js +159 -0
- package/dist/doctor-bbKSvGVD.js +244 -0
- package/dist/doctor-contract-Btjt6NJD.js +383 -0
- package/dist/doctor-contract-api.js +2 -0
- package/dist/gateway-registry-BKSpa4GB.js +74 -0
- package/dist/handle-action.guild-admin-B5BArS2n.js +286 -0
- package/dist/inbound-context-WAOqhGlT.js +48 -0
- package/dist/inbound-event-delivery-C-1Ji3WP.js +65 -0
- package/dist/index.js +26 -0
- package/dist/manager.runtime-DXHynKE4.js +2356 -0
- package/dist/message-handler-mXzc3tA_.js +381 -0
- package/dist/message-handler.preflight-BPD1a347.js +1113 -0
- package/dist/message-handler.process-GUa3aV8z.js +1438 -0
- package/dist/message-utils-dUbem16p.js +549 -0
- package/dist/outbound-adapter-C18OAc1y.js +536 -0
- package/dist/pluralkit-D1Q2x0w5.js +22 -0
- package/dist/preflight-audio-CZtpWcIm.js +72 -0
- package/dist/preflight-audio.runtime-Brx_0_xW.js +7 -0
- package/dist/preview-streaming-D_slNIiO.js +8 -0
- package/dist/probe-D--Ca4JF.js +139 -0
- package/dist/probe.runtime-DQBchZzv.js +2 -0
- package/dist/provider-B2-31CIT.js +9565 -0
- package/dist/provider-session.runtime-BwzzSsrH.js +6 -0
- package/dist/provider.runtime-CP3oHLls.js +2 -0
- package/dist/resolve-allowlist-common-CqxPLcJO.js +34 -0
- package/dist/resolve-channels-0LX4pUbB.js +265 -0
- package/dist/resolve-users-CztOv0Qs.js +120 -0
- package/dist/runtime-DUaw66V_.js +1073 -0
- package/dist/runtime-api.actions.js +3 -0
- package/dist/runtime-api.js +30 -0
- package/dist/runtime-api.lookup.js +7 -0
- package/dist/runtime-api.monitor-CvVKvEXW.js +5 -0
- package/dist/runtime-api.monitor.js +8 -0
- package/dist/runtime-api.send.js +6 -0
- package/dist/runtime-api.threads.js +6 -0
- package/dist/runtime-fC6f4UF2.js +8 -0
- package/dist/runtime-setter-api.js +2 -0
- package/dist/secret-config-contract-B6WW5V88.js +115 -0
- package/dist/secret-contract-api.js +2 -0
- package/dist/security-audit-CnyIQKz6.js +120 -0
- package/dist/security-audit-contract-api.js +2 -0
- package/dist/security-audit.runtime-CQSkjNLu.js +2 -0
- package/dist/security-contract-DLvYOgLM.js +26 -0
- package/dist/security-contract-api.js +2 -0
- package/dist/security-doctor-DepqtNCI.js +18 -0
- package/dist/send-DCtPCHGk.js +881 -0
- package/dist/send.components-Bcgxvm52.js +474 -0
- package/dist/send.outbound-S9t0UuHc.js +330 -0
- package/dist/send.receipt-CDn3GBWC.js +3119 -0
- package/dist/send.shared-D4iBnAmn.js +669 -0
- package/dist/sender-identity-CxCe3_1a.js +43 -0
- package/dist/session-contract-Dwhw3RTY.js +6 -0
- package/dist/session-key-api.js +2 -0
- package/dist/session-key-normalization-CP8dPUid.js +23 -0
- package/dist/setup-entry.js +11 -0
- package/dist/setup-plugin-api.js +2 -0
- package/dist/shared-AIlvuZXt.js +171 -0
- package/dist/subagent-hooks-8bK-mgiU.js +120 -0
- package/dist/subagent-hooks-api.js +22 -0
- package/dist/system-events-Ba1TklaL.js +34 -0
- package/dist/target-resolver-BrtFQtoK.js +82 -0
- package/dist/targets-DWLLZE2l.js +3 -0
- package/dist/test-api.js +45 -0
- package/dist/thread-binding-api.js +4 -0
- package/dist/thread-bindings-9aKRmZv0.js +255 -0
- package/dist/thread-bindings.discord-api-ssGH5wc2.js +244 -0
- package/dist/thread-bindings.manager-0YBHGemk.js +534 -0
- package/dist/thread-bindings.session-updates-DJZGIwaU.js +54 -0
- package/dist/thread-bindings.state-eTFl-PqJ.js +318 -0
- package/dist/timeouts-CEwuGaWT.js +52 -0
- package/dist/timeouts.js +2 -0
- package/dist/typing-BmJKRpCS.js +14 -0
- package/package.json +19 -7
- package/account-inspect-api.js +0 -7
- package/action-runtime-api.js +0 -7
- package/api.js +0 -7
- package/channel-config-api.js +0 -7
- package/channel-plugin-api.js +0 -7
- package/configured-state.js +0 -7
- package/contract-api.js +0 -7
- package/directory-contract-api.js +0 -7
- package/doctor-contract-api.js +0 -7
- package/index.js +0 -7
- package/runtime-api.actions.js +0 -7
- package/runtime-api.js +0 -7
- package/runtime-api.lookup.js +0 -7
- package/runtime-api.monitor.js +0 -7
- package/runtime-api.send.js +0 -7
- package/runtime-api.threads.js +0 -7
- package/runtime-setter-api.js +0 -7
- package/secret-contract-api.js +0 -7
- package/security-audit-contract-api.js +0 -7
- package/security-contract-api.js +0 -7
- package/session-key-api.js +0 -7
- package/setup-entry.js +0 -7
- package/setup-plugin-api.js +0 -7
- package/subagent-hooks-api.js +0 -7
- package/test-api.js +0 -7
- package/thread-binding-api.js +0 -7
- package/timeouts.js +0 -7
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { a as reconcileAcpThreadBindingsOnStartup } from "./thread-bindings-9aKRmZv0.js";
|
|
2
|
+
import { n as createThreadBindingManager, t as createNoopThreadBindingManager } from "./thread-bindings.manager-0YBHGemk.js";
|
|
3
|
+
import { t as createDiscordMessageHandler } from "./message-handler-mXzc3tA_.js";
|
|
4
|
+
import { resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled } from "klaw/plugin-sdk/conversation-runtime";
|
|
5
|
+
import { getAcpSessionManager, isAcpRuntimeError } from "klaw/plugin-sdk/acp-runtime";
|
|
6
|
+
export { createDiscordMessageHandler, createNoopThreadBindingManager, createThreadBindingManager, getAcpSessionManager, isAcpRuntimeError, reconcileAcpThreadBindingsOnStartup, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { p as normalizeDiscordToken } from "./accounts-B7OBFePq.js";
|
|
2
|
+
import { n as fetchDiscord } from "./api-CXAcv9nZ.js";
|
|
3
|
+
import { a as normalizeDiscordSlug } from "./allow-list-B0s7evD7.js";
|
|
4
|
+
//#region extensions/discord/src/guilds.ts
|
|
5
|
+
async function listGuilds(token, fetcher) {
|
|
6
|
+
return (await fetchDiscord("/users/@me/guilds", token, fetcher)).filter((guild) => typeof guild.id === "string" && typeof guild.name === "string").map((guild) => ({
|
|
7
|
+
id: guild.id,
|
|
8
|
+
name: guild.name,
|
|
9
|
+
slug: normalizeDiscordSlug(guild.name)
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region extensions/discord/src/resolve-allowlist-common.ts
|
|
14
|
+
function resolveDiscordAllowlistToken(token) {
|
|
15
|
+
return normalizeDiscordToken(token, "channels.discord.token");
|
|
16
|
+
}
|
|
17
|
+
function buildDiscordUnresolvedResults(entries, buildResult) {
|
|
18
|
+
return entries.map((input) => buildResult(input));
|
|
19
|
+
}
|
|
20
|
+
function findDiscordGuildByName(guilds, input) {
|
|
21
|
+
const slug = normalizeDiscordSlug(input);
|
|
22
|
+
if (!slug) return;
|
|
23
|
+
return guilds.find((guild) => guild.slug === slug);
|
|
24
|
+
}
|
|
25
|
+
function filterDiscordGuilds(guilds, params) {
|
|
26
|
+
if (params.guildId) return guilds.filter((guild) => guild.id === params.guildId);
|
|
27
|
+
if (params.guildName) {
|
|
28
|
+
const match = findDiscordGuildByName(guilds, params.guildName);
|
|
29
|
+
return match ? [match] : [];
|
|
30
|
+
}
|
|
31
|
+
return guilds;
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { listGuilds as i, filterDiscordGuilds as n, resolveDiscordAllowlistToken as r, buildDiscordUnresolvedResults as t };
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { Wt as __exportAll } from "./send.receipt-CDn3GBWC.js";
|
|
2
|
+
import { n as fetchDiscord, t as DiscordApiError } from "./api-CXAcv9nZ.js";
|
|
3
|
+
import { a as normalizeDiscordSlug } from "./allow-list-B0s7evD7.js";
|
|
4
|
+
import { i as listGuilds, n as filterDiscordGuilds, r as resolveDiscordAllowlistToken, t as buildDiscordUnresolvedResults } from "./resolve-allowlist-common-CqxPLcJO.js";
|
|
5
|
+
//#region extensions/discord/src/resolve-channels.ts
|
|
6
|
+
var resolve_channels_exports = /* @__PURE__ */ __exportAll({ resolveDiscordChannelAllowlist: () => resolveDiscordChannelAllowlist });
|
|
7
|
+
function parseDiscordChannelInput(raw) {
|
|
8
|
+
const trimmed = raw.trim();
|
|
9
|
+
if (!trimmed) return {};
|
|
10
|
+
const mention = trimmed.match(/^<#(\d+)>$/);
|
|
11
|
+
if (mention) return { channelId: mention[1] };
|
|
12
|
+
const channelPrefix = trimmed.match(/^(?:channel:|discord:)?(\d+)$/i);
|
|
13
|
+
if (channelPrefix) return { channelId: channelPrefix[1] };
|
|
14
|
+
const guildPrefix = trimmed.match(/^(?:guild:|server:)?(\d+)$/i);
|
|
15
|
+
if (guildPrefix && !trimmed.includes("/") && !trimmed.includes("#")) return {
|
|
16
|
+
guildId: guildPrefix[1],
|
|
17
|
+
guildOnly: true
|
|
18
|
+
};
|
|
19
|
+
const split = trimmed.includes("/") ? trimmed.split("/") : trimmed.split("#");
|
|
20
|
+
if (split.length >= 2) {
|
|
21
|
+
const guild = split[0]?.trim();
|
|
22
|
+
const channel = split.slice(1).join("#").trim();
|
|
23
|
+
if (!channel) return guild ? {
|
|
24
|
+
guild: guild.trim(),
|
|
25
|
+
guildOnly: true
|
|
26
|
+
} : {};
|
|
27
|
+
if (guild && /^\d+$/.test(guild)) {
|
|
28
|
+
if (/^\d+$/.test(channel)) return {
|
|
29
|
+
guildId: guild,
|
|
30
|
+
channelId: channel
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
guildId: guild,
|
|
34
|
+
channel
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
guild,
|
|
39
|
+
channel
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
guild: trimmed,
|
|
44
|
+
guildOnly: true
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async function listGuildChannels(token, fetcher, guildId) {
|
|
48
|
+
return (await fetchDiscord(`/guilds/${guildId}/channels`, token, fetcher)).map((channel) => {
|
|
49
|
+
const archived = channel.thread_metadata?.archived;
|
|
50
|
+
return {
|
|
51
|
+
id: typeof channel.id === "string" ? channel.id : "",
|
|
52
|
+
name: typeof channel.name === "string" ? channel.name : "",
|
|
53
|
+
guildId,
|
|
54
|
+
type: channel.type,
|
|
55
|
+
archived
|
|
56
|
+
};
|
|
57
|
+
}).filter((channel) => Boolean(channel.id) && Boolean(channel.name));
|
|
58
|
+
}
|
|
59
|
+
async function fetchChannel(token, fetcher, channelId) {
|
|
60
|
+
let raw;
|
|
61
|
+
try {
|
|
62
|
+
raw = await fetchDiscord(`/channels/${channelId}`, token, fetcher);
|
|
63
|
+
} catch (err) {
|
|
64
|
+
if (err instanceof DiscordApiError && err.status === 403) return { status: "forbidden" };
|
|
65
|
+
if (err instanceof DiscordApiError && err.status === 404) return { status: "not-found" };
|
|
66
|
+
throw err;
|
|
67
|
+
}
|
|
68
|
+
if (!raw || typeof raw.guild_id !== "string" || typeof raw.id !== "string") return { status: "invalid" };
|
|
69
|
+
return {
|
|
70
|
+
status: "found",
|
|
71
|
+
channel: {
|
|
72
|
+
id: raw.id,
|
|
73
|
+
name: typeof raw.name === "string" ? raw.name : "",
|
|
74
|
+
guildId: raw.guild_id,
|
|
75
|
+
type: raw.type
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function preferActiveMatch(candidates) {
|
|
80
|
+
if (candidates.length === 0) return;
|
|
81
|
+
const scored = candidates.map((channel) => {
|
|
82
|
+
const isThread = channel.type === 11 || channel.type === 12;
|
|
83
|
+
return {
|
|
84
|
+
channel,
|
|
85
|
+
score: (Boolean(channel.archived) ? 0 : 2) + (isThread ? 0 : 1)
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
scored.sort((a, b) => b.score - a.score);
|
|
89
|
+
return scored[0]?.channel ?? candidates[0];
|
|
90
|
+
}
|
|
91
|
+
async function resolveDiscordChannelAllowlist(params) {
|
|
92
|
+
const token = resolveDiscordAllowlistToken(params.token);
|
|
93
|
+
if (!token) return buildDiscordUnresolvedResults(params.entries, (input) => ({
|
|
94
|
+
input,
|
|
95
|
+
resolved: false
|
|
96
|
+
}));
|
|
97
|
+
const fetcher = params.fetcher ?? fetch;
|
|
98
|
+
const guilds = await listGuilds(token, fetcher);
|
|
99
|
+
const channelsByGuild = /* @__PURE__ */ new Map();
|
|
100
|
+
const getChannels = (guildId) => {
|
|
101
|
+
const existing = channelsByGuild.get(guildId);
|
|
102
|
+
if (existing) return existing;
|
|
103
|
+
const promise = listGuildChannels(token, fetcher, guildId);
|
|
104
|
+
channelsByGuild.set(guildId, promise);
|
|
105
|
+
return promise;
|
|
106
|
+
};
|
|
107
|
+
const results = [];
|
|
108
|
+
for (const input of params.entries) {
|
|
109
|
+
const parsed = parseDiscordChannelInput(input);
|
|
110
|
+
if (parsed.guildOnly) {
|
|
111
|
+
const guild = filterDiscordGuilds(guilds, {
|
|
112
|
+
guildId: parsed.guildId,
|
|
113
|
+
guildName: parsed.guild
|
|
114
|
+
})[0];
|
|
115
|
+
if (guild) results.push({
|
|
116
|
+
input,
|
|
117
|
+
resolved: true,
|
|
118
|
+
guildId: guild.id,
|
|
119
|
+
guildName: guild.name
|
|
120
|
+
});
|
|
121
|
+
else results.push({
|
|
122
|
+
input,
|
|
123
|
+
resolved: false,
|
|
124
|
+
guildId: parsed.guildId,
|
|
125
|
+
guildName: parsed.guild
|
|
126
|
+
});
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (parsed.channelId) {
|
|
130
|
+
const channelId = parsed.channelId;
|
|
131
|
+
const result = await fetchChannel(token, fetcher, channelId);
|
|
132
|
+
if (result.status === "found") {
|
|
133
|
+
const channel = result.channel;
|
|
134
|
+
if (parsed.guildId && parsed.guildId !== channel.guildId) {
|
|
135
|
+
const expectedGuild = guilds.find((entry) => entry.id === parsed.guildId);
|
|
136
|
+
const actualGuild = guilds.find((entry) => entry.id === channel.guildId);
|
|
137
|
+
results.push({
|
|
138
|
+
input,
|
|
139
|
+
resolved: false,
|
|
140
|
+
guildId: parsed.guildId,
|
|
141
|
+
guildName: expectedGuild?.name,
|
|
142
|
+
channelId,
|
|
143
|
+
channelName: channel.name,
|
|
144
|
+
note: actualGuild?.name ? `channel belongs to guild ${actualGuild.name}` : "channel belongs to a different guild"
|
|
145
|
+
});
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const guild = guilds.find((entry) => entry.id === channel.guildId);
|
|
149
|
+
results.push({
|
|
150
|
+
input,
|
|
151
|
+
resolved: true,
|
|
152
|
+
guildId: channel.guildId,
|
|
153
|
+
guildName: guild?.name,
|
|
154
|
+
channelId: channel.id,
|
|
155
|
+
channelName: channel.name,
|
|
156
|
+
archived: channel.archived
|
|
157
|
+
});
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (result.status === "not-found" && parsed.guildId) {
|
|
161
|
+
const guild = guilds.find((entry) => entry.id === parsed.guildId);
|
|
162
|
+
if (guild) {
|
|
163
|
+
const match = preferActiveMatch((await getChannels(guild.id)).filter((channel) => normalizeDiscordSlug(channel.name) === normalizeDiscordSlug(channelId)));
|
|
164
|
+
if (match) {
|
|
165
|
+
results.push({
|
|
166
|
+
input,
|
|
167
|
+
resolved: true,
|
|
168
|
+
guildId: guild.id,
|
|
169
|
+
guildName: guild.name,
|
|
170
|
+
channelId: match.id,
|
|
171
|
+
channelName: match.name,
|
|
172
|
+
archived: match.archived
|
|
173
|
+
});
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
results.push({
|
|
179
|
+
input,
|
|
180
|
+
resolved: false,
|
|
181
|
+
guildId: parsed.guildId,
|
|
182
|
+
channelId
|
|
183
|
+
});
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (parsed.guildId || parsed.guild) {
|
|
187
|
+
const guild = filterDiscordGuilds(guilds, {
|
|
188
|
+
guildId: parsed.guildId,
|
|
189
|
+
guildName: parsed.guild
|
|
190
|
+
})[0];
|
|
191
|
+
const channelQuery = parsed.channel?.trim();
|
|
192
|
+
if (!guild || !channelQuery) {
|
|
193
|
+
results.push({
|
|
194
|
+
input,
|
|
195
|
+
resolved: false,
|
|
196
|
+
guildId: parsed.guildId,
|
|
197
|
+
guildName: parsed.guild,
|
|
198
|
+
channelName: channelQuery ?? parsed.channel
|
|
199
|
+
});
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const channels = await getChannels(guild.id);
|
|
203
|
+
const normalizedChannelQuery = normalizeDiscordSlug(channelQuery);
|
|
204
|
+
const isNumericId = /^\d+$/.test(channelQuery);
|
|
205
|
+
let matches = channels.filter((channel) => isNumericId ? channel.id === channelQuery : normalizeDiscordSlug(channel.name) === normalizedChannelQuery);
|
|
206
|
+
if (isNumericId && matches.length === 0) matches = channels.filter((channel) => normalizeDiscordSlug(channel.name) === normalizedChannelQuery);
|
|
207
|
+
const match = preferActiveMatch(matches);
|
|
208
|
+
if (match) results.push({
|
|
209
|
+
input,
|
|
210
|
+
resolved: true,
|
|
211
|
+
guildId: guild.id,
|
|
212
|
+
guildName: guild.name,
|
|
213
|
+
channelId: match.id,
|
|
214
|
+
channelName: match.name,
|
|
215
|
+
archived: match.archived
|
|
216
|
+
});
|
|
217
|
+
else results.push({
|
|
218
|
+
input,
|
|
219
|
+
resolved: false,
|
|
220
|
+
guildId: guild.id,
|
|
221
|
+
guildName: guild.name,
|
|
222
|
+
channelName: parsed.channel,
|
|
223
|
+
note: `channel not found in guild ${guild.name}`
|
|
224
|
+
});
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
const channelName = input.trim().replace(/^#/, "");
|
|
228
|
+
if (!channelName) {
|
|
229
|
+
results.push({
|
|
230
|
+
input,
|
|
231
|
+
resolved: false,
|
|
232
|
+
channelName
|
|
233
|
+
});
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
const candidates = [];
|
|
237
|
+
for (const guild of guilds) {
|
|
238
|
+
const channels = await getChannels(guild.id);
|
|
239
|
+
for (const channel of channels) if (normalizeDiscordSlug(channel.name) === normalizeDiscordSlug(channelName)) candidates.push(channel);
|
|
240
|
+
}
|
|
241
|
+
const match = preferActiveMatch(candidates);
|
|
242
|
+
if (match) {
|
|
243
|
+
const guild = guilds.find((entry) => entry.id === match.guildId);
|
|
244
|
+
results.push({
|
|
245
|
+
input,
|
|
246
|
+
resolved: true,
|
|
247
|
+
guildId: match.guildId,
|
|
248
|
+
guildName: guild?.name,
|
|
249
|
+
channelId: match.id,
|
|
250
|
+
channelName: match.name,
|
|
251
|
+
archived: match.archived,
|
|
252
|
+
note: candidates.length > 1 && guild?.name ? `matched multiple; chose ${guild.name}` : void 0
|
|
253
|
+
});
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
results.push({
|
|
257
|
+
input,
|
|
258
|
+
resolved: false,
|
|
259
|
+
channelName
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
return results;
|
|
263
|
+
}
|
|
264
|
+
//#endregion
|
|
265
|
+
export { resolve_channels_exports as n, resolveDiscordChannelAllowlist as t };
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Wt as __exportAll } from "./send.receipt-CDn3GBWC.js";
|
|
2
|
+
import { n as fetchDiscord } from "./api-CXAcv9nZ.js";
|
|
3
|
+
import { i as listGuilds, n as filterDiscordGuilds, r as resolveDiscordAllowlistToken, t as buildDiscordUnresolvedResults } from "./resolve-allowlist-common-CqxPLcJO.js";
|
|
4
|
+
import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "klaw/plugin-sdk/string-coerce-runtime";
|
|
5
|
+
//#region extensions/discord/src/resolve-users.ts
|
|
6
|
+
var resolve_users_exports = /* @__PURE__ */ __exportAll({ resolveDiscordUserAllowlist: () => resolveDiscordUserAllowlist });
|
|
7
|
+
function parseDiscordUserInput(raw) {
|
|
8
|
+
const trimmed = raw.trim();
|
|
9
|
+
if (!trimmed) return {};
|
|
10
|
+
const mention = trimmed.match(/^<@!?(\d+)>$/);
|
|
11
|
+
if (mention) return { userId: mention[1] };
|
|
12
|
+
const prefixed = trimmed.match(/^(?:user:|discord:)?(\d+)$/i);
|
|
13
|
+
if (prefixed) return { userId: prefixed[1] };
|
|
14
|
+
const split = trimmed.includes("/") ? trimmed.split("/") : trimmed.split("#");
|
|
15
|
+
if (split.length >= 2) {
|
|
16
|
+
const guild = split[0]?.trim();
|
|
17
|
+
const user = split.slice(1).join("#").trim();
|
|
18
|
+
if (guild && /^\d+$/.test(guild)) return {
|
|
19
|
+
guildId: guild,
|
|
20
|
+
userName: user
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
guildName: guild,
|
|
24
|
+
userName: user
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return { userName: trimmed.replace(/^@/, "") };
|
|
28
|
+
}
|
|
29
|
+
function scoreDiscordMember(member, query) {
|
|
30
|
+
const q = normalizeLowercaseStringOrEmpty(query);
|
|
31
|
+
const user = member.user;
|
|
32
|
+
const candidates = [
|
|
33
|
+
user.username,
|
|
34
|
+
user.global_name,
|
|
35
|
+
member.nick ?? void 0
|
|
36
|
+
].map((value) => {
|
|
37
|
+
const normalized = normalizeOptionalString(value);
|
|
38
|
+
return normalized ? normalizeLowercaseStringOrEmpty(normalized) : void 0;
|
|
39
|
+
}).filter(Boolean);
|
|
40
|
+
let score = 0;
|
|
41
|
+
if (candidates.some((value) => value === q)) score += 3;
|
|
42
|
+
if (candidates.some((value) => value?.includes(q))) score += 1;
|
|
43
|
+
if (!user.bot) score += 1;
|
|
44
|
+
return score;
|
|
45
|
+
}
|
|
46
|
+
async function resolveDiscordUserAllowlist(params) {
|
|
47
|
+
const token = resolveDiscordAllowlistToken(params.token);
|
|
48
|
+
if (!token) return buildDiscordUnresolvedResults(params.entries, (input) => ({
|
|
49
|
+
input,
|
|
50
|
+
resolved: false
|
|
51
|
+
}));
|
|
52
|
+
const fetcher = params.fetcher ?? fetch;
|
|
53
|
+
let guilds = null;
|
|
54
|
+
const getGuilds = async () => {
|
|
55
|
+
if (!guilds) guilds = await listGuilds(token, fetcher);
|
|
56
|
+
return guilds;
|
|
57
|
+
};
|
|
58
|
+
const results = [];
|
|
59
|
+
for (const input of params.entries) {
|
|
60
|
+
const parsed = parseDiscordUserInput(input);
|
|
61
|
+
if (parsed.userId) {
|
|
62
|
+
results.push({
|
|
63
|
+
input,
|
|
64
|
+
resolved: true,
|
|
65
|
+
id: parsed.userId
|
|
66
|
+
});
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const query = parsed.userName?.trim();
|
|
70
|
+
if (!query) {
|
|
71
|
+
results.push({
|
|
72
|
+
input,
|
|
73
|
+
resolved: false
|
|
74
|
+
});
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const guildList = filterDiscordGuilds(await getGuilds(), {
|
|
78
|
+
guildId: parsed.guildId,
|
|
79
|
+
guildName: parsed.guildName?.trim()
|
|
80
|
+
});
|
|
81
|
+
let best = null;
|
|
82
|
+
let matches = 0;
|
|
83
|
+
for (const guild of guildList) {
|
|
84
|
+
const paramsObj = new URLSearchParams({
|
|
85
|
+
query,
|
|
86
|
+
limit: "25"
|
|
87
|
+
});
|
|
88
|
+
const members = await fetchDiscord(`/guilds/${guild.id}/members/search?${paramsObj.toString()}`, token, fetcher);
|
|
89
|
+
for (const member of members) {
|
|
90
|
+
const score = scoreDiscordMember(member, query);
|
|
91
|
+
if (score === 0) continue;
|
|
92
|
+
matches += 1;
|
|
93
|
+
if (!best || score > best.score) best = {
|
|
94
|
+
member,
|
|
95
|
+
guild,
|
|
96
|
+
score
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (best) {
|
|
101
|
+
const user = best.member.user;
|
|
102
|
+
const name = normalizeOptionalString(best.member.nick) ?? normalizeOptionalString(user.global_name) ?? normalizeOptionalString(user.username);
|
|
103
|
+
results.push({
|
|
104
|
+
input,
|
|
105
|
+
resolved: true,
|
|
106
|
+
id: user.id,
|
|
107
|
+
name,
|
|
108
|
+
guildId: best.guild.id,
|
|
109
|
+
guildName: best.guild.name,
|
|
110
|
+
note: matches > 1 ? "multiple matches; chose best" : void 0
|
|
111
|
+
});
|
|
112
|
+
} else results.push({
|
|
113
|
+
input,
|
|
114
|
+
resolved: false
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return results;
|
|
118
|
+
}
|
|
119
|
+
//#endregion
|
|
120
|
+
export { resolve_users_exports as n, resolveDiscordUserAllowlist as t };
|