Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 176 additions & 0 deletions src/apps/chatwoot/consumers/waha/message.any.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,18 @@ class MessageAnyHandler extends MessageBaseHandler<WAMessage> {
if (msg) {
return msg;
}
msg = this.getPollMessage(payload, protoMessage);
if (msg) {
return msg;
}
msg = this.getEventMessage(payload, protoMessage);
if (msg) {
return msg;
}
msg = this.getPixMessage(payload, protoMessage);
if (msg) {
return msg;
}
return this.getUnsupportedMessage();
}

Expand Down Expand Up @@ -173,6 +185,170 @@ class MessageAnyHandler extends MessageBaseHandler<WAMessage> {
};
}

private getPollMessage(
payload: WAMessage,
message: proto.Message | null,
): ChatWootMessagePartial | null {
const hasPoll = !lodash.isEmpty(message?.pollCreationMessageV3);
if (!hasPoll) {
return null;
}
const poll = this.l.key(TKey.WA_TO_CW_MESSAGE_POLL).r({
payload,
message,
});
if (isEmptyString(poll)) {
return null;
}
return {
content: WhatsappToMarkdown(poll),
attachments: [],
private: undefined,
};
}

private getEventMessage(
payload: WAMessage,
message: proto.Message | null,
): ChatWootMessagePartial | null {
const hasEvent = !lodash.isEmpty(message?.eventMessage);
if (!hasEvent) {
return null;
}

// Converter timestamps Unix para datas legíveis
const eventData = message.eventMessage;
const formatTimestamp = (timestamp: number | string | any | undefined): string | undefined => {
if (!timestamp) return undefined;

// Converter Long para number se necessário
let ts: number;
if (typeof timestamp === 'object' && timestamp.toNumber) {
ts = timestamp.toNumber();
} else if (typeof timestamp === 'string') {
ts = parseInt(timestamp);
} else {
ts = timestamp as number;
}

if (isNaN(ts)) return undefined;

// Converter de segundos para milissegundos se necessário
const date = new Date(ts > 10000000000 ? ts : ts * 1000);
return date.toLocaleString('pt-BR', {
day: '2-digit',
month: '2-digit',
year: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Sao_Paulo'
});
};

const event = this.l.key(TKey.WA_TO_CW_MESSAGE_EVENT).r({
payload,
message: {
...message,
eventMessage: eventData,
// Adicionar campos formatados separadamente para o template
formattedStartTime: formatTimestamp(eventData.startTime),
formattedEndTime: formatTimestamp(eventData.endTime),
},
});
if (isEmptyString(event)) {
return null;
}
return {
content: WhatsappToMarkdown(event),
attachments: [],
private: undefined,
};
}

private getPixMessage(
payload: WAMessage,
message: proto.Message | null,
): ChatWootMessagePartial | null {
// Verificar se há dados PIX no payload
const pixData = this.extractPixData(payload);
if (!pixData) {
return null;
}

const pix = this.l.key(TKey.WA_TO_CW_MESSAGE_PIX).r({
payload,
message,
pixData,
});
if (isEmptyString(pix)) {
return null;
}
return {
content: WhatsappToMarkdown(pix),
attachments: [],
private: undefined,
};
}

private extractPixData(payload: WAMessage): any | null {
try {
this.logger.info('Starting PIX data extraction...');

// Tentar primeiro em Message, depois em RawMessage
const messageData = payload._data?.Message || payload._data?.RawMessage;
this.logger.info(`Message data found: ${!!messageData}`);

// Log da estrutura completa para debug
this.logger.info(`Message data structure: ${JSON.stringify(messageData, null, 2).substring(0, 500)}...`);

if (!messageData?.interactiveMessage?.InteractiveMessage?.NativeFlowMessage?.buttons) {
this.logger.warn('No interactive message buttons found');
this.logger.info(`Available keys in messageData: ${Object.keys(messageData || {}).join(', ')}`);
if (messageData?.interactiveMessage) {
this.logger.info(`interactiveMessage keys: ${Object.keys(messageData.interactiveMessage).join(', ')}`);
}
return null;
}

const buttons = messageData.interactiveMessage.InteractiveMessage.NativeFlowMessage.buttons;
this.logger.info(`Found ${buttons.length} buttons`);

const paymentButton = buttons.find((btn: any) => btn.name === 'payment_info');
this.logger.info(`Payment button found: ${!!paymentButton}`);

if (!paymentButton?.buttonParamsJSON) {
this.logger.warn('No buttonParamsJSON found');
return null;
}

this.logger.info(`ButtonParamsJSON: ${paymentButton.buttonParamsJSON.substring(0, 100)}...`);

const pixInfo = JSON.parse(paymentButton.buttonParamsJSON);
const pixSettings = pixInfo.payment_settings?.find((setting: any) => setting.type === 'pix_static_code');

if (!pixSettings?.pix_static_code) {
this.logger.warn('No PIX static code settings found');
return null;
}

const pixCode = pixSettings.pix_static_code;
const result = {
merchantName: pixCode.merchant_name,
key: pixCode.key,
keyType: pixCode.key_type,
currency: pixInfo.currency,
totalAmount: pixInfo.total_amount?.value || 0,
referenceId: pixInfo.reference_id,
};

this.logger.info(`PIX data extracted successfully: ${JSON.stringify(result)}`);
return result;
} catch (error) {
this.logger.warn(`Failed to extract PIX data: ${error}`);
return null;
}
}

