






















@@ -1,4 +1,9 @@
1-import { MessageReferenceType, StickerFormatType } from "discord-api-types/v10";
1+import {
2+ComponentType,
3+MessageFlags,
4+MessageReferenceType,
5+StickerFormatType,
6+} from "discord-api-types/v10";
27import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
38import { ChannelType, type Client, type Message } from "../internal/discord.js";
49@@ -137,6 +142,7 @@ function asForwardedSnapshotMessage(params: {
137142138143function asReferencedForwardMessage(params: {
139144content?: string;
145+components?: Array<Record<string, unknown>>;
140146embeds?: Array<{ title?: string; description?: string }>;
141147attachments?: Array<Record<string, unknown>>;
142148messageReferenceType?: MessageReferenceType;
@@ -152,8 +158,10 @@ function asReferencedForwardMessage(params: {
152158id: "m0",
153159channelId: "c1",
154160content: params.content ?? "",
161+components: params.components ?? [],
155162attachments: params.attachments ?? [],
156163embeds: params.embeds ?? [],
164+flags: params.components ? MessageFlags.IsComponentsV2 : 0,
157165stickers: [],
158166author: {
159167id: "u2",
@@ -980,6 +988,46 @@ describe("resolveDiscordMessageText", () => {
980988expect(text).toBe("Breaking");
981989});
982990991+it("uses Components v2 text display content when normal message text is empty", () => {
992+const text = resolveDiscordMessageText(
993+asMessage({
994+content: "",
995+flags: MessageFlags.IsComponentsV2,
996+components: [
997+{
998+type: ComponentType.Container,
999+components: [
1000+{ type: ComponentType.TextDisplay, content: "Component headline" },
1001+{
1002+type: ComponentType.Section,
1003+components: [{ type: ComponentType.TextDisplay, content: "Component body" }],
1004+accessory: { type: ComponentType.Thumbnail, media: { url: "attachment://x.png" } },
1005+},
1006+],
1007+},
1008+],
1009+}),
1010+);
1011+1012+expect(text).toBe("Component headline\nComponent body");
1013+});
1014+1015+it("uses Components v2 text display content from referenced reply messages", () => {
1016+const text = resolveDiscordMessageText(
1017+asReferencedForwardMessage({
1018+components: [
1019+{
1020+type: ComponentType.Container,
1021+components: [{ type: ComponentType.TextDisplay, content: "Referenced component text" }],
1022+},
1023+],
1024+messageReferenceType: MessageReferenceType.Default,
1025+}).referencedMessage!,
1026+);
1027+1028+expect(text).toBe("Referenced component text");
1029+});
1030+9831031it("uses embed description when content is empty", () => {
9841032const text = resolveDiscordMessageText(
9851033asMessage({
@@ -1025,6 +1073,42 @@ describe("resolveDiscordMessageText", () => {
10251073expect(text).toContain("[Forwarded message from @Bob]");
10261074expect(text).toContain("Forwarded title\nForwarded details");
10271075});
1076+1077+it("includes Components v2 text display content from forwarded snapshots", () => {
1078+const text = resolveDiscordMessageText(
1079+asMessage({
1080+content: "",
1081+rawData: {
1082+message_snapshots: [
1083+{
1084+message: {
1085+content: "",
1086+embeds: [],
1087+attachments: [],
1088+components: [
1089+{
1090+type: ComponentType.Container,
1091+components: [
1092+{ type: ComponentType.TextDisplay, content: "Forwarded component text" },
1093+],
1094+},
1095+],
1096+author: {
1097+id: "u2",
1098+username: "Bob",
1099+discriminator: "0",
1100+},
1101+},
1102+},
1103+],
1104+},
1105+}),
1106+{ includeForwarded: true },
1107+);
1108+1109+expect(text).toContain("[Forwarded message from @Bob]");
1110+expect(text).toContain("Forwarded component text");
1111+});
10281112});
1029111310301114describe("resolveDiscordChannelInfo", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。