diff --git a/src/channels/whatsapp.test.ts b/src/channels/whatsapp.test.ts index d7d0875..5bf1893 100644 --- a/src/channels/whatsapp.test.ts +++ b/src/channels/whatsapp.test.ts @@ -87,6 +87,7 @@ vi.mock('@whiskeysockets/baileys', () => { fetchLatestWaWebVersion: vi .fn() .mockResolvedValue({ version: [2, 3000, 0] }), + normalizeMessageContent: vi.fn((content: unknown) => content), makeCacheableSignalKeyStore: vi.fn((keys: unknown) => keys), useMultiFileAuthState: vi.fn().mockResolvedValue({ state: { diff --git a/src/channels/whatsapp.ts b/src/channels/whatsapp.ts index f603025..d8b4e1e 100644 --- a/src/channels/whatsapp.ts +++ b/src/channels/whatsapp.ts @@ -8,6 +8,7 @@ import makeWASocket, { WASocket, fetchLatestWaWebVersion, makeCacheableSignalKeyStore, + normalizeMessageContent, useMultiFileAuthState, } from '@whiskeysockets/baileys'; @@ -172,6 +173,11 @@ export class WhatsAppChannel implements Channel { this.sock.ev.on('messages.upsert', async ({ messages }) => { for (const msg of messages) { if (!msg.message) continue; + // Unwrap container types (viewOnceMessageV2, ephemeralMessage, + // editedMessage, etc.) so that conversation, extendedTextMessage, + // imageMessage, etc. are accessible at the top level. + const normalized = normalizeMessageContent(msg.message); + if (!normalized) continue; const rawJid = msg.key.remoteJid; if (!rawJid || rawJid === 'status@broadcast') continue; @@ -196,10 +202,10 @@ export class WhatsAppChannel implements Channel { const groups = this.opts.registeredGroups(); if (groups[chatJid]) { const content = - msg.message?.conversation || - msg.message?.extendedTextMessage?.text || - msg.message?.imageMessage?.caption || - msg.message?.videoMessage?.caption || + normalized.conversation || + normalized.extendedTextMessage?.text || + normalized.imageMessage?.caption || + normalized.videoMessage?.caption || ''; // Skip protocol messages with no text content (encryption keys, read receipts, etc.)