diff --git a/src/server.ts b/src/server.ts index c3702d8..524fb2a 100644 --- a/src/server.ts +++ b/src/server.ts @@ -145,11 +145,43 @@ export class WebhookServer { return; } + // Determine sender depending on context (group vs DM) and ignore non-user messages + const remoteJid = data.key.remoteJid; + const participant = data.key.participant; + const fromMe = !!data.key.fromMe; + + // Ignore broadcasts/status + if (remoteJid === 'status@broadcast' || (typeof remoteJid === 'string' && remoteJid.endsWith('@broadcast'))) { + if (process.env.NODE_ENV !== 'test') { + console.log('ℹ️ Ignoring broadcast/status message'); + } + return; + } + + // Ignore our own messages + if (fromMe) { + if (process.env.NODE_ENV !== 'test') { + console.log('ℹ️ Ignoring message sent by the bot (fromMe=true)'); + } + return; + } + + // Compute sender JID based on chat type + const senderRaw = isGroupId(remoteJid) ? participant : remoteJid; + // Normalize sender ID for consistency and validation - const normalizedSenderId = normalizeWhatsAppId(data.key.participant); + const normalizedSenderId = normalizeWhatsAppId(senderRaw); if (!normalizedSenderId) { if (process.env.NODE_ENV !== 'test') { - console.log('⚠️ Invalid sender ID, ignoring message'); + console.debug('⚠️ Invalid sender ID, ignoring message', { remoteJid, participant, fromMe }); + } + return; + } + + // Avoid processing messages from the bot number + if (process.env.CHATBOT_PHONE_NUMBER && normalizedSenderId === process.env.CHATBOT_PHONE_NUMBER) { + if (process.env.NODE_ENV !== 'test') { + console.log('ℹ️ Ignoring message from the bot number'); } return; } @@ -157,7 +189,7 @@ export class WebhookServer { // Ensure user exists in database (swallow DB errors to keep webhook 200) let userId: string | null = null; try { - userId = ensureUserExists(data.key.participant, WebhookServer.dbInstance); + userId = ensureUserExists(senderRaw, WebhookServer.dbInstance); } catch (e) { if (process.env.NODE_ENV !== 'test') { console.error('⚠️ Error ensuring user exists, ignoring message:', e);