[core] ChatWoot - receive messages from broadcast list

fix #1321
This commit is contained in:
devlikepro committed 2025-09-14 17:48:54 +07:00
1 parent dee9864157
commit 2e42d0e7eb
22 files changed
+68 -6

No files matched your search

+2 -2
View File
@@ -35,8 +35,8 @@ import { sleep } from '@waha/utils/promiseTimeout';
import { Job } from 'bullmq';
import { PinoLogger } from 'nestjs-pino';
import { ChatWootAppConfig } from '../../dto/config.dto';
import { TKey } from '@waha/apps/chatwoot/i18n/templates';
import { isJidBroadcast } from '@adiwajshing/baileys/lib/WABinary/jid-utils';
export function ListenEventsForChatWoot() {
return [
@@ -285,7 +285,7 @@ export abstract class MessageBaseHandler<Payload extends WAMessageBase> {
const chatId = payload.from;
// Add participant name to group messages
const manyParticipants = isJidGroup(chatId) || isJidStatusBroadcast(chatId);
const manyParticipants = isJidGroup(chatId) || isJidBroadcast(chatId);
if (!payload.fromMe && manyParticipants) {
const key = parseMessageIdSerialized(payload.id, true);
let participant = toCusFormat(key.participant);
@@ -3,8 +3,14 @@ import {
isJidNewsletter,
isJidStatusBroadcast,
} from '@adiwajshing/baileys';
import { isLidUser } from '@adiwajshing/baileys/lib/WABinary/jid-utils';
import { public_contact_create_update_payload as Contact } from '@figuro/chatwoot-sdk';
import {
isJidBroadcast,
isLidUser,
} from '@adiwajshing/baileys/lib/WABinary/jid-utils';
import {
public_contact_create_update_payload,
public_contact_create_update_payload as Contact,
} from '@figuro/chatwoot-sdk';
import { ContactInfo } from '@waha/apps/chatwoot/client/ContactConversationService';
import { AttributeKey } from '@waha/apps/chatwoot/const';
import { Locale } from '@waha/apps/chatwoot/i18n/locale';
@@ -221,6 +227,31 @@ class StatusContactInfo extends ChatContactInfo {
}
}
class BroadcastContactInfo extends ChatContactInfo {
async Attributes() {
return {
[AttributeKey.WA_CHAT_ID]: this.chatId,
};
}
@CacheAsync()
async AvatarUrl(): Promise<string | null> {
return null;
}
async PublicContactCreate(): Promise<Contact> {
const name = this.locale
.key(TKey.WHATSAPP_CONTACT_BROADCAST_SUFFIX)
.render();
return {
identifier: this.chatId,
name: `${name} (${this.chatId})`,
custom_attributes: await this.Attributes(),
};
}
}
/**
* Factory function to get the appropriate ContactInfo implementation
* based on the chat ID type
@@ -236,6 +267,8 @@ export function WhatsAppContactInfo(
return new ChannelContactInfo(session, chatId, locale);
} else if (isJidStatusBroadcast(chatId)) {
return new StatusContactInfo(session, chatId, locale);
} else if (isJidBroadcast(chatId)) {
return new BroadcastContactInfo(session, chatId, locale);
} else if (isLidUser(chatId)) {
return new LidContactInfo(session, chatId, locale);
}
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'مجموعة'
whatsapp.contact.channel.suffix: 'قناة'
whatsapp.contact.broadcast.suffix: 'قائمة البث'
# Aka Stories
whatsapp.contact.status.name: 'الحالة'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'গ্রুপ'
whatsapp.contact.channel.suffix: 'চ্যানেল'
whatsapp.contact.broadcast.suffix: 'প্রচার তালিকা'
# Aka Stories
whatsapp.contact.status.name: 'স্ট্যাটাস'
@@ -64,6 +64,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'Gruppe'
whatsapp.contact.channel.suffix: 'Kanal'
whatsapp.contact.broadcast.suffix: 'Broadcast-Liste'
# Aka Stories
whatsapp.contact.status.name: 'Status'
@@ -62,6 +62,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'Group'
whatsapp.contact.channel.suffix: 'Channel'
whatsapp.contact.broadcast.suffix: 'Broadcast List'
# Aka Stories
whatsapp.contact.status.name: 'Status'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'Grupo'
whatsapp.contact.channel.suffix: 'Canal'
whatsapp.contact.broadcast.suffix: 'Lista de difusión'
# Aka Stories
whatsapp.contact.status.name: 'Estado'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'گروه'
whatsapp.contact.channel.suffix: 'کانال'
whatsapp.contact.broadcast.suffix: 'فهرست انتشار'
# Aka Stories
whatsapp.contact.status.name: 'وضعیت'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'Groupe'
whatsapp.contact.channel.suffix: 'Canal'
whatsapp.contact.broadcast.suffix: 'Liste de diffusion'
# Aka Stories
whatsapp.contact.status.name: 'Statut'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'קבוצה'
whatsapp.contact.channel.suffix: 'ערוץ'
whatsapp.contact.broadcast.suffix: 'רשימת שידור'
# Aka Stories
whatsapp.contact.status.name: 'סטטוס'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'समूह'
whatsapp.contact.channel.suffix: 'चैनल'
whatsapp.contact.broadcast.suffix: 'प्रसारण सूची'
# Aka Stories
whatsapp.contact.status.name: 'स्थिति'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'Grup'
whatsapp.contact.channel.suffix: 'Saluran'
whatsapp.contact.broadcast.suffix: 'Daftar Siaran'
# Aka Stories
whatsapp.contact.status.name: 'Status'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'ਗਰੁੱਪ'
whatsapp.contact.channel.suffix: 'ਚੈਨਲ'
whatsapp.contact.broadcast.suffix: 'ਪ੍ਰਸਾਰਣ ਸੂਚੀ'
# Aka Stories
whatsapp.contact.status.name: 'ਸਥਿਤੀ'
@@ -64,6 +64,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'Grupo'
whatsapp.contact.channel.suffix: 'Canal'
whatsapp.contact.broadcast.suffix: 'Lista de transmissão'
# Aka Stories
whatsapp.contact.status.name: 'Status'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'Группа'
whatsapp.contact.channel.suffix: 'Канал'
whatsapp.contact.broadcast.suffix: 'Список рассылки'
# Aka Stories
whatsapp.contact.status.name: 'Статус'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'Grup'
whatsapp.contact.channel.suffix: 'Kanal'
whatsapp.contact.broadcast.suffix: 'Yayın Listesi'
# Aka Stories
whatsapp.contact.status.name: 'Durum'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'Група'
whatsapp.contact.channel.suffix: 'Канал'
whatsapp.contact.broadcast.suffix: 'Список розсилки'
# Aka Stories
whatsapp.contact.status.name: 'Статус'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: 'گروپ'
whatsapp.contact.channel.suffix: 'چینل'
whatsapp.contact.broadcast.suffix: 'براڈکاسٹ فہرست'
# Aka Stories
whatsapp.contact.status.name: 'سٹیٹس'
@@ -61,6 +61,7 @@ whatsapp.reaction.removed: |
whatsapp.contact.group.suffix: '群组'
whatsapp.contact.channel.suffix: '频道'
whatsapp.contact.broadcast.suffix: '广播列表'
# Aka Stories
whatsapp.contact.status.name: '状态'
+2
View File
@@ -36,6 +36,7 @@ export enum TKey {
//
WHATSAPP_CONTACT_GROUP_SUFFIX = 'whatsapp.contact.group.suffix',
WHATSAPP_CONTACT_CHANNEL_SUFFIX = 'whatsapp.contact.channel.suffix',
WHATSAPP_CONTACT_BROADCAST_SUFFIX = 'whatsapp.contact.broadcast.suffix',
WHATSAPP_CONTACT_STATUS_NAME = 'whatsapp.contact.status.name',
//
@@ -114,6 +115,7 @@ export type TemplatePayloads = {
[TKey.WHATSAPP_MESSAGE_REMOVING_ERROR]: void;
[TKey.WHATSAPP_CONTACT_GROUP_SUFFIX]: void;
[TKey.WHATSAPP_CONTACT_CHANNEL_SUFFIX]: void;
[TKey.WHATSAPP_CONTACT_BROADCAST_SUFFIX]: void;
[TKey.WHATSAPP_CONTACT_STATUS_NAME]: void;
[TKey.CW_TO_WA_MESSAGE_TEXT]: {
content: string;
+6 -1
View File
@@ -1914,7 +1914,12 @@ export class WhatsappSessionGoWSCore extends WhatsappSession {
if (message.Message.protocolMessage) return;
const normalizedContent = normalizeMessageContent(message.Message);
const hasSomeContent = !!getContentType(normalizedContent);
const contentType = getContentType(normalizedContent);
// Ignore device sent message
if (contentType == 'deviceSentMessage') {
return;
}
const hasSomeContent = !!contentType;
if (!hasSomeContent) {
// Ignore key distribution messages
if (message?.Message?.senderKeyDistributionMessage) return;
+6 -1
View File
@@ -2211,7 +2211,12 @@ export class WhatsappSessionNoWebCore extends WhatsappSession {
return;
const normalizedContent = normalizeMessageContent(message.message);
const hasSomeContent = !!getContentType(normalizedContent);
const contentType = getContentType(normalizedContent);
// Ignore device sent message
if (contentType == 'deviceSentMessage') {
return;
}
const hasSomeContent = !!contentType;
if (!hasSomeContent) {
// Ignore key distribution messages
if (message?.message?.senderKeyDistributionMessage) return;