@openclaw/discord 2026.9.6 → 2026.9.8
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/assets/icon.png +0 -0
- package/dist/.setup/{account-inspect-BwQj24ht.mjs → account-inspect-De8hOUxG.mjs} +1 -1
- package/dist/.setup/{accounts-CwJQoLjM.mjs → accounts-ChaMcixG.mjs} +1 -4
- package/dist/.setup/{activities-api-COU4-0nR.mjs → activities-api-tvbsU2e3.mjs} +38 -66
- package/dist/.setup/{api-CBK9zcq5.mjs → api-DVbJwZVt.mjs} +10 -2
- package/dist/.setup/{approval-handler.runtime-CbBktBb4.mjs → approval-handler.runtime-DxCK2Rux.mjs} +49 -125
- package/dist/.setup/{approval-message-updates-jf9zMaIC.mjs → approval-message-updates-BKFqavHZ.mjs} +2 -2
- package/dist/.setup/{audit-vKbh-LFR.mjs → audit-CLg9I71N.mjs} +5 -5
- package/dist/.setup/{channel-Dv4e3Jpc.mjs → channel-DxlUVU9t.mjs} +121 -227
- package/dist/.setup/{channel-type-DKnjV1XW.mjs → channel-type-DRCrEMss.mjs} +22 -22
- package/dist/.setup/{channel.setup-0NX6FFwi.mjs → channel.setup-CRo1GjV7.mjs} +6 -9
- package/dist/.setup/{components-yBEb75bB.mjs → components-Cq1PvIpN.mjs} +41 -69
- package/dist/.setup/{config-schema-CiZz-mtA.mjs → config-schema-oxELUSDx.mjs} +19 -44
- package/dist/.setup/{conversation-binding-route-B7qImK_b.mjs → conversation-binding-route-Caz_XuFH.mjs} +10 -5
- package/dist/.setup/{directory-config-BytTftz-.mjs → directory-config-esqNn0Eo.mjs} +6 -9
- package/dist/.setup/{directory-live--EGTH0DC.mjs → directory-live-DtKRHuGV.mjs} +6 -12
- package/dist/.setup/{discord-BXpHW-cu.mjs → discord-0xJYfdDD.mjs} +82 -386
- package/dist/.setup/{doctor-D1R-uFIu.mjs → doctor-BCl1H5tl.mjs} +21 -36
- package/dist/.setup/{doctor-contract-Co5vRCZ6.mjs → doctor-contract-CvvgwrrG.mjs} +41 -50
- package/dist/.setup/{channel-actions.runtime-leZuw01r.mjs → handle-action-CUvQWnE7.mjs} +67 -104
- package/dist/.setup/{handle-action.guild-admin-DcFa8NwA.mjs → handle-action.guild-admin-Df-8gVle.mjs} +62 -120
- package/dist/.setup/{live-policy-config-eKQ-PLdy.mjs → live-policy-config-8Pv20CHc.mjs} +2 -3
- package/dist/.setup/{message-handler-X6ejmbtY.mjs → message-handler-B-Jk4oDk.mjs} +18 -94
- package/dist/.setup/{message-handler.preflight-pluralkit-8Xji34AF.mjs → message-handler.preflight-pluralkit-CWLUBVcx.mjs} +8 -10
- package/dist/.setup/{message-handler.preflight-DE_POxFc.mjs → message-handler.preflight-v-__NSDq.mjs} +69 -180
- package/dist/.setup/{message-handler.process-CCmIVnxy.mjs → message-handler.process-BNFFuChn.mjs} +65 -86
- package/dist/.setup/{outbound-adapter-ClIgmu4F.mjs → outbound-adapter-BobT-kse.mjs} +105 -19
- package/dist/.setup/{outbound-session-route-VulUE0yV.mjs → outbound-session-route-zVGxxceg.mjs} +140 -108
- package/dist/.setup/{pluralkit-CdAt1G0P.mjs → pluralkit-a6_NLfH9.mjs} +1 -1
- package/dist/.setup/{presence-cache-dYSHPWMx.mjs → presence-cache-Di3H3DIU.mjs} +0 -4
- package/dist/.setup/{probe-CupW4we4.mjs → probe-LYrIHlBF.mjs} +13 -4
- package/dist/.setup/{provider-iOf73HW-.mjs → provider-B_G5hASF.mjs} +721 -1416
- package/dist/.setup/provider-session.runtime-BYlTBFD2.mjs +6 -0
- package/dist/.setup/provider.runtime-CUE3UxER.mjs +2 -0
- package/dist/.setup/{realtime-session.runtime-Dz8uVutq.mjs → realtime-session.runtime-oUd9DOcz.mjs} +41 -55
- package/dist/.setup/{receive-recovery-DHst8WRx.mjs → receive-recovery-CHPOsnLc.mjs} +1 -4
- package/dist/.setup/{resolve-allowlist-common-CwMBzbx9.mjs → resolve-allowlist-common-DPdRggu5.mjs} +4 -7
- package/dist/.setup/{resolve-channels-BbvsLQOZ.mjs → resolve-channels-BFPNRmVv.mjs} +21 -40
- package/dist/.setup/{resolve-users-ByFlR7LQ.mjs → resolve-users-0-aBuCy3.mjs} +4 -4
- package/dist/.setup/{retry-BEYkDy0P.mjs → retry-pz_cSha2.mjs} +3 -3
- package/dist/.setup/rolldown-runtime-B4FMCO8f.mjs +28 -0
- package/dist/.setup/{runtime-B8lJfyrA.mjs → runtime-FN000lxA.mjs} +60 -162
- package/dist/.setup/runtime-doctor-migrations-CshUGl36.mjs +159 -0
- package/dist/.setup/{runtime-DisDbixd.mjs → runtime-sUksZ--Q.mjs} +2 -5
- package/dist/.setup/{secret-config-contract-DFu9hfU8.mjs → secret-config-contract-uOE2J7yM.mjs} +15 -85
- package/dist/.setup/{security-audit-s5w50-Ly.mjs → security-audit-Cdaegq7C.mjs} +3 -1
- package/dist/.setup/{send-CIBzvXjS.mjs → send-CrfEI6Bs.mjs} +53 -108
- package/dist/.setup/{send.components-ChY21qr-.mjs → send.components-DxQAMfES.mjs} +62 -107
- package/dist/.setup/{send.outbound-QTyuFupn.mjs → send.outbound-BISKnb-a.mjs} +66 -140
- package/dist/.setup/{send.shared-VNvWfX2T.mjs → send.shared-DGFkbkQR.mjs} +10 -25
- package/dist/.setup/{sender-identity-0Ymgvmaj.mjs → sender-identity-B9X5Vb9R.mjs} +2 -3
- package/dist/.setup/setup-plugin-api-BQUBxbhe.mjs +3 -0
- package/dist/.setup/{shared-DHPDaMSx.mjs → shared-B3wZ4hN-.mjs} +25 -32
- package/dist/.setup/{subagent-hooks-CjW7r8Pe.mjs → subagent-hooks-nlUE9ow7.mjs} +5 -6
- package/dist/.setup/system-events-CdeZnvPV.mjs +33 -0
- package/dist/.setup/{target-resolver-BXpy6VT8.mjs → target-resolver-BuLapkhy.mjs} +9 -12
- package/dist/.setup/targets-0KUcEIYx.mjs +3 -0
- package/dist/.setup/{thread-bindings-CEh2dhqP.mjs → thread-bindings-D7TfgjR_.mjs} +33 -35
- package/dist/.setup/{thread-bindings.manager-ve-i6oqt.mjs → thread-bindings.manager-DN-NissX.mjs} +325 -233
- package/dist/.setup/thread-bindings.session-updates-CshfKghV.mjs +359 -0
- package/dist/.setup/{thread-bindings.state-BThFQEga.mjs → thread-bindings.state-g6v9zAym.mjs} +21 -62
- package/dist/.setup/{transcripts-source-DVegW0WI.mjs → transcripts-source-p8EV179h.mjs} +76 -235
- package/dist/.setup/{typing-BKZL5fGj.mjs → typing-BiHCzBRu.mjs} +2 -1
- package/dist/.setup/{voice-runtime-elTtjEIG.mjs → voice-runtime-B46rcwrG.mjs} +140 -244
- package/dist/account-inspect-api.js +1 -1
- package/dist/action-runtime-api.js +1 -1
- package/dist/activities-api.js +1 -1
- package/dist/api.js +18 -18
- package/dist/channel-config-api.js +1 -1
- package/dist/channel-plugin-api.js +1 -1
- package/dist/directory-contract-api.js +1 -1
- package/dist/doctor-contract-api.js +4 -4
- package/dist/index.js +1 -1
- package/dist/runtime-api.js +20 -20
- package/dist/secret-contract-api.js +1 -1
- package/dist/security-audit-contract-api.js +1 -1
- package/dist/setup-entry.js +1 -1
- package/dist/setup-plugin-api.js +1 -1
- package/dist/src/voice/audio-worker.runtime.js +15 -24
- package/dist/subagent-hooks-api.js +3 -4
- package/dist/transcripts-source-api.js +1 -1
- package/node_modules/@types/node/README.md +2 -2
- package/node_modules/@types/node/child_process.d.ts +1 -1
- package/node_modules/@types/node/crypto.d.ts +20 -8
- package/node_modules/@types/node/ffi.d.ts +14 -0
- package/node_modules/@types/node/http2.d.ts +3 -2
- package/node_modules/@types/node/net.d.ts +16 -4
- package/node_modules/@types/node/package.json +2 -17
- package/node_modules/@types/node/process.d.ts +1 -0
- package/node_modules/@types/node/quic.d.ts +39 -1
- package/node_modules/@types/node/stream/iter.d.ts +9 -12
- package/node_modules/@types/node/test/reporters.d.ts +1 -0
- package/node_modules/@types/node/test.d.ts +72 -0
- package/node_modules/@types/node/tls.d.ts +14 -10
- package/node_modules/@types/node/vm.d.ts +2 -1
- package/node_modules/@types/node/worker_threads.d.ts +4 -1
- package/node_modules/typebox/build/compile/code.mjs +1 -2
- package/node_modules/typebox/build/compile/validator.mjs +5 -1
- package/node_modules/typebox/build/format/iri.mjs +16 -9
- package/node_modules/typebox/build/guard/emit.mjs +2 -2
- package/node_modules/typebox/build/guard/guard.d.mts +7 -5
- package/node_modules/typebox/build/guard/guard.mjs +14 -9
- package/node_modules/typebox/build/guard/index.mjs +6 -0
- package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
- package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
- package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
- package/node_modules/typebox/build/schema/build.mjs +2 -3
- package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
- package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
- package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
- package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
- package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
- package/node_modules/typebox/build/schema/parse.mjs +3 -0
- package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
- package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
- package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
- package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
- package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
- package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
- package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
- package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
- package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
- package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
- package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
- package/node_modules/typebox/package.json +1 -1
- package/node_modules/typebox/readme.md +3 -1
- package/openclaw.plugin.json +21 -1
- package/package.json +5 -5
- package/dist/.setup/agent-components.runtime-CEPrf2SY.mjs +0 -4
- package/dist/.setup/probe.runtime-DBQ_AGPe.mjs +0 -2
- package/dist/.setup/provider-session.runtime-DrGAYnZv.mjs +0 -6
- package/dist/.setup/provider.runtime-BmjW_pIw.mjs +0 -2
- package/dist/.setup/security-audit.runtime-DHtYenx9.mjs +0 -2
- package/dist/.setup/setup-plugin-api-Dvr41dyx.mjs +0 -3
- package/dist/.setup/system-events-B2YEEMbS.mjs +0 -34
- package/dist/.setup/targets-CvemhN3i.mjs +0 -3
- package/dist/.setup/thread-bindings.session-updates-DCQq1WZ5.mjs +0 -55
- /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import "./targets-
|
|
5
|
-
import { a as readDiscordAutoArchiveDurationParam, t as handleDiscordAction } from "./runtime-
|
|
1
|
+
import { i as buildDiscordPresentationComponents, m as coerceDiscordComponentParam, r as buildDiscordInteractiveComponents } from "./components-Cq1PvIpN.mjs";
|
|
2
|
+
import { C as withDiscordRequestAuthority } from "./discord-0xJYfdDD.mjs";
|
|
3
|
+
import { _ as matchesDiscordToolContextTarget, b as parseDiscordTarget, x as resolveDiscordChannelId } from "./retry-pz_cSha2.mjs";
|
|
4
|
+
import "./targets-0KUcEIYx.mjs";
|
|
5
|
+
import { a as readDiscordAutoArchiveDurationParam, t as handleDiscordAction } from "./runtime-FN000lxA.mjs";
|
|
6
6
|
import "../action-runtime-api.js";
|
|
7
|
-
import { b as discordInboundEventDelivery, i as isDiscordComponentSpecWithinMessageLimit, n as DISCORD_PRESENTATION_CAPABILITIES } from "./outbound-session-route-
|
|
8
|
-
import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-
|
|
7
|
+
import { b as discordInboundEventDelivery, i as isDiscordComponentSpecWithinMessageLimit, n as DISCORD_PRESENTATION_CAPABILITIES } from "./outbound-session-route-zVGxxceg.mjs";
|
|
8
|
+
import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-Df-8gVle.mjs";
|
|
9
9
|
import { n as notifyDiscordActiveTurnThreadCreated, r as notifyDiscordActiveTurnThreadReplyDelivered } from "./active-turn-thread-route-fmHl1HNd.mjs";
|
|
10
|
-
import { normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
10
|
+
import { asOptionalRecord, normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
11
11
|
import { adaptMessagePresentationForChannel, normalizeLegacyInteractiveReply, normalizeMessagePresentation, renderMessagePresentationFallbackText } from "openclaw/plugin-sdk/interactive-runtime";
|
|
12
12
|
import { resolveReactionMessageId } from "openclaw/plugin-sdk/channel-actions";
|
|
13
13
|
import { readBooleanParam } from "openclaw/plugin-sdk/boolean-param";
|
|
@@ -15,7 +15,7 @@ import { readPositiveIntegerParam as readPositiveIntegerParam$1, readStringArray
|
|
|
15
15
|
//#region extensions/discord/src/actions/handle-action.ts
|
|
16
16
|
const providerId = "discord";
|
|
17
17
|
function withCurrentSourceReplyRoute(result) {
|
|
18
|
-
const details =
|
|
18
|
+
const details = asOptionalRecord(result.details) ?? {};
|
|
19
19
|
return {
|
|
20
20
|
...result,
|
|
21
21
|
details: {
|
|
@@ -55,8 +55,13 @@ async function dispatchDiscordMessageAction(ctx) {
|
|
|
55
55
|
...ctx.progressSnapshot ? { progressSnapshot: ctx.progressSnapshot } : {},
|
|
56
56
|
...readPolicyOptions
|
|
57
57
|
};
|
|
58
|
+
const runAction = ({ action: runtimeAction, ...payload }) => handleDiscordAction({
|
|
59
|
+
action: runtimeAction,
|
|
60
|
+
accountId: accountId ?? void 0,
|
|
61
|
+
...payload
|
|
62
|
+
}, cfg, actionOptions);
|
|
58
63
|
const notifyVisibleOutbound = (result, to, fallbackSessionKey) => {
|
|
59
|
-
if ((result.details
|
|
64
|
+
if (asOptionalRecord(result.details)?.ok !== true) return;
|
|
60
65
|
discordInboundEventDelivery.notify({
|
|
61
66
|
sessionKey: ctx.sessionKey ?? fallbackSessionKey ?? void 0,
|
|
62
67
|
to,
|
|
@@ -65,7 +70,7 @@ async function dispatchDiscordMessageAction(ctx) {
|
|
|
65
70
|
});
|
|
66
71
|
};
|
|
67
72
|
const withAdoptedThreadReplyRoute = (result, to, fallbackSessionKey) => {
|
|
68
|
-
if ((result.details
|
|
73
|
+
if (asOptionalRecord(result.details)?.ok !== true) return result;
|
|
69
74
|
let target;
|
|
70
75
|
try {
|
|
71
76
|
target = parseDiscordTarget(to, { defaultKind: "channel" });
|
|
@@ -79,27 +84,33 @@ async function dispatchDiscordMessageAction(ctx) {
|
|
|
79
84
|
})) return withCurrentSourceReplyRoute(result);
|
|
80
85
|
return result;
|
|
81
86
|
};
|
|
82
|
-
const readTarget = () => {
|
|
83
|
-
const target = readStringParam$1(params,
|
|
87
|
+
const readTarget = ([firstKey, secondKey] = ["channelId", "to"]) => {
|
|
88
|
+
const target = readStringParam$1(params, firstKey) ?? readStringParam$1(params, secondKey) ?? readCurrentDiscordTarget(ctx.toolContext);
|
|
84
89
|
if (!target) throw new Error("Discord channel target is required (use channel:<id>).");
|
|
85
90
|
return target;
|
|
86
91
|
};
|
|
87
92
|
const resolveChannelId = () => resolveDiscordChannelId(readTarget());
|
|
88
|
-
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
if (action === "send" || action === "upload-file") {
|
|
94
|
+
const to = readTarget(["to", "target"]);
|
|
95
|
+
const asVoice = action === "send" ? readBooleanParam(params, "asVoice") === true : void 0;
|
|
96
|
+
const [firstMediaKey, lastMediaKey] = action === "send" ? ["media", "filePath"] : ["filePath", "media"];
|
|
97
|
+
const mediaUrl = readStringParam$1(params, firstMediaKey, { trim: false }) ?? readStringParam$1(params, "path", { trim: false }) ?? readStringParam$1(params, lastMediaKey, { trim: false });
|
|
98
|
+
if (action === "upload-file" && !mediaUrl) {
|
|
99
|
+
if (readStringParam$1(params, "buffer", { trim: false })) throw new Error("Use action: \"send\" for base64 buffer attachments; upload-file requires filePath, path, or media.");
|
|
100
|
+
throw new Error("upload-file requires filePath, path, or media.");
|
|
101
|
+
}
|
|
97
102
|
const content = readStringParam$1(params, "message", {
|
|
98
103
|
allowEmpty: true,
|
|
99
104
|
trim: false
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
|
|
105
|
+
}) ?? (action === "upload-file" ? readStringParam$1(params, "content", {
|
|
106
|
+
allowEmpty: true,
|
|
107
|
+
trim: false
|
|
108
|
+
}) ?? readStringParam$1(params, "caption", {
|
|
109
|
+
allowEmpty: true,
|
|
110
|
+
trim: false
|
|
111
|
+
}) ?? "" : void 0);
|
|
112
|
+
const explicitComponents = action === "send" ? coerceDiscordComponentParam(params.components) : void 0;
|
|
113
|
+
const presentation = action === "send" && explicitComponents == null ? normalizeMessagePresentation(params.presentation) : void 0;
|
|
103
114
|
const adaptedPresentation = presentation ? adaptMessagePresentationForChannel({
|
|
104
115
|
presentation,
|
|
105
116
|
capabilities: DISCORD_PRESENTATION_CAPABILITIES
|
|
@@ -111,9 +122,9 @@ async function dispatchDiscordMessageAction(ctx) {
|
|
|
111
122
|
includesMedia: Boolean(mediaUrl)
|
|
112
123
|
}) ? generatedPresentationComponents : void 0;
|
|
113
124
|
const presentationFellBack = Boolean(generatedPresentationComponents && !presentationComponents);
|
|
114
|
-
const rawComponents = presentationFellBack ? void 0 : explicitComponents ?? presentationComponents ?? buildDiscordInteractiveComponents(normalizeLegacyInteractiveReply(params.interactive));
|
|
125
|
+
const rawComponents = action !== "send" || presentationFellBack ? void 0 : explicitComponents ?? presentationComponents ?? buildDiscordInteractiveComponents(normalizeLegacyInteractiveReply(params.interactive));
|
|
115
126
|
const components = Boolean(rawComponents) && (typeof rawComponents === "function" || typeof rawComponents === "object") ? rawComponents : void 0;
|
|
116
|
-
const rawEmbeds = params.embeds;
|
|
127
|
+
const rawEmbeds = action === "send" ? params.embeds : void 0;
|
|
117
128
|
const embeds = Array.isArray(rawEmbeds) ? rawEmbeds : void 0;
|
|
118
129
|
const deliveryContent = presentationFellBack && presentation ? renderMessagePresentationFallbackText({
|
|
119
130
|
text: content,
|
|
@@ -125,63 +136,25 @@ async function dispatchDiscordMessageAction(ctx) {
|
|
|
125
136
|
const suppressEmbeds = readBooleanParam(params, "suppressEmbeds");
|
|
126
137
|
const sessionKey = readStringParam$1(params, "__sessionKey");
|
|
127
138
|
const agentId = readStringParam$1(params, "__agentId");
|
|
128
|
-
const threadName = readStringParam$1(params, "threadName");
|
|
129
|
-
const result = await
|
|
139
|
+
const threadName = action === "send" ? readStringParam$1(params, "threadName") : void 0;
|
|
140
|
+
const result = await runAction({
|
|
130
141
|
action: "sendMessage",
|
|
131
|
-
accountId: accountId ?? void 0,
|
|
132
142
|
to,
|
|
133
143
|
content: deliveryContent,
|
|
134
144
|
...threadName ? { threadName } : {},
|
|
135
145
|
mediaUrl: mediaUrl ?? void 0,
|
|
136
146
|
filename: filename ?? void 0,
|
|
137
147
|
replyTo: replyTo ?? void 0,
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
148
|
+
...action === "send" ? {
|
|
149
|
+
components,
|
|
150
|
+
embeds,
|
|
151
|
+
asVoice
|
|
152
|
+
} : {},
|
|
141
153
|
silent,
|
|
142
154
|
...suppressEmbeds === void 0 ? {} : { suppressEmbeds },
|
|
143
155
|
__sessionKey: sessionKey ?? void 0,
|
|
144
156
|
__agentId: agentId ?? void 0
|
|
145
|
-
}, cfg, actionOptions);
|
|
146
|
-
notifyVisibleOutbound(result, to, sessionKey);
|
|
147
|
-
return withAdoptedThreadReplyRoute(result, to, sessionKey);
|
|
148
|
-
}
|
|
149
|
-
if (action === "upload-file") {
|
|
150
|
-
const to = readSendTarget();
|
|
151
|
-
const mediaUrl = readStringParam$1(params, "filePath", { trim: false }) ?? readStringParam$1(params, "path", { trim: false }) ?? readStringParam$1(params, "media", { trim: false });
|
|
152
|
-
if (!mediaUrl) {
|
|
153
|
-
if (readStringParam$1(params, "buffer", { trim: false })) throw new Error("Use action: \"send\" for base64 buffer attachments; upload-file requires filePath, path, or media.");
|
|
154
|
-
throw new Error("upload-file requires filePath, path, or media.");
|
|
155
|
-
}
|
|
156
|
-
const content = readStringParam$1(params, "message", {
|
|
157
|
-
allowEmpty: true,
|
|
158
|
-
trim: false
|
|
159
|
-
}) ?? readStringParam$1(params, "content", {
|
|
160
|
-
allowEmpty: true,
|
|
161
|
-
trim: false
|
|
162
|
-
}) ?? readStringParam$1(params, "caption", {
|
|
163
|
-
allowEmpty: true,
|
|
164
|
-
trim: false
|
|
165
157
|
});
|
|
166
|
-
const filename = readStringParam$1(params, "filename");
|
|
167
|
-
const replyTo = readStringParam$1(params, "replyTo");
|
|
168
|
-
const silent = readBooleanParam(params, "silent") === true;
|
|
169
|
-
const suppressEmbeds = readBooleanParam(params, "suppressEmbeds");
|
|
170
|
-
const sessionKey = readStringParam$1(params, "__sessionKey");
|
|
171
|
-
const agentId = readStringParam$1(params, "__agentId");
|
|
172
|
-
const result = await handleDiscordAction({
|
|
173
|
-
action: "sendMessage",
|
|
174
|
-
accountId: accountId ?? void 0,
|
|
175
|
-
to,
|
|
176
|
-
content: content ?? "",
|
|
177
|
-
mediaUrl,
|
|
178
|
-
filename: filename ?? void 0,
|
|
179
|
-
replyTo: replyTo ?? void 0,
|
|
180
|
-
silent,
|
|
181
|
-
...suppressEmbeds === void 0 ? {} : { suppressEmbeds },
|
|
182
|
-
__sessionKey: sessionKey ?? void 0,
|
|
183
|
-
__agentId: agentId ?? void 0
|
|
184
|
-
}, cfg, actionOptions);
|
|
185
158
|
notifyVisibleOutbound(result, to, sessionKey);
|
|
186
159
|
return withAdoptedThreadReplyRoute(result, to, sessionKey);
|
|
187
160
|
}
|
|
@@ -194,38 +167,35 @@ async function dispatchDiscordMessageAction(ctx) {
|
|
|
194
167
|
if (!messageId) throw new Error("messageId required. Provide messageId explicitly or react to the current inbound message.");
|
|
195
168
|
const emoji = readStringParam$1(params, "emoji", { allowEmpty: true });
|
|
196
169
|
const remove = readBooleanParam(params, "remove");
|
|
197
|
-
return await
|
|
170
|
+
return await runAction({
|
|
198
171
|
action: "react",
|
|
199
|
-
accountId: accountId ?? void 0,
|
|
200
172
|
channelId: readTarget(),
|
|
201
173
|
messageId,
|
|
202
174
|
emoji,
|
|
203
175
|
remove
|
|
204
|
-
}
|
|
176
|
+
});
|
|
205
177
|
}
|
|
206
178
|
if (action === "reactions") {
|
|
207
179
|
const messageId = readStringParam$1(params, "messageId", { required: true });
|
|
208
180
|
const limit = readPositiveIntegerParam$1(params, "limit");
|
|
209
|
-
return await
|
|
181
|
+
return await runAction({
|
|
210
182
|
action: "reactions",
|
|
211
|
-
accountId: accountId ?? void 0,
|
|
212
183
|
channelId: readTarget(),
|
|
213
184
|
messageId,
|
|
214
185
|
limit
|
|
215
|
-
}
|
|
186
|
+
});
|
|
216
187
|
}
|
|
217
188
|
if (action === "read") {
|
|
218
189
|
const limit = readPositiveIntegerParam$1(params, "limit");
|
|
219
|
-
return await
|
|
190
|
+
return await runAction({
|
|
220
191
|
action: "readMessages",
|
|
221
|
-
accountId: accountId ?? void 0,
|
|
222
192
|
channelId: resolveChannelId(),
|
|
223
193
|
limit,
|
|
224
194
|
before: readStringParam$1(params, "before"),
|
|
225
195
|
after: readStringParam$1(params, "after"),
|
|
226
196
|
around: readStringParam$1(params, "around"),
|
|
227
197
|
messageId: readStringParam$1(params, "messageId")
|
|
228
|
-
}
|
|
198
|
+
});
|
|
229
199
|
}
|
|
230
200
|
if (action === "edit" || action === "delete") {
|
|
231
201
|
const messageId = readStringParam$1(params, "messageId", { required: true });
|
|
@@ -234,44 +204,40 @@ async function dispatchDiscordMessageAction(ctx) {
|
|
|
234
204
|
target,
|
|
235
205
|
toolContext: ctx.toolContext
|
|
236
206
|
}) ? readCurrentDiscordTarget(ctx.toolContext) : void 0;
|
|
237
|
-
return await
|
|
207
|
+
return await runAction({
|
|
238
208
|
action: action === "edit" ? "editMessage" : "deleteMessage",
|
|
239
|
-
accountId: accountId ?? void 0,
|
|
240
209
|
channelId: resolveDiscordChannelId(currentDmChannel ?? target),
|
|
241
210
|
messageId,
|
|
242
211
|
...action === "edit" ? { content: params.message } : {}
|
|
243
|
-
}
|
|
212
|
+
});
|
|
244
213
|
}
|
|
245
214
|
if (action === "pin" || action === "unpin" || action === "list-pins") {
|
|
246
215
|
const messageId = action === "list-pins" ? void 0 : readStringParam$1(params, "messageId", { required: true });
|
|
247
|
-
return await
|
|
216
|
+
return await runAction({
|
|
248
217
|
action: action === "pin" ? "pinMessage" : action === "unpin" ? "unpinMessage" : "listPins",
|
|
249
|
-
accountId: accountId ?? void 0,
|
|
250
218
|
channelId: resolveChannelId(),
|
|
251
219
|
messageId
|
|
252
|
-
}
|
|
220
|
+
});
|
|
253
221
|
}
|
|
254
|
-
if (action === "permissions") return await
|
|
222
|
+
if (action === "permissions") return await runAction({
|
|
255
223
|
action: "permissions",
|
|
256
|
-
accountId: accountId ?? void 0,
|
|
257
224
|
channelId: resolveChannelId()
|
|
258
|
-
}
|
|
225
|
+
});
|
|
259
226
|
if (action === "thread-create") {
|
|
260
227
|
const name = readStringParam$1(params, "threadName", { required: true });
|
|
261
228
|
const messageId = readStringParam$1(params, "messageId");
|
|
262
229
|
const content = readStringParam$1(params, "message", { trim: false });
|
|
263
230
|
const autoArchiveMinutes = readDiscordAutoArchiveDurationParam(params, "autoArchiveMin");
|
|
264
231
|
const appliedTags = readStringArrayParam$1(params, "appliedTags");
|
|
265
|
-
const result = await
|
|
232
|
+
const result = await runAction({
|
|
266
233
|
action: "threadCreate",
|
|
267
|
-
accountId: accountId ?? void 0,
|
|
268
234
|
channelId: resolveChannelId(),
|
|
269
235
|
name,
|
|
270
236
|
messageId,
|
|
271
237
|
content,
|
|
272
238
|
autoArchiveMinutes,
|
|
273
239
|
appliedTags: appliedTags ?? void 0
|
|
274
|
-
}
|
|
240
|
+
});
|
|
275
241
|
const details = result.details && typeof result.details === "object" && !Array.isArray(result.details) ? result.details : void 0;
|
|
276
242
|
if (details?.ok === true) {
|
|
277
243
|
const threadId = typeof details.thread?.id === "string" ? details.thread.id : void 0;
|
|
@@ -288,30 +254,27 @@ async function dispatchDiscordMessageAction(ctx) {
|
|
|
288
254
|
}
|
|
289
255
|
if (action === "sticker") {
|
|
290
256
|
const to = readStringParam$1(params, "to", { required: true });
|
|
291
|
-
const
|
|
292
|
-
required: true,
|
|
293
|
-
label: "sticker-id"
|
|
294
|
-
}) ?? [];
|
|
295
|
-
const result = await handleDiscordAction({
|
|
257
|
+
const result = await runAction({
|
|
296
258
|
action: "sticker",
|
|
297
|
-
accountId: accountId ?? void 0,
|
|
298
259
|
to,
|
|
299
|
-
stickerIds,
|
|
260
|
+
stickerIds: readStringArrayParam$1(params, "stickerId", {
|
|
261
|
+
required: true,
|
|
262
|
+
label: "sticker-id"
|
|
263
|
+
}) ?? [],
|
|
300
264
|
content: readStringParam$1(params, "message", { trim: false }),
|
|
301
265
|
...readBooleanParam(params, "silent") === true ? { silent: true } : {}
|
|
302
|
-
}
|
|
266
|
+
});
|
|
303
267
|
notifyVisibleOutbound(result, to);
|
|
304
268
|
return result;
|
|
305
269
|
}
|
|
306
|
-
if (action === "set-presence") return await
|
|
270
|
+
if (action === "set-presence") return await runAction({
|
|
307
271
|
action: "setPresence",
|
|
308
|
-
accountId: accountId ?? void 0,
|
|
309
272
|
status: readStringParam$1(params, "status"),
|
|
310
273
|
activityType: readStringParam$1(params, "activityType"),
|
|
311
274
|
activityName: readStringParam$1(params, "activityName"),
|
|
312
275
|
activityUrl: readStringParam$1(params, "activityUrl"),
|
|
313
276
|
activityState: readStringParam$1(params, "activityState")
|
|
314
|
-
}
|
|
277
|
+
});
|
|
315
278
|
const adminResult = await tryHandleDiscordMessageActionGuildAdmin({
|
|
316
279
|
ctx,
|
|
317
280
|
resolveChannelId,
|
|
@@ -1,10 +1,50 @@
|
|
|
1
|
-
import { c as readDiscordChannelMoveParams, n as isDiscordModerationAction, o as readDiscordChannelCreateParams, r as readDiscordModerationCommand, s as readDiscordChannelEditParams, t as handleDiscordAction } from "./runtime-
|
|
1
|
+
import { c as readDiscordChannelMoveParams, n as isDiscordModerationAction, o as readDiscordChannelCreateParams, r as readDiscordModerationCommand, s as readDiscordChannelEditParams, t as handleDiscordAction } from "./runtime-FN000lxA.mjs";
|
|
2
2
|
import "../action-runtime-api.js";
|
|
3
|
-
import { y as isTrustedRequesterGuildAdminAction } from "./outbound-session-route-
|
|
3
|
+
import { y as isTrustedRequesterGuildAdminAction } from "./outbound-session-route-zVGxxceg.mjs";
|
|
4
4
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
5
5
|
import { readBooleanParam } from "openclaw/plugin-sdk/boolean-param";
|
|
6
6
|
import { readNonNegativeIntegerParam, readPositiveIntegerParam, readStringArrayParam, readStringParam } from "openclaw/plugin-sdk/param-readers";
|
|
7
7
|
//#region extensions/discord/src/actions/handle-action.guild-admin.ts
|
|
8
|
+
const guildMetadataReads = {
|
|
9
|
+
"member-info": {
|
|
10
|
+
action: "memberInfo",
|
|
11
|
+
requiredParams: ["userId", "guildId"]
|
|
12
|
+
},
|
|
13
|
+
"role-info": {
|
|
14
|
+
action: "roleInfo",
|
|
15
|
+
requiredParams: ["guildId"]
|
|
16
|
+
},
|
|
17
|
+
"channel-info": {
|
|
18
|
+
action: "channelInfo",
|
|
19
|
+
requiredParams: ["channelId"]
|
|
20
|
+
},
|
|
21
|
+
"channel-list": {
|
|
22
|
+
action: "channelList",
|
|
23
|
+
requiredParams: ["guildId"]
|
|
24
|
+
},
|
|
25
|
+
"voice-status": {
|
|
26
|
+
action: "voiceStatus",
|
|
27
|
+
requiredParams: ["guildId", "userId"]
|
|
28
|
+
},
|
|
29
|
+
"event-list": {
|
|
30
|
+
action: "eventList",
|
|
31
|
+
requiredParams: ["guildId"]
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const channelMutation = {
|
|
35
|
+
"channel-create": {
|
|
36
|
+
action: "channelCreate",
|
|
37
|
+
read: readDiscordChannelCreateParams
|
|
38
|
+
},
|
|
39
|
+
"channel-edit": {
|
|
40
|
+
action: "channelEdit",
|
|
41
|
+
read: readDiscordChannelEditParams
|
|
42
|
+
},
|
|
43
|
+
"channel-move": {
|
|
44
|
+
action: "channelMove",
|
|
45
|
+
read: readDiscordChannelMoveParams
|
|
46
|
+
}
|
|
47
|
+
};
|
|
8
48
|
function readDiscordRequesterSenderId(ctx) {
|
|
9
49
|
const currentProvider = normalizeOptionalString(ctx.toolContext?.currentChannelProvider);
|
|
10
50
|
if (currentProvider?.toLowerCase() === "discord") return normalizeOptionalString(ctx.requesterSenderId);
|
|
@@ -23,22 +63,13 @@ async function tryHandleDiscordMessageActionGuildAdmin(params) {
|
|
|
23
63
|
const { action, params: actionParams, cfg } = ctx;
|
|
24
64
|
const accountId = ctx.accountId ?? readStringParam(actionParams, "accountId");
|
|
25
65
|
const senderUserId = readDiscordRequesterSenderId(ctx);
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
66
|
+
const metadataRead = guildMetadataReads[action];
|
|
67
|
+
if (metadataRead) {
|
|
68
|
+
const values = Object.fromEntries(metadataRead.requiredParams.map((key) => [key, readStringParam(actionParams, key, { required: true })]));
|
|
29
69
|
return await handleDiscordAction({
|
|
30
|
-
action:
|
|
70
|
+
action: metadataRead.action,
|
|
31
71
|
accountId: accountId ?? void 0,
|
|
32
|
-
|
|
33
|
-
userId
|
|
34
|
-
}, cfg, readPolicyOptions);
|
|
35
|
-
}
|
|
36
|
-
if (action === "role-info") {
|
|
37
|
-
const guildId = readStringParam(actionParams, "guildId", { required: true });
|
|
38
|
-
return await handleDiscordAction({
|
|
39
|
-
action: "roleInfo",
|
|
40
|
-
accountId: accountId ?? void 0,
|
|
41
|
-
guildId
|
|
72
|
+
...values
|
|
42
73
|
}, cfg, readPolicyOptions);
|
|
43
74
|
}
|
|
44
75
|
if (action === "emoji-list") {
|
|
@@ -102,43 +133,12 @@ async function tryHandleDiscordMessageActionGuildAdmin(params) {
|
|
|
102
133
|
...senderParam(senderUserId)
|
|
103
134
|
}, cfg);
|
|
104
135
|
}
|
|
105
|
-
if (action === "channel-
|
|
106
|
-
const
|
|
107
|
-
return await handleDiscordAction({
|
|
108
|
-
action: "channelInfo",
|
|
109
|
-
accountId: accountId ?? void 0,
|
|
110
|
-
channelId
|
|
111
|
-
}, cfg, readPolicyOptions);
|
|
112
|
-
}
|
|
113
|
-
if (action === "channel-list") {
|
|
114
|
-
const guildId = readStringParam(actionParams, "guildId", { required: true });
|
|
115
|
-
return await handleDiscordAction({
|
|
116
|
-
action: "channelList",
|
|
117
|
-
accountId: accountId ?? void 0,
|
|
118
|
-
guildId
|
|
119
|
-
}, cfg, readPolicyOptions);
|
|
120
|
-
}
|
|
121
|
-
if (action === "channel-create") {
|
|
122
|
-
const guildId = readStringParam(actionParams, "guildId", { required: true });
|
|
123
|
-
return await handleDiscordAction({
|
|
124
|
-
action: "channelCreate",
|
|
125
|
-
accountId: accountId ?? void 0,
|
|
126
|
-
...readDiscordChannelCreateParams({
|
|
127
|
-
...actionParams,
|
|
128
|
-
guildId
|
|
129
|
-
}),
|
|
130
|
-
...senderParam(senderUserId)
|
|
131
|
-
}, cfg);
|
|
132
|
-
}
|
|
133
|
-
if (action === "channel-edit") {
|
|
134
|
-
const channelId = readStringParam(actionParams, "channelId", { required: true });
|
|
136
|
+
if (action === "channel-create" || action === "channel-edit" || action === "channel-move") {
|
|
137
|
+
const mutation = channelMutation[action];
|
|
135
138
|
return await handleDiscordAction({
|
|
136
|
-
action:
|
|
139
|
+
action: mutation.action,
|
|
137
140
|
accountId: accountId ?? void 0,
|
|
138
|
-
...
|
|
139
|
-
...actionParams,
|
|
140
|
-
channelId
|
|
141
|
-
}),
|
|
141
|
+
...mutation.read(actionParams),
|
|
142
142
|
...senderParam(senderUserId)
|
|
143
143
|
}, cfg);
|
|
144
144
|
}
|
|
@@ -151,73 +151,21 @@ async function tryHandleDiscordMessageActionGuildAdmin(params) {
|
|
|
151
151
|
...senderParam(senderUserId)
|
|
152
152
|
}, cfg);
|
|
153
153
|
}
|
|
154
|
-
if (action === "
|
|
155
|
-
const
|
|
156
|
-
const
|
|
154
|
+
if (action === "category-create" || action === "category-edit" || action === "category-delete") {
|
|
155
|
+
const creating = action === "category-create";
|
|
156
|
+
const categoryId = readStringParam(actionParams, creating ? "guildId" : "categoryId", { required: true });
|
|
157
|
+
const fields = action === "category-delete" ? {} : {
|
|
158
|
+
name: readStringParam(actionParams, "name", { required: creating }),
|
|
159
|
+
position: readNonNegativeIntegerParam(actionParams, "position")
|
|
160
|
+
};
|
|
157
161
|
return await handleDiscordAction({
|
|
158
|
-
action: "
|
|
162
|
+
action: creating ? "categoryCreate" : action === "category-edit" ? "categoryEdit" : "categoryDelete",
|
|
159
163
|
accountId: accountId ?? void 0,
|
|
160
|
-
...
|
|
161
|
-
|
|
162
|
-
guildId,
|
|
163
|
-
channelId
|
|
164
|
-
}),
|
|
164
|
+
...creating ? { guildId: categoryId } : { categoryId },
|
|
165
|
+
...fields,
|
|
165
166
|
...senderParam(senderUserId)
|
|
166
167
|
}, cfg);
|
|
167
168
|
}
|
|
168
|
-
if (action === "category-create") {
|
|
169
|
-
const guildId = readStringParam(actionParams, "guildId", { required: true });
|
|
170
|
-
const name = readStringParam(actionParams, "name", { required: true });
|
|
171
|
-
const position = readNonNegativeIntegerParam(actionParams, "position");
|
|
172
|
-
return await handleDiscordAction({
|
|
173
|
-
action: "categoryCreate",
|
|
174
|
-
accountId: accountId ?? void 0,
|
|
175
|
-
guildId,
|
|
176
|
-
name,
|
|
177
|
-
position: position ?? void 0,
|
|
178
|
-
...senderParam(senderUserId)
|
|
179
|
-
}, cfg);
|
|
180
|
-
}
|
|
181
|
-
if (action === "category-edit") {
|
|
182
|
-
const categoryId = readStringParam(actionParams, "categoryId", { required: true });
|
|
183
|
-
const name = readStringParam(actionParams, "name");
|
|
184
|
-
const position = readNonNegativeIntegerParam(actionParams, "position");
|
|
185
|
-
return await handleDiscordAction({
|
|
186
|
-
action: "categoryEdit",
|
|
187
|
-
accountId: accountId ?? void 0,
|
|
188
|
-
categoryId,
|
|
189
|
-
name: name ?? void 0,
|
|
190
|
-
position: position ?? void 0,
|
|
191
|
-
...senderParam(senderUserId)
|
|
192
|
-
}, cfg);
|
|
193
|
-
}
|
|
194
|
-
if (action === "category-delete") {
|
|
195
|
-
const categoryId = readStringParam(actionParams, "categoryId", { required: true });
|
|
196
|
-
return await handleDiscordAction({
|
|
197
|
-
action: "categoryDelete",
|
|
198
|
-
accountId: accountId ?? void 0,
|
|
199
|
-
categoryId,
|
|
200
|
-
...senderParam(senderUserId)
|
|
201
|
-
}, cfg);
|
|
202
|
-
}
|
|
203
|
-
if (action === "voice-status") {
|
|
204
|
-
const guildId = readStringParam(actionParams, "guildId", { required: true });
|
|
205
|
-
const userId = readStringParam(actionParams, "userId", { required: true });
|
|
206
|
-
return await handleDiscordAction({
|
|
207
|
-
action: "voiceStatus",
|
|
208
|
-
accountId: accountId ?? void 0,
|
|
209
|
-
guildId,
|
|
210
|
-
userId
|
|
211
|
-
}, cfg, readPolicyOptions);
|
|
212
|
-
}
|
|
213
|
-
if (action === "event-list") {
|
|
214
|
-
const guildId = readStringParam(actionParams, "guildId", { required: true });
|
|
215
|
-
return await handleDiscordAction({
|
|
216
|
-
action: "eventList",
|
|
217
|
-
accountId: accountId ?? void 0,
|
|
218
|
-
guildId
|
|
219
|
-
}, cfg, readPolicyOptions);
|
|
220
|
-
}
|
|
221
169
|
if (action === "event-create") {
|
|
222
170
|
const guildId = readStringParam(actionParams, "guildId", { required: true });
|
|
223
171
|
const name = readStringParam(actionParams, "eventName", { required: true });
|
|
@@ -253,14 +201,8 @@ async function tryHandleDiscordMessageActionGuildAdmin(params) {
|
|
|
253
201
|
})
|
|
254
202
|
});
|
|
255
203
|
return await handleDiscordAction({
|
|
256
|
-
|
|
204
|
+
...moderation,
|
|
257
205
|
accountId: accountId ?? void 0,
|
|
258
|
-
guildId: moderation.guildId,
|
|
259
|
-
userId: moderation.userId,
|
|
260
|
-
durationMinutes: moderation.durationMinutes,
|
|
261
|
-
until: moderation.until,
|
|
262
|
-
reason: moderation.reason,
|
|
263
|
-
deleteMessageDays: moderation.deleteMessageDays,
|
|
264
206
|
senderUserId
|
|
265
207
|
}, cfg);
|
|
266
208
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as normalizeDiscordAllowList } from "./channel-type-
|
|
1
|
+
import { i as normalizeDiscordAllowList } from "./channel-type-DRCrEMss.mjs";
|
|
2
2
|
import { defineStableChannelIngressIdentity } from "openclaw/plugin-sdk/channel-ingress-runtime";
|
|
3
3
|
//#region extensions/discord/src/monitor/ingress-identity.ts
|
|
4
4
|
const DISCORD_ALLOW_LIST_PREFIXES = [
|
|
@@ -20,8 +20,7 @@ function normalizeDiscordIdEntry(entry) {
|
|
|
20
20
|
function normalizeDiscordNameEntry(entry) {
|
|
21
21
|
const text = entry.trim();
|
|
22
22
|
if (!text || text === "*" || normalizeDiscordIdEntry(text) || /#\d{4}$/.test(text)) return null;
|
|
23
|
-
|
|
24
|
-
return typeof nameSlug === "string" && nameSlug ? nameSlug : null;
|
|
23
|
+
return normalizeDiscordNameSubject(text);
|
|
25
24
|
}
|
|
26
25
|
function normalizeDiscordTagEntry(entry) {
|
|
27
26
|
const text = entry.trim();
|