summary refs log tree commit diff
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-03-06 22:50:26 +0100
committerRory& <root@rory.gay>2026-03-06 22:50:26 +0100
commit7001a4c3829db3c1f91ab24635bedd671f301fd9 (patch)
treec9ff1a533cbb49961c532c6366a589fe52da4020
parenttemp hack: ...and dont forget to save it (diff)
downloadserver-ts-7001a4c3829db3c1f91ab24635bedd671f301fd9.tar.xz
[cherry/1518] Webhooks: respect thread_id parameter
-rw-r--r--src/api/util/handlers/Webhook.ts25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/api/util/handlers/Webhook.ts b/src/api/util/handlers/Webhook.ts

index fe144171..439edbb2 100644 --- a/src/api/util/handlers/Webhook.ts +++ b/src/api/util/handlers/Webhook.ts
@@ -1,5 +1,5 @@ import { handleMessage, postHandleMessage } from "@spacebar/api"; -import { Attachment, Config, DiscordApiErrors, emitEvent, FieldErrors, Message, MessageCreateEvent, uploadFile, ValidateName, Webhook } from "@spacebar/util"; +import { Attachment, Channel, Config, DiscordApiErrors, emitEvent, FieldErrors, Message, MessageCreateEvent, uploadFile, ValidateName, Webhook } from "@spacebar/util"; import { Request, Response } from "express"; import { HTTPError } from "lambert-server"; import { MoreThan } from "typeorm"; @@ -35,6 +35,7 @@ export const executeWebhook = async (req: Request, res: Response) => { } const wait = req.query.wait === "true"; + const thread_id = typeof req.query.thread_id === "string" ? req.query.thread_id : undefined; if (!wait) { res.status(204).send(); @@ -52,7 +53,7 @@ export const executeWebhook = async (req: Request, res: Response) => { // TODO: creating messages by users checks if the user can bypass rate limits, we cant do that on webhooks, but maybe we could check the application if there is one? const limits = Config.get().limits; - if (limits.absoluteRate.register.enabled) { + if (limits.absoluteRate.sendMessage.enabled) { const count = await Message.count({ where: { channel_id: webhook.channel_id, @@ -73,10 +74,20 @@ export const executeWebhook = async (req: Request, res: Response) => { } } + let sendChannel = webhook.channel; + if (thread_id) { + sendChannel = await Channel.findOneOrFail({ + where: { + id: thread_id, + parent_id: webhook.channel.id, + }, + }); + } + const files = (req.files as Express.Multer.File[]) ?? []; for (const currFile of files) { try { - const file = await uploadFile(`/attachments/${webhook.channel.id}`, currFile); + const file = await uploadFile(`/attachments/${sendChannel.id}`, currFile); attachments.push(Attachment.create({ ...file, proxy_url: file.url })); } catch (error) { if (wait) res.status(400).json({ message: error?.toString() }); @@ -95,7 +106,7 @@ export const executeWebhook = async (req: Request, res: Response) => { application_id: webhook.application?.id, embeds, // TODO: Support thread_id/thread_name once threads are implemented - channel_id: webhook.channel_id, + channel_id: sendChannel.id, attachments, timestamp: new Date(), }); @@ -104,14 +115,14 @@ export const executeWebhook = async (req: Request, res: Response) => { //@ts-ignore dont care2 message.edited_timestamp = null; - webhook.channel.last_message_id = message.id; + sendChannel.last_message_id = message.id; await Promise.all([ message.save(), - webhook.channel.save(), + sendChannel.save(), emitEvent({ event: "MESSAGE_CREATE", - channel_id: webhook.channel_id, + channel_id: sendChannel.id, data: message, } as MessageCreateEvent), ]);