diff --git a/assets/openapi.json b/assets/openapi.json index e8a028457..4c045736a 100644 Binary files a/assets/openapi.json and b/assets/openapi.json differ diff --git a/assets/schemas.json b/assets/schemas.json index 04c160a2f..5b8ea8d74 100644 Binary files a/assets/schemas.json and b/assets/schemas.json differ diff --git a/src/api/routes/interactions/#interaction_id/#interaction_token/callback.ts b/src/api/routes/interactions/#interaction_id/#interaction_token/callback.ts index 8a785ac73..3be078ed6 100644 --- a/src/api/routes/interactions/#interaction_id/#interaction_token/callback.ts +++ b/src/api/routes/interactions/#interaction_id/#interaction_token/callback.ts @@ -20,6 +20,7 @@ import { ButtonStyle, InteractionCallbackSchema, InteractionCallbackType, Messag import { route } from "@spacebar/api"; import { Request, Response, Router } from "express"; import { emitEvent, FieldErrors, InteractionSuccessEvent, Message, MessageCreateEvent, pendingInteractions, User } from "@spacebar/util"; +import { sendMessage } from "../../../../util/handlers/Message"; const router = Router({ mergeParams: true }); @@ -95,11 +96,11 @@ router.post("/", route({}), async (req: Request, res: Response) => { // TODO break; case InteractionCallbackType.CHANNEL_MESSAGE_WITH_SOURCE: { - const message = await Message.createWithDefaults({ + const user = await User.findOneOrFail({ where: { id: interaction.userId } }); + await sendMessage({ type: MessageType.APPLICATION_COMMAND, timestamp: new Date(), application_id: interaction.applicationId, - guild_id: interaction.guildId, channel_id: interaction.channelId, author_id: interaction.applicationId, content: body.data.content, @@ -115,11 +116,13 @@ router.post("/", route({}), async (req: Request, res: Response) => { id: interactionId, name: interaction.commandName, type: 2, + user, }, interaction_metadata: { id: interactionId, type: 2, user_id: interaction.userId, + user, authorizing_integration_owners: { "1": interaction.userId, }, @@ -128,53 +131,6 @@ router.post("/", route({}), async (req: Request, res: Response) => { }, }); - const user = await User.findOneOrFail({ where: { id: interaction.userId } }); - - // Don't save messages with ephemeral flag (64) set - if ((message.flags & (1 << 6)) == 0) { - message.save(); - } - - emitEvent({ - event: "MESSAGE_CREATE", - ...((message.flags & (1 << 6)) === 0 ? { channel_id: interaction.channelId } : { user_id: interaction.userId }), - data: { - application_id: interaction.applicationId, - attachments: message.attachments, - author: message.author?.toPublicUser(), - channel_id: message.channel_id, - channel_type: 0, - components: message.components, - content: message.content, - edited_timestamp: null, - embeds: message.embeds, - flags: message.flags, - id: message.id, - interaction: { - id: interactionId, - name: interaction.commandName, - type: interaction.type, - user, - }, - interaction_metadata: { - authorizing_integration_owners: { "1": interaction.userId }, - command_type: interaction.commandType, - id: interactionId, - name: interaction.commandName, - type: interaction.type, - user, - }, - mention_everyone: false, - mentions: [], - nonce: interaction.nonce, - pinned: false, - position: 0, - timestamp: message.timestamp, - tss: message.tts, - type: message.type, - webhook_id: interaction.applicationId, - } as MessageCreateSchema, - } as MessageCreateEvent); break; } case InteractionCallbackType.DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE: diff --git a/src/api/util/handlers/Message.ts b/src/api/util/handlers/Message.ts index 6ba669859..1c1c29d93 100644 --- a/src/api/util/handlers/Message.ts +++ b/src/api/util/handlers/Message.ts @@ -501,6 +501,7 @@ export async function postHandleMessage(message: Message) { console.error(`[Embeds] Error while generating embed for ${link}`, e); } } + const ephermal = (message.flags & (1 << 6)) !== 0; await Promise.all([ emitEvent({ @@ -508,7 +509,7 @@ export async function postHandleMessage(message: Message) { channel_id: message.channel_id, data, } as MessageUpdateEvent), - Message.update({ id: message.id, channel_id: message.channel_id }, { embeds: data.embeds }), + ephermal ? null : Message.update({ id: message.id, channel_id: message.channel_id }, { embeds: data.embeds }), ...cachePromises, ]); } @@ -516,11 +517,12 @@ export async function postHandleMessage(message: Message) { export async function sendMessage(opts: MessageOptions) { const message = await handleMessage({ ...opts, timestamp: new Date() }); + const ephermal = (message.flags & (1 << 6)) !== 0; await Promise.all([ - Message.insert(message), + ephermal ? null : Message.insert(message), emitEvent({ event: "MESSAGE_CREATE", - channel_id: opts.channel_id, + ...(ephermal ? { user_id: message.interaction_metadata?.user_id } : { channel_id: message.channel_id }), data: message.toJSON(), } as MessageCreateEvent), ]); diff --git a/src/schemas/uncategorised/MessageCreateSchema.ts b/src/schemas/uncategorised/MessageCreateSchema.ts index e7592d036..4d32eadc8 100644 --- a/src/schemas/uncategorised/MessageCreateSchema.ts +++ b/src/schemas/uncategorised/MessageCreateSchema.ts @@ -89,6 +89,7 @@ interface MessageInteractionSchema { command_type?: ApplicationCommandType; ephemerality_reason?: number; user?: PublicUser; // It has to be optional cause LSP gives an errors for some reason + user_id?: string; authorizing_integration_owners?: object; // It has to be optional cause LSP gives an errors for some reason original_response_message_id?: Snowflake; interacted_message_id?: Snowflake;