Skip to content

Commit

Permalink
fix(whatsapp.gblib): .gbapp message subprocessing.
Browse files Browse the repository at this point in the history
  • Loading branch information
rodrigorodriguez committed Sep 1, 2022
1 parent ec7a7c9 commit 9c00ddd
Show file tree
Hide file tree
Showing 2 changed files with 222 additions and 222 deletions.
221 changes: 0 additions & 221 deletions packages/core.gbapp/services/GBMinService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,6 @@ export class GBMinService {
GBServer.globals.server.get('/instances/:botId', this.handleGetInstanceForClient.bind(this));
}

// Servers the WhatsApp callback.

GBServer.globals.server.post('/webhooks/whatsapp/:botId', this.WhatsAppCallback.bind(this));

// Calls mountBot event to all bots.

Expand Down Expand Up @@ -342,224 +339,6 @@ export class GBMinService {
return req.body.phone_id ? "maytapi" : "chatapi";
}

private async WhatsAppCallback(req, res) {
try {

if (req.body && req.body.webhook) {
res.status(200);
res.end();

return;
}

let provider = GBMinService.isChatAPI(req, res);
let id;
let senderName;
let botId;
let text;

switch (provider) {
case "GeneralBots":

id = req.body.messages[0].author.split('@')[0];
senderName = req.body.messages[0].senderName;
text = req.body;

break;

case "chatapi":

if (req.body.ack) {
res.status(200);
res.end();

return;
}
if (req.body.messages[0].fromMe) {
res.end();

return; // Exit here.
}
id = req.body.messages[0].author.split('@')[0];
senderName = req.body.messages[0].senderName;
text = req.body.messages[0].body;
botId = req.params.botId;
if (botId === '[default]' || botId === undefined) {
botId = GBConfigService.get('BOT_ID');
}
break;
case "maytapi":

if (req.body.type !== 'message') {
res.status(200);
res.end();

return;
}
if (req.body.message.fromMe) {
res.end();

return; // Exit here.
}
id = req.body.user.phone;
senderName = req.body.user.name;
text = req.body.message.text;

botId = WhatsappDirectLine.phones[req.body.phoneId];
break;
}

const sec = new SecService();
let user = await sec.getUserFromSystemId(id);

GBLog.info(`A WhatsApp mobile requested instance for: ${botId}.`);

let urlMin: any = GBServer.globals.minInstances.filter
(p => p.instance.botId === botId)[0];

const botNumber = urlMin ? urlMin.core.getParam(urlMin.instance, 'Bot Number', null) : null;
let activeMin;

// Processes group behaviour.

text = text.replace(/\@\d+ /gi, '');

if (provider === "chatapi") {

// Ensures that the bot group is the active bot for the user (like switching).

const message = req.body.messages[0];
if (message.chatName.charAt(0) !== '+') {
const group = message.chatName;

const botGroup = await this.core.loadInstanceByBotId(group);
if (botGroup && user.instanceId !== botGroup.instanceId) {
await sec.updateUserInstance(id, botGroup.instanceId);
}
if (botGroup) {
activeMin = GBServer.globals.minInstances.filter
(p => p.instance.instanceId === botGroup.instanceId)[0];
await (activeMin as any).whatsAppDirectLine.received(req, res);
return; // EXIT HERE.
}
}
}

// Detects if the welcome message is enabled.

if (process.env.WHATSAPP_WELCOME_DISABLED !== 'true') {

// Tries to find if user wants to switch bots.

let toSwitchMin = GBServer.globals.minInstances.filter(
p => p.instance.botId.toLowerCase() === text.toLowerCase()
)[0];
if (!toSwitchMin) {
toSwitchMin = GBServer.globals.minInstances.filter(p =>
p.instance.activationCode ? p.instance.activationCode.toLowerCase() === text.toLowerCase() : false
)[0];
}

// If bot has a fixed Find active bot instance.

activeMin = botNumber ? urlMin :
toSwitchMin ? toSwitchMin : GBServer.globals.minBoot;

// If it is the first time for the user, tries to auto-execute
// start dialog if any is specified in Config.xlsx.

if (user === null || user.hearOnDialog) {
user = await sec.ensureUser(activeMin.instance.instanceId, id, senderName, '', 'whatsapp', senderName, null);

const startDialog = user.hearOnDialog ?
user.hearOnDialog :
activeMin.core.getParam(activeMin.instance, 'Start Dialog', null);

if (startDialog) {
GBLog.info(`Calling /start to Auto start ${startDialog} for ${activeMin.instance.instanceId}...`);
if (provider === "chatapi") {
req.body.messages[0].body = `/start`;
}
else if (provider === "maytapi") {
req.body.message = `/start`;
}

// Resets HEAR ON DIALOG value to none and passes
// current dialog to the direct line.

await sec.updateUserHearOnDialog(user.userId, null);
await (activeMin as any).whatsAppDirectLine.received(req, res);
} else {
await (activeMin as any).whatsAppDirectLine.sendToDevice(
id,
`Olá! Seja bem-vinda(o)!\nMe chamo ${activeMin.instance.title}. Como posso ajudar? Pode me falar que eu te ouço, me manda um aúdio.`
, null);
res.end();
}
} else {

// User wants to switch bots.

if (toSwitchMin !== undefined) {

// So gets the new bot instance information and prepares to
// auto start dialog if any is specified.

const instance = await this.core.loadInstanceByBotId(activeMin.botId);
await sec.updateUserInstance(id, instance.instanceId);
await (activeMin as any).whatsAppDirectLine.resetConversationId(activeMin.botId, id, '');
const startDialog = activeMin.core.getParam(activeMin.instance, 'Start Dialog', null);


if (startDialog) {
GBLog.info(`Calling /start for Auto start : ${startDialog} for ${activeMin.instance.botId}...`);
if (provider === "chatapi") {
req.body.messages[0].body = `/start`;
}
else if (provider === "maytapi") {
req.body.message = `/start`;
}


await (activeMin as any).whatsAppDirectLine.received(req, res);
} else {
await (activeMin as any).whatsAppDirectLine.sendToDevice(
id,
`Agora falando com ${activeMin.instance.title}...`,
null
);


}
res.end();
} else {
activeMin = GBServer.globals.minInstances.filter(p => p.instance.instanceId === user.instanceId)[0];
if (activeMin === undefined) {
activeMin = GBServer.globals.minBoot;
await (activeMin as any).whatsAppDirectLine.sendToDevice(
id,
`O outro Bot que você estava falando(${user.instanceId}), não está mais disponível. Agora você está falando comigo, ${activeMin.instance.title}...`
);
}
await (activeMin as any).whatsAppDirectLine.received(req, res);
}
}
} else {
let minInstance = GBServer.globals.minInstances.filter(
p => p.instance.botId.toLowerCase() === botId.toLowerCase()
)[0];


// Just pass the message to the receiver.

await minInstance.whatsAppDirectLine.received(req, res);
}
} catch (error) {

GBLog.error(`Error on Whatsapp callback: ${error.data ? error.data : error} ${error.stack}`);
}
}

/**
* Creates a listener that can be used by external monitors to check
* bot instance health.
Expand Down

0 comments on commit 9c00ddd

Please sign in to comment.