summary refs log tree commit diff
diff options
context:
space:
mode:
authorOh64 <contact@oh64.moe>2026-03-11 03:23:51 +0100
committerRory& <root@rory.gay>2026-03-21 08:27:57 +0100
commit7a92946bed3d7d1ec6c488d86093b91527905b25 (patch)
tree40adff1ba7d67dd0b3470e9e6b4860303d2c96f5
parentAdd WIP PublicMessage schema (diff)
downloadserver-ts-github/dev/emma/as-to-satisfies-gw.tar.xz
-rw-r--r--src/api/routes/channels/#channel_id/greet.ts5
-rw-r--r--src/api/routes/channels/#channel_id/messages/#message_id/index.ts26
-rw-r--r--src/api/routes/channels/#channel_id/messages/index.ts23
-rw-r--r--src/api/routes/channels/#channel_id/messages/pins/index.ts13
-rw-r--r--src/api/routes/channels/#channel_id/pins.ts13
-rw-r--r--src/api/routes/channels/#channel_id/post-data.ts4
-rw-r--r--src/api/routes/channels/#channel_id/threads.ts13
-rw-r--r--src/api/routes/channels/preload-messages.ts4
-rw-r--r--src/api/util/handlers/Message.ts8
-rw-r--r--src/api/util/handlers/Webhook.ts13
-rw-r--r--src/util/entities/Member.ts5
-rw-r--r--src/util/entities/Message.ts14
12 files changed, 91 insertions, 50 deletions
diff --git a/src/api/routes/channels/#channel_id/greet.ts b/src/api/routes/channels/#channel_id/greet.ts

