diff --git a/server/api/messages/[instanceId]/[chatId]/send.post.ts b/server/api/messages/[instanceId]/[chatId]/send.post.ts index a4de526..728daef 100644 --- a/server/api/messages/[instanceId]/[chatId]/send.post.ts +++ b/server/api/messages/[instanceId]/[chatId]/send.post.ts @@ -6,6 +6,7 @@ * - Stickers: image converted to WebP (FormData with asSticker flag) */ import type { AnyMediaMessageContent } from '@whiskeysockets/baileys' +import { generateWAMessageFromContent, proto } from '@whiskeysockets/baileys' import { query } from '../../../../utils/database' import { baileysManager } from '../../../../services/baileys/manager' import { convertToSticker, canConvertToSticker } from '../../../../services/media/sticker-processor' @@ -358,6 +359,8 @@ async function handlePollMessage( /** * Handle event message sending + * Note: Baileys' sendMessage doesn't handle 'event' type directly, + * so we build the proto message manually and use relayMessage */ async function handleEventMessage( body: EventMessageBody, @@ -375,33 +378,48 @@ async function handleEventMessage( throw createError({ statusCode: 400, message: 'Event start date is required' }) } - const eventContent: any = { + // Build the eventMessage proto directly + const eventMessage: proto.Message.IEventMessage = { name: body.name, - startDate: new Date(body.startDate) + startTime: Math.floor(new Date(body.startDate).getTime() / 1000), + description: body.description || undefined, + extraGuestsAllowed: true } if (body.endDate) { - eventContent.endDate = new Date(body.endDate) + eventMessage.endTime = Math.floor(new Date(body.endDate).getTime() / 1000) } - if (body.description) { - eventContent.description = body.description - } - - if (body.location) { - if (body.location.latitude && body.location.longitude) { - eventContent.location = { - degreesLatitude: body.location.latitude, - degreesLongitude: body.location.longitude, - name: body.location.name, - address: body.location.address - } + if (body.location && body.location.latitude && body.location.longitude) { + eventMessage.location = { + degreesLatitude: body.location.latitude, + degreesLongitude: body.location.longitude, + name: body.location.name || undefined, + address: body.location.address || undefined } } - const content = { event: eventContent } + // Create the message content with eventMessage + const messageContent: proto.IMessage = { + eventMessage + } - const result = await socket.sendMessage(jid, content, options) + // Generate the full WAMessage using generateWAMessageFromContent + const userJid = socket.user?.id + const generatedMessage = generateWAMessageFromContent( + jid, + messageContent, + { + userJid, + quoted: options.quoted, + timestamp: new Date() + } + ) + + // Use relayMessage to send the pre-built message + await socket.relayMessage(jid, generatedMessage.message!, { + messageId: generatedMessage.key.id + }) // Save to database await query( @@ -413,7 +431,7 @@ async function handleEventMessage( [ instanceId, chatId, - result.key.id, + generatedMessage.key.id, 'me', true, 'event', @@ -425,7 +443,7 @@ async function handleEventMessage( location: body.location }), 'sent', - JSON.stringify(result), + JSON.stringify(generatedMessage), body.quotedMessageId || null ] ) @@ -437,7 +455,7 @@ async function handleEventMessage( return { success: true, - messages: [{ messageId: result.key.id, type: 'event' }] + messages: [{ messageId: generatedMessage.key.id, type: 'event' }] } }