From 4350dff22a7de69ba6d35ecbdd67e59b810bd46f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 5 Dec 2022 20:45:05 +0100 Subject: [PATCH] feat(provider): :fire: add twilii (weoking) --- .vscode/settings.json | 8 +++++++- TODO.md | 2 +- packages/bot/core/core.class.js | 4 ++++ packages/bot/index.js | 4 ++-- packages/database/src/mysql/index.js | 14 ++++---------- packages/provider/src/twilio/index.js | 21 +++++++++++++-------- packages/provider/src/twilio/server.js | 21 +++++++++++++++++++++ packages/provider/src/web-whatsapp/index.js | 6 +----- 8 files changed, 53 insertions(+), 27 deletions(-) create mode 100644 packages/provider/src/twilio/server.js diff --git a/.vscode/settings.json b/.vscode/settings.json index e286082..d35c0e4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,9 @@ { - "conventionalCommits.scopes": ["hook", "contributing", "cli", "bot"] + "conventionalCommits.scopes": [ + "hook", + "contributing", + "cli", + "bot", + "provider" + ] } diff --git a/TODO.md b/TODO.md index b5c0a4c..9388f54 100644 --- a/TODO.md +++ b/TODO.md @@ -18,7 +18,7 @@ - [X] agregar export package - [X] __(doc):__ Video para explicar como implementar nuevos database - [X] Mongo adapter -- [ ] MySQL adapter +- [X] MySQL adapter - [ ] JsonFile adapter ### @bot-whatsapp/provider diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index b1e2fbc..ba69dff 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -25,6 +25,10 @@ class CoreClass { * Manejador de eventos */ listenerBusEvents = () => [ + { + event: 'preinit', + func: () => printer('Iniciando provider espere...'), + }, { event: 'require_action', func: ({ instructions, title = '⚡⚡ ACCION REQUERIDA ⚡⚡' }) => diff --git a/packages/bot/index.js b/packages/bot/index.js index 5972d61..8964221 100644 --- a/packages/bot/index.js +++ b/packages/bot/index.js @@ -25,8 +25,8 @@ const createFlow = (args) => { * @param {*} args * @returns */ -const createProvider = (providerClass = class {}) => { - const providerInstance = new providerClass() +const createProvider = (providerClass = class {}, args = null) => { + const providerInstance = new providerClass(args) if (!providerClass.prototype instanceof ProviderClass) throw new Error('El provider no implementa ProviderClass') return providerInstance diff --git a/packages/database/src/mysql/index.js b/packages/database/src/mysql/index.js index dfeb22e..de69e4a 100644 --- a/packages/database/src/mysql/index.js +++ b/packages/database/src/mysql/index.js @@ -1,24 +1,18 @@ require('dotenv').config() const mysql = require('mysql2') -const DB_NAME = process.env.DB_NAME || 'db_bot' -const DB_HOST = process.env.DB_HOST || 'localhost' -const DB_USER = process.env.DB_USER || 'root' - class MyslAdapter { db listHistory = [] + credentials = { host: null, user: null, database: null } - constructor() { + constructor(_credentials) { + this.credentials = _credentials this.init().then() } async init() { - this.db = mysql.createConnection({ - host: DB_HOST, - user: DB_USER, - database: DB_NAME, - }) + this.db = mysql.createConnection(this.credentials) await this.db.connect((error) => { if (!error) { diff --git a/packages/provider/src/twilio/index.js b/packages/provider/src/twilio/index.js index 41795b1..a49bcde 100644 --- a/packages/provider/src/twilio/index.js +++ b/packages/provider/src/twilio/index.js @@ -1,19 +1,24 @@ const twilio = require('twilio') const { ProviderClass } = require('@bot-whatsapp/bot') -const TwilioVendor = new twilio(accountSid, authToken) - +const WebHookServer = require('./server') class TwilioProvider extends ProviderClass { - constructor() { - super(TwilioVendor) + vendor + vendorNumber + constructor({ accountSid, authToken, vendorNumber }) { + super() + this.vendor = new twilio(accountSid, authToken) + this.vendorNumber = vendorNumber + new WebHookServer().start() } - sendMessage = (message) => - this.vendor.messages.create({ + sendMessage = async (number, message) => { + return this.vendor.messages.create({ body: message, - to: '+12345678901', // Text this number - from: '+12345678901', // From a valid Twilio number + from: ['whatsapp:', this.vendorNumber].join(''), + to: ['whatsapp:', number].join(''), }) + } } module.exports = TwilioProvider diff --git a/packages/provider/src/twilio/server.js b/packages/provider/src/twilio/server.js new file mode 100644 index 0000000..4be9c0b --- /dev/null +++ b/packages/provider/src/twilio/server.js @@ -0,0 +1,21 @@ +const polka = require('polka') +const parsePolka = require('@polka/parse') + +class WebHookServer { + incomingMsg = (req, res, next) => { + const { body } = req + let json = JSON.stringify({ error: 'Missing CSRF token', body }) + res.end(json) + } + + start = () => { + polka() + .use(parsePolka.urlencoded({ extended: false })) + .post('/hook', this.incomingMsg) + .listen(3000, () => { + console.log(`> Running on localhost:3000 /hook`) + }) + } +} + +module.exports = WebHookServer diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index a010da6..463987c 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -32,7 +32,7 @@ class WebWhatsappProvider extends ProviderClass { for (const { event, func } of listEvents) { this.vendor.on(event, func) } - + this.vendor.emit('preinit') this.vendor.initialize().catch((e) => { logger.log(e) this.emit('require_action', { @@ -72,10 +72,6 @@ class WebWhatsappProvider extends ProviderClass { event: 'ready', func: () => this.emit('ready', true), }, - { - event: 'authenticated', - func: () => this.emit('ready', true), - }, { event: 'message', func: (payload) => {