mirror of
https://github.com/EvolutionAPI/evolution-api.git
synced 2025-07-24 17:38:40 -06:00
feat: typebot send list
This commit is contained in:
parent
52216ec08e
commit
c55312d206
@ -223,7 +223,51 @@ export class TypebotService {
|
|||||||
|
|
||||||
formattedText = formattedText.replace(/\n$/, '');
|
formattedText = formattedText.replace(/\n$/, '');
|
||||||
|
|
||||||
if (formattedText.includes('[buttons]')) {
|
if (formattedText.includes('[list]')) {
|
||||||
|
const listJson = {
|
||||||
|
number: remoteJid.split('@')[0],
|
||||||
|
title: '',
|
||||||
|
description: '',
|
||||||
|
buttonText: '',
|
||||||
|
footerText: '',
|
||||||
|
sections: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
const titleMatch = formattedText.match(/\[title\]([\s\S]*?)(?=\[description\])/);
|
||||||
|
const descriptionMatch = formattedText.match(/\[description\]([\s\S]*?)(?=\[buttonText\])/);
|
||||||
|
const buttonTextMatch = formattedText.match(/\[buttonText\]([\s\S]*?)(?=\[footerText\])/);
|
||||||
|
const footerTextMatch = formattedText.match(/\[footerText\]([\s\S]*?)(?=\[menu\])/);
|
||||||
|
|
||||||
|
if (titleMatch) listJson.title = titleMatch[1].trim();
|
||||||
|
if (descriptionMatch) listJson.description = descriptionMatch[1].trim();
|
||||||
|
if (buttonTextMatch) listJson.buttonText = buttonTextMatch[1].trim();
|
||||||
|
if (footerTextMatch) listJson.footerText = footerTextMatch[1].trim();
|
||||||
|
|
||||||
|
const menuContent = formattedText.match(/\[menu\]([\s\S]*?)\[\/menu\]/)?.[1];
|
||||||
|
if (menuContent) {
|
||||||
|
const sections = menuContent.match(/\[section\]([\s\S]*?)(?=\[section\]|\[\/section\])/g);
|
||||||
|
if (sections) {
|
||||||
|
sections.forEach((section) => {
|
||||||
|
const sectionTitle = section.match(/title: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
const rows = section.match(/\[row\]([\s\S]*?)(?=\[row\]|\[\/section\]|\[\/menu\])/g);
|
||||||
|
|
||||||
|
const sectionData = {
|
||||||
|
title: sectionTitle,
|
||||||
|
rows:
|
||||||
|
rows?.map((row) => ({
|
||||||
|
title: row.match(/title: (.*?)(?:\n|$)/)?.[1]?.trim(),
|
||||||
|
description: row.match(/description: (.*?)(?:\n|$)/)?.[1]?.trim(),
|
||||||
|
rowId: row.match(/rowId: (.*?)(?:\n|$)/)?.[1]?.trim(),
|
||||||
|
})) || [],
|
||||||
|
};
|
||||||
|
|
||||||
|
listJson.sections.push(sectionData);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.listMessage(listJson);
|
||||||
|
} else if (formattedText.includes('[buttons]')) {
|
||||||
const buttonJson = {
|
const buttonJson = {
|
||||||
number: remoteJid.split('@')[0],
|
number: remoteJid.split('@')[0],
|
||||||
thumbnailUrl: undefined,
|
thumbnailUrl: undefined,
|
||||||
@ -302,9 +346,9 @@ export class TypebotService {
|
|||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
|
|
||||||
sendTelemetry('/message/sendText');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sendTelemetry('/message/sendText');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.type === 'image') {
|
if (message.type === 'image') {
|
||||||
@ -371,14 +415,130 @@ export class TypebotService {
|
|||||||
|
|
||||||
formattedText = formattedText.replace(/\n$/, '');
|
formattedText = formattedText.replace(/\n$/, '');
|
||||||
|
|
||||||
await instance.textMessage(
|
if (formattedText.includes('[list]')) {
|
||||||
{
|
const listJson = {
|
||||||
number: remoteJid.split('@')[0],
|
number: remoteJid.split('@')[0],
|
||||||
delay: settings?.delayMessage || 1000,
|
title: '',
|
||||||
text: formattedText,
|
description: '',
|
||||||
},
|
buttonText: '',
|
||||||
false,
|
footerText: '',
|
||||||
);
|
sections: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
const titleMatch = formattedText.match(/\[title\]([\s\S]*?)(?=\[description\])/);
|
||||||
|
const descriptionMatch = formattedText.match(/\[description\]([\s\S]*?)(?=\[buttonText\])/);
|
||||||
|
const buttonTextMatch = formattedText.match(/\[buttonText\]([\s\S]*?)(?=\[footerText\])/);
|
||||||
|
const footerTextMatch = formattedText.match(/\[footerText\]([\s\S]*?)(?=\[menu\])/);
|
||||||
|
|
||||||
|
if (titleMatch) listJson.title = titleMatch[1].trim();
|
||||||
|
if (descriptionMatch) listJson.description = descriptionMatch[1].trim();
|
||||||
|
if (buttonTextMatch) listJson.buttonText = buttonTextMatch[1].trim();
|
||||||
|
if (footerTextMatch) listJson.footerText = footerTextMatch[1].trim();
|
||||||
|
|
||||||
|
const menuContent = formattedText.match(/\[menu\]([\s\S]*?)\[\/menu\]/)?.[1];
|
||||||
|
if (menuContent) {
|
||||||
|
const sections = menuContent.match(/\[section\]([\s\S]*?)(?=\[section\]|\[\/section\])/g);
|
||||||
|
if (sections) {
|
||||||
|
sections.forEach((section) => {
|
||||||
|
const sectionTitle = section.match(/title: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
const rows = section.match(/\[row\]([\s\S]*?)(?=\[row\]|\[\/section\]|\[\/menu\])/g);
|
||||||
|
|
||||||
|
const sectionData = {
|
||||||
|
title: sectionTitle,
|
||||||
|
rows:
|
||||||
|
rows?.map((row) => ({
|
||||||
|
title: row.match(/title: (.*?)(?:\n|$)/)?.[1]?.trim(),
|
||||||
|
description: row.match(/description: (.*?)(?:\n|$)/)?.[1]?.trim(),
|
||||||
|
rowId: row.match(/rowId: (.*?)(?:\n|$)/)?.[1]?.trim(),
|
||||||
|
})) || [],
|
||||||
|
};
|
||||||
|
|
||||||
|
listJson.sections.push(sectionData);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.listMessage(listJson);
|
||||||
|
} else if (formattedText.includes('[buttons]')) {
|
||||||
|
const buttonJson = {
|
||||||
|
number: remoteJid.split('@')[0],
|
||||||
|
thumbnailUrl: undefined,
|
||||||
|
title: '',
|
||||||
|
description: '',
|
||||||
|
footer: '',
|
||||||
|
buttons: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
const thumbnailUrlMatch = formattedText.match(/\[thumbnailUrl\]([\s\S]*?)(?=\[title\])/);
|
||||||
|
const titleMatch = formattedText.match(/\[title\]([\s\S]*?)(?=\[description\])/);
|
||||||
|
const descriptionMatch = formattedText.match(/\[description\]([\s\S]*?)(?=\[footer\])/);
|
||||||
|
const footerMatch = formattedText.match(/\[footer\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url))/);
|
||||||
|
|
||||||
|
if (titleMatch) buttonJson.title = titleMatch[1].trim();
|
||||||
|
if (thumbnailUrlMatch) buttonJson.thumbnailUrl = thumbnailUrlMatch[1].trim();
|
||||||
|
if (descriptionMatch) buttonJson.description = descriptionMatch[1].trim();
|
||||||
|
if (footerMatch) buttonJson.footer = footerMatch[1].trim();
|
||||||
|
|
||||||
|
const buttonTypes = {
|
||||||
|
reply: /\[reply\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,
|
||||||
|
pix: /\[pix\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,
|
||||||
|
copy: /\[copy\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,
|
||||||
|
call: /\[call\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,
|
||||||
|
url: /\[url\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const [type, pattern] of Object.entries(buttonTypes)) {
|
||||||
|
let match;
|
||||||
|
while ((match = pattern.exec(formattedText)) !== null) {
|
||||||
|
const content = match[1].trim();
|
||||||
|
const button: any = { type };
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 'pix':
|
||||||
|
button.currency = content.match(/currency: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
button.name = content.match(/name: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
button.keyType = content.match(/keyType: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
button.key = content.match(/key: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'reply':
|
||||||
|
button.displayText = content.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
button.id = content.match(/id: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'copy':
|
||||||
|
button.displayText = content.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
button.copyCode = content.match(/copyCode: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'call':
|
||||||
|
button.displayText = content.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
button.phoneNumber = content.match(/phone: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'url':
|
||||||
|
button.displayText = content.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
button.url = content.match(/url: (.*?)(?:\n|$)/)?.[1]?.trim();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.keys(button).length > 1) {
|
||||||
|
buttonJson.buttons.push(button);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.buttonMessage(buttonJson);
|
||||||
|
} else {
|
||||||
|
await instance.textMessage(
|
||||||
|
{
|
||||||
|
number: remoteJid.split('@')[0],
|
||||||
|
delay: settings?.delayMessage || 1000,
|
||||||
|
text: formattedText,
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
sendTelemetry('/message/sendText');
|
sendTelemetry('/message/sendText');
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user