private getUnsupportedMessage(): ChatWootMessagePartial {
const unsupported = this.l
.key(TKey.WA_TO_CW_MESSAGE_UNSUPPORTED)
Expand Down
66 changes: 66 additions & 0 deletions src/apps/chatwoot/i18n/locales/ar-AE.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,72 @@ whatsapp.to.chatwoot.message.location: |-
{{/liveLocationMessage}}
{{/message}}


whatsapp.to.chatwoot.message.poll: |-
{{#message}}
{{#pollCreationMessageV3}}
📊 **استطلاع**

**{{name}}**

{{#options}}
- {{optionName}}
{{/options}}
{{/pollCreationMessageV3}}
{{/message}}

whatsapp.to.chatwoot.message.event: |-
{{#message}}
{{#eventMessage}}
{{#isCanceled}}
❌ **تم إلغاء الحدث**
{{/isCanceled}}
{{^isCanceled}}
📅 **حدث**
{{/isCanceled}}

**{{name}}**

{{#description}}
{{description}}
{{/description}}

{{#location.name}}
📍 **الموقع:** {{location.name}}
{{/location.name}}

{{#startTime}}
🕐 **البداية:** {{startTime}}
{{/startTime}}

{{#endTime}}
🕐 **النهاية:** {{endTime}}
{{/endTime}}

{{#joinLink}}
🔗 **رابط المشاركة:** {{joinLink}}
{{/joinLink}}
{{/eventMessage}}
{{/message}}

whatsapp.to.chatwoot.message.pix: |-
💳 **PIX - Copy and Paste**

{{#pixData}}
**{{merchantName}}**

**PIX Key:** {{key}}
**Type:** {{keyType}}
{{#totalAmount}}
**Amount:** R$ {{totalAmount}}
{{/totalAmount}}
{{#referenceId}}
**Reference:** {{referenceId}}
{{/referenceId}}

💳 **PIX Copy and Paste sent**
{{/pixData}}

whatsapp.to.chatwoot.message.unsupported: |-
⚠️ **هذا النوع من الرسائل غير مدعوم في ChatWoot.**
📱 يرجى فتح **WhatsApp** لعرضه.
Expand Down
66 changes: 66 additions & 0 deletions src/apps/chatwoot/i18n/locales/bn-BD.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,72 @@ whatsapp.to.chatwoot.message.location: |-
{{/liveLocationMessage}}
{{/message}}


whatsapp.to.chatwoot.message.poll: |-
{{#message}}
{{#pollCreationMessageV3}}
📊 **Poll**

**{{name}}**

{{#options}}
- {{optionName}}
{{/options}}
{{/pollCreationMessageV3}}
{{/message}}

whatsapp.to.chatwoot.message.event: |-
{{#message}}
{{#eventMessage}}
{{#isCanceled}}
❌ **Event Canceled**
{{/isCanceled}}
{{^isCanceled}}
📅 **Event**
{{/isCanceled}}

**{{name}}**

{{#description}}
{{description}}
{{/description}}

{{#location.name}}
📍 **Location:** {{location.name}}
{{/location.name}}

{{#formattedStartTime}}
🕐 **Start:** {{formattedStartTime}}
{{/formattedStartTime}}

{{#formattedEndTime}}
🕐 **End:** {{formattedEndTime}}
{{/formattedEndTime}}

{{#joinLink}}
🔗 **Join Link:** {{joinLink}}
{{/joinLink}}
{{/eventMessage}}
{{/message}}

whatsapp.to.chatwoot.message.pix: |-
💳 **PIX - Copy and Paste**

{{#pixData}}
**{{merchantName}}**

**PIX Key:** {{key}}
**Type:** {{keyType}}
{{#totalAmount}}
**Amount:** R$ {{totalAmount}}
{{/totalAmount}}
{{#referenceId}}
**Reference:** {{referenceId}}
{{/referenceId}}

💳 **PIX Copy and Paste sent**
{{/pixData}}

whatsapp.to.chatwoot.message.unsupported: |-
⚠️ **এই ধরনের বার্তা ChatWoot-এ সমর্থিত নয়।**
📱 এটি দেখতে অনুগ্রহ করে **WhatsApp** খুলুন।
Expand Down
Loading