






























@@ -2,17 +2,55 @@ import { parseCustomId, type ComponentParserResult } from "./internal/discord.js
2233export const DISCORD_COMPONENT_CUSTOM_ID_KEY = "occomp";
44export const DISCORD_MODAL_CUSTOM_ID_KEY = "ocmodal";
5+const ENCODED_CUSTOM_ID_VERSION = "1";
6+7+function encodeCustomIdValue(value: string): string {
8+return value.replace(/%/g, "%25").replace(/;/g, "%3B");
9+}
10+11+function needsCustomIdEncoding(value: string): boolean {
12+return /[%;]/.test(value);
13+}
14+15+function decodeCustomIdValue(value: string): string {
16+return value.replace(/%(25|3B)/gi, (match) => (match.toLowerCase() === "%25" ? "%" : ";"));
17+}
18+19+function decodeParsedCustomIdData(
20+data: ComponentParserResult["data"],
21+): ComponentParserResult["data"] {
22+if (data.e !== ENCODED_CUSTOM_ID_VERSION) {
23+return data;
24+}
25+return Object.fromEntries(
26+Object.entries(data).map(([key, value]) => [
27+key,
28+typeof value === "string" ? decodeCustomIdValue(value) : value,
29+]),
30+) as ComponentParserResult["data"];
31+}
532633export function buildDiscordComponentCustomId(params: {
734componentId: string;
835modalId?: string;
936}): string {
10-const base = `${DISCORD_COMPONENT_CUSTOM_ID_KEY}:cid=${params.componentId}`;
11-return params.modalId ? `${base};mid=${params.modalId}` : base;
37+const encoded =
38+needsCustomIdEncoding(params.componentId) || needsCustomIdEncoding(params.modalId ?? "");
39+const componentId = encoded ? encodeCustomIdValue(params.componentId) : params.componentId;
40+const base = encoded
41+ ? `${DISCORD_COMPONENT_CUSTOM_ID_KEY}:e=${ENCODED_CUSTOM_ID_VERSION};cid=${componentId}`
42+ : `${DISCORD_COMPONENT_CUSTOM_ID_KEY}:cid=${componentId}`;
43+const modalId = params.modalId;
44+if (!modalId) {
45+return base;
46+}
47+return `${base};mid=${encoded ? encodeCustomIdValue(modalId) : modalId}`;
1248}
13491450export function buildDiscordModalCustomId(modalId: string): string {
15-return `${DISCORD_MODAL_CUSTOM_ID_KEY}:mid=${modalId}`;
51+return needsCustomIdEncoding(modalId)
52+ ? `${DISCORD_MODAL_CUSTOM_ID_KEY}:e=${ENCODED_CUSTOM_ID_VERSION};mid=${encodeCustomIdValue(modalId)}`
53+ : `${DISCORD_MODAL_CUSTOM_ID_KEY}:mid=${modalId}`;
1654}
17551856export function parseDiscordComponentCustomId(
@@ -22,11 +60,12 @@ export function parseDiscordComponentCustomId(
2260if (parsed.key !== DISCORD_COMPONENT_CUSTOM_ID_KEY) {
2361return null;
2462}
25-const componentId = parsed.data.cid;
63+const data = decodeParsedCustomIdData(parsed.data);
64+const componentId = data.cid;
2665if (typeof componentId !== "string" || !componentId.trim()) {
2766return null;
2867}
29-const modalId = parsed.data.mid;
68+const modalId = data.mid;
3069return {
3170 componentId,
3271modalId: typeof modalId === "string" && modalId.trim() ? modalId : undefined,
@@ -38,7 +77,8 @@ export function parseDiscordModalCustomId(id: string): string | null {
3877if (parsed.key !== DISCORD_MODAL_CUSTOM_ID_KEY) {
3978return null;
4079}
41-const modalId = parsed.data.mid;
80+const data = decodeParsedCustomIdData(parsed.data);
81+const modalId = data.mid;
4282if (typeof modalId !== "string" || !modalId.trim()) {
4383return null;
4484}
@@ -57,7 +97,7 @@ export function parseDiscordComponentCustomIdForInteraction(id: string): Compone
5797if (parsed.key !== DISCORD_COMPONENT_CUSTOM_ID_KEY) {
5898return parsed;
5999}
60-return { key: "*", data: parsed.data };
100+return { key: "*", data: decodeParsedCustomIdData(parsed.data) };
61101}
6210263103export function parseDiscordModalCustomIdForInteraction(id: string): ComponentParserResult {
@@ -68,5 +108,5 @@ export function parseDiscordModalCustomIdForInteraction(id: string): ComponentPa
68108if (parsed.key !== DISCORD_MODAL_CUSTOM_ID_KEY) {
69109return parsed;
70110}
71-return { key: "*", data: parsed.data };
111+return { key: "*", data: decodeParsedCustomIdData(parsed.data) };
72112}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。