summary refs log tree commit diff
path: root/src/util
diff options
context:
space:
mode:
authorMathMan05 <mathmanrm@gmail.com>2026-02-26 14:51:11 -0600
committerRory& <root@rory.gay>2026-03-20 16:31:32 +0100
commit2ff656ef03a69bde06475f314002f6b20ad79dce (patch)
tree04e656997980b4792b7afc7c9fb5ebcfdba7e1e1 /src/util
parentmaybe processing media? (diff)
downloadserver-ts-2ff656ef03a69bde06475f314002f6b20ad79dce.tar.xz
sign 'em
Diffstat (limited to 'src/util')
-rw-r--r--src/util/entities/Message.ts62
1 files changed, 61 insertions, 1 deletions
diff --git a/src/util/entities/Message.ts b/src/util/entities/Message.ts

index 05e7dea5..cd89c6e2 100644 --- a/src/util/entities/Message.ts +++ b/src/util/entities/Message.ts
@@ -29,7 +29,18 @@ import { Webhook } from "./Webhook"; import { Sticker } from "./Sticker"; import { Attachment } from "./Attachment"; import { NewUrlUserSignatureData } from "../Signing"; -import { ApplicationCommandType, BaseMessageComponents, Embed, MessageSnapshot, MessageType, PartialMessage, Poll, Reaction } from "@spacebar/schemas"; +import { + ApplicationCommandType, + BaseMessageComponents, + Embed, + MessageComponentType, + MessageSnapshot, + MessageType, + PartialMessage, + Poll, + Reaction, + UnfurledMediaItem, +} from "@spacebar/schemas"; import { MessageFlags } from "@spacebar/util"; import { JsonRemoveEmpty } from "../util/Decorators"; @@ -304,6 +315,55 @@ export class Message extends BaseClass { attachments: this.attachments?.map((attachment: Attachment) => Attachment.prototype.signUrls.call(attachment, data)), }; } + async withSignedComponents(data: NewUrlUserSignatureData) { + if (!this.components || !(this.flags & Number(MessageFlags.FLAGS.IS_COMPONENTS_V2))) return { ...this }; + function signMedia(media: UnfurledMediaItem) { + Object.assign(media, Attachment.prototype.signUrls.call(media, data)); + } + return { + ...this, + components: this.components.map((comp) => { + comp = structuredClone(comp); + if (comp.type === MessageComponentType.Section) { + const accessory = comp.accessory; + if (accessory.type === MessageComponentType.Thumbnail) { + signMedia(accessory.media); + } + } else if (comp.type === MessageComponentType.MediaGallery) { + comp.items.forEach(({ media }) => signMedia(media)); + } else if (comp.type === MessageComponentType.File) { + signMedia(comp.file); + } else if (comp.type === MessageComponentType.Container) { + for (const elm of comp.components) { + switch (elm.type) { + case MessageComponentType.Separator: + case MessageComponentType.TextDisplay: + case MessageComponentType.ActionRow: + break; + case MessageComponentType.Section: { + const accessory = elm.accessory; + if (accessory.type === MessageComponentType.Thumbnail) { + signMedia(accessory.media); + } + break; + } + case MessageComponentType.MediaGallery: + elm.items.forEach(({ media }) => signMedia(media)); + break; + case MessageComponentType.File: { + signMedia(elm.file); + break; + } + + default: + elm satisfies never; + } + } + } + return comp; + }), + }; + } static async createWithDefaults(opts: Partial<Message>): Promise<Message> { const message = Message.create();