index 8dbaacdc..37fd5589 100644 --- a/src/api/routes/channels/#channel_id/greet.ts +++ b/src/api/routes/channels/#channel_id/greet.ts
@@ -90,11 +90,12 @@ router.post( channel.last_message_id = message.id; + await message.save(); + const publicMsg = message.toJSON(); await Promise.all([ - message.save(), emitEvent({ event: "MESSAGE_CREATE", - data: message, + data: publicMsg, channel_id, } satisfies MessageCreateEvent), channel.save(), diff --git a/src/api/routes/channels/#channel_id/messages/#message_id/index.ts b/src/api/routes/channels/#channel_id/messages/#message_id/index.ts
index e69818b1..32f51bea 100644 --- a/src/api/routes/channels/#channel_id/messages/#message_id/index.ts +++ b/src/api/routes/channels/#channel_id/messages/#message_id/index.ts
@@ -100,18 +100,15 @@ router.patch( edited_timestamp: new Date(), }); - await Promise.all([ - new_message.save(), - await emitEvent({ - event: "MESSAGE_UPDATE", - channel_id, - data: { - ...new_message.toJSON(), - nonce: undefined, - member: new_message.member?.toPublicMember(), - }, - } satisfies MessageUpdateEvent), - ]); + await new_message.save(); + await emitEvent({ + event: "MESSAGE_UPDATE", + channel_id, + data: { + ...new_message.toJSON(), + nonce: undefined, + }, + } satisfies MessageUpdateEvent); postHandleMessage(new_message).catch((e) => console.error("[Message] post-message handler failed", e)); @@ -221,12 +218,13 @@ router.put( //Fix for the client bug delete message.member; + await message.save(); + const publicMsg = message.toJSON(); await Promise.all([ - message.save(), emitEvent({ event: "MESSAGE_CREATE", channel_id: channel_id, - data: message, + data: publicMsg, } satisfies MessageCreateEvent), channel.save(), ]); diff --git a/src/api/routes/channels/#channel_id/messages/index.ts b/src/api/routes/channels/#channel_id/messages/index.ts
index c96715bc..ca3db013 100644 --- a/src/api/routes/channels/#channel_id/messages/index.ts +++ b/src/api/routes/channels/#channel_id/messages/index.ts
@@ -54,6 +54,8 @@ import { MessageCreateAttachment, MessageCreateCloudAttachment, MessageCreateSchema, + PartialUser, + PublicMessage, Reaction, ReadStateType, RelationshipType, @@ -178,8 +180,8 @@ router.get( await Message.fillReplies(messages); const endpoint = Config.get().cdn.endpointPublic; - const ret = messages.map((x: Message) => { - x = x.toJSON(); + const ret = messages.map((msg) => { + const x = msg.toJSON(); (x.reactions || []).forEach((y: Partial<Reaction>) => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -188,12 +190,13 @@ router.get( delete y.user_ids; }); if (!x.author) - x.author = User.create({ + x.author = { id: "4", discriminator: "0000", username: "Spacebar Ghost", public_flags: 0, - }); + avatar: null, + } as PartialUser; x.attachments?.forEach((y: Attachment) => { // dynamically set attachment proxy_url in case the endpoint changed const uri = y.proxy_url.startsWith("http") ? y.proxy_url : `https://example.org${y.proxy_url}`; @@ -243,11 +246,15 @@ router.get( }); //console.log(ret); + type MessageWithInteraction = PublicMessage & { + interaction_metadata?: { user?: User; user_id: string }; + interaction?: { user?: User }; + }; await Promise.all( - ret - .filter((x: MessageCreateSchema) => x.interaction_metadata && !x.interaction_metadata.user) - .map(async (x: MessageCreateSchema) => { - x.interaction_metadata!.user = x.interaction!.user = await User.findOneOrFail({ where: { id: (x as Message).interaction_metadata!.user_id } }); + (ret as MessageWithInteraction[]) + .filter((x) => x.interaction_metadata && !x.interaction_metadata.user) + .map(async (x) => { + x.interaction_metadata!.user = x.interaction!.user = await User.findOneOrFail({ where: { id: x.interaction_metadata!.user_id } }); }), ); diff --git a/src/api/routes/channels/#channel_id/messages/pins/index.ts b/src/api/routes/channels/#channel_id/messages/pins/index.ts
index f9e4b697..e72352cb 100644 --- a/src/api/routes/channels/#channel_id/messages/pins/index.ts +++ b/src/api/routes/channels/#channel_id/messages/pins/index.ts
@@ -80,12 +80,14 @@ router.put( mention_everyone: false, }); + await message.save(); + const publicMsg = message.toJSON(); + const publicSystem = systemPinMessage.toJSON(); await Promise.all([ - message.save(), emitEvent({ event: "MESSAGE_UPDATE", channel_id, - data: message, + data: publicMsg, } satisfies MessageUpdateEvent), emitEvent({ event: "CHANNEL_PINS_UPDATE", @@ -100,7 +102,7 @@ router.put( emitEvent({ event: "MESSAGE_CREATE", channel_id: message.channel_id, - data: systemPinMessage, + data: publicSystem, } satisfies MessageCreateEvent), ]); @@ -133,12 +135,13 @@ router.delete( message.pinned_at = null; + await message.save(); + const publicMsg2 = message.toJSON(); await Promise.all([ - message.save(), emitEvent({ event: "MESSAGE_UPDATE", channel_id, - data: message, + data: publicMsg2, } satisfies MessageUpdateEvent), emitEvent({ event: "CHANNEL_PINS_UPDATE", diff --git a/src/api/routes/channels/#channel_id/pins.ts b/src/api/routes/channels/#channel_id/pins.ts
index 9b515591..5105421d 100644 --- a/src/api/routes/channels/#channel_id/pins.ts +++ b/src/api/routes/channels/#channel_id/pins.ts
@@ -81,12 +81,14 @@ router.put( mention_everyone: false, }); + await message.save(); + const publicMsg = message.toJSON(); + const publicSystem = systemPinMessage.toJSON(); await Promise.all([ - message.save(), emitEvent({ event: "MESSAGE_UPDATE", channel_id, - data: message, + data: publicMsg, } satisfies MessageUpdateEvent), emitEvent({ event: "CHANNEL_PINS_UPDATE", @@ -101,7 +103,7 @@ router.put( emitEvent({ event: "MESSAGE_CREATE", channel_id: message.channel_id, - data: systemPinMessage, + data: publicSystem, } satisfies MessageCreateEvent), ]); @@ -134,12 +136,13 @@ router.delete( message.pinned_at = null; + await message.save(); + const publicMsg2 = message.toJSON(); await Promise.all([ - message.save(), emitEvent({ event: "MESSAGE_UPDATE", channel_id, - data: message, + data: publicMsg2, } satisfies MessageUpdateEvent), emitEvent({ event: "CHANNEL_PINS_UPDATE", diff --git a/src/api/routes/channels/#channel_id/post-data.ts b/src/api/routes/channels/#channel_id/post-data.ts
index d37344a9..79d02863 100644 --- a/src/api/routes/channels/#channel_id/post-data.ts +++ b/src/api/routes/channels/#channel_id/post-data.ts
@@ -18,7 +18,7 @@ import { route } from "@spacebar/api"; import { Channel, Member, Message } from "@spacebar/util"; -import { PostDataSchema } from "@spacebar/schemas"; +import { PostDataSchema, PublicMessage } from "@spacebar/schemas"; import { Request, Response, Router } from "express"; import { messageUpload } from "./messages"; @@ -83,7 +83,7 @@ router.post( }), ]); await Message.fillReplies(messages); - const objRet: { threads: Record<string, { first_message: null | Message; owner: null | Member }> } = { threads: {} }; + const objRet: { threads: Record<string, { first_message: null | PublicMessage; owner: null | Member }> } = { threads: {} }; for (const thread of threads) { const owner = members.find(({ id }) => id === thread.owner_id)?.toJSON() || null; const first_message = messages.find(({ channel_id }) => channel_id === thread.id)?.toJSON() || null; diff --git a/src/api/routes/channels/#channel_id/threads.ts b/src/api/routes/channels/#channel_id/threads.ts
index 26a19030..2af92f53 100644 --- a/src/api/routes/channels/#channel_id/threads.ts +++ b/src/api/routes/channels/#channel_id/threads.ts
@@ -147,8 +147,17 @@ router.post( } } const embeds = body.message.embeds || []; - const message = await handleMessage({ + const bodyMsg = { ...body.message, + allowed_mentions: body.message.allowed_mentions + ? { + ...body.message.allowed_mentions, + parse: body.message.allowed_mentions.parse as ("users" | "roles" | "everyone")[], + } + : undefined, + } as Parameters<typeof handleMessage>[0]; + const message = await handleMessage({ + ...bodyMsg, id: thread.id, type: 0, pinned: false, @@ -189,7 +198,7 @@ router.post( emitEvent({ event: "MESSAGE_CREATE", channel_id: channel_id, - data: message, + data: message.toJSON(), } satisfies MessageCreateEvent), message.guild_id ? Member.update({ id: req.user_id, guild_id: message.guild_id }, { last_message_id: message.id }) : null, ]); diff --git a/src/api/routes/channels/preload-messages.ts b/src/api/routes/channels/preload-messages.ts
index 09743cc7..f14b387b 100644 --- a/src/api/routes/channels/preload-messages.ts +++ b/src/api/routes/channels/preload-messages.ts
@@ -58,11 +58,9 @@ router.post( const filteredMessages = messages.map((message) => { const x = message.toJSON(); // https://docs.discord.food/resources/message#preload-messages - reactions are not included in the response - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error x.reactions = undefined; return x; - }) as PreloadMessagesResponseSchema; + }) as unknown as PreloadMessagesResponseSchema; return res.status(200).send(filteredMessages); }, diff --git a/src/api/util/handlers/Message.ts b/src/api/util/handlers/Message.ts
index a21149ca..ed41341e 100644 --- a/src/api/util/handlers/Message.ts +++ b/src/api/util/handlers/Message.ts
@@ -69,6 +69,7 @@ import { UnfurledMediaItem, BaseMessageComponents, v1CompTypes, + PartialUser } from "@spacebar/schemas"; const allow_empty = false; // TODO: check webhook, application, system author, stickers @@ -830,12 +831,13 @@ export async function postHandleMessage(message: Message) { if (data.embeds != undefined) { data.embeds = data.embeds?.filter((embed) => embed.type === "rich"); } + // author value is already included in message.toJSON() const event = { event: "MESSAGE_UPDATE", channel_id: message.channel_id, data: { - ...data, - author, + ...message.toJSON(), + embeds: data.embeds == undefined ? message.embeds || [] : data.embeds, }, } satisfies MessageUpdateEvent; const embeds = data.embeds == undefined ? [] : data.embeds; @@ -900,7 +902,7 @@ export async function postHandleMessage(message: Message) { emitEvent({ event: "MESSAGE_UPDATE", channel_id: message.channel_id, - data, + data: message.toJSON(), } satisfies MessageUpdateEvent), Message.update({ id: message.id, channel_id: message.channel_id }, { embeds: embeds }), ...cachePromises, diff --git a/src/api/util/handlers/Webhook.ts b/src/api/util/handlers/Webhook.ts
index b6a390a5..deb0331f 100644 --- a/src/api/util/handlers/Webhook.ts +++ b/src/api/util/handlers/Webhook.ts
@@ -96,8 +96,17 @@ export const executeWebhook = async (req: Request, res: Response) => { } const embeds = body.embeds || []; - const message = await handleMessage({ + const bodyMsg = { ...body, + allowed_mentions: body.allowed_mentions + ? { + ...body.allowed_mentions, + parse: body.allowed_mentions.parse as ("users" | "roles" | "everyone")[], + } + : undefined, + } as Parameters<typeof handleMessage>[0]; + const message = await handleMessage({ + ...bodyMsg, username: body.username || webhook.name, avatar_url: body.avatar_url || webhook.avatar, type: 0, @@ -123,7 +132,7 @@ export const executeWebhook = async (req: Request, res: Response) => { emitEvent({ event: "MESSAGE_CREATE", channel_id: sendChannel.id, - data: message, + data: message.toJSON(), } satisfies MessageCreateEvent), ]); diff --git a/src/util/entities/Member.ts b/src/util/entities/Member.ts
index f372277e..00ac3a35 100644 --- a/src/util/entities/Member.ts +++ b/src/util/entities/Member.ts
@@ -442,12 +442,13 @@ export class Member extends BaseClassWithoutId { channel.last_message_id = message.id; + await message.save(); + const publicMsg = message.toJSON(); await Promise.all([ - message.save(), emitEvent({ event: "MESSAGE_CREATE", channel_id: message.channel_id, - data: message, + data: publicMsg, } satisfies MessageCreateEvent), channel.save(), ]); diff --git a/src/util/entities/Message.ts b/src/util/entities/Message.ts
index 9649447c..b343a0cc 100644 --- a/src/util/entities/Message.ts +++ b/src/util/entities/Message.ts
@@ -36,6 +36,7 @@ import { MessageComponentType, MessageSnapshot, MessageType, PartialMessage, Poll, PublicMessage, Reaction, UnfurledMediaItem, } from "@spacebar/schemas"; +import { PartialUser } from "@spacebar/schemas"; import { MessageFlags } from "@spacebar/util"; import { JsonRemoveEmpty } from "../util/Decorators"; @@ -251,15 +252,23 @@ export class Message extends BaseClass { ...this, channel_id: this.channel_id ?? this.channel.id, channel: undefined, + + timestamp: this.timestamp.toISOString(), + edited_timestamp: this.edited_timestamp ? this.edited_timestamp.toISOString() : null, + author_id: undefined, member_id: undefined, webhook_id: this.webhook_id ?? undefined, application_id: undefined, mentions: this.mentions?.map((user) => { if (user && !user.toPublicUser) console.trace("toPublic user missing!!!"); - return user?.toPublicUser?.() ?? user ?? undefined; + return (user?.toPublicUser?.() ?? user ?? undefined) as unknown as PartialUser; }), + mention_roles: this.mention_roles?.map((role) => role.id) ?? [], + mention_channels: this.mention_channels?.map((ch) => ch.toJSON()) ?? [], + attachments: this.attachments ?? [], + nonce: this.nonce ?? undefined, tts: this.tts ?? false, guild: this.guild ?? undefined, @@ -269,6 +278,7 @@ export class Message extends BaseClass { reactions: this.reactions ?? undefined, sticker_items: this.sticker_items ?? undefined, message_reference: this.message_reference ?? undefined, + mention_everyone: this.mention_everyone ?? false, author: { ...(this.author?.toPublicUser() ?? undefined), // Webhooks @@ -277,7 +287,7 @@ export class Message extends BaseClass { }, activity: this.activity ?? undefined, application: this.application ?? undefined, - components: this.components ?? undefined, + components: this.components ?? [], poll: this.poll ?? undefined, content: this.content ?? "", pinned: this.pinned,