bot-framework-mutant-whats-adapter
Version:
Mutant Whats é a solução da Mutant de integração com o WhatsApp Business API. Este pacote é um adapter para integração do botframework e o MutantWhats.
175 lines (143 loc) • 5.71 kB
JavaScript
const { TurnContext, StatusCodes } = require('botbuilder');
const { CustomWebAdapter } = require('@botbuildercommunity/core');
const { MutantWhatsClient } = require('./client');
class MutantWhatsAdapter extends CustomWebAdapter {
constructor(botData) {
super();
botData.role = 'bot';
this.botData = botData;
this.debug = process.env.DEBUG === 'true';
}
async processActivity(req, res, action, logic) {
const message = await this.retrieveBody(req);
if (!message) {
res.status(400);
res.end();
return;
}
const conversationId = message.conversationId ? message.conversationId : message.conversation_id;
const ticketId = message.ticket_id;
const now = new Date();
const activity = {
id: ticketId,
timestamp: now.toUTCString(),
localTimestamp: now.toISOString(),
channelId: 'whatsapp',
conversation: {
id: conversationId,
isGroup: false,
conversationType: null,
tenantId: null,
name: ""
},
recipient: this.botData,
localTimezone: 'America/Sao_Paulo',
callerId: null,
serviceUrl: null,
listenFor: null,
label: conversationId,
valueType: null,
type: 'message'
};
if (action === "message") {
const activityRequest = message.activities[0];
activity.text = activityRequest.text;
activity.attachments = activityRequest.attachments;
activity.channelData = {
conversationId,
actionType: action
};
activity.from = activityRequest.from;
}
if (action === "start-conversation") {
activity.from = {
id: message.contact.identifier,
name: message.contact.name,
role: 'user'
}
activity.text = message.start_message;
activity.channelData = {
...message,
conversationId,
actionType: action,
};
}
const context = this.createContext(activity);
context.turnState.set("httpStatus", StatusCodes.OK);
await this.runMiddleware(context, logic);
res.status(context.turnState.get("httpStatus"));
if (context.turnState.get("httpBody")) {
res.send(context.turnState.get("httpBody"));
} else {
res.end();
}
}
async sendActivities(context, activities) {
const responses = [];
const { token, cookie, messageUrl, transferTo, closeUrl, conversationId } = context.activity.channelData;
const mutantWhatsClient = new MutantWhatsClient(
{ token, cookie },
messageUrl, transferTo, closeUrl, conversationId
)
// tslint:disable-next-line:prefer-for-of
for (let i = 0; i < activities.length; i++) {
const activity = activities[i];
switch (activity.type) {
case "delay":
await this.delay(activity.value);
responses.push({});
break;
case 'message':
const message = this.parseActivity(activity);
await mutantWhatsClient.sendMessage(message);
responses.push({});
break;
case 'Handoff':
const codeHandoff = activity.code;
await mutantWhatsClient.sendTransferConversation(codeHandoff);
responses.push({});
break;
case 'EndOfConversation':
const codeEndConversation = activity.code || 'solved';
await mutantWhatsClient.sendCloseConversation(codeEndConversation)
responses.push({});
break;
case 'attachment':
const { file: filecontent, filename } = activity.attachments[0]
const messageWithAttachment = this.parseActivity(activity)
await mutantWhatsClient.sendAttachment(messageWithAttachment, filecontent, filename)
break;
default:
responses.push({});
console.warn(`MutantWhatsAdapter.sendActivities(): Activities of type '${activity.type}' aren't supported.`);
}
}
return responses;
}
parseActivity(activity) {
// Change formatting to WhatsApp formatting
if (activity.text) {
activity.text = activity.text.replace(/<b>(.*?)<\/b>/gis, "*$1*");
activity.text = activity.text.replace(/<i>(.*?)<\/i>/gis, "_$1_");
activity.text = activity.text.replace(/<s>(.*?)<\/s>/gis, "~$1~");
activity.text = activity.text.replace(/<code>(.*?)<\/code>/gis, "```$1```");
}
const now = new Date()
return {
"channelData": {
"clientActivityID": "161529868025941mn7p4d2qe",
"clientTimestamp": now.toISOString()
},
"text": activity.text,
"textFormat": 'plain',
"type": 'message',
"channelId": "webchat",
"from": this.botData,
"timestamp": now.toISOString()
};
}
createContext(request) {
return new TurnContext(this, request);
}
}
module.exports.MutantWhatsAdapter = MutantWhatsAdapter;