
























@@ -0,0 +1,106 @@
1+import type { APIAttachment, APIStickerItem } from "discord-api-types/v10";
2+import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
3+import type { Message } from "../internal/discord.js";
4+5+export type DiscordSnapshotAuthor = {
6+id?: string | null;
7+username?: string | null;
8+discriminator?: string | null;
9+global_name?: string | null;
10+name?: string | null;
11+};
12+13+export type DiscordSnapshotMessage = {
14+content?: string | null;
15+embeds?: Array<{ description?: string | null; title?: string | null }> | null;
16+attachments?: APIAttachment[] | null;
17+stickers?: APIStickerItem[] | null;
18+sticker_items?: APIStickerItem[] | null;
19+author?: DiscordSnapshotAuthor | null;
20+};
21+22+export type DiscordMessageSnapshot = {
23+message?: DiscordSnapshotMessage | null;
24+};
25+26+const FORWARD_MESSAGE_REFERENCE_TYPE = 1;
27+28+export function normalizeDiscordStickerItems(value: unknown): APIStickerItem[] {
29+if (!Array.isArray(value)) {
30+return [];
31+}
32+return value.filter(
33+(entry): entry is APIStickerItem =>
34+Boolean(entry) &&
35+typeof entry === "object" &&
36+typeof (entry as { id?: unknown }).id === "string" &&
37+typeof (entry as { name?: unknown }).name === "string",
38+);
39+}
40+41+export function resolveDiscordMessageStickers(message: Message): APIStickerItem[] {
42+const stickers = (message as { stickers?: unknown }).stickers;
43+const normalized = normalizeDiscordStickerItems(stickers);
44+if (normalized.length > 0) {
45+return normalized;
46+}
47+const rawData = (message as { rawData?: { sticker_items?: unknown; stickers?: unknown } })
48+.rawData;
49+return normalizeDiscordStickerItems(rawData?.sticker_items ?? rawData?.stickers);
50+}
51+52+export function resolveDiscordSnapshotStickers(snapshot: DiscordSnapshotMessage): APIStickerItem[] {
53+return normalizeDiscordStickerItems(snapshot.stickers ?? snapshot.sticker_items);
54+}
55+56+export function hasDiscordMessageStickers(message: Message): boolean {
57+return resolveDiscordMessageStickers(message).length > 0;
58+}
59+60+export function resolveDiscordMessageSnapshots(message: Message): DiscordMessageSnapshot[] {
61+const rawData = (message as { rawData?: { message_snapshots?: unknown } }).rawData;
62+return normalizeDiscordMessageSnapshots(
63+rawData?.message_snapshots ??
64+(message as { message_snapshots?: unknown }).message_snapshots ??
65+(message as { messageSnapshots?: unknown }).messageSnapshots,
66+);
67+}
68+69+export function normalizeDiscordMessageSnapshots(snapshots: unknown): DiscordMessageSnapshot[] {
70+if (!Array.isArray(snapshots)) {
71+return [];
72+}
73+return snapshots.filter(
74+(entry): entry is DiscordMessageSnapshot => Boolean(entry) && typeof entry === "object",
75+);
76+}
77+78+export function resolveDiscordReferencedForwardMessage(message: Message): Message | null {
79+const referenceType = message.messageReference?.type;
80+return Number(referenceType) === FORWARD_MESSAGE_REFERENCE_TYPE
81+ ? message.referencedMessage
82+ : null;
83+}
84+85+export function formatDiscordSnapshotAuthor(
86+author: DiscordSnapshotAuthor | null | undefined,
87+): string | undefined {
88+if (!author) {
89+return undefined;
90+}
91+const globalName = normalizeOptionalString(author.global_name) ?? undefined;
92+const username = normalizeOptionalString(author.username) ?? undefined;
93+const name = normalizeOptionalString(author.name) ?? undefined;
94+const discriminator = normalizeOptionalString(author.discriminator) ?? undefined;
95+const base = globalName || username || name;
96+if (username && discriminator && discriminator !== "0") {
97+return `@${username}#${discriminator}`;
98+}
99+if (base) {
100+return `@${base}`;
101+}
102+if (author.id) {
103+return `@${author.id}`;
104+}
105+return undefined;
106+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。