From faa4ea01525fa45a0010ff86566953fde6cd4008 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Thu, 5 Jan 2023 00:44:27 +0000 Subject: [PATCH 001/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 8dad0a49b17339da24dd19a4279ae23dce8a73ff Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Thu, 5 Jan 2023 15:33:48 +0000 Subject: [PATCH 002/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 983db5c7b87ff41aba9d759bf1fadb1ca85543c8 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Fri, 6 Jan 2023 06:29:55 +0000 Subject: [PATCH 003/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From ec2041b75a5265b2c90258f4cd8ea99a113457cc Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Fri, 6 Jan 2023 06:46:09 +0000 Subject: [PATCH 004/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 2040f857a56d2d6eee6504b6bb602476831d0a44 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:44:19 +0000 Subject: [PATCH 005/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From a71566f2ad3bf37deb450dac350c4ff858cd4120 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 11:45:52 +0000 Subject: [PATCH 006/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index fa7dc12..4a722ce 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.41-alpha.0", + "version": "0.0.42-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 5a86b89..5a0007c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.48-alpha.0", + "version": "0.0.49-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index c96f366..ddfae8e 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.59-alpha.0", + "version": "0.0.60-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 50a5cee..6d8e007 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.40-alpha.0", + "version": "0.0.41-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 9fb35b8..d5c0ea2 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.46-alpha.0", + "version": "0.0.47-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From a6c10fe414b8502c0ddfefa63c4e75d264d95346 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 6 Jan 2023 14:31:04 +0100 Subject: [PATCH 007/117] chore: :art: working --- packages/bot/core/core.class.js | 43 ++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 7550dd0..9491219 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -18,6 +18,7 @@ class CoreClass { flowClass databaseClass providerClass + listCallbacks = [] constructor(_flow, _database, _provider) { this.flowClass = _flow this.databaseClass = _database @@ -114,18 +115,24 @@ class CoreClass { } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo - const cbEveryCtx = (inRef) => { - this.flowClass.allCallbacks[inRef](messageCtxInComming, { - fallBack, - flowDynamic, - }) - } + const cbEveryCtx = + (inRef, _injectMessageCtx, _injectfallBack, _injectflowDynamic) => + () => { + this.flowClass.allCallbacks[inRef](_injectMessageCtx, { + fallBack: _injectfallBack, + flowDynamic: _injectflowDynamic, + }) + } // 📄 [options: callback]: Si se tiene un callback se ejecuta - if (!fallBackFlag) { - if (refToContinue?.options?.capture) cbEveryCtx(refToContinue?.ref) - for (const ite of this.flowClass.find(body)) { - if (!ite?.options?.capture) cbEveryCtx(ite?.ref) + const callAllCb = (_msgToList = []) => { + for (const ite of _msgToList) { + this.listCallbacks[ite?.ref] = cbEveryCtx( + ite?.ref, + messageCtxInComming, + fallBack, + flowDynamic + ) } } @@ -138,10 +145,7 @@ class CoreClass { msgToSend = this.flowClass.find(body, false, flowStandalone) || [] - for (const ite of msgToSend) { - cbEveryCtx(ite?.ref) - } - + callAllCb(msgToSend) this.sendFlow(msgToSend, from) return } @@ -153,12 +157,14 @@ class CoreClass { if (['string', 'boolean'].includes(typeCapture) && valueCapture) { msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] + callAllCb(msgToSend) this.sendFlow(msgToSend, from) return } } msgToSend = this.flowClass.find(body) || [] + callAllCb(msgToSend) this.sendFlow(msgToSend, from) } @@ -169,10 +175,19 @@ class CoreClass { * @returns */ sendProviderAndSave = (numberOrId, ctxMessage) => { + const executeCb = (ref) => { + try { + return this.listCallbacks[ref]() + } catch (e) { + return Promise.resolve() + } + } + const { answer } = ctxMessage return Promise.all([ this.providerClass.sendMessage(numberOrId, answer, ctxMessage), this.databaseClass.save({ ...ctxMessage, from: numberOrId }), + executeCb(ctxMessage?.ref), ]) } From e8e14d3b6514dc080de86dd595e89d41cafbcc1a Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 6 Jan 2023 15:12:33 +0100 Subject: [PATCH 008/117] build: :zap: ready for video --- packages/bot/core/core.class.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 9491219..2f76071 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -106,6 +106,7 @@ class CoreClass { from, keyword: null, index, + options: prevMsg?.options ?? {}, }) ) .slice(0, optListMsg.limit) From 0451043a212c513bada629e6fa7ee902f9330796 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 15:05:32 +0000 Subject: [PATCH 009/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 930e120d70ef09d274b19484e5656949bf7c08af Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 15:09:04 +0000 Subject: [PATCH 010/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 4a722ce..6382380 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.42-alpha.0", + "version": "0.0.43-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 5a0007c..71fec46 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.49-alpha.0", + "version": "0.0.50-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index ddfae8e..2ef3d52 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.60-alpha.0", + "version": "0.0.61-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 6d8e007..191750c 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.41-alpha.0", + "version": "0.0.42-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index d5c0ea2..84ae965 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.47-alpha.0", + "version": "0.0.48-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From b588479fd155e91a9af82d0d871aa68bbcf789b8 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 19:17:18 +0000 Subject: [PATCH 011/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 8017426cfcd7351965c1ce99284632590483b2be Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 6 Jan 2023 19:18:41 +0000 Subject: [PATCH 012/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 6382380..cf9f3e0 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.43-alpha.0", + "version": "0.0.44-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 71fec46..0279c4d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.50-alpha.0", + "version": "0.0.51-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 2ef3d52..5dce363 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.61-alpha.0", + "version": "0.0.62-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 191750c..616b1c2 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.42-alpha.0", + "version": "0.0.43-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 84ae965..607e549 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.48-alpha.0", + "version": "0.0.49-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From 6ea377e9e55c62b9228ab8ee524f69f3069daf25 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 6 Jan 2023 21:20:08 +0100 Subject: [PATCH 013/117] build: :zap: working fallback, flowDynamic --- packages/bot/core/core.class.js | 44 +++++++++++---------------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 2f76071..4243713 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -18,7 +18,6 @@ class CoreClass { flowClass databaseClass providerClass - listCallbacks = [] constructor(_flow, _database, _provider) { this.flowClass = _flow this.databaseClass = _database @@ -106,7 +105,6 @@ class CoreClass { from, keyword: null, index, - options: prevMsg?.options ?? {}, }) ) .slice(0, optListMsg.limit) @@ -116,24 +114,18 @@ class CoreClass { } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo - const cbEveryCtx = - (inRef, _injectMessageCtx, _injectfallBack, _injectflowDynamic) => - () => { - this.flowClass.allCallbacks[inRef](_injectMessageCtx, { - fallBack: _injectfallBack, - flowDynamic: _injectflowDynamic, - }) - } + const cbEveryCtx = (inRef) => { + this.flowClass.allCallbacks[inRef](messageCtxInComming, { + fallBack, + flowDynamic, + }) + } // 📄 [options: callback]: Si se tiene un callback se ejecuta - const callAllCb = (_msgToList = []) => { - for (const ite of _msgToList) { - this.listCallbacks[ite?.ref] = cbEveryCtx( - ite?.ref, - messageCtxInComming, - fallBack, - flowDynamic - ) + if (!fallBackFlag) { + if (prevMsg?.options?.capture) cbEveryCtx(prevMsg?.ref) + for (const ite of this.flowClass.find(body)) { + if (!ite?.options?.capture) cbEveryCtx(ite?.ref) } } @@ -146,7 +138,10 @@ class CoreClass { msgToSend = this.flowClass.find(body, false, flowStandalone) || [] - callAllCb(msgToSend) + for (const ite of msgToSend) { + cbEveryCtx(ite?.ref) + } + this.sendFlow(msgToSend, from) return } @@ -158,14 +153,12 @@ class CoreClass { if (['string', 'boolean'].includes(typeCapture) && valueCapture) { msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] - callAllCb(msgToSend) this.sendFlow(msgToSend, from) return } } msgToSend = this.flowClass.find(body) || [] - callAllCb(msgToSend) this.sendFlow(msgToSend, from) } @@ -176,19 +169,10 @@ class CoreClass { * @returns */ sendProviderAndSave = (numberOrId, ctxMessage) => { - const executeCb = (ref) => { - try { - return this.listCallbacks[ref]() - } catch (e) { - return Promise.resolve() - } - } - const { answer } = ctxMessage return Promise.all([ this.providerClass.sendMessage(numberOrId, answer, ctxMessage), this.databaseClass.save({ ...ctxMessage, from: numberOrId }), - executeCb(ctxMessage?.ref), ]) } From 5d10cb9026da60043e9a2f86117ebb04d0631a3f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 7 Jan 2023 14:34:17 +0100 Subject: [PATCH 014/117] fix(provider): :zap: fix send image baileys --- packages/provider/src/baileys/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 3b46135..9f89e13 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -4,7 +4,7 @@ const pino = require('pino') const rimraf = require('rimraf') const mime = require('mime-types') const { join } = require('path') -const { existsSync, createWriteStream } = require('fs') +const { existsSync, createWriteStream, readFileSync } = require('fs') const { Console } = require('console') const { @@ -167,8 +167,8 @@ class BaileysProvider extends ProviderClass { sendMedia = async (number, imageUrl, text) => { const fileDownloaded = await baileyDownloadMedia(imageUrl) return this.vendor.sendMessage(number, { - image: { url: fileDownloaded }, - text, + image: readFileSync(fileDownloaded), + caption: text, }) } From 391e11ce738cd64792b5237d69f3739b0263c198 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 7 Jan 2023 14:59:25 +0100 Subject: [PATCH 015/117] fix(provider): :zap: fix send image baileys --- packages/provider/src/baileys/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 9f89e13..e5c2276 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -238,6 +238,9 @@ class BaileysProvider extends ProviderClass { }, })) + + console.log(templateButtons) + return this.vendor.sendMessage(`${numberClean}@c.us`, { text, footer: '', From 2ddea5468d235035478d4e91e63c821da19da179 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 7 Jan 2023 14:59:48 +0100 Subject: [PATCH 016/117] fix(provider): :zap: fix send image baileys --- packages/provider/src/baileys/index.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index e5c2276..7f25b80 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -137,7 +137,7 @@ class BaileysProvider extends ProviderClass { } const btnCtx = - payload?.message?.templateButtonReplyMessage + payload?.message?.buttonsResponseMessage ?.selectedDisplayText if (btnCtx) payload.body = btnCtx @@ -229,23 +229,22 @@ class BaileysProvider extends ProviderClass { */ sendButtons = async (number, text, buttons) => { - const numberClean = number.replace('+', '') + const numberClean = baileyCleanNumber(number) + const templateButtons = buttons.map((btn, i) => ({ - index: `${i}`, - quickReplyButton: { - displayText: btn.body, - id: `id-btn-${i}`, - }, + buttonId: `id-btn-${i}`, + buttonText: { displayText: btn.body }, + type: 1, })) - - console.log(templateButtons) - - return this.vendor.sendMessage(`${numberClean}@c.us`, { + const buttonMessage = { text, footer: '', - templateButtons: templateButtons, - }) + buttons: templateButtons, + headerType: 1, + } + + return this.vendor.sendMessage(numberClean, buttonMessage) } /** From 4ff02d2bfa238cafaa6165f06e8eba459f718447 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 7 Jan 2023 17:55:11 +0100 Subject: [PATCH 017/117] build: :zap: fix --- .../contexts/src/dialogflow/dialogflow.class.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/contexts/src/dialogflow/dialogflow.class.js b/packages/contexts/src/dialogflow/dialogflow.class.js index ffe50e7..ebd92bc 100644 --- a/packages/contexts/src/dialogflow/dialogflow.class.js +++ b/packages/contexts/src/dialogflow/dialogflow.class.js @@ -97,13 +97,21 @@ class DialogFlowContext extends CoreClass { }) customPayload = { - media: fields?.media?.stringValue, - buttons: mapButtons, + options: { + media: fields?.media?.stringValue, + buttons: mapButtons, + }, } + + const ctxFromDX = { + ...customPayload, + answer: fields?.answer?.stringValue, + } + this.sendFlow([ctxFromDX], from) + return } const ctxFromDX = { - ...customPayload, answer: queryResult?.fulfillmentText, } From 4f2fbaf21b09c1f39df11e6f372d8e018e4af9c2 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Sat, 7 Jan 2023 16:57:18 +0000 Subject: [PATCH 018/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 2ad57a8be1adab01a3308e37b26f812b42684fef Mon Sep 17 00:00:00 2001 From: leifermendez Date: Sat, 7 Jan 2023 16:57:52 +0000 Subject: [PATCH 019/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index cf9f3e0..77cb142 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.44-alpha.0", + "version": "0.0.45-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 0279c4d..04118d7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.51-alpha.0", + "version": "0.0.52-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 5dce363..bb19123 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.62-alpha.0", + "version": "0.0.63-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 616b1c2..cdab548 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.43-alpha.0", + "version": "0.0.44-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 607e549..4c53f47 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.49-alpha.0", + "version": "0.0.50-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From f9e3bbc6655060408e4fdbe1d7e920c2ed4fca53 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Sun, 8 Jan 2023 04:57:27 -0600 Subject: [PATCH 020/117] feat: agregamos dockerfile y webserver a starters agregamos dockerfile y webserver a starters --- .gitignore | 4 +++ starters/apps/base-baileys-json/Dockerfile | 7 +++++ starters/apps/base-baileys-json/app.js | 2 ++ .../apps/base-baileys-json/public/index.html | 12 ++++++++ .../apps/base-baileys-json/server.http.js | 30 +++++++++++++++++++ starters/apps/base-baileys-memory/Dockerfile | 7 +++++ starters/apps/base-baileys-memory/app.js | 2 ++ .../base-baileys-memory/public/index.html | 12 ++++++++ .../apps/base-baileys-memory/server.http.js | 30 +++++++++++++++++++ starters/apps/base-baileys-mongo/Dockerfile | 7 +++++ starters/apps/base-baileys-mongo/app.js | 2 ++ .../apps/base-baileys-mongo/public/index.html | 12 ++++++++ .../apps/base-baileys-mongo/server.http.js | 30 +++++++++++++++++++ starters/apps/base-baileys-mysql/Dockerfile | 7 +++++ starters/apps/base-baileys-mysql/app.js | 2 ++ .../apps/base-baileys-mysql/public/index.html | 12 ++++++++ .../apps/base-baileys-mysql/server.http.js | 30 +++++++++++++++++++ starters/apps/base-venom-json/Dockerfile | 7 +++++ starters/apps/base-venom-json/app.js | 2 ++ .../apps/base-venom-json/public/index.html | 12 ++++++++ starters/apps/base-venom-json/server.http.js | 30 +++++++++++++++++++ starters/apps/base-venom-memory/Dockerfile | 7 +++++ starters/apps/base-venom-memory/app.js | 2 ++ .../apps/base-venom-memory/public/index.html | 12 ++++++++ .../apps/base-venom-memory/server.http.js | 30 +++++++++++++++++++ starters/apps/base-venom-mongo/Dockerfile | 7 +++++ starters/apps/base-venom-mongo/app.js | 2 ++ .../apps/base-venom-mongo/public/index.html | 12 ++++++++ starters/apps/base-venom-mongo/server.http.js | 30 +++++++++++++++++++ starters/apps/base-venom-mysql/Dockerfile | 7 +++++ starters/apps/base-venom-mysql/app.js | 2 ++ .../apps/base-venom-mysql/public/index.html | 12 ++++++++ starters/apps/base-venom-mysql/server.http.js | 30 +++++++++++++++++++ starters/apps/base-wweb-json/Dockerfile | 7 +++++ starters/apps/base-wweb-json/app.js | 2 ++ .../apps/base-wweb-json/public/index.html | 12 ++++++++ starters/apps/base-wweb-json/server.http.js | 30 +++++++++++++++++++ starters/apps/base-wweb-memory/Dockerfile | 7 +++++ starters/apps/base-wweb-memory/app.js | 2 ++ .../apps/base-wweb-memory/public/index.html | 12 ++++++++ starters/apps/base-wweb-memory/server.http.js | 30 +++++++++++++++++++ starters/apps/base-wweb-mongo/Dockerfile | 7 +++++ starters/apps/base-wweb-mongo/app.js | 2 ++ .../apps/base-wweb-mongo/public/index.html | 12 ++++++++ starters/apps/base-wweb-mongo/server.http.js | 30 +++++++++++++++++++ starters/apps/base-wweb-mysql/Dockerfile | 7 +++++ starters/apps/base-wweb-mysql/app.js | 2 ++ .../apps/base-wweb-mysql/public/index.html | 12 ++++++++ starters/apps/base-wweb-mysql/server.http.js | 30 +++++++++++++++++++ 49 files changed, 616 insertions(+) create mode 100644 starters/apps/base-baileys-json/Dockerfile create mode 100644 starters/apps/base-baileys-json/public/index.html create mode 100644 starters/apps/base-baileys-json/server.http.js create mode 100644 starters/apps/base-baileys-memory/Dockerfile create mode 100644 starters/apps/base-baileys-memory/public/index.html create mode 100644 starters/apps/base-baileys-memory/server.http.js create mode 100644 starters/apps/base-baileys-mongo/Dockerfile create mode 100644 starters/apps/base-baileys-mongo/public/index.html create mode 100644 starters/apps/base-baileys-mongo/server.http.js create mode 100644 starters/apps/base-baileys-mysql/Dockerfile create mode 100644 starters/apps/base-baileys-mysql/public/index.html create mode 100644 starters/apps/base-baileys-mysql/server.http.js create mode 100644 starters/apps/base-venom-json/Dockerfile create mode 100644 starters/apps/base-venom-json/public/index.html create mode 100644 starters/apps/base-venom-json/server.http.js create mode 100644 starters/apps/base-venom-memory/Dockerfile create mode 100644 starters/apps/base-venom-memory/public/index.html create mode 100644 starters/apps/base-venom-memory/server.http.js create mode 100644 starters/apps/base-venom-mongo/Dockerfile create mode 100644 starters/apps/base-venom-mongo/public/index.html create mode 100644 starters/apps/base-venom-mongo/server.http.js create mode 100644 starters/apps/base-venom-mysql/Dockerfile create mode 100644 starters/apps/base-venom-mysql/public/index.html create mode 100644 starters/apps/base-venom-mysql/server.http.js create mode 100644 starters/apps/base-wweb-json/Dockerfile create mode 100644 starters/apps/base-wweb-json/public/index.html create mode 100644 starters/apps/base-wweb-json/server.http.js create mode 100644 starters/apps/base-wweb-memory/Dockerfile create mode 100644 starters/apps/base-wweb-memory/public/index.html create mode 100644 starters/apps/base-wweb-memory/server.http.js create mode 100644 starters/apps/base-wweb-mongo/Dockerfile create mode 100644 starters/apps/base-wweb-mongo/public/index.html create mode 100644 starters/apps/base-wweb-mongo/server.http.js create mode 100644 starters/apps/base-wweb-mysql/Dockerfile create mode 100644 starters/apps/base-wweb-mysql/public/index.html create mode 100644 starters/apps/base-wweb-mysql/server.http.js diff --git a/.gitignore b/.gitignore index 2a3fcb7..721d12c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,10 @@ mediaSend/* !mediaSend/nota-de-voz.mp3 .env .wwebjs_auth +/session +/session/* +/tokens +/tokens/* packages/cli/config.json config.json .yarnrc.yml diff --git a/starters/apps/base-baileys-json/Dockerfile b/starters/apps/base-baileys-json/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-baileys-json/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-json/app.js b/starters/apps/base-baileys-json/app.js index 267d860..99ecf65 100644 --- a/starters/apps/base-baileys-json/app.js +++ b/starters/apps/base-baileys-json/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const BaileysProvider = require('@bot-whatsapp/provider/baileys') const JsonFileAdapter = require('@bot-whatsapp/database/json') diff --git a/starters/apps/base-baileys-json/public/index.html b/starters/apps/base-baileys-json/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-baileys-json/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-baileys-json/server.http.js b/starters/apps/base-baileys-json/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-baileys-json/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-memory/Dockerfile b/starters/apps/base-baileys-memory/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-baileys-memory/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-memory/app.js b/starters/apps/base-baileys-memory/app.js index 3b967a8..522bb6c 100644 --- a/starters/apps/base-baileys-memory/app.js +++ b/starters/apps/base-baileys-memory/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/base-baileys-memory/public/index.html b/starters/apps/base-baileys-memory/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-baileys-memory/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-baileys-memory/server.http.js b/starters/apps/base-baileys-memory/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-baileys-memory/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mongo/Dockerfile b/starters/apps/base-baileys-mongo/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-baileys-mongo/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-mongo/app.js b/starters/apps/base-baileys-mongo/app.js index 96f04b0..277115d 100644 --- a/starters/apps/base-baileys-mongo/app.js +++ b/starters/apps/base-baileys-mongo/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MongoAdapter = require('@bot-whatsapp/database/mongo') diff --git a/starters/apps/base-baileys-mongo/public/index.html b/starters/apps/base-baileys-mongo/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-baileys-mongo/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-baileys-mongo/server.http.js b/starters/apps/base-baileys-mongo/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-baileys-mongo/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mysql/Dockerfile b/starters/apps/base-baileys-mysql/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-baileys-mysql/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-mysql/app.js b/starters/apps/base-baileys-mysql/app.js index 6982000..02a13c0 100644 --- a/starters/apps/base-baileys-mysql/app.js +++ b/starters/apps/base-baileys-mysql/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MySQLAdapter = require('@bot-whatsapp/database/mysql') diff --git a/starters/apps/base-baileys-mysql/public/index.html b/starters/apps/base-baileys-mysql/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-baileys-mysql/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-baileys-mysql/server.http.js b/starters/apps/base-baileys-mysql/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-baileys-mysql/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-json/Dockerfile b/starters/apps/base-venom-json/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-venom-json/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-venom-json/app.js b/starters/apps/base-venom-json/app.js index 8a223b2..c742f78 100644 --- a/starters/apps/base-venom-json/app.js +++ b/starters/apps/base-venom-json/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const VenomProvider = require('@bot-whatsapp/provider/venom') const JsonFileAdapter = require('@bot-whatsapp/database/json') diff --git a/starters/apps/base-venom-json/public/index.html b/starters/apps/base-venom-json/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-venom-json/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-venom-json/server.http.js b/starters/apps/base-venom-json/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-venom-json/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-memory/Dockerfile b/starters/apps/base-venom-memory/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-venom-memory/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-venom-memory/app.js b/starters/apps/base-venom-memory/app.js index 44750c4..6f89ef2 100644 --- a/starters/apps/base-venom-memory/app.js +++ b/starters/apps/base-venom-memory/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const VenomProvider = require('@bot-whatsapp/provider/venom') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/base-venom-memory/public/index.html b/starters/apps/base-venom-memory/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-venom-memory/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-venom-memory/server.http.js b/starters/apps/base-venom-memory/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-venom-memory/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mongo/Dockerfile b/starters/apps/base-venom-mongo/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-venom-mongo/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-venom-mongo/app.js b/starters/apps/base-venom-mongo/app.js index 266e2e0..d8de982 100644 --- a/starters/apps/base-venom-mongo/app.js +++ b/starters/apps/base-venom-mongo/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const VenomProvider = require('@bot-whatsapp/provider/venom') const MongoAdapter = require('@bot-whatsapp/database/mongo') diff --git a/starters/apps/base-venom-mongo/public/index.html b/starters/apps/base-venom-mongo/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-venom-mongo/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-venom-mongo/server.http.js b/starters/apps/base-venom-mongo/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-venom-mongo/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mysql/Dockerfile b/starters/apps/base-venom-mysql/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-venom-mysql/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-venom-mysql/app.js b/starters/apps/base-venom-mysql/app.js index fe19fa5..24da8ee 100644 --- a/starters/apps/base-venom-mysql/app.js +++ b/starters/apps/base-venom-mysql/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const VenomProvider = require('@bot-whatsapp/provider/venom') const MySQLAdapter = require('@bot-whatsapp/database/mysql') diff --git a/starters/apps/base-venom-mysql/public/index.html b/starters/apps/base-venom-mysql/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-venom-mysql/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-venom-mysql/server.http.js b/starters/apps/base-venom-mysql/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-venom-mysql/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-json/Dockerfile b/starters/apps/base-wweb-json/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-wweb-json/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-json/app.js b/starters/apps/base-wweb-json/app.js index 2b8a55d..31f03dd 100644 --- a/starters/apps/base-wweb-json/app.js +++ b/starters/apps/base-wweb-json/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const JsonFileAdapter = require('@bot-whatsapp/database/json') diff --git a/starters/apps/base-wweb-json/public/index.html b/starters/apps/base-wweb-json/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-wweb-json/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-wweb-json/server.http.js b/starters/apps/base-wweb-json/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-wweb-json/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-memory/Dockerfile b/starters/apps/base-wweb-memory/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-wweb-memory/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-memory/app.js b/starters/apps/base-wweb-memory/app.js index 1e47221..5318283 100644 --- a/starters/apps/base-wweb-memory/app.js +++ b/starters/apps/base-wweb-memory/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/base-wweb-memory/public/index.html b/starters/apps/base-wweb-memory/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-wweb-memory/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-wweb-memory/server.http.js b/starters/apps/base-wweb-memory/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-wweb-memory/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mongo/Dockerfile b/starters/apps/base-wweb-mongo/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-wweb-mongo/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-mongo/app.js b/starters/apps/base-wweb-mongo/app.js index e78f1b1..34f3887 100644 --- a/starters/apps/base-wweb-mongo/app.js +++ b/starters/apps/base-wweb-mongo/app.js @@ -8,6 +8,8 @@ const { const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MongoAdapter = require('@bot-whatsapp/database/mongo') +require('./server.http') + /** * Declaramos las conexiones de Mongo */ diff --git a/starters/apps/base-wweb-mongo/public/index.html b/starters/apps/base-wweb-mongo/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-wweb-mongo/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-wweb-mongo/server.http.js b/starters/apps/base-wweb-mongo/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-wweb-mongo/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mysql/Dockerfile b/starters/apps/base-wweb-mysql/Dockerfile new file mode 100644 index 0000000..14b07b2 --- /dev/null +++ b/starters/apps/base-wweb-mysql/Dockerfile @@ -0,0 +1,7 @@ +FROM node:lts-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-mysql/app.js b/starters/apps/base-wweb-mysql/app.js index 2d92136..2095842 100644 --- a/starters/apps/base-wweb-mysql/app.js +++ b/starters/apps/base-wweb-mysql/app.js @@ -5,6 +5,8 @@ const { addKeyword, } = require('@bot-whatsapp/bot') +require('./server.http') + const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MySQLAdapter = require('@bot-whatsapp/database/mysql') diff --git a/starters/apps/base-wweb-mysql/public/index.html b/starters/apps/base-wweb-mysql/public/index.html new file mode 100644 index 0000000..d193fae --- /dev/null +++ b/starters/apps/base-wweb-mysql/public/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + diff --git a/starters/apps/base-wweb-mysql/server.http.js b/starters/apps/base-wweb-mysql/server.http.js new file mode 100644 index 0000000..439f191 --- /dev/null +++ b/starters/apps/base-wweb-mysql/server.http.js @@ -0,0 +1,30 @@ +var http = require('http') +var fs = require('fs') +var path = require('path') + +const PORT = process.env.PORT || 3000 + +/** + * Levantar un HTTP Server + */ +http.createServer(function (req, res) { + if (req.url === '/') { + fs.readFile('./public/index.html', 'UTF-8', function (err, html) { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.end(html) + }) + } else if (req.url.match('.css$')) { + var cssPath = path.join(__dirname, 'public', req.url) + var fileStream = fs.createReadStream(cssPath, 'UTF-8') + res.writeHead(200, { 'Content-Type': 'text/css' }) + fileStream.pipe(res) + } else if (req.url.match('.png$')) { + var imagePath = path.join(__dirname, req.url) + var fileStream = fs.createReadStream(imagePath) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.end('No Page Found') + } +}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) From 5a033da83aee1f614120bccf27c9f330500cc7b0 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sun, 8 Jan 2023 15:54:32 +0100 Subject: [PATCH 021/117] fix(provider): fix error docker as root user --- packages/provider/src/web-whatsapp/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index ef9427f..5c35a6c 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -24,6 +24,7 @@ class WebWhatsappProvider extends ProviderClass { super() this.vendor = new Client({ authStrategy: new LocalAuth(), + puppeteer: { headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox', '--unhandled-rejections=strict'] } }) const listEvents = this.busEvents() From 4e0d33c6bb46ad259774f6d0c38c6c0b5f8ca4a9 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sun, 8 Jan 2023 16:47:28 +0100 Subject: [PATCH 022/117] fix: :zap: add Dockerfile, starter --- .../apps/base-baileys-json/public/index.html | 74 ++++++++++++++++++- .../apps/base-baileys-json/server.http.js | 20 +++-- .../base-baileys-memory/public/index.html | 74 ++++++++++++++++++- .../apps/base-baileys-memory/server.http.js | 20 +++-- .../apps/base-baileys-mongo/public/index.html | 74 ++++++++++++++++++- .../apps/base-baileys-mongo/server.http.js | 20 +++-- .../apps/base-baileys-mysql/public/index.html | 74 ++++++++++++++++++- .../apps/base-baileys-mysql/server.http.js | 20 +++-- starters/apps/base-venom-json/Dockerfile | 25 ++++++- .../apps/base-venom-json/public/index.html | 74 ++++++++++++++++++- starters/apps/base-venom-json/server.http.js | 20 +++-- starters/apps/base-venom-memory/Dockerfile | 25 ++++++- .../apps/base-venom-memory/public/index.html | 74 ++++++++++++++++++- .../apps/base-venom-memory/server.http.js | 20 +++-- starters/apps/base-venom-mongo/Dockerfile | 25 ++++++- .../apps/base-venom-mongo/public/index.html | 74 ++++++++++++++++++- starters/apps/base-venom-mongo/server.http.js | 20 +++-- starters/apps/base-venom-mysql/Dockerfile | 25 ++++++- .../apps/base-venom-mysql/public/index.html | 74 ++++++++++++++++++- starters/apps/base-venom-mysql/server.http.js | 20 +++-- starters/apps/base-wweb-json/Dockerfile | 25 ++++++- .../apps/base-wweb-json/public/index.html | 74 ++++++++++++++++++- starters/apps/base-wweb-json/server.http.js | 20 +++-- starters/apps/base-wweb-memory/Dockerfile | 25 ++++++- .../apps/base-wweb-memory/public/index.html | 74 ++++++++++++++++++- starters/apps/base-wweb-memory/server.http.js | 20 +++-- starters/apps/base-wweb-mongo/Dockerfile | 25 ++++++- .../apps/base-wweb-mongo/public/index.html | 74 ++++++++++++++++++- starters/apps/base-wweb-mongo/server.http.js | 20 +++-- starters/apps/base-wweb-mysql/Dockerfile | 25 ++++++- .../apps/base-wweb-mysql/public/index.html | 74 ++++++++++++++++++- starters/apps/base-wweb-mysql/server.http.js | 20 +++-- 32 files changed, 1164 insertions(+), 164 deletions(-) diff --git a/starters/apps/base-baileys-json/public/index.html b/starters/apps/base-baileys-json/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-baileys-json/public/index.html +++ b/starters/apps/base-baileys-json/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-baileys-json/server.http.js b/starters/apps/base-baileys-json/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-baileys-json/server.http.js +++ b/starters/apps/base-baileys-json/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-memory/public/index.html b/starters/apps/base-baileys-memory/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-baileys-memory/public/index.html +++ b/starters/apps/base-baileys-memory/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-baileys-memory/server.http.js b/starters/apps/base-baileys-memory/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-baileys-memory/server.http.js +++ b/starters/apps/base-baileys-memory/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mongo/public/index.html b/starters/apps/base-baileys-mongo/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-baileys-mongo/public/index.html +++ b/starters/apps/base-baileys-mongo/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-baileys-mongo/server.http.js b/starters/apps/base-baileys-mongo/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-baileys-mongo/server.http.js +++ b/starters/apps/base-baileys-mongo/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mysql/public/index.html b/starters/apps/base-baileys-mysql/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-baileys-mysql/public/index.html +++ b/starters/apps/base-baileys-mysql/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-baileys-mysql/server.http.js b/starters/apps/base-baileys-mysql/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-baileys-mysql/server.http.js +++ b/starters/apps/base-baileys-mysql/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-json/Dockerfile b/starters/apps/base-venom-json/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-venom-json/Dockerfile +++ b/starters/apps/base-venom-json/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-venom-json/public/index.html b/starters/apps/base-venom-json/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-venom-json/public/index.html +++ b/starters/apps/base-venom-json/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-venom-json/server.http.js b/starters/apps/base-venom-json/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-venom-json/server.http.js +++ b/starters/apps/base-venom-json/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-memory/Dockerfile b/starters/apps/base-venom-memory/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-venom-memory/Dockerfile +++ b/starters/apps/base-venom-memory/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-venom-memory/public/index.html b/starters/apps/base-venom-memory/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-venom-memory/public/index.html +++ b/starters/apps/base-venom-memory/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-venom-memory/server.http.js b/starters/apps/base-venom-memory/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-venom-memory/server.http.js +++ b/starters/apps/base-venom-memory/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mongo/Dockerfile b/starters/apps/base-venom-mongo/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-venom-mongo/Dockerfile +++ b/starters/apps/base-venom-mongo/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-venom-mongo/public/index.html b/starters/apps/base-venom-mongo/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-venom-mongo/public/index.html +++ b/starters/apps/base-venom-mongo/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-venom-mongo/server.http.js b/starters/apps/base-venom-mongo/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-venom-mongo/server.http.js +++ b/starters/apps/base-venom-mongo/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mysql/Dockerfile b/starters/apps/base-venom-mysql/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-venom-mysql/Dockerfile +++ b/starters/apps/base-venom-mysql/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-venom-mysql/public/index.html b/starters/apps/base-venom-mysql/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-venom-mysql/public/index.html +++ b/starters/apps/base-venom-mysql/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-venom-mysql/server.http.js b/starters/apps/base-venom-mysql/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-venom-mysql/server.http.js +++ b/starters/apps/base-venom-mysql/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-json/Dockerfile b/starters/apps/base-wweb-json/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-wweb-json/Dockerfile +++ b/starters/apps/base-wweb-json/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-json/public/index.html b/starters/apps/base-wweb-json/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-wweb-json/public/index.html +++ b/starters/apps/base-wweb-json/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-wweb-json/server.http.js b/starters/apps/base-wweb-json/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-wweb-json/server.http.js +++ b/starters/apps/base-wweb-json/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-memory/Dockerfile b/starters/apps/base-wweb-memory/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-wweb-memory/Dockerfile +++ b/starters/apps/base-wweb-memory/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-memory/public/index.html b/starters/apps/base-wweb-memory/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-wweb-memory/public/index.html +++ b/starters/apps/base-wweb-memory/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-wweb-memory/server.http.js b/starters/apps/base-wweb-memory/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-wweb-memory/server.http.js +++ b/starters/apps/base-wweb-memory/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mongo/Dockerfile b/starters/apps/base-wweb-mongo/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-wweb-mongo/Dockerfile +++ b/starters/apps/base-wweb-mongo/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-mongo/public/index.html b/starters/apps/base-wweb-mongo/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-wweb-mongo/public/index.html +++ b/starters/apps/base-wweb-mongo/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-wweb-mongo/server.http.js b/starters/apps/base-wweb-mongo/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-wweb-mongo/server.http.js +++ b/starters/apps/base-wweb-mongo/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mysql/Dockerfile b/starters/apps/base-wweb-mysql/Dockerfile index 14b07b2..3a9aa17 100644 --- a/starters/apps/base-wweb-mysql/Dockerfile +++ b/starters/apps/base-wweb-mysql/Dockerfile @@ -1,7 +1,24 @@ -FROM node:lts-bullseye as bot +FROM node:18-alpine as node + WORKDIR /app -COPY package*.json ./ -RUN npm i +# Installs latest Chromium (92) package. +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + harfbuzz \ + ca-certificates \ + ttf-freefont \ + nodejs \ + yarn + +# Tell Puppeteer to skip installing Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Puppeteer v10.0.0 works with Chromium 92. COPY . . -ARG PORT +RUN npm install puppeteer@10.0.0 +RUN npm install + CMD ["npm", "start"] diff --git a/starters/apps/base-wweb-mysql/public/index.html b/starters/apps/base-wweb-mysql/public/index.html index d193fae..202b50c 100644 --- a/starters/apps/base-wweb-mysql/public/index.html +++ b/starters/apps/base-wweb-mysql/public/index.html @@ -1,12 +1,80 @@ - + - Document + + + 🤖 Crear chatbot WhatsApp en minutos + - +
+ Escanear QR +
+

Whatsapp QR

+

+ F5 para actualizar, el codigo se actualiza cada minuto.
+ Con esta libreria, puedes configurar respuestas + automatizadas para preguntas frecuentes , recibir y + responder mensajes de manera automatizada, y hacer un + seguimiento de las interacciones con los clientes. Además, + nuestro Chatbot se integra fácilmente con otros sistemas y + herramientas que ya esté utilizando en su negocio. +

+ +
+
diff --git a/starters/apps/base-wweb-mysql/server.http.js b/starters/apps/base-wweb-mysql/server.http.js index 439f191..217bd71 100644 --- a/starters/apps/base-wweb-mysql/server.http.js +++ b/starters/apps/base-wweb-mysql/server.http.js @@ -1,6 +1,6 @@ -var http = require('http') -var fs = require('fs') -var path = require('path') +const http = require('http') +const fs = require('fs') +const path = require('path') const PORT = process.env.PORT || 3000 @@ -8,23 +8,27 @@ const PORT = process.env.PORT || 3000 * Levantar un HTTP Server */ http.createServer(function (req, res) { + var cssPath = undefined + var fileStream = undefined + var imagePath = undefined + if (req.url === '/') { fs.readFile('./public/index.html', 'UTF-8', function (err, html) { res.writeHead(200, { 'Content-Type': 'text/html' }) res.end(html) }) } else if (req.url.match('.css$')) { - var cssPath = path.join(__dirname, 'public', req.url) - var fileStream = fs.createReadStream(cssPath, 'UTF-8') + cssPath = path.join(__dirname, 'public', req.url) + fileStream = fs.createReadStream(cssPath, 'UTF-8') res.writeHead(200, { 'Content-Type': 'text/css' }) fileStream.pipe(res) } else if (req.url.match('.png$')) { - var imagePath = path.join(__dirname, req.url) - var fileStream = fs.createReadStream(imagePath) + imagePath = path.join(__dirname, req.url) + fileStream = fs.createReadStream(imagePath) res.writeHead(200, { 'Content-Type': 'image/png' }) fileStream.pipe(res) } else { res.writeHead(404, { 'Content-Type': 'text/html' }) res.end('No Page Found') } -}).listen(PORT, () => console.log(`Ready HTTP http://localhost:${PORT}`)) +}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) From 1c5da9cc6addf58e363dae892b69d4c265613eb4 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Sun, 8 Jan 2023 15:52:28 +0000 Subject: [PATCH 023/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/provider/package.json | 2 +- packages/provider/src/web-whatsapp/index.js | 9 ++++++++- 6 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 77cb142..fc82ecf 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.45-alpha.0", + "version": "0.0.46-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 04118d7..3984281 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.52-alpha.0", + "version": "0.0.53-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index bb19123..09b5ff1 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.63-alpha.0", + "version": "0.0.64-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index cdab548..4c50a2e 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.44-alpha.0", + "version": "0.0.45-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/package.json b/packages/provider/package.json index 4c53f47..f778bfc 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.50-alpha.0", + "version": "0.0.51-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 5c35a6c..07b37da 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -24,7 +24,14 @@ class WebWhatsappProvider extends ProviderClass { super() this.vendor = new Client({ authStrategy: new LocalAuth(), - puppeteer: { headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox', '--unhandled-rejections=strict'] } + puppeteer: { + headless: true, + args: [ + '--no-sandbox', + '--disable-setuid-sandbox', + '--unhandled-rejections=strict', + ], + }, }) const listEvents = this.busEvents() From 3de5f4b77a10e30632ff7555f5af5d8e93cb2019 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 9 Jan 2023 18:37:58 +0100 Subject: [PATCH 024/117] feat: :zap: new portal web for qr scan --- .github/workflows/ci.yml | 2 +- .github/workflows/releases-dev.yml | 2 +- .github/workflows/releases.yml | 2 +- package.json | 6 +- packages/portal/.eslintignore | 33 + packages/portal/.eslintrc.cjs | 41 + packages/portal/.gitignore | 38 + packages/portal/.prettierignore | 6 + packages/portal/README.md | 71 + .../portal/adaptors/static/vite.config.ts | 19 + packages/portal/package.json | 48 + packages/portal/portal.http.js | 56 + packages/portal/public/favicon.svg | 1 + packages/portal/public/manifest.json | 9 + packages/portal/public/robots.txt | 0 packages/portal/public/water-mark.png | Bin 0 -> 95495 bytes packages/portal/rollup-portal.config.js | 13 + .../portal/src/components/header/header.css | 36 + .../portal/src/components/header/header.tsx | 47 + packages/portal/src/components/icons/bot.css | 12 + packages/portal/src/components/icons/bot.tsx | 18 + packages/portal/src/components/icons/qwik.tsx | 38 + packages/portal/src/components/qr/qr.css | 12 + packages/portal/src/components/qr/qr.tsx | 35 + .../components/router-head/router-head.tsx | 32 + packages/portal/src/entry.dev.tsx | 18 + packages/portal/src/entry.preview.tsx | 20 + packages/portal/src/entry.ssr.tsx | 28 + packages/portal/src/global.css | 125 ++ packages/portal/src/root.tsx | 29 + packages/portal/src/routes/index.css | 23 + packages/portal/src/routes/index.tsx | 61 + packages/portal/src/routes/layout.tsx | 20 + packages/portal/src/routes/service-worker.ts | 18 + packages/portal/tsconfig.json | 26 + packages/portal/vite.config.ts | 23 + packages/provider/src/web-whatsapp/index.js | 9 +- scripts/move.js | 24 +- yarn.lock | 1356 +++++++++++++---- 39 files changed, 2054 insertions(+), 303 deletions(-) create mode 100644 packages/portal/.eslintignore create mode 100644 packages/portal/.eslintrc.cjs create mode 100644 packages/portal/.gitignore create mode 100644 packages/portal/.prettierignore create mode 100644 packages/portal/README.md create mode 100644 packages/portal/adaptors/static/vite.config.ts create mode 100644 packages/portal/package.json create mode 100644 packages/portal/portal.http.js create mode 100644 packages/portal/public/favicon.svg create mode 100644 packages/portal/public/manifest.json create mode 100644 packages/portal/public/robots.txt create mode 100644 packages/portal/public/water-mark.png create mode 100644 packages/portal/rollup-portal.config.js create mode 100644 packages/portal/src/components/header/header.css create mode 100644 packages/portal/src/components/header/header.tsx create mode 100644 packages/portal/src/components/icons/bot.css create mode 100644 packages/portal/src/components/icons/bot.tsx create mode 100644 packages/portal/src/components/icons/qwik.tsx create mode 100644 packages/portal/src/components/qr/qr.css create mode 100644 packages/portal/src/components/qr/qr.tsx create mode 100644 packages/portal/src/components/router-head/router-head.tsx create mode 100644 packages/portal/src/entry.dev.tsx create mode 100644 packages/portal/src/entry.preview.tsx create mode 100644 packages/portal/src/entry.ssr.tsx create mode 100644 packages/portal/src/global.css create mode 100644 packages/portal/src/root.tsx create mode 100644 packages/portal/src/routes/index.css create mode 100644 packages/portal/src/routes/index.tsx create mode 100644 packages/portal/src/routes/layout.tsx create mode 100644 packages/portal/src/routes/service-worker.ts create mode 100644 packages/portal/tsconfig.json create mode 100644 packages/portal/vite.config.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8fd8fa3..968147b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: run: yarn install --immutable --network-timeout 300000 - name: Build Package - run: yarn build + run: yarn build:full - name: Build Eslint rules run: yarn lint:fix diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index a2d9979..165b906 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -27,7 +27,7 @@ jobs: run: yarn install --immutable --network-timeout 300000 - name: Build Package - run: yarn build + run: yarn build:full - name: Release @bot-whatsapp/bot run: yarn node ./scripts/release.js --name=bot --version= --token="${{ secrets.NPM_TOKEN }}" diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index daafe13..1b07570 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -31,7 +31,7 @@ jobs: run: yarn install --immutable --network-timeout 300000 - name: Build Package - run: yarn build + run: yarn build:full - name: Release @bot-whatsapp/bot run: yarn node ./scripts/release.js --name=bot --version="${{ steps.vars.outputs.tag }}" --token="${{ secrets.NPM_TOKEN }}" diff --git a/package.json b/package.json index 72109ae..af82cd9 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,15 @@ "contexts:rollup": "rollup --config ./packages/contexts/rollup-contexts.config.js", "database:rollup": "rollup --config ./packages/database/rollup-database.config.js", "create-bot-whatsapp:rollup": "rollup --config ./packages/create-bot-whatsapp/rollup-create.config.js", + "portal:rollup": "rollup --config ./packages/portal/rollup-portal.config.js", "format:check": "prettier --check ./packages", "format:write": "prettier --write ./packages", "fmt.staged": "pretty-quick --staged", "lint:check": "eslint ./packages", "lint:fix": "eslint --fix ./packages", - "build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup", + "build:portal-web": "cd ./packages/portal/ && yarn run build.types && yarn run build.client && yarn run build.server && yarn run lint --fix", + "build:full": "yarn run build:portal-web && yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup && yarn run portal:rollup", + "build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup && yarn run portal:rollup", "copy.lib": "node ./scripts/move.js", "test.unit": "node ./node_modules/uvu/bin.js packages test", "test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit", @@ -39,6 +42,7 @@ "packages/database", "packages/provider", "packages/contexts", + "packages/portal", "packages/docs" ], "keywords": [ diff --git a/packages/portal/.eslintignore b/packages/portal/.eslintignore new file mode 100644 index 0000000..73d2683 --- /dev/null +++ b/packages/portal/.eslintignore @@ -0,0 +1,33 @@ +**/*.log +**/.DS_Store +*. +.vscode/settings.json +.history +.yarn +bazel-* +bazel-bin +bazel-out +bazel-qwik +bazel-testlogs +dist +dist-dev +lib +lib-types +etc +external +node_modules +temp +tsc-out +tsdoc-metadata.json +target +output +rollup.config.js +build +.cache +.vscode +.rollup.cache +dist +tsconfig.tsbuildinfo +vite.config.ts +*.spec.tsx +*.spec.ts diff --git a/packages/portal/.eslintrc.cjs b/packages/portal/.eslintrc.cjs new file mode 100644 index 0000000..039b99a --- /dev/null +++ b/packages/portal/.eslintrc.cjs @@ -0,0 +1,41 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:qwik/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + tsconfigRootDir: __dirname, + project: ['./tsconfig.json'], + ecmaVersion: 2021, + sourceType: 'module', + ecmaFeatures: { + jsx: true, + }, + }, + plugins: ['@typescript-eslint'], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-inferrable-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-this-alias': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + 'prefer-spread': 'off', + 'no-case-declarations': 'off', + 'no-console': 'off', + '@typescript-eslint/no-unused-vars': ['error'], + '@typescript-eslint/consistent-type-imports': 'warn', + }, +}; diff --git a/packages/portal/.gitignore b/packages/portal/.gitignore new file mode 100644 index 0000000..e95b829 --- /dev/null +++ b/packages/portal/.gitignore @@ -0,0 +1,38 @@ +# Build +/dist +/lib +/lib-types +/server + +# Development +node_modules + +# Cache +.cache +.mf +.vscode +.rollup.cache +tsconfig.tsbuildinfo + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Editor +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Yarn +.yarn/* +!.yarn/releases diff --git a/packages/portal/.prettierignore b/packages/portal/.prettierignore new file mode 100644 index 0000000..1592248 --- /dev/null +++ b/packages/portal/.prettierignore @@ -0,0 +1,6 @@ +# Files Prettier should not format +**/*.log +**/.DS_Store +*. +dist +node_modules diff --git a/packages/portal/README.md b/packages/portal/README.md new file mode 100644 index 0000000..0b9a2a9 --- /dev/null +++ b/packages/portal/README.md @@ -0,0 +1,71 @@ +# Qwik City App ⚡️ + +- [Qwik Docs](https://qwik.builder.io/) +- [Discord](https://qwik.builder.io/chat) +- [Qwik GitHub](https://github.com/BuilderIO/qwik) +- [@QwikDev](https://twitter.com/QwikDev) +- [Vite](https://vitejs.dev/) + +--- + +## Project Structure + +This project is using Qwik with [QwikCity](https://qwik.builder.io/qwikcity/overview/). QwikCity is just a extra set of tools on top of Qwik to make it easier to build a full site, including directory-based routing, layouts, and more. + +Inside your project, you'll see the following directory structure: + +``` +├── public/ +│ └── ... +└── src/ + ├── components/ + │ └── ... + └── routes/ + └── ... +``` + +- `src/routes`: Provides the directory based routing, which can include a hierarchy of `layout.tsx` layout files, and an `index.tsx` file as the page. Additionally, `index.ts` files are endpoints. Please see the [routing docs](https://qwik.builder.io/qwikcity/routing/overview/) for more info. + +- `src/components`: Recommended directory for components. + +- `public`: Any static assets, like images, can be placed in the public directory. Please see the [Vite public directory](https://vitejs.dev/guide/assets.html#the-public-directory) for more info. + +## Add Integrations and deployment + +Use the `npm run qwik add` command to add additional integrations. Some examples of integrations include: Cloudflare, Netlify or Express server, and the [Static Site Generator (SSG)](https://qwik.builder.io/qwikcity/static-site-generation/static-site-config/). + +```shell +npm run qwik add # or `yarn qwik add` +``` + +## Development + +Development mode uses [Vite's development server](https://vitejs.dev/). During development, the `dev` command will server-side render (SSR) the output. + +```shell +npm start # or `yarn start` +``` + +> Note: during dev mode, Vite may request a significant number of `.js` files. This does not represent a Qwik production build. + +## Preview + +The preview command will create a production build of the client modules, a production build of `src/entry.preview.tsx`, and run a local server. The preview server is only for convenience to locally preview a production build, and it should not be used as a production server. + +```shell +npm run preview # or `yarn preview` +``` + +## Production + +The production build will generate client and server modules by running both client and server build commands. Additionally, the build command will use Typescript to run a type check on the source code. + +```shell +npm run build # or `yarn build` +``` + +## Static Site Generator (Node.js) + +``` +npm run build.server +``` diff --git a/packages/portal/adaptors/static/vite.config.ts b/packages/portal/adaptors/static/vite.config.ts new file mode 100644 index 0000000..dba968a --- /dev/null +++ b/packages/portal/adaptors/static/vite.config.ts @@ -0,0 +1,19 @@ +import { staticAdaptor } from '@builder.io/qwik-city/adaptors/static/vite' +import { extendConfig } from '@builder.io/qwik-city/vite' +import baseConfig from '../../vite.config' + +export default extendConfig(baseConfig, () => { + return { + build: { + ssr: true, + rollupOptions: { + input: ['@qwik-city-plan'], + }, + }, + plugins: [ + staticAdaptor({ + origin: 'https://bot-whatsapp.netlify.app', + }), + ], + } +}) diff --git a/packages/portal/package.json b/packages/portal/package.json new file mode 100644 index 0000000..6ba104a --- /dev/null +++ b/packages/portal/package.json @@ -0,0 +1,48 @@ +{ + "name": "@bot-whatsapp/portal", + "version": "0.0.1-alpha.0", + "description": "Portal WEB para escanear QR", + "main": "./lib/portal.http.cjs", + "scripts": { + "build": "qwik build", + "build.client": "vite build", + "build.preview": "vite build --ssr src/entry.preview.tsx", + "build.server": "vite build -c adaptors/static/vite.config.ts", + "build.types": "tsc --incremental --noEmit", + "deploy": "echo 'Run \"npm run qwik add\" to install a server adaptor'", + "dev": "vite --mode ssr", + "dev.debug": "node --inspect-brk ./node_modules/vite/bin/vite.js --mode ssr --force", + "fmt": "prettier --write .", + "fmt.check": "prettier --check .", + "lint": "eslint \"src/**/*.ts*\"", + "preview": "qwik build preview && vite preview --open", + "start": "vite --open --mode ssr", + "qwik": "qwik" + }, + "files": [ + "./dist/*", + "./lib/portal.http.cjs" + ], + "devDependencies": { + "@builder.io/qwik": "0.16.2", + "@builder.io/qwik-city": "0.0.128", + "@types/eslint": "8.4.10", + "@types/node": "^18.11.18", + "@types/node-fetch": "latest", + "@typescript-eslint/eslint-plugin": "5.48.0", + "@typescript-eslint/parser": "5.48.0", + "eslint": "8.31.0", + "eslint-plugin-qwik": "0.16.2", + "node-fetch": "3.3.0", + "prettier": "2.8.1", + "typescript": "4.9.4", + "undici": "5.14.0", + "vite": "4.0.3", + "vite-tsconfig-paths": "3.5.0" + }, + "dependencies": { + "kleur": "^4.1.5", + "polka": "^0.5.2", + "serve-static": "^1.13.1" + } +} diff --git a/packages/portal/portal.http.js b/packages/portal/portal.http.js new file mode 100644 index 0000000..62dc676 --- /dev/null +++ b/packages/portal/portal.http.js @@ -0,0 +1,56 @@ +const { join } = require('path') +const { createReadStream, existsSync } = require('fs') +const { bgYellow, cyan } = require('kleur') +const polka = require('polka') + +const HTTP_PORT = process.env.PORT || 3000 +const QR_FILE = process.env.QR_FILE ?? 'qr.png' +const PUBLIC_URL = + process.env.PUBLIC_URL ?? + process.env.RAILWAY_STATIC_URL ?? + 'http://localhost' + +const dir = [join(__dirname, 'dist'), join(__dirname, '..', 'dist')].find((i) => + existsSync(i) +) +const serve = require('serve-static')(dir) + +/** + * Iniciamos Portal WEB para escanear QR + * @param {port:3000, publicSite:'http://mistio.com', qrFile:'qr.png', dir:__dirname} + */ +const start = ( + { port, publicSite, qrFile } = { + port: HTTP_PORT, + publicSite: PUBLIC_URL, + qrFile: QR_FILE, + } +) => { + polka() + .use(serve) + .get(qrFile, (_, res) => { + const qrSource = [ + join(process.cwd(), qrFile), + join(__dirname, '..', qrFile), + join(__dirname, qrFile), + ].find((i) => existsSync(i)) + + const qrMark = [ + join(__dirname, 'dist', 'water-mark.png'), + join(__dirname, '..', 'dist', 'water-mark.png'), + ].find((i) => existsSync(i)) + const fileStream = createReadStream(qrSource ?? qrMark) + res.writeHead(200, { 'Content-Type': 'image/png' }) + fileStream.pipe(res) + }) + .listen(port, () => { + console.log(``) + console.log(bgYellow(`🚩 ESCANEAR QR 🚩`)) + console.log(cyan(`Existen varias maneras de escanear el QR code`)) + console.log(cyan(`- Se ha creado un archivo /qr.png`)) + console.log(cyan(`- Tambien puedes visitar ${publicSite}:${port}`)) + console.log(``) + }) +} + +module.exports = start diff --git a/packages/portal/public/favicon.svg b/packages/portal/public/favicon.svg new file mode 100644 index 0000000..0ded7c1 --- /dev/null +++ b/packages/portal/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/portal/public/manifest.json b/packages/portal/public/manifest.json new file mode 100644 index 0000000..44825fa --- /dev/null +++ b/packages/portal/public/manifest.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/web-manifest-combined.json", + "name": "qwik-project-name", + "short_name": "Welcome to Qwik", + "start_url": ".", + "display": "standalone", + "background_color": "#fff", + "description": "A Qwik project app." +} diff --git a/packages/portal/public/robots.txt b/packages/portal/public/robots.txt new file mode 100644 index 0000000..e69de29 diff --git a/packages/portal/public/water-mark.png b/packages/portal/public/water-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..e44ada3c7c0f1c144584f4d812caea656a4c81a5 GIT binary patch literal 95495 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 { + useStylesScoped$(styles) + + return ( +
+ + +
+ ) +}) diff --git a/packages/portal/src/components/icons/bot.css b/packages/portal/src/components/icons/bot.css new file mode 100644 index 0000000..481f167 --- /dev/null +++ b/packages/portal/src/components/icons/bot.css @@ -0,0 +1,12 @@ +.logo { + display: flex; + gap: 0.5rem; + align-items: center; + align-content: center; + color: #1a1a1a; +} + +.logo h1 { + font-size: 1.5rem; + margin: 0; +} diff --git a/packages/portal/src/components/icons/bot.tsx b/packages/portal/src/components/icons/bot.tsx new file mode 100644 index 0000000..3c69ef7 --- /dev/null +++ b/packages/portal/src/components/icons/bot.tsx @@ -0,0 +1,18 @@ +import { component$, useStylesScoped$ } from '@builder.io/qwik' + +import styles from './bot.css?inline' + +export const BotLogo = component$(() => { + useStylesScoped$(styles) + return ( +
+ +

Chatbot

+
+ ) +}) diff --git a/packages/portal/src/components/icons/qwik.tsx b/packages/portal/src/components/icons/qwik.tsx new file mode 100644 index 0000000..3bd8d91 --- /dev/null +++ b/packages/portal/src/components/icons/qwik.tsx @@ -0,0 +1,38 @@ +export const QwikLogo = () => ( + + + + + + + + + +) diff --git a/packages/portal/src/components/qr/qr.css b/packages/portal/src/components/qr/qr.css new file mode 100644 index 0000000..37d8779 --- /dev/null +++ b/packages/portal/src/components/qr/qr.css @@ -0,0 +1,12 @@ +div img { + display: block; + background-color: #f0f0f0; + width: 350px; + height: 350px; + object-fit: contain; + border-radius: 10px; +} +div { + display: flex; + justify-content: center; +} diff --git a/packages/portal/src/components/qr/qr.tsx b/packages/portal/src/components/qr/qr.tsx new file mode 100644 index 0000000..a0fb3d2 --- /dev/null +++ b/packages/portal/src/components/qr/qr.tsx @@ -0,0 +1,35 @@ +import { + component$, + useClientEffect$, + useStore, + useStylesScoped$, +} from '@builder.io/qwik' +import { useLocation } from '@builder.io/qwik-city' +import style from './qr.css?inline' + +export const QR = component$(() => { + useStylesScoped$(style) + const state = useStore({ + count: 0, + }) + + useClientEffect$(() => { + setInterval(() => { + state.count++ + }, 800) + }) + + const location = useLocation() + const qrImage = location.query?.qr ?? 'qr.png' + + return ( +
+ { + const head = useDocumentHead() + const loc = useLocation() + + return ( + <> + {head.title} + + + + + + {head.meta.map((m) => ( + + ))} + + {head.links.map((l) => ( + + ))} + + {head.styles.map((s) => ( + - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-baileys-json/server.http.js b/starters/apps/base-baileys-json/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-baileys-json/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-memory/Dockerfile b/starters/apps/base-baileys-memory/Dockerfile index 14b07b2..7fb6d5d 100644 --- a/starters/apps/base-baileys-memory/Dockerfile +++ b/starters/apps/base-baileys-memory/Dockerfile @@ -1,7 +1,9 @@ -FROM node:lts-bullseye as bot +FROM node:18-bullseye as bot WORKDIR /app COPY package*.json ./ RUN npm i COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL ARG PORT CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-memory/README.md b/starters/apps/base-baileys-memory/README.md index a31dc9f..13d73f2 100644 --- a/starters/apps/base-baileys-memory/README.md +++ b/starters/apps/base-baileys-memory/README.md @@ -5,26 +5,8 @@

-**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)** +**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes.  Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver documentación](https://bot-whatsapp.netlify.app/)** -```js -const main = async () => { - const adapterDB = new MockAdapter() - const adapterFlow = createFlow([flowPrincipal]) - - const adapterProvider = createProvider(BaileysProvider, { - accountSid: process.env.ACC_SID, - authToken: process.env.ACC_TOKEN, - vendorNumber: process.env.ACC_VENDOR, - }) - - createBot({ - flow: adapterFlow, - provider: adapterProvider, - database: adapterDB, - }) -} -``` ``` npm install diff --git a/starters/apps/base-baileys-memory/app.js b/starters/apps/base-baileys-memory/app.js index 522bb6c..a8fbd00 100644 --- a/starters/apps/base-baileys-memory/app.js +++ b/starters/apps/base-baileys-memory/app.js @@ -5,86 +5,62 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MockAdapter = require('@bot-whatsapp/database/mock') -/** - * Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo: - * - * Menu Principal - * - SubMenu 1 - * - Submenu 1.1 - * - Submenu 2 - * - Submenu 2.1 - * - * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. - */ +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer([ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', +]) -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer([ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer([ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', +]) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) - -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) - -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer([ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', +]) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { const adapterDB = new MockAdapter() const adapterFlow = createFlow([flowPrincipal]) const adapterProvider = createProvider(BaileysProvider) + createBot({ flow: adapterFlow, provider: adapterProvider, database: adapterDB, }) + + QRPortalWeb() } main() diff --git a/starters/apps/base-baileys-memory/package.json b/starters/apps/base-baileys-memory/package.json index 481e00a..2d01103 100644 --- a/starters/apps/base-baileys-memory/package.json +++ b/starters/apps/base-baileys-memory/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-bailey-memory", + "name": "base-bailey-memory", "version": "1.0.0", "description": "", "main": "app.js", @@ -13,6 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "wa-sticker-formatter": "4.3.2" diff --git a/starters/apps/base-baileys-memory/public/index.html b/starters/apps/base-baileys-memory/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-baileys-memory/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-baileys-memory/server.http.js b/starters/apps/base-baileys-memory/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-baileys-memory/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mongo/package.json b/starters/apps/base-baileys-mongo/package.json index d828a88..c2f8624 100644 --- a/starters/apps/base-baileys-mongo/package.json +++ b/starters/apps/base-baileys-mongo/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-bailey-mongo", + "name": "base-bailey-mongo", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-baileys-mongo/public/index.html b/starters/apps/base-baileys-mongo/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-baileys-mongo/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-baileys-mongo/server.http.js b/starters/apps/base-baileys-mongo/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-baileys-mongo/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-baileys-mysql/package.json b/starters/apps/base-baileys-mysql/package.json index 4a7b07a..7ecb417 100644 --- a/starters/apps/base-baileys-mysql/package.json +++ b/starters/apps/base-baileys-mysql/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-bailey-mysql", + "name": "base-bailey-mysql", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-meta-json/package.json b/starters/apps/base-meta-json/package.json index 3243406..e034a53 100644 --- a/starters/apps/base-meta-json/package.json +++ b/starters/apps/base-meta-json/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-meta-json", + "name": "base-meta-json", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-meta-memory/package.json b/starters/apps/base-meta-memory/package.json index f86e916..51da345 100644 --- a/starters/apps/base-meta-memory/package.json +++ b/starters/apps/base-meta-memory/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-meta-memory", + "name": "base-meta-memory", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-meta-mongo/package.json b/starters/apps/base-meta-mongo/package.json index 94055f8..686ac63 100644 --- a/starters/apps/base-meta-mongo/package.json +++ b/starters/apps/base-meta-mongo/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-meta-mongo", + "name": "base-meta-mongo", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-meta-mysql/package.json b/starters/apps/base-meta-mysql/package.json index a9a71b0..45fe39e 100644 --- a/starters/apps/base-meta-mysql/package.json +++ b/starters/apps/base-meta-mysql/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-meta-mysql", + "name": "base-meta-mysql", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-twilio-json/package.json b/starters/apps/base-twilio-json/package.json index 4f5fdf4..00ab354 100644 --- a/starters/apps/base-twilio-json/package.json +++ b/starters/apps/base-twilio-json/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-twilio-json", + "name": "base-twilio-json", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-twilio-memory/package.json b/starters/apps/base-twilio-memory/package.json index e71ca5a..cdfaf65 100644 --- a/starters/apps/base-twilio-memory/package.json +++ b/starters/apps/base-twilio-memory/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-twilio-memory", + "name": "base-twilio-memory", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-twilio-mongo/package.json b/starters/apps/base-twilio-mongo/package.json index 4a8c063..69a05bb 100644 --- a/starters/apps/base-twilio-mongo/package.json +++ b/starters/apps/base-twilio-mongo/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-twilio-mongo", + "name": "base-twilio-mongo", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-twilio-mysql/package.json b/starters/apps/base-twilio-mysql/package.json index d4c4d37..453955b 100644 --- a/starters/apps/base-twilio-mysql/package.json +++ b/starters/apps/base-twilio-mysql/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-twilio-mysql", + "name": "base-twilio-mysql", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-venom-json/package.json b/starters/apps/base-venom-json/package.json index 88d7f6f..4d10427 100644 --- a/starters/apps/base-venom-json/package.json +++ b/starters/apps/base-venom-json/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-venom-json", + "name": "base-venom-json", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-venom-memory/package.json b/starters/apps/base-venom-memory/package.json index dfe5408..57af4e1 100644 --- a/starters/apps/base-venom-memory/package.json +++ b/starters/apps/base-venom-memory/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-venom-memory", + "name": "base-venom-memory", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-venom-mongo/package.json b/starters/apps/base-venom-mongo/package.json index 3b46613..0d84d2b 100644 --- a/starters/apps/base-venom-mongo/package.json +++ b/starters/apps/base-venom-mongo/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-venom-mongo", + "name": "base-venom-mongo", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-venom-mysql/package.json b/starters/apps/base-venom-mysql/package.json index 670fd00..a029a70 100644 --- a/starters/apps/base-venom-mysql/package.json +++ b/starters/apps/base-venom-mysql/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-venom-mysql", + "name": "base-venom-mysql", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-wweb-json/package.json b/starters/apps/base-wweb-json/package.json index 9abc893..d55dfeb 100644 --- a/starters/apps/base-wweb-json/package.json +++ b/starters/apps/base-wweb-json/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-wweb-json", + "name": "base-wweb-json", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-wweb-memory/package.json b/starters/apps/base-wweb-memory/package.json index fbf9400..d9c3ee0 100644 --- a/starters/apps/base-wweb-memory/package.json +++ b/starters/apps/base-wweb-memory/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-wweb-memory", + "name": "base-wweb-memory", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-wweb-mongo/package.json b/starters/apps/base-wweb-mongo/package.json index c58767a..e7ecebb 100644 --- a/starters/apps/base-wweb-mongo/package.json +++ b/starters/apps/base-wweb-mongo/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-wweb-mongo", + "name": "base-wweb-mongo", "version": "1.0.0", "description": "", "main": "app.js", diff --git a/starters/apps/base-wweb-mysql/package.json b/starters/apps/base-wweb-mysql/package.json index b1c44ff..3ab34d5 100644 --- a/starters/apps/base-wweb-mysql/package.json +++ b/starters/apps/base-wweb-mysql/package.json @@ -1,5 +1,5 @@ { - "name": "bot-whatsapp-base-wweb-mysql", + "name": "base-wweb-mysql", "version": "1.0.0", "description": "", "main": "app.js", From 2fc274725df91d5e83b4f3eab233c149b4715d05 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 11:58:25 +0100 Subject: [PATCH 064/117] docs: :memo: meta added --- .../docs/src/routes/docs/providers/index.mdx | 6 + .../src/routes/docs/providers/meta/index.mdx | 158 +++++++++++++++++- 2 files changed, 163 insertions(+), 1 deletion(-) diff --git a/packages/docs/src/routes/docs/providers/index.mdx b/packages/docs/src/routes/docs/providers/index.mdx index 26241ec..0f6db6a 100644 --- a/packages/docs/src/routes/docs/providers/index.mdx +++ b/packages/docs/src/routes/docs/providers/index.mdx @@ -39,6 +39,12 @@ Estamos trabajando en el apartado de la documentación lo más claro posible. Pu --- +### Meta: Configuración + +Estamos trabajando en el apartado de la documentación lo más claro posible. Puedes encontrar los [detalles aquí](/docs/providers/meta) + +--- + + En el ejemplo de abajo puedes ver como una sugerencia de como puede ser + utilizando variables de entorno + + +```js +const main = async () => { + const adapterDB = new MockAdapter() + const adapterFlow = createFlow([flowPrincipal]) + + const adapterProvider = createProvider(MetaProvider, { + jwtToken: process.env.JWTOKEN, //EAARBW3ZBGU0UBAACDjtQIzI8JuEa............. + numberId: process.env.NUMBER_ID, //103975305758520 + verifyToken: process.env.VERIFY_TOKEN, //LO_QUE_SEA + }) + + createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + }) +} + +main() +``` + +--- + +Luego de ejecutar el bot encontraras un mensaje en la consola similar al siguiente. +Donde podrás encontrar la URL para tu **webhook** + +```shell +$ npm start + +> bot-whatsapp-base-meta-memory@1.0.0 start +> node app.js + + +[meta]: Agregar esta url "WHEN A MESSAGE COMES IN" +[meta]: POST http://localhost:3000/webhook +[meta]: Más información en la documentacion +``` + +--- + +## ¿Ahora que hago? + +Podrás observar que el bot inicia un servicio HTTP (endpoint) que debe estar en un servidor en linea para que puedas conectarlo con Meta. + +--- + +### Opción 1: + +Puedes hacer pruebas en local atrevés de un servidor proxy tunnel.  +Descarga **[ngork](https://ngrok.com/download)** es una herramienta gratuita que nos ayudara con esto. + +![](https://i.imgur.com/TjjBtRh.png) + +--- + +Esto genera una URL en línea que podemos usar en la parte de **WebHook** de Meta + +![](https://i.imgur.com/NXHMDsf.png) + +--- + +![](https://i.imgur.com/tpov3D1.png) + +--- + +![](https://i.imgur.com/haRGylR.png) + +--- + +![](https://i.imgur.com/cMaIzeC.png) + +--- + +### Opción 2: + +Si ya tienes desplegado tu bot en un servidor tienes que obtener la IP publica o subdominio que te proporcionaron. **Ejemplo** si estas usando +[Railway](https://railway.app/) puedes ir a la seccion de ajustes y generar un subdominio. Ya tendriamos el **WebHook** +`https://base-twilio-memory-production.up.railway.app/twilio-hook` + +![](https://i.imgur.com/Yg2BYqB.png) + +--- + +![](https://i.imgur.com/dIbyEwp.png) + +--- + + From af44ed12684c54f8c7948c199755c49e5afd9964 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 13:25:18 +0100 Subject: [PATCH 065/117] ci: :zap: add github release --- .github/workflows/releases-dev.yml | 2 +- .github/workflows/releases.yml | 2 +- package.json | 5 ++- packages/docs/src/components/widgets/Hero.tsx | 9 ++++- scripts/release.js | 38 ++++++++++++++++++- yarn.lock | 1 + 6 files changed, 52 insertions(+), 5 deletions(-) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 6f380a2..7848669 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -3,7 +3,7 @@ name: 🚀 (DEV) Liberando versiones on: push: branches: - - next-release + - release/next jobs: ############ RELEASE ############ diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index df211d4..2fd43fe 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -3,7 +3,7 @@ name: 🚀⚡ Liberando versiones on: push: branches: - - production-release + - release/production jobs: ############ RELEASE ############ release: diff --git a/package.json b/package.json index b15b835..7387dfc 100644 --- a/package.json +++ b/package.json @@ -97,5 +97,8 @@ "npm": "please-use-yarn", "yarn": ">=3" }, - "author": "Leifer Mendez " + "author": "Leifer Mendez ", + "dependencies": { + "@octokit/core": "^4.1.0" + } } diff --git a/packages/docs/src/components/widgets/Hero.tsx b/packages/docs/src/components/widgets/Hero.tsx index 4700421..0e7cc5e 100644 --- a/packages/docs/src/components/widgets/Hero.tsx +++ b/packages/docs/src/components/widgets/Hero.tsx @@ -47,13 +47,20 @@ export default component$(() => { npm create bot-whatsapp@latest
- diff --git a/scripts/release.js b/scripts/release.js index 9dfcc62..e88e740 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -3,16 +3,50 @@ const { join } = require('path') const { execFile } = require('node:child_process') const process = require('node:process') const util = require('node:util') +const { Octokit } = require('@octokit/core') const OS_ENVIROMENT_WIN = process.platform.includes('win32') const semver = require('semver') const NPM_COMMAND = OS_ENVIROMENT_WIN ? 'npm.cmd' : 'npm' -const [PKG_ARG, PKG_ARG_VERSION, NPM_TOKEN] = process.argv.slice(2) || [null] +const [PKG_ARG, PKG_ARG_VERSION, NPM_TOKEN, GITHUB_TOKEN] = process.argv.slice( + 2 +) || [null] const PATH_PACKAGES = join(__dirname, '..', `packages`) const cmd = util.promisify(execFile) +/** + * Publicar Release en Github + * @param {*} name + * @param {*} tag_name + * @param {*} auth + * @param {*} owner + * @param {*} repo + */ +const githubGithubRelease = async ( + name = '', + tag_name = '', + auth = '', + owner = 'codigoencasa', + repo = 'bot-whatsapp' +) => { + const octokit = new Octokit({ + auth, + }) + + await octokit.request(`POST /repos/${owner}/${repo}/releases`, { + owner, + repo, + tag_name, + name, + body: 'Description of the release', + draft: false, + prerelease: false, + generate_release_notes: true, + }) +} + /** * Create Token */ @@ -147,6 +181,7 @@ const publishRelease = async (packageName, latest = null) => { const main = async () => { if (PKG_ARG) { let EXIST_VERSION = true + const githubToken = GITHUB_TOKEN ? GITHUB_TOKEN.split('=').at(1) : null const tokenNpm = NPM_TOKEN ? NPM_TOKEN.split('=').at(1) : null const pkgName = PKG_ARG ? PKG_ARG.split('=').at(1) : null const pkgNumber = PKG_ARG_VERSION @@ -161,6 +196,7 @@ const main = async () => { } await packRelease(pkgName) await publishRelease(pkgName, pkgNumber) + await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) } } diff --git a/yarn.lock b/yarn.lock index 05e6737..cf802d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1100,6 +1100,7 @@ __metadata: dependencies: "@commitlint/cli": ^17.3.0 "@commitlint/config-conventional": ^17.3.0 + "@octokit/core": ^4.1.0 "@rollup/plugin-commonjs": ^23.0.2 "@rollup/plugin-json": ^5.0.1 "@rollup/plugin-node-resolve": ^15.0.1 From d00547866a0d39a9d0f777943795948a9117597e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 13:31:34 +0100 Subject: [PATCH 066/117] ci: :zap: add github release --- scripts/release.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/release.js b/scripts/release.js index e88e740..5ed1f58 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -196,7 +196,8 @@ const main = async () => { } await packRelease(pkgName) await publishRelease(pkgName, pkgNumber) - await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) + if (pkgNumber) + await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) } } From 0619641f82225adbc687bd609dd15af4b9a1d342 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 12:33:39 +0000 Subject: [PATCH 067/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From d90a42b9628dd60a013a903909c03c6ba74055eb Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 13:33:52 +0100 Subject: [PATCH 068/117] ci: :zap: add github release --- .github/workflows/releases.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 2fd43fe..961efbf 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -43,22 +43,22 @@ jobs: run: yarn build:full - name: Release @bot-whatsapp/bot - run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/cli - run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/create-bot-whatsapp - run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/database - run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/provider - run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/portal - run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Commit and push changes uses: devops-infra/action-commit-push@master From afb127278aadc23436d3d3530f84a694d4e0dbbc Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 12:38:01 +0000 Subject: [PATCH 069/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 8e3413ca80ce9507e7136ff11ef54e58d4fe2bd6 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 13:48:33 +0100 Subject: [PATCH 070/117] ci: :zap: add github release --- .github/workflows/releases.yml | 12 +++++++----- package.json | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 961efbf..fc2081b 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -60,8 +60,10 @@ jobs: - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" - - name: Commit and push changes - uses: devops-infra/action-commit-push@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - commit_message: 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release' + - name: GIT commit and push all changed files + if: github.event_name == 'push' + run: | + git config --global user.name "${{ env.CI_COMMIT_AUTHOR }}" + git config --global user.email "username@users.noreply.github.com" + git commit -a -m 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release' + git push diff --git a/package.json b/package.json index 7387dfc..471f7a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.8", + "version": "0.1.9", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From 375a997f25a78d1c469c9466a86e3d00cb201571 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 12:49:52 +0000 Subject: [PATCH 071/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 5b3e7cefde57b38fad32a2ade2641b944989bb2d Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 14:32:59 +0100 Subject: [PATCH 072/117] ci: :zap: add github release --- package.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 471f7a1..983f107 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,8 @@ "rollup-plugin-copy": "^3.4.0", "semver": "^7.3.8", "standard-version": "^9.5.0", - "uvu": "^0.5.6" + "uvu": "^0.5.6", + "@octokit/core": "^4.1.0" }, "packageManager": "yarn@3.3.0", "engines": { @@ -97,8 +98,5 @@ "npm": "please-use-yarn", "yarn": ">=3" }, - "author": "Leifer Mendez ", - "dependencies": { - "@octokit/core": "^4.1.0" - } + "author": "Leifer Mendez " } From c621d0ee2439e19783a75c39f81e3cee8ae20cbb Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 13:36:55 +0000 Subject: [PATCH 073/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 983f107..fe8cb42 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "devDependencies": { "@commitlint/cli": "^17.3.0", "@commitlint/config-conventional": "^17.3.0", + "@octokit/core": "^4.1.0", "@rollup/plugin-commonjs": "^23.0.2", "@rollup/plugin-json": "^5.0.1", "@rollup/plugin-node-resolve": "^15.0.1", @@ -89,8 +90,7 @@ "rollup-plugin-copy": "^3.4.0", "semver": "^7.3.8", "standard-version": "^9.5.0", - "uvu": "^0.5.6", - "@octokit/core": "^4.1.0" + "uvu": "^0.5.6" }, "packageManager": "yarn@3.3.0", "engines": { From d52951adf9a962b2a1a14c990554c359781a95d1 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 14:41:13 +0100 Subject: [PATCH 074/117] ci: :fire: fix ci version name --- .github/workflows/netlify.yml | 2 +- .github/workflows/releases-dev.yml | 3 +++ .github/workflows/releases.yml | 15 +++++++++------ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/netlify.yml b/.github/workflows/netlify.yml index 76d5383..8f1ba08 100644 --- a/.github/workflows/netlify.yml +++ b/.github/workflows/netlify.yml @@ -3,7 +3,7 @@ name: 📄 (PROD) Desplegando documentacion on: push: branches: - - next-release + - release/next jobs: ############ DOCUMENTATION BUILD ############ diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 7848669..4e5c169 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -44,6 +44,9 @@ jobs: - name: Release @bot-whatsapp/provider run: yarn node ./scripts/release.js --name=provider --version= --token="${{ secrets.NPM_TOKEN }}" + - name: Release @bot-whatsapp/contexts + run: yarn node ./scripts/release.js --name=contexts --version= --token="${{ secrets.NPM_TOKEN }}" + - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}" diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index fc2081b..26b8391 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -43,22 +43,25 @@ jobs: run: yarn build:full - name: Release @bot-whatsapp/bot - run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/cli - run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/create-bot-whatsapp - run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/database - run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/provider - run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + + - name: Release @bot-whatsapp/contexts + run: yarn node ./scripts/release.js --name=contexts --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: Release @bot-whatsapp/portal - run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }} --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" - name: GIT commit and push all changed files if: github.event_name == 'push' From 787cdc69a068ea4d1da7e31b6f74e853c5f2d9ec Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 13:45:16 +0000 Subject: [PATCH 075/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 0af9ef2dae723ec4f8bde1949714a69faf95b01e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 15:14:51 +0100 Subject: [PATCH 076/117] ci: :fire: fix ci version name --- packages/contexts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contexts/package.json b/packages/contexts/package.json index 2301645..92b9561 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.1", + "version": "0.0.4-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ From faa3a21ffe1c1ffc0d3e58f9b2bb6876e18d9437 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 14:16:19 +0000 Subject: [PATCH 077/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/provider/src/twilio/package.json | 2 +- starters/apps/base-twilio-json/package.json | 2 +- starters/apps/base-twilio-memory/package.json | 2 +- starters/apps/base-twilio-mongo/package.json | 2 +- starters/apps/base-twilio-mysql/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/provider/src/twilio/package.json b/packages/provider/src/twilio/package.json index dd0a9bf..e4bb7d4 100644 --- a/packages/provider/src/twilio/package.json +++ b/packages/provider/src/twilio/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "twilio": "3.84.0" + "twilio": "3.84.1" } } diff --git a/starters/apps/base-twilio-json/package.json b/starters/apps/base-twilio-json/package.json index 00ab354..15367a6 100644 --- a/starters/apps/base-twilio-json/package.json +++ b/starters/apps/base-twilio-json/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.0", + "twilio": "3.84.1", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-twilio-memory/package.json b/starters/apps/base-twilio-memory/package.json index cdfaf65..bf1501c 100644 --- a/starters/apps/base-twilio-memory/package.json +++ b/starters/apps/base-twilio-memory/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.0", + "twilio": "3.84.1", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-twilio-mongo/package.json b/starters/apps/base-twilio-mongo/package.json index 69a05bb..06bdef2 100644 --- a/starters/apps/base-twilio-mongo/package.json +++ b/starters/apps/base-twilio-mongo/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.0", + "twilio": "3.84.1", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-twilio-mysql/package.json b/starters/apps/base-twilio-mysql/package.json index 453955b..90149e2 100644 --- a/starters/apps/base-twilio-mysql/package.json +++ b/starters/apps/base-twilio-mysql/package.json @@ -11,7 +11,7 @@ "dependencies": { "body-parser": "^1.20.1", "polka": "^0.5.2", - "twilio": "3.84.0", + "twilio": "3.84.1", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", From 9704bc0f0203f7be200ccd80c69bef55837fe2f4 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 15:28:30 +0100 Subject: [PATCH 078/117] docs: :memo: meta added --- .github/workflows/releases.yml | 17 +++++++----- packages/portal/package.json | 2 +- scripts/github.js | 47 ++++++++++++++++++++++++++++++++++ scripts/release.js | 39 +--------------------------- 4 files changed, 59 insertions(+), 46 deletions(-) create mode 100644 scripts/github.js diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 26b8391..ab4faa4 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -43,25 +43,28 @@ jobs: run: yarn build:full - name: Release @bot-whatsapp/bot - run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/cli - run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/create-bot-whatsapp - run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/database - run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/provider - run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/contexts - run: yarn node ./scripts/release.js --name=contexts --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=contexts --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" - name: Release @bot-whatsapp/portal - run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" --gitToken="${{ secrets.OCTO_TOKEN }}" + run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}" + + - name: Release Github + run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}" - name: GIT commit and push all changed files if: github.event_name == 'push' diff --git a/packages/portal/package.json b/packages/portal/package.json index f32cf85..e8941f8 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.9-alpha.0", + "version": "v0.1.11", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/scripts/github.js b/scripts/github.js new file mode 100644 index 0000000..9277d83 --- /dev/null +++ b/scripts/github.js @@ -0,0 +1,47 @@ +const process = require('node:process') +const { Octokit } = require('@octokit/core') + +const [PKG_ARG, GITHUB_TOKEN] = process.argv.slice(2) || [null] + +/** + * Publicar Release en Github + * @param {*} name + * @param {*} tag_name + * @param {*} auth + * @param {*} owner + * @param {*} repo + */ +const githubGithubRelease = async ( + name = '', + tag_name = '', + auth = '', + owner = 'codigoencasa', + repo = 'bot-whatsapp' +) => { + const octokit = new Octokit({ + auth, + }) + + await octokit.request(`POST /repos/${owner}/${repo}/releases`, { + owner, + repo, + tag_name, + name, + body: 'Description of the release', + draft: false, + prerelease: false, + generate_release_notes: true, + }) +} + +const main = async () => { + if (PKG_ARG) { + const githubToken = GITHUB_TOKEN ? GITHUB_TOKEN.split('=').at(1) : null + const pkgNumber = PKG_ARG ? PKG_ARG.split('=').at(1) : null + + if (pkgNumber) + await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) + } +} + +main() diff --git a/scripts/release.js b/scripts/release.js index 5ed1f58..9dfcc62 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -3,50 +3,16 @@ const { join } = require('path') const { execFile } = require('node:child_process') const process = require('node:process') const util = require('node:util') -const { Octokit } = require('@octokit/core') const OS_ENVIROMENT_WIN = process.platform.includes('win32') const semver = require('semver') const NPM_COMMAND = OS_ENVIROMENT_WIN ? 'npm.cmd' : 'npm' -const [PKG_ARG, PKG_ARG_VERSION, NPM_TOKEN, GITHUB_TOKEN] = process.argv.slice( - 2 -) || [null] +const [PKG_ARG, PKG_ARG_VERSION, NPM_TOKEN] = process.argv.slice(2) || [null] const PATH_PACKAGES = join(__dirname, '..', `packages`) const cmd = util.promisify(execFile) -/** - * Publicar Release en Github - * @param {*} name - * @param {*} tag_name - * @param {*} auth - * @param {*} owner - * @param {*} repo - */ -const githubGithubRelease = async ( - name = '', - tag_name = '', - auth = '', - owner = 'codigoencasa', - repo = 'bot-whatsapp' -) => { - const octokit = new Octokit({ - auth, - }) - - await octokit.request(`POST /repos/${owner}/${repo}/releases`, { - owner, - repo, - tag_name, - name, - body: 'Description of the release', - draft: false, - prerelease: false, - generate_release_notes: true, - }) -} - /** * Create Token */ @@ -181,7 +147,6 @@ const publishRelease = async (packageName, latest = null) => { const main = async () => { if (PKG_ARG) { let EXIST_VERSION = true - const githubToken = GITHUB_TOKEN ? GITHUB_TOKEN.split('=').at(1) : null const tokenNpm = NPM_TOKEN ? NPM_TOKEN.split('=').at(1) : null const pkgName = PKG_ARG ? PKG_ARG.split('=').at(1) : null const pkgNumber = PKG_ARG_VERSION @@ -196,8 +161,6 @@ const main = async () => { } await packRelease(pkgName) await publishRelease(pkgName, pkgNumber) - if (pkgNumber) - await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken) } } From e2fec5d521974c51a0f9ff1169e1546f51b9e100 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 14:33:19 +0000 Subject: [PATCH 079/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From c6f58e913d02ac9cbda21b09e55fd71018547b80 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 15:35:47 +0100 Subject: [PATCH 080/117] chore(release): 0.1.10 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eae6a68..360aa17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.10](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.8...v0.1.10) (2023-01-11) + + +### Bug Fixes + +* :fire: update qr package ([ecde23f](https://github.com/leifermendez/bot-whatsapp/commit/ecde23fdea65def209aa874af35a3f293e6b1a91)) + ### [0.1.8](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.8) (2023-01-10) ### [0.1.7](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7) (2023-01-10) diff --git a/package.json b/package.json index fe8cb42..87b8f0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.9", + "version": "0.1.10", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From be6c609570bf76f6112f861c4949f79ac1af1653 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 15:36:19 +0100 Subject: [PATCH 081/117] chore: :zap: set MANUAL version to bypass From 68a6e4b241c70cb0b91d5e2a557d3bcbb92738a5 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 14:39:57 +0000 Subject: [PATCH 082/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From eb1fcbff228876d748c87a6cf060a165dcc56638 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:11:55 +0100 Subject: [PATCH 083/117] chore(release): 0.1.11 --- CHANGELOG.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 360aa17..00a5618 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.11](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.11) (2023-01-11) + +### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10) + +### [0.1.7-pre-1](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-alpha...v0.1.7-pre-1) (2023-01-10) + +### [0.1.7-alpha](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7-alpha) (2023-01-10) + ### [0.1.10](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.8...v0.1.10) (2023-01-11) diff --git a/package.json b/package.json index 87b8f0b..5e3d098 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.10", + "version": "0.1.11", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From edf5fdcbdc46a8a96367042df6a23a4a46b88545 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:12:09 +0100 Subject: [PATCH 084/117] chore(release): 0.1.12 --- CHANGELOG.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00a5618..3c74d4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.12](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.12) (2023-01-11) + +### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10) + +### [0.1.7-pre-1](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-alpha...v0.1.7-pre-1) (2023-01-10) + +### [0.1.7-alpha](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7-alpha) (2023-01-10) + ### [0.1.11](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.11) (2023-01-11) ### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10) diff --git a/package.json b/package.json index 5e3d098..d7ef271 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.11", + "version": "0.1.12", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From b321b03b2a04566a90a5ff41929734e021a6476e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:12:24 +0100 Subject: [PATCH 085/117] chore(release): 0.1.12 --- .github/workflows/releases.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index ab4faa4..2cbe8e6 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -26,9 +26,6 @@ jobs: - run: corepack enable - - name: Set User - run: git config --global user.email "leifer.contacto@gmail.com" && git config --global user.name "Leifer Mendez" - - name: Install NPM Dependencies run: yarn install --immutable --network-timeout 300000 @@ -69,7 +66,7 @@ jobs: - name: GIT commit and push all changed files if: github.event_name == 'push' run: | - git config --global user.name "${{ env.CI_COMMIT_AUTHOR }}" + git config --global user.name "Leifer" git config --global user.email "username@users.noreply.github.com" git commit -a -m 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release' git push From fea6276b89b17da8070828fa9059666743bb02b4 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 15:16:00 +0000 Subject: [PATCH 086/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From f029c7317a954ceb008f5d3808934484634ef4f0 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:18:47 +0100 Subject: [PATCH 087/117] chore(release): 0.1.12 --- .github/workflows/releases.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 2cbe8e6..90aa18b 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -26,6 +26,9 @@ jobs: - run: corepack enable + - name: Set User + run: git config --global user.email "leifer.contacto@gmail.com" && git config --global user.name "Leifer Mendez" + - name: Install NPM Dependencies run: yarn install --immutable --network-timeout 300000 @@ -66,7 +69,5 @@ jobs: - name: GIT commit and push all changed files if: github.event_name == 'push' run: | - git config --global user.name "Leifer" - git config --global user.email "username@users.noreply.github.com" git commit -a -m 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release' git push From 288894ee8e1f0720d282a87efc40c6e42fc0fa9c Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 15:22:46 +0000 Subject: [PATCH 088/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 9688ec1844b9147751215ceb7f8524cdbe58655b Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:26:04 +0100 Subject: [PATCH 089/117] chore(release): 0.1.13 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c74d4a..023883a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.13](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.12...v0.1.13) (2023-01-11) + ### [0.1.12](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.12) (2023-01-11) ### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10) diff --git a/package.json b/package.json index d7ef271..07bc07d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.12", + "version": "0.1.13", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From f80a051fa950d8d01bb01c9f4295245881df3087 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 16:26:16 +0100 Subject: [PATCH 090/117] chore(release): 0.1.13 --- .github/workflows/releases.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 90aa18b..72f0c48 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -69,5 +69,5 @@ jobs: - name: GIT commit and push all changed files if: github.event_name == 'push' run: | - git commit -a -m 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release' + git commit -a -m 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' git push From 9fb34cc9e0d5ea721cfaa36e816518581c757d59 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 15:30:38 +0000 Subject: [PATCH 091/117] =?UTF-8?q?ci(providers):=20=F0=9F=91=8D=20updated?= =?UTF-8?q?=20versions=20stable=20providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From ef03478683b73d182c37ab15caf8173097a492ef Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 15:36:27 +0000 Subject: [PATCH 092/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index c549214..44ebca0 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.53-alpha.0", + "version": "0.0.55-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 391098e..6f04765 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.60-alpha.0", + "version": "0.0.61-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index 92b9561..7f0f0a8 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.4-alpha.0", + "version": "0.0.5-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index f9ffe1c..b6cf5b4 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.71-alpha.0", + "version": "0.0.72-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 6c53960..3d745a8 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.52-alpha.0", + "version": "0.0.53-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/portal/package.json b/packages/portal/package.json index ce7784d..03c9bae 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.10-alpha.0", + "version": "0.0.11-alpha.0", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/packages/provider/package.json b/packages/provider/package.json index 007f079..c32af01 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.58-alpha.0", + "version": "0.0.59-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From eceb170df03721dca4183b658c863b94fa04bc84 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Wed, 11 Jan 2023 10:36:18 -0600 Subject: [PATCH 093/117] feat: mod de starters para habiltar portal Modificacion de starters para habiltar el portal para el QR --- starters/apps/base-baileys-json/app.js | 64 +++++++--- starters/apps/base-baileys-memory/app.js | 64 +++++++--- starters/apps/base-baileys-mongo/app.js | 108 +++++++++-------- starters/apps/base-baileys-mysql/app.js | 108 +++++++++-------- .../apps/base-baileys-mysql/public/index.html | 80 ------------- .../apps/base-baileys-mysql/server.http.js | 34 ------ starters/apps/base-meta-json/app.js | 104 +++++++++-------- starters/apps/base-meta-memory/app.js | 104 +++++++++-------- starters/apps/base-meta-mongo/app.js | 104 +++++++++-------- starters/apps/base-meta-mysql/app.js | 104 +++++++++-------- starters/apps/base-twilio-json/app.js | 104 +++++++++-------- starters/apps/base-twilio-memory/app.js | 104 +++++++++-------- starters/apps/base-twilio-mongo/app.js | 104 +++++++++-------- starters/apps/base-twilio-mysql/app.js | 104 +++++++++-------- starters/apps/base-venom-json/app.js | 108 +++++++++-------- .../apps/base-venom-json/public/index.html | 80 ------------- starters/apps/base-venom-json/server.http.js | 34 ------ starters/apps/base-venom-memory/app.js | 108 +++++++++-------- .../apps/base-venom-memory/public/index.html | 80 ------------- .../apps/base-venom-memory/server.http.js | 34 ------ starters/apps/base-venom-mongo/app.js | 108 +++++++++-------- .../apps/base-venom-mongo/public/index.html | 80 ------------- starters/apps/base-venom-mongo/server.http.js | 34 ------ starters/apps/base-venom-mysql/app.js | 108 +++++++++-------- .../apps/base-venom-mysql/public/index.html | 80 ------------- starters/apps/base-venom-mysql/server.http.js | 34 ------ starters/apps/base-wweb-json/app.js | 108 +++++++++-------- .../apps/base-wweb-json/public/index.html | 80 ------------- starters/apps/base-wweb-json/server.http.js | 34 ------ starters/apps/base-wweb-memory/app.js | 108 +++++++++-------- .../apps/base-wweb-memory/public/index.html | 80 ------------- starters/apps/base-wweb-memory/server.http.js | 34 ------ starters/apps/base-wweb-mongo/app.js | 109 ++++++++++-------- .../apps/base-wweb-mongo/public/index.html | 80 ------------- starters/apps/base-wweb-mongo/server.http.js | 34 ------ starters/apps/base-wweb-mysql/app.js | 108 +++++++++-------- .../apps/base-wweb-mysql/public/index.html | 80 ------------- starters/apps/base-wweb-mysql/server.http.js | 34 ------ 38 files changed, 1174 insertions(+), 1893 deletions(-) delete mode 100644 starters/apps/base-baileys-mysql/public/index.html delete mode 100644 starters/apps/base-baileys-mysql/server.http.js delete mode 100644 starters/apps/base-venom-json/public/index.html delete mode 100644 starters/apps/base-venom-json/server.http.js delete mode 100644 starters/apps/base-venom-memory/public/index.html delete mode 100644 starters/apps/base-venom-memory/server.http.js delete mode 100644 starters/apps/base-venom-mongo/public/index.html delete mode 100644 starters/apps/base-venom-mongo/server.http.js delete mode 100644 starters/apps/base-venom-mysql/public/index.html delete mode 100644 starters/apps/base-venom-mysql/server.http.js delete mode 100644 starters/apps/base-wweb-json/public/index.html delete mode 100644 starters/apps/base-wweb-json/server.http.js delete mode 100644 starters/apps/base-wweb-memory/public/index.html delete mode 100644 starters/apps/base-wweb-memory/server.http.js delete mode 100644 starters/apps/base-wweb-mongo/public/index.html delete mode 100644 starters/apps/base-wweb-mongo/server.http.js delete mode 100644 starters/apps/base-wweb-mysql/public/index.html delete mode 100644 starters/apps/base-wweb-mysql/server.http.js diff --git a/starters/apps/base-baileys-json/app.js b/starters/apps/base-baileys-json/app.js index 67d4be6..b06887c 100644 --- a/starters/apps/base-baileys-json/app.js +++ b/starters/apps/base-baileys-json/app.js @@ -9,31 +9,59 @@ const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const JsonFileAdapter = require('@bot-whatsapp/database/json') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) + const flowDocs = addKeyword([ 'doc', 'documentacion', 'documentación', -]).addAnswer([ - '📄 Aquí encontras las documentación recuerda que puedes mejorarla', - 'https://bot-whatsapp.netlify.app/', -]) +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer([ - '🙌 Aquí encontras un ejemplo rapido', - 'https://bot-whatsapp.netlify.app/docs/example/', -]) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowGracias = addKeyword(['gracias', 'grac']).addAnswer([ - '🚀 Puedes aportar tu granito de arena a este proyecto', - '[*opencollective*] https://opencollective.com/bot-whatsapp', - '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', - '[*patreon*] https://www.patreon.com/leifermendez', -]) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowDiscord = addKeyword(['discord']).addAnswer([ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', -]) +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) .addAnswer('🙌 Hola bienvenido a este *Chatbot*') diff --git a/starters/apps/base-baileys-memory/app.js b/starters/apps/base-baileys-memory/app.js index a8fbd00..3d05e79 100644 --- a/starters/apps/base-baileys-memory/app.js +++ b/starters/apps/base-baileys-memory/app.js @@ -9,31 +9,59 @@ const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MockAdapter = require('@bot-whatsapp/database/mock') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) + const flowDocs = addKeyword([ 'doc', 'documentacion', 'documentación', -]).addAnswer([ - '📄 Aquí encontras las documentación recuerda que puedes mejorarla', - 'https://bot-whatsapp.netlify.app/', -]) +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer([ - '🙌 Aquí encontras un ejemplo rapido', - 'https://bot-whatsapp.netlify.app/docs/example/', -]) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowGracias = addKeyword(['gracias', 'grac']).addAnswer([ - '🚀 Puedes aportar tu granito de arena a este proyecto', - '[*opencollective*] https://opencollective.com/bot-whatsapp', - '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', - '[*patreon*] https://www.patreon.com/leifermendez', -]) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowDiscord = addKeyword(['discord']).addAnswer([ - '🤪 Únete al discord', - 'https://link.codigoencasa.com/DISCORD', -]) +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) .addAnswer('🙌 Hola bienvenido a este *Chatbot*') diff --git a/starters/apps/base-baileys-mongo/app.js b/starters/apps/base-baileys-mongo/app.js index 277115d..253d1fa 100644 --- a/starters/apps/base-baileys-mongo/app.js +++ b/starters/apps/base-baileys-mongo/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MongoAdapter = require('@bot-whatsapp/database/mongo') @@ -29,58 +28,72 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -95,6 +108,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-baileys-mysql/app.js b/starters/apps/base-baileys-mysql/app.js index 02a13c0..3dc800b 100644 --- a/starters/apps/base-baileys-mysql/app.js +++ b/starters/apps/base-baileys-mysql/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MySQLAdapter = require('@bot-whatsapp/database/mysql') @@ -30,58 +29,72 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -98,6 +111,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-baileys-mysql/public/index.html b/starters/apps/base-baileys-mysql/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-baileys-mysql/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-baileys-mysql/server.http.js b/starters/apps/base-baileys-mysql/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-baileys-mysql/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-meta-json/app.js b/starters/apps/base-meta-json/app.js index 49dd430..cc4c7ac 100644 --- a/starters/apps/base-meta-json/app.js +++ b/starters/apps/base-meta-json/app.js @@ -20,58 +20,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-meta-memory/app.js b/starters/apps/base-meta-memory/app.js index 288929c..c8201e8 100644 --- a/starters/apps/base-meta-memory/app.js +++ b/starters/apps/base-meta-memory/app.js @@ -20,58 +20,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-meta-mongo/app.js b/starters/apps/base-meta-mongo/app.js index f40a6a2..18cd9ac 100644 --- a/starters/apps/base-meta-mongo/app.js +++ b/starters/apps/base-meta-mongo/app.js @@ -27,58 +27,72 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-meta-mysql/app.js b/starters/apps/base-meta-mysql/app.js index 25b171c..102f977 100644 --- a/starters/apps/base-meta-mysql/app.js +++ b/starters/apps/base-meta-mysql/app.js @@ -28,58 +28,72 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-twilio-json/app.js b/starters/apps/base-twilio-json/app.js index 190e842..047a126 100644 --- a/starters/apps/base-twilio-json/app.js +++ b/starters/apps/base-twilio-json/app.js @@ -20,58 +20,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-twilio-memory/app.js b/starters/apps/base-twilio-memory/app.js index 9730709..cc1d16b 100644 --- a/starters/apps/base-twilio-memory/app.js +++ b/starters/apps/base-twilio-memory/app.js @@ -20,58 +20,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-twilio-mongo/app.js b/starters/apps/base-twilio-mongo/app.js index 9e5e3f7..dcabb99 100644 --- a/starters/apps/base-twilio-mongo/app.js +++ b/starters/apps/base-twilio-mongo/app.js @@ -27,58 +27,72 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-twilio-mysql/app.js b/starters/apps/base-twilio-mysql/app.js index 7100f9c..4725cd3 100644 --- a/starters/apps/base-twilio-mysql/app.js +++ b/starters/apps/base-twilio-mysql/app.js @@ -29,58 +29,72 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { diff --git a/starters/apps/base-venom-json/app.js b/starters/apps/base-venom-json/app.js index c742f78..c399b5e 100644 --- a/starters/apps/base-venom-json/app.js +++ b/starters/apps/base-venom-json/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const JsonFileAdapter = require('@bot-whatsapp/database/json') @@ -22,58 +21,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -85,6 +98,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-venom-json/public/index.html b/starters/apps/base-venom-json/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-venom-json/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-venom-json/server.http.js b/starters/apps/base-venom-json/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-venom-json/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-memory/app.js b/starters/apps/base-venom-memory/app.js index 6f89ef2..c539f36 100644 --- a/starters/apps/base-venom-memory/app.js +++ b/starters/apps/base-venom-memory/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MockAdapter = require('@bot-whatsapp/database/mock') @@ -22,58 +21,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -85,6 +98,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-venom-memory/public/index.html b/starters/apps/base-venom-memory/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-venom-memory/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-venom-memory/server.http.js b/starters/apps/base-venom-memory/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-venom-memory/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mongo/app.js b/starters/apps/base-venom-mongo/app.js index d8de982..bae23f8 100644 --- a/starters/apps/base-venom-mongo/app.js +++ b/starters/apps/base-venom-mongo/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MongoAdapter = require('@bot-whatsapp/database/mongo') @@ -29,58 +28,72 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -95,6 +108,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-venom-mongo/public/index.html b/starters/apps/base-venom-mongo/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-venom-mongo/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-venom-mongo/server.http.js b/starters/apps/base-venom-mongo/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-venom-mongo/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-venom-mysql/app.js b/starters/apps/base-venom-mysql/app.js index 24da8ee..737dc99 100644 --- a/starters/apps/base-venom-mysql/app.js +++ b/starters/apps/base-venom-mysql/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MySQLAdapter = require('@bot-whatsapp/database/mysql') @@ -31,58 +30,72 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -99,6 +112,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-venom-mysql/public/index.html b/starters/apps/base-venom-mysql/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-venom-mysql/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-venom-mysql/server.http.js b/starters/apps/base-venom-mysql/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-venom-mysql/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-json/app.js b/starters/apps/base-wweb-json/app.js index 31f03dd..3144bd0 100644 --- a/starters/apps/base-wweb-json/app.js +++ b/starters/apps/base-wweb-json/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const JsonFileAdapter = require('@bot-whatsapp/database/json') @@ -22,58 +21,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -85,6 +98,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-wweb-json/public/index.html b/starters/apps/base-wweb-json/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-wweb-json/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-wweb-json/server.http.js b/starters/apps/base-wweb-json/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-wweb-json/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-memory/app.js b/starters/apps/base-wweb-memory/app.js index 5318283..29eb0bc 100644 --- a/starters/apps/base-wweb-memory/app.js +++ b/starters/apps/base-wweb-memory/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') @@ -22,58 +21,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock') * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -85,6 +98,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-wweb-memory/public/index.html b/starters/apps/base-wweb-memory/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-wweb-memory/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-wweb-memory/server.http.js b/starters/apps/base-wweb-memory/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-wweb-memory/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mongo/app.js b/starters/apps/base-wweb-mongo/app.js index 34f3887..43eed81 100644 --- a/starters/apps/base-wweb-mongo/app.js +++ b/starters/apps/base-wweb-mongo/app.js @@ -4,12 +4,10 @@ const { createFlow, addKeyword, } = require('@bot-whatsapp/bot') - +const QRPortal = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MongoAdapter = require('@bot-whatsapp/database/mongo') -require('./server.http') - /** * Declaramos las conexiones de Mongo */ @@ -29,58 +27,72 @@ const MONGO_DB_NAME = 'db_bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -95,6 +107,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-wweb-mongo/public/index.html b/starters/apps/base-wweb-mongo/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-wweb-mongo/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-wweb-mongo/server.http.js b/starters/apps/base-wweb-mongo/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-wweb-mongo/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) diff --git a/starters/apps/base-wweb-mysql/app.js b/starters/apps/base-wweb-mysql/app.js index 2095842..2b31f4a 100644 --- a/starters/apps/base-wweb-mysql/app.js +++ b/starters/apps/base-wweb-mysql/app.js @@ -5,8 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -require('./server.http') - +const QRPortal = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MySQLAdapter = require('@bot-whatsapp/database/mysql') @@ -31,58 +30,72 @@ const MYSQL_DB_NAME = 'bot' * Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal. */ -const flowBolsos2 = addKeyword(['bolsos2', '2']) - .addAnswer('🤯 *MUCHOS* bolsos ...') - .addAnswer('y mas bolsos... bla bla') +const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([ + '📄 Aquí tenemos el flujo secundario', +]) -const flowZapatos2 = addKeyword(['zapatos2', '2']) - .addAnswer('🤯 repito que tengo *MUCHOS* zapatos.') - .addAnswer('y algunas otras cosas.') +const flowDocs = addKeyword([ + 'doc', + 'documentacion', + 'documentación', +]).addAnswer( + [ + '📄 Aquí encontras las documentación recuerda que puedes mejorarla', + 'https://bot-whatsapp.netlify.app/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS']) - .addAnswer('🤯 Veo que elegiste zapatos') - .addAnswer('Tengo muchos zapatos...bla bla') - .addAnswer( - ['Manda:', '*(2) Zapatos2*', 'para mas información'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowZapatos2] - ) +const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer( + [ + '🙌 Aquí encontras un ejemplo rapido', + 'https://bot-whatsapp.netlify.app/docs/example/', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS']) - .addAnswer('🙌 Veo que elegiste bolsos') - .addAnswer('Tengo muchos bolsos...bla bla') - .addAnswer( - ['Manda:', '*(2) Bolsos2*', 'para mas información.'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos2] - ) +const flowGracias = addKeyword(['gracias', 'grac']).addAnswer( + [ + '🚀 Puedes aportar tu granito de arena a este proyecto', + '[*opencollective*] https://opencollective.com/bot-whatsapp', + '[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez', + '[*patreon*] https://www.patreon.com/leifermendez', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) -/** - * Declarando flujo principal - */ +const flowDiscord = addKeyword(['discord']).addAnswer( + [ + '🤪 Únete al discord', + 'https://link.codigoencasa.com/DISCORD', + '\n*2* Para siguiente paso.', + ], + null, + null, + [flowSecundario] +) const flowPrincipal = addKeyword(['hola', 'ole', 'alo']) - .addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?']) - .addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...']) + .addAnswer('🙌 Hola bienvenido a este *Chatbot*') .addAnswer( - ['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'], - { capture: true }, - (ctx) => { - console.log('Aqui puedes ver más info del usuario...') - console.log('Puedes enviar un mail, hook, etc..') - console.log(ctx) - }, - [flowBolsos, flowZapatos] + [ + 'te comparto los siguientes links de interes sobre el proyecto', + '👉 *doc* para ver la documentación', + '👉 *gracias* para ver la lista de videos', + '👉 *discord* unirte al discord', + ], + null, + null, + [flowDocs, flowGracias, flowTuto, flowDiscord] ) const main = async () => { @@ -99,6 +112,7 @@ const main = async () => { provider: adapterProvider, database: adapterDB, }) + QRPortalWeb() } main() diff --git a/starters/apps/base-wweb-mysql/public/index.html b/starters/apps/base-wweb-mysql/public/index.html deleted file mode 100644 index 202b50c..0000000 --- a/starters/apps/base-wweb-mysql/public/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - 🤖 Crear chatbot WhatsApp en minutos - - - -
- Escanear QR -
-

Whatsapp QR

-

- F5 para actualizar, el codigo se actualiza cada minuto.
- Con esta libreria, puedes configurar respuestas - automatizadas para preguntas frecuentes , recibir y - responder mensajes de manera automatizada, y hacer un - seguimiento de las interacciones con los clientes. Además, - nuestro Chatbot se integra fácilmente con otros sistemas y - herramientas que ya esté utilizando en su negocio. -

- -
-
- - diff --git a/starters/apps/base-wweb-mysql/server.http.js b/starters/apps/base-wweb-mysql/server.http.js deleted file mode 100644 index 217bd71..0000000 --- a/starters/apps/base-wweb-mysql/server.http.js +++ /dev/null @@ -1,34 +0,0 @@ -const http = require('http') -const fs = require('fs') -const path = require('path') - -const PORT = process.env.PORT || 3000 - -/** - * Levantar un HTTP Server - */ -http.createServer(function (req, res) { - var cssPath = undefined - var fileStream = undefined - var imagePath = undefined - - if (req.url === '/') { - fs.readFile('./public/index.html', 'UTF-8', function (err, html) { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.end(html) - }) - } else if (req.url.match('.css$')) { - cssPath = path.join(__dirname, 'public', req.url) - fileStream = fs.createReadStream(cssPath, 'UTF-8') - res.writeHead(200, { 'Content-Type': 'text/css' }) - fileStream.pipe(res) - } else if (req.url.match('.png$')) { - imagePath = path.join(__dirname, req.url) - fileStream = fs.createReadStream(imagePath) - res.writeHead(200, { 'Content-Type': 'image/png' }) - fileStream.pipe(res) - } else { - res.writeHead(404, { 'Content-Type': 'text/html' }) - res.end('No Page Found') - } -}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`)) From f430380b4f23d41702395c96c628bf13bf443278 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Wed, 11 Jan 2023 10:49:48 -0600 Subject: [PATCH 094/117] fix: correccion en starters app.js para portal QR correccion en starters app.js para portal QR --- starters/apps/base-baileys-mongo/app.js | 2 +- starters/apps/base-baileys-mysql/app.js | 2 +- starters/apps/base-venom-json/app.js | 2 +- starters/apps/base-venom-memory/app.js | 2 +- starters/apps/base-venom-mongo/app.js | 2 +- starters/apps/base-venom-mysql/app.js | 2 +- starters/apps/base-wweb-json/app.js | 2 +- starters/apps/base-wweb-memory/app.js | 2 +- starters/apps/base-wweb-mongo/app.js | 3 ++- starters/apps/base-wweb-mysql/app.js | 2 +- 10 files changed, 11 insertions(+), 10 deletions(-) diff --git a/starters/apps/base-baileys-mongo/app.js b/starters/apps/base-baileys-mongo/app.js index 253d1fa..2de3ad6 100644 --- a/starters/apps/base-baileys-mongo/app.js +++ b/starters/apps/base-baileys-mongo/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MongoAdapter = require('@bot-whatsapp/database/mongo') diff --git a/starters/apps/base-baileys-mysql/app.js b/starters/apps/base-baileys-mysql/app.js index 3dc800b..d3dbbe5 100644 --- a/starters/apps/base-baileys-mysql/app.js +++ b/starters/apps/base-baileys-mysql/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const BaileysProvider = require('@bot-whatsapp/provider/baileys') const MySQLAdapter = require('@bot-whatsapp/database/mysql') diff --git a/starters/apps/base-venom-json/app.js b/starters/apps/base-venom-json/app.js index c399b5e..120deee 100644 --- a/starters/apps/base-venom-json/app.js +++ b/starters/apps/base-venom-json/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const JsonFileAdapter = require('@bot-whatsapp/database/json') diff --git a/starters/apps/base-venom-memory/app.js b/starters/apps/base-venom-memory/app.js index c539f36..8402cf9 100644 --- a/starters/apps/base-venom-memory/app.js +++ b/starters/apps/base-venom-memory/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/base-venom-mongo/app.js b/starters/apps/base-venom-mongo/app.js index bae23f8..2f4f16a 100644 --- a/starters/apps/base-venom-mongo/app.js +++ b/starters/apps/base-venom-mongo/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MongoAdapter = require('@bot-whatsapp/database/mongo') diff --git a/starters/apps/base-venom-mysql/app.js b/starters/apps/base-venom-mysql/app.js index 737dc99..8c5c2db 100644 --- a/starters/apps/base-venom-mysql/app.js +++ b/starters/apps/base-venom-mysql/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const VenomProvider = require('@bot-whatsapp/provider/venom') const MySQLAdapter = require('@bot-whatsapp/database/mysql') diff --git a/starters/apps/base-wweb-json/app.js b/starters/apps/base-wweb-json/app.js index 3144bd0..729ac2a 100644 --- a/starters/apps/base-wweb-json/app.js +++ b/starters/apps/base-wweb-json/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const JsonFileAdapter = require('@bot-whatsapp/database/json') diff --git a/starters/apps/base-wweb-memory/app.js b/starters/apps/base-wweb-memory/app.js index 29eb0bc..d6a567a 100644 --- a/starters/apps/base-wweb-memory/app.js +++ b/starters/apps/base-wweb-memory/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MockAdapter = require('@bot-whatsapp/database/mock') diff --git a/starters/apps/base-wweb-mongo/app.js b/starters/apps/base-wweb-mongo/app.js index 43eed81..a8e8aad 100644 --- a/starters/apps/base-wweb-mongo/app.js +++ b/starters/apps/base-wweb-mongo/app.js @@ -4,7 +4,8 @@ const { createFlow, addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') + +const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MongoAdapter = require('@bot-whatsapp/database/mongo') diff --git a/starters/apps/base-wweb-mysql/app.js b/starters/apps/base-wweb-mysql/app.js index 2b31f4a..68f7f37 100644 --- a/starters/apps/base-wweb-mysql/app.js +++ b/starters/apps/base-wweb-mysql/app.js @@ -5,7 +5,7 @@ const { addKeyword, } = require('@bot-whatsapp/bot') -const QRPortal = require('@bot-whatsapp/portal') +const QRPortalWeb = require('@bot-whatsapp/portal') const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp') const MySQLAdapter = require('@bot-whatsapp/database/mysql') From 675046cc58a63f6583da85fc35d3a873458e6051 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 20:34:59 +0100 Subject: [PATCH 095/117] ci: :fire: fix github action --- .github/workflows/check-providers.yml | 45 --------------------------- .github/workflows/codeql.yml | 3 +- .github/workflows/contributors.yml | 6 ++-- .github/workflows/netlify-dev.yml | 1 + .github/workflows/netlify.yml | 2 +- .github/workflows/releases-dev.yml | 12 ++++--- .github/workflows/releases.yml | 5 +-- .gitignore | 1 + 8 files changed, 18 insertions(+), 57 deletions(-) delete mode 100644 .github/workflows/check-providers.yml diff --git a/.github/workflows/check-providers.yml b/.github/workflows/check-providers.yml deleted file mode 100644 index 9965606..0000000 --- a/.github/workflows/check-providers.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Rev Providers - -on: - pull_request: - branches: - - dev - -jobs: - check-npm: - name: Install Dependencies - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: 16.x - cache: 'yarn' - registry-url: https://registry.npmjs.org/ - - - run: corepack enable - - - name: Install NPM Dependencies - run: yarn install --immutable --network-timeout 300000 - - - name: Check Baileys - run: yarn node ./scripts/checker.js --name=baileys --stable=true - - - name: Check Venom - run: yarn node ./scripts/checker.js --name=venom --stable=true - - - name: Check web-whatsapp - run: yarn node ./scripts/checker.js --name=web-whatsapp --stable=true - - - name: Check Meta - run: yarn node ./scripts/checker.js --name=meta --stable=true - - - name: Check Twilio - run: yarn node ./scripts/checker.js --name=twilio --stable=true - - - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: 'ci(providers): 👍 updated versions stable providers' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 86178fd..a1fed1b 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -13,7 +13,7 @@ name: 'CodeQL' on: push: - branches: ['main', dev, next-release] + branches: [release/next] pull_request: # The branches below must be a subset of the branches above branches: ['main'] @@ -22,6 +22,7 @@ on: jobs: analyze: + if: ${{ !github.event.act }} name: Analyze runs-on: ubuntu-latest permissions: diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index 4f3d94e..b126e98 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -1,8 +1,8 @@ name: Revisando Colaboradores + on: - push: - branches: - - main + schedule: + - cron: '0 9 * * *' jobs: contrib-readme-job: diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index e3e8200..1820da5 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -13,6 +13,7 @@ on: jobs: ############ DOCUMENTATION BUILD ############ build-documentation: + if: ${{ !github.event.act }} name: Build Package runs-on: ubuntu-latest diff --git a/.github/workflows/netlify.yml b/.github/workflows/netlify.yml index 8f1ba08..2dac101 100644 --- a/.github/workflows/netlify.yml +++ b/.github/workflows/netlify.yml @@ -7,7 +7,7 @@ on: jobs: ############ DOCUMENTATION BUILD ############ - build-documentation: + build-documentation-prod: name: Build Package runs-on: ubuntu-latest diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 4e5c169..6901587 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -50,8 +50,10 @@ jobs: - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}" - - name: Commit Versioning & Push changes - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: 'ci(version): :zap: automatic - "${date}" updated versions every packages' - branch: dev + - name: GIT commit and push all changed files + if: github.event_name == 'push' + run: | + git config --global user.email "leifer.contacto@gmail.com" + git config --global user.name "Leifer Mendez" + git commit -a -m 'chore(version): dev release 🫡' + git push origin dev diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 72f0c48..343164e 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -6,7 +6,8 @@ on: - release/production jobs: ############ RELEASE ############ - release: + release-prod: + if: ${{ !github.event.act }} name: Release runs-on: ubuntu-latest steps: @@ -70,4 +71,4 @@ jobs: if: github.event_name == 'push' run: | git commit -a -m 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' - git push + git push origin dev diff --git a/.gitignore b/.gitignore index 721d12c..1cc3038 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ yarn-error.log .npmrc # Local Netlify folder .netlify +.secrets \ No newline at end of file From 89cf90988833e0845368461beffa3cbc436f25de Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 20:40:41 +0100 Subject: [PATCH 096/117] ci: :fire: fix github action --- .github/workflows/releases-dev.yml | 12 +++++------- .github/workflows/releases.yml | 9 +++++---- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 6901587..4e5c169 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -50,10 +50,8 @@ jobs: - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}" - - name: GIT commit and push all changed files - if: github.event_name == 'push' - run: | - git config --global user.email "leifer.contacto@gmail.com" - git config --global user.name "Leifer Mendez" - git commit -a -m 'chore(version): dev release 🫡' - git push origin dev + - name: Commit Versioning & Push changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: 'ci(version): :zap: automatic - "${date}" updated versions every packages' + branch: dev diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 343164e..aab4756 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -67,8 +67,9 @@ jobs: - name: Release Github run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}" - - name: GIT commit and push all changed files + - name: Commit Versioning & Push changes if: github.event_name == 'push' - run: | - git commit -a -m 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' - git push origin dev + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' + branch: dev From 0f9e57df378bcbf1dfe9de6390c925f87521bda0 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Wed, 11 Jan 2023 19:44:10 +0000 Subject: [PATCH 097/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 44ebca0..b205714 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.55-alpha.0", + "version": "0.0.61-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 6f04765..18b8619 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.61-alpha.0", + "version": "0.0.67-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index 7f0f0a8..7381d6a 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.5-alpha.0", + "version": "0.0.11-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index b6cf5b4..49503df 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.72-alpha.0", + "version": "0.0.78-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 3d745a8..80bbcd1 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.53-alpha.0", + "version": "0.0.59-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/portal/package.json b/packages/portal/package.json index 03c9bae..9fd3307 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.11-alpha.0", + "version": "0.0.17-alpha.0", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/packages/provider/package.json b/packages/provider/package.json index c32af01..683ca66 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.59-alpha.0", + "version": "0.0.65-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From 9723e9d908f240070fbb06ae99e7107ea9919756 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 20:49:04 +0100 Subject: [PATCH 098/117] chore(release): 0.1.14 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 023883a..f5cd96d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.14](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.13...v0.1.14) (2023-01-11) + ### [0.1.13](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.12...v0.1.13) (2023-01-11) ### [0.1.12](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.12) (2023-01-11) diff --git a/package.json b/package.json index 07bc07d..e77273f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.13", + "version": "0.1.14", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From b682b0b6ba857cee126a3cde861270a3c94e8927 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 21:03:43 +0100 Subject: [PATCH 099/117] chore(release): 0.1.15 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5cd96d..c16e624 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.15](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.14...v0.1.15) (2023-01-11) + ### [0.1.14](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.13...v0.1.14) (2023-01-11) ### [0.1.13](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.12...v0.1.13) (2023-01-11) diff --git a/package.json b/package.json index e77273f..c7f64fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.14", + "version": "0.1.15", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From e442d05aa4570e5147498695474e810e8de0b149 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 21:04:00 +0100 Subject: [PATCH 100/117] chore(version): launch release --- .github/workflows/releases.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index aab4756..32d04cf 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -67,6 +67,12 @@ jobs: - name: Release Github run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}" + - name: 'Run if changes have been detected' + if: steps.auto-commit-action.outputs.changes_detected == 'true' + run: | + git add . + git commit -m "chore(version): pre release" + - name: Commit Versioning & Push changes if: github.event_name == 'push' uses: stefanzweifel/git-auto-commit-action@v4 From 42b98801db6dc13a9c7e247325788e72d48cbb64 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 21:16:19 +0100 Subject: [PATCH 101/117] chore(release): 0.1.16 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c16e624..48381f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.16](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.15...v0.1.16) (2023-01-11) + ### [0.1.15](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.14...v0.1.15) (2023-01-11) ### [0.1.14](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.13...v0.1.14) (2023-01-11) diff --git a/package.json b/package.json index c7f64fc..a6e64e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.15", + "version": "0.1.16", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From aaec0751408ab49483d428810d94aaf7d46acb94 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 11 Jan 2023 21:17:32 +0100 Subject: [PATCH 102/117] fix(ci): pre-release --- .github/workflows/releases.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index 32d04cf..d1c2e8f 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -68,7 +68,6 @@ jobs: run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}" - name: 'Run if changes have been detected' - if: steps.auto-commit-action.outputs.changes_detected == 'true' run: | git add . git commit -m "chore(version): pre release" From 230981e2676361149cb2a99def7f705e75009260 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 12 Jan 2023 09:35:06 +0100 Subject: [PATCH 103/117] fix(starters): :zap: added dockerfile --- starters/apps/base-baileys-mongo/Dockerfile | 4 +++- starters/apps/base-baileys-mysql/Dockerfile | 4 +++- starters/apps/base-meta-json/Dockerfile | 9 +++++++++ starters/apps/base-meta-memory/Dockerfile | 9 +++++++++ starters/apps/base-meta-mongo/Dockerfile | 9 +++++++++ starters/apps/base-meta-mysql/Dockerfile | 9 +++++++++ starters/apps/base-twilio-json/Dockerfile | 9 +++++++++ starters/apps/base-twilio-memory/Dockerfile | 9 +++++++++ starters/apps/base-twilio-mongo/Dockerfile | 9 +++++++++ starters/apps/base-twilio-mysql/Dockerfile | 9 +++++++++ 10 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 starters/apps/base-meta-json/Dockerfile create mode 100644 starters/apps/base-meta-memory/Dockerfile create mode 100644 starters/apps/base-meta-mongo/Dockerfile create mode 100644 starters/apps/base-meta-mysql/Dockerfile create mode 100644 starters/apps/base-twilio-json/Dockerfile create mode 100644 starters/apps/base-twilio-memory/Dockerfile create mode 100644 starters/apps/base-twilio-mongo/Dockerfile create mode 100644 starters/apps/base-twilio-mysql/Dockerfile diff --git a/starters/apps/base-baileys-mongo/Dockerfile b/starters/apps/base-baileys-mongo/Dockerfile index 14b07b2..7fb6d5d 100644 --- a/starters/apps/base-baileys-mongo/Dockerfile +++ b/starters/apps/base-baileys-mongo/Dockerfile @@ -1,7 +1,9 @@ -FROM node:lts-bullseye as bot +FROM node:18-bullseye as bot WORKDIR /app COPY package*.json ./ RUN npm i COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL ARG PORT CMD ["npm", "start"] diff --git a/starters/apps/base-baileys-mysql/Dockerfile b/starters/apps/base-baileys-mysql/Dockerfile index 14b07b2..7fb6d5d 100644 --- a/starters/apps/base-baileys-mysql/Dockerfile +++ b/starters/apps/base-baileys-mysql/Dockerfile @@ -1,7 +1,9 @@ -FROM node:lts-bullseye as bot +FROM node:18-bullseye as bot WORKDIR /app COPY package*.json ./ RUN npm i COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL ARG PORT CMD ["npm", "start"] diff --git a/starters/apps/base-meta-json/Dockerfile b/starters/apps/base-meta-json/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-meta-json/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-meta-memory/Dockerfile b/starters/apps/base-meta-memory/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-meta-memory/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-meta-mongo/Dockerfile b/starters/apps/base-meta-mongo/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-meta-mongo/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-meta-mysql/Dockerfile b/starters/apps/base-meta-mysql/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-meta-mysql/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-twilio-json/Dockerfile b/starters/apps/base-twilio-json/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-twilio-json/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-twilio-memory/Dockerfile b/starters/apps/base-twilio-memory/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-twilio-memory/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-twilio-mongo/Dockerfile b/starters/apps/base-twilio-mongo/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-twilio-mongo/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] diff --git a/starters/apps/base-twilio-mysql/Dockerfile b/starters/apps/base-twilio-mysql/Dockerfile new file mode 100644 index 0000000..7fb6d5d --- /dev/null +++ b/starters/apps/base-twilio-mysql/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-bullseye as bot +WORKDIR /app +COPY package*.json ./ +RUN npm i +COPY . . +ARG RAILWAY_STATIC_URL +ARG PUBLIC_URL +ARG PORT +CMD ["npm", "start"] From a1ce98bdc884e59d104456c5883250024492fa63 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 12 Jan 2023 10:31:41 +0100 Subject: [PATCH 104/117] docs: :art: more doc --- packages/docs/src/routes/docs/flows/index.mdx | 138 +++++++++++++++++- 1 file changed, 137 insertions(+), 1 deletion(-) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 027c793..7a2171c 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -1,6 +1,6 @@ import Navigation from '../../../components/widgets/Navigation' -# Flow (Flujos) +# Flow Los flujos hace referencia al hecho de construir un flujo de conversion. Esto es un flow podemos observar que estan presente dos metodos importantes **addKeyword** y el **addAnswer**. @@ -23,6 +23,142 @@ const flowPrincipal = addKeyword(['hola', 'alo']) --- +## addKeyword() + +Esta funcion se utliza para iniciar un flujo de conversion.
Recibe un `string` o un `array` +de string `['hola','buenas']`. + +**Opciones** + +- sensitive: Sensible a mayusculas y minusculas por defecto `false` + +```js +const { addKeyword } = require('@bot-whatsapp/bot') + +const flowString = addKeyword('hola') + +const flowArray = addKeyword(['hola', 'alo']) + +const flowSensitive = addKeyword(['hola', 'alo'], { + sensitive: true, +}) +``` + +--- + +## addAnswer() + +Esta funcion se utliza para responder un mensaje despues del `addKeyword()` + +**Opciones** + +- delay: 0 (milisegundos) +- media: url de imagen +- buttons: array `[{body:'Boton1'}, {body:'Boton2'}, {body:'Boton3'}]` +- capture: false (para esperar respuesta) +- child: Objecto tipo flujo o arra de flujos hijos + +```js +const { addKeyword } = require('@bot-whatsapp/bot') + +const flowString = addKeyword('hola').addAnswer( + 'Este mensaje se enviara 1 segundo despues', + { + delay: 1000, + } +) + +const flowString = addKeyword('hola').addAnswer( + 'Este mensaje envia una imagen', + { + media: 'https://i.imgur.com/0HpzsEm.png', + } +) + +const flowString = addKeyword('hola').addAnswer( + 'Este mensaje envia tres botones', + { + buttons: [ + { body: 'Boton 1' }, + { body: 'Boton 2' }, + { body: 'Boton 3' }, + ], + } +) + +const flowString = addKeyword('hola').addAnswer( + 'Este mensaje espera una respueta del usuario', + { + capture: true, + } +) +``` + +--- + +## ctx + +Este argumento se utiliza para obtener el contexto de la conversación + +```js +const { addKeyword } = require('@bot-whatsapp/bot') + +const flowString = addKeyword('hola').addAnswer( + 'Indica cual es tu email', + null, + (ctx) => { + console.log('👉 Informacion del contexto: ', ctx) + } +) +``` + +--- + +## fallBack() + +Esta funcion se utliza para volver a enviar el ultimo mensaje abajo un ejemplo. +En el ejemplo de abajo esperamos que el usuario ingrese un mensaje que contenga `@` sino contiene +se repetira el mensaje `Indica cual es tu email` + +```js +const { addKeyword } = require('@bot-whatsapp/bot') + +const flowString = addKeyword('hola').addAnswer( + 'Indica cual es tu email', + null, + (ctx, { fallBack }) => { + if (!ctx.body.includes('@')) return fallBack() + } +) +``` + +--- + +## flowDynamic() + +Esta funcion se utliza para devolver mensajes dinamicos que pueden venir de una API o Base de datos. +La funcion recibe un array que debe contener la siguiente estrucutura: + +`[{body:'Mensaje}, {body:'Mensaje2}]` + +```js +const { addKeyword } = require('@bot-whatsapp/bot') + +const flowString = addKeyword('hola') + .addAnswer('Indica cual es tu email', null, async (ctx, {flowDynamic}) => { + const mensajesDB = () => { + const categories = db.find(...) + const mapDatos = categories.map((c) => ({body:c.name})) + return mapDatos + } + await flowDynamic(mensajesDB()) + }) + + +``` + +--- + Date: Thu, 12 Jan 2023 11:43:58 +0100 Subject: [PATCH 105/117] refactor(bot): :sparkles: async callbacks --- packages/bot/core/core.class.js | 72 +++++++++++++++++++-------------- packages/bot/utils/queue.js | 8 ++-- 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 4243713..e084b20 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -8,6 +8,10 @@ const { createWriteStream } = require('fs') const logger = new Console({ stdout: createWriteStream(`${process.cwd()}/core.class.log`), }) + +const QueuePrincipal = new Queue() +const QueueDynamic = new Queue() + /** * [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos * [ ] Guardar historial en db @@ -84,17 +88,33 @@ class CoreClass { this.databaseClass.save(ctxByNumber) } + // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx + const sendFlow = async (messageToSend, numberOrId) => { + const queue = [] + for (const ctxMessage of messageToSend) { + const delayMs = ctxMessage?.options?.delay || 0 + if (delayMs) await delay(delayMs) + QueuePrincipal.enqueue(() => + Promise.all([ + this.sendProviderAndSave(numberOrId, ctxMessage), + cbEveryCtx(ctxMessage?.ref), + ]) + ) + } + return Promise.all(queue) + } + // 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje const fallBack = () => { fallBackFlag = true msgToSend = this.flowClass.find(refToContinue?.keyword, true) || [] - this.sendFlow(msgToSend, from) + sendFlow(msgToSend, from) return refToContinue } // 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes // para evitar bloque de whatsapp - const flowDynamic = (listMsg = [], optListMsg = { limit: 3 }) => { + const flowDynamic = async (listMsg = [], optListMsg = { limit: 3 }) => { if (!Array.isArray(listMsg)) throw new Error('Esto debe ser un ARRAY') @@ -108,26 +128,29 @@ class CoreClass { }) ) .slice(0, optListMsg.limit) - msgToSend = parseListMsg - this.sendFlow(msgToSend, from) + for (const msg of parseListMsg) { + await this.sendProviderAndSave(from, msg) + } return } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo - const cbEveryCtx = (inRef) => { - this.flowClass.allCallbacks[inRef](messageCtxInComming, { + const cbEveryCtx = async (inRef) => { + if (!this.flowClass.allCallbacks[inRef]) return Promise.resolve() + return this.flowClass.allCallbacks[inRef](messageCtxInComming, { fallBack, flowDynamic, }) } // 📄 [options: callback]: Si se tiene un callback se ejecuta - if (!fallBackFlag) { - if (prevMsg?.options?.capture) cbEveryCtx(prevMsg?.ref) - for (const ite of this.flowClass.find(body)) { - if (!ite?.options?.capture) cbEveryCtx(ite?.ref) - } - } + //TODO AQUI + // if (!fallBackFlag) { + // if (prevMsg?.options?.capture) cbEveryCtx(prevMsg?.ref) + // for (const ite of this.flowClass.find(body)) { + // if (!ite?.options?.capture) cbEveryCtx(ite?.ref) + // } + // } // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa if (!fallBackFlag && prevMsg?.options?.nested?.length) { @@ -138,11 +161,12 @@ class CoreClass { msgToSend = this.flowClass.find(body, false, flowStandalone) || [] - for (const ite of msgToSend) { - cbEveryCtx(ite?.ref) - } + // //TODO AQUI + // for (const ite of msgToSend) { + // cbEveryCtx(ite?.ref) + // } - this.sendFlow(msgToSend, from) + sendFlow(msgToSend, from) return } @@ -153,13 +177,13 @@ class CoreClass { if (['string', 'boolean'].includes(typeCapture) && valueCapture) { msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] - this.sendFlow(msgToSend, from) + sendFlow(msgToSend, from) return } } msgToSend = this.flowClass.find(body) || [] - this.sendFlow(msgToSend, from) + sendFlow(msgToSend, from) } /** @@ -176,18 +200,6 @@ class CoreClass { ]) } - sendFlow = async (messageToSend, numberOrId) => { - const queue = [] - for (const ctxMessage of messageToSend) { - const delayMs = ctxMessage?.options?.delay || 0 - if (delayMs) await delay(delayMs) - Queue.enqueue(() => - this.sendProviderAndSave(numberOrId, ctxMessage) - ) - } - return Promise.all(queue) - } - /** * @private * @param {*} message diff --git a/packages/bot/utils/queue.js b/packages/bot/utils/queue.js index 1f610e9..873024a 100644 --- a/packages/bot/utils/queue.js +++ b/packages/bot/utils/queue.js @@ -1,8 +1,8 @@ class Queue { - static queue = [] - static pendingPromise = false + queue = [] + pendingPromise = false - static enqueue(promise) { + enqueue(promise) { return new Promise((resolve, reject) => { this.queue.push({ promise, @@ -13,7 +13,7 @@ class Queue { }) } - static dequeue() { + dequeue() { if (this.workingOnPromise) { return false } From 8a1bdc58785950493cc2683b0ecb0fa881dc683f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 12 Jan 2023 16:35:43 +0100 Subject: [PATCH 106/117] refactor(bot): :fire: fallback --- packages/bot/core/core.class.js | 25 +++++++++++++++++++------ packages/bot/rollup-bot.config.js | 1 + 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index e084b20..c0186d8 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -10,7 +10,6 @@ const logger = new Console({ }) const QueuePrincipal = new Queue() -const QueueDynamic = new Queue() /** * [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos @@ -92,12 +91,13 @@ class CoreClass { const sendFlow = async (messageToSend, numberOrId) => { const queue = [] for (const ctxMessage of messageToSend) { + console.log('🙌 ', ctxMessage.answer) const delayMs = ctxMessage?.options?.delay || 0 if (delayMs) await delay(delayMs) QueuePrincipal.enqueue(() => Promise.all([ this.sendProviderAndSave(numberOrId, ctxMessage), - cbEveryCtx(ctxMessage?.ref), + resolveCbEveryCtx(ctxMessage), ]) ) } @@ -105,19 +105,23 @@ class CoreClass { } // 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje - const fallBack = () => { + const fallBack = async () => { fallBackFlag = true - msgToSend = this.flowClass.find(refToContinue?.keyword, true) || [] - sendFlow(msgToSend, from) + await this.sendProviderAndSave(from, refToContinue) + QueuePrincipal.queue = [] return refToContinue } // 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes // para evitar bloque de whatsapp - const flowDynamic = async (listMsg = [], optListMsg = { limit: 3 }) => { + const flowDynamic = async ( + listMsg = [], + optListMsg = { limit: 5, fallback: false } + ) => { if (!Array.isArray(listMsg)) throw new Error('Esto debe ser un ARRAY') + fallBackFlag = optListMsg.fallback const parseListMsg = listMsg .map(({ body }, index) => toCtx({ @@ -134,6 +138,13 @@ class CoreClass { return } + // 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback + const resolveCbEveryCtx = async (ctxMessage) => { + if (prevMsg?.options?.capture) return cbEveryCtx(prevMsg?.ref) + if (!ctxMessage?.options?.capture) + return await cbEveryCtx(ctxMessage?.ref) + } + // 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo const cbEveryCtx = async (inRef) => { if (!this.flowClass.allCallbacks[inRef]) return Promise.resolve() @@ -143,6 +154,8 @@ class CoreClass { }) } + if (prevMsg?.ref) resolveCbEveryCtx(prevMsg) + // 📄 [options: callback]: Si se tiene un callback se ejecuta //TODO AQUI // if (!fallBackFlag) { diff --git a/packages/bot/rollup-bot.config.js b/packages/bot/rollup-bot.config.js index f8ffa2a..36bbb87 100644 --- a/packages/bot/rollup-bot.config.js +++ b/packages/bot/rollup-bot.config.js @@ -10,6 +10,7 @@ module.exports = [ banner: banner['banner.output'].join(''), file: join(__dirname, 'lib', 'bundle.bot.cjs'), format: 'cjs', + sourcemap: true, }, plugins: [commonjs(), nodeResolve()], }, From ee30df73b879f4bf712b7e51f09e44ac943bea7f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 12 Jan 2023 21:04:04 +0100 Subject: [PATCH 107/117] ci(cli): :zap: fix --- packages/bot/core/core.class.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index c0186d8..79d996b 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -91,7 +91,6 @@ class CoreClass { const sendFlow = async (messageToSend, numberOrId) => { const queue = [] for (const ctxMessage of messageToSend) { - console.log('🙌 ', ctxMessage.answer) const delayMs = ctxMessage?.options?.delay || 0 if (delayMs) await delay(delayMs) QueuePrincipal.enqueue(() => From 8f27d34081a899dc1aa7de6afeb5a1184d7a8fd3 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Thu, 12 Jan 2023 21:04:44 +0100 Subject: [PATCH 108/117] ci(cli): :zap: fix --- .github/workflows/releases.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index d1c2e8f..d587c64 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -77,4 +77,3 @@ jobs: uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' - branch: dev From 8357eda573985b1477025defb3fead7911b6d394 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Thu, 12 Jan 2023 20:10:58 +0000 Subject: [PATCH 109/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index b205714..f8c71c4 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.61-alpha.0", + "version": "0.0.62-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 18b8619..6cdd841 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.67-alpha.0", + "version": "0.0.68-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index 7381d6a..e1497ba 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.11-alpha.0", + "version": "0.0.12-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 49503df..62e0a29 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.78-alpha.0", + "version": "0.0.79-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index 80bbcd1..f1f58cc 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.59-alpha.0", + "version": "0.0.60-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/portal/package.json b/packages/portal/package.json index 9fd3307..8ea9ac2 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.17-alpha.0", + "version": "0.0.18-alpha.0", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/packages/provider/package.json b/packages/provider/package.json index 683ca66..33d9e96 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.65-alpha.0", + "version": "0.0.66-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From 46a9fa6793e06600335de998d2bd9d0691b02ca4 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Fri, 13 Jan 2023 11:57:42 -0600 Subject: [PATCH 110/117] fix: se agrego @bot-whatsapp/portal a package.json se agrego @bot-whatsapp/portal a package.json --- starters/apps/base-baileys-mongo/package.json | 1 + starters/apps/base-baileys-mysql/package.json | 1 + starters/apps/base-venom-json/package.json | 1 + starters/apps/base-venom-memory/package.json | 1 + starters/apps/base-venom-mongo/package.json | 1 + starters/apps/base-venom-mysql/package.json | 1 + starters/apps/base-wweb-json/package.json | 1 + starters/apps/base-wweb-memory/package.json | 1 + starters/apps/base-wweb-mongo/package.json | 1 + starters/apps/base-wweb-mysql/package.json | 1 + 10 files changed, 10 insertions(+) diff --git a/starters/apps/base-baileys-mongo/package.json b/starters/apps/base-baileys-mongo/package.json index c2f8624..92f84a8 100644 --- a/starters/apps/base-baileys-mongo/package.json +++ b/starters/apps/base-baileys-mongo/package.json @@ -13,6 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "mongodb": "^4.12.1", diff --git a/starters/apps/base-baileys-mysql/package.json b/starters/apps/base-baileys-mysql/package.json index 7ecb417..8bb2c71 100644 --- a/starters/apps/base-baileys-mysql/package.json +++ b/starters/apps/base-baileys-mysql/package.json @@ -13,6 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "@adiwajshing/baileys": "4.4.0", "mime-types": "2.1.35", "mysql2": "^2.3.3", diff --git a/starters/apps/base-venom-json/package.json b/starters/apps/base-venom-json/package.json index 4d10427..87b993b 100644 --- a/starters/apps/base-venom-json/package.json +++ b/starters/apps/base-venom-json/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mime-types": "2.1.35" }, "author": "", diff --git a/starters/apps/base-venom-memory/package.json b/starters/apps/base-venom-memory/package.json index 57af4e1..228c623 100644 --- a/starters/apps/base-venom-memory/package.json +++ b/starters/apps/base-venom-memory/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mime-types": "2.1.35" }, "author": "", diff --git a/starters/apps/base-venom-mongo/package.json b/starters/apps/base-venom-mongo/package.json index 0d84d2b..d6b5693 100644 --- a/starters/apps/base-venom-mongo/package.json +++ b/starters/apps/base-venom-mongo/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mime-types": "2.1.35", "mongodb": "^4.12.1" }, diff --git a/starters/apps/base-venom-mysql/package.json b/starters/apps/base-venom-mysql/package.json index a029a70..d8d5466 100644 --- a/starters/apps/base-venom-mysql/package.json +++ b/starters/apps/base-venom-mysql/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mysql2": "^2.3.3", "mime-types": "2.1.35" }, diff --git a/starters/apps/base-wweb-json/package.json b/starters/apps/base-wweb-json/package.json index d55dfeb..f52ab5a 100644 --- a/starters/apps/base-wweb-json/package.json +++ b/starters/apps/base-wweb-json/package.json @@ -13,6 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "whatsapp-web.js": "1.18.4" }, "author": "", diff --git a/starters/apps/base-wweb-memory/package.json b/starters/apps/base-wweb-memory/package.json index d9c3ee0..b9c4712 100644 --- a/starters/apps/base-wweb-memory/package.json +++ b/starters/apps/base-wweb-memory/package.json @@ -13,6 +13,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "whatsapp-web.js": "1.18.4" }, "author": "", diff --git a/starters/apps/base-wweb-mongo/package.json b/starters/apps/base-wweb-mongo/package.json index e7ecebb..9c51d8a 100644 --- a/starters/apps/base-wweb-mongo/package.json +++ b/starters/apps/base-wweb-mongo/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mime-types": "^2.1.35", "mongodb": "^4.12.1" }, diff --git a/starters/apps/base-wweb-mysql/package.json b/starters/apps/base-wweb-mysql/package.json index 3ab34d5..e95ec1a 100644 --- a/starters/apps/base-wweb-mysql/package.json +++ b/starters/apps/base-wweb-mysql/package.json @@ -14,6 +14,7 @@ "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", + "@bot-whatsapp/portal": "latest", "mysql2": "^2.3.3" }, "author": "", From 6aed100d96e4c43b10f3ced470051b6bcb526ffa Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 13 Jan 2023 19:08:08 +0000 Subject: [PATCH 111/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index f8c71c4..1164b02 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.62-alpha.0", + "version": "0.0.64-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 6cdd841..29c6e07 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.68-alpha.0", + "version": "0.0.70-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index e1497ba..ecd06e8 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.12-alpha.0", + "version": "0.0.14-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 62e0a29..ac7ad87 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.79-alpha.0", + "version": "0.0.81-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index f1f58cc..b8b625a 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.60-alpha.0", + "version": "0.0.62-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/portal/package.json b/packages/portal/package.json index 8ea9ac2..80ad83e 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.18-alpha.0", + "version": "0.0.20-alpha.0", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/packages/provider/package.json b/packages/provider/package.json index 33d9e96..f9102b4 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.66-alpha.0", + "version": "0.0.68-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [], From d483b9135972caa637bed4fcabd149fb64ab5966 Mon Sep 17 00:00:00 2001 From: Jose Alberto Guerra Ugalde Date: Fri, 13 Jan 2023 13:41:19 -0600 Subject: [PATCH 112/117] git como requisito e instrucciones MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se agregó Git como requisito e instrucciones para instalarlo en Windows --- .../src/routes/docs/requirements/index.mdx | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/packages/docs/src/routes/docs/requirements/index.mdx b/packages/docs/src/routes/docs/requirements/index.mdx index 03718d2..d51a65b 100644 --- a/packages/docs/src/routes/docs/requirements/index.mdx +++ b/packages/docs/src/routes/docs/requirements/index.mdx @@ -4,17 +4,9 @@ import Navigation from '../../../components/widgets/Navigation' A continuación se describen los puntos técnicos que debes de tener en cuenta antes de trabajar con esta herramienta -- Node v16 o superior **[descargar node](https://nodejs.org/es/download/)** - +- Node v16 o superior - **[descargar node](https://nodejs.org/es/download/)** +- Git - **[descargar Git](https://git-scm.com/download/win)** --- - -## ¿Como instalar Node? - -- **Windows**: [Ver video](https://youtu.be/xRXHQlqA3Ak?t=376). Necesita ayuda para instalar Node en Windows. A continuación te comparto un video en el minuto exacto donde explico como instalar. -- **Ubuntu**: Te comparto un recurso de **[Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-es)** donde explica como instalar node en Ubuntu. - ---- - ## ¿Como saber que tengo el Node? Solo debes ejecutar el siguiente comando y esperar que la versión que te arroja sea superior a v16 @@ -23,7 +15,28 @@ Solo debes ejecutar el siguiente comando y esperar que la versión que te arroja $ node -v v18.12.1 ``` +--- +## ¿Como instalar Node? +- **Windows**: [Ver video](https://youtu.be/xRXHQlqA3Ak?t=376). Si necesitas ayuda para instalar Node en Windows. A continuación te comparto un video en el minuto exacto donde explico como instalar. +- **Ubuntu**: Te comparto un recurso de **[Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-es)** donde explica como instalar node en Ubuntu. +- --- +## ¿Como saber que tengo Git? + +Solo debes ejecutar el siguiente comando y esperar que te mande la versión que tienes instalada, si te manda un error de comando no reconocido es que no lo tienes instalado. + +```shell +$ git -v +git +``` +--- +## ¿Como instalar Git? + +- Solo es necesario instalar Git si estás usando **Windows**, ya que Mac y Linux lo traen preinstalado. +- Lo puedes descargar desde esta **[liga](https://git-scm.com/download/win)** . +- Descarga la versión necesaria para tu sistema operativo (32-bit o 64-bit). +- Una vez terminada la descarga, ejecuta el archivo descargado y dale "Siguiente" en todas las pantallas. +- Haz clic en el botón de "Finalizar". --- Date: Fri, 13 Jan 2023 21:34:40 +0100 Subject: [PATCH 113/117] ci: :bug: add message cli GIT --- packages/cli/check/index.js | 19 ++++++++++++++++--- packages/cli/interactive/index.js | 5 +++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/cli/check/index.js b/packages/cli/check/index.js index 73d5924..abd4eb1 100644 --- a/packages/cli/check/index.js +++ b/packages/cli/check/index.js @@ -1,4 +1,5 @@ const { red, yellow, green, bgCyan } = require('kleur') +const { exec } = require('node:child_process') const checkNodeVersion = () => { console.log(bgCyan('🚀 Revisando tu Node.js')) @@ -12,7 +13,7 @@ const checkNodeVersion = () => { ) process.exit(1) } - console.log(green(`Node.js compatible ${version}`)) + console.log(green(`Node.js: ${version} compatible ✅`)) console.log(``) } @@ -31,8 +32,20 @@ const checkOs = () => { console.log(yellow(messages.join(' \n'))) } - + console.log(green(`OS: compatible ✅`)) console.log(``) } -module.exports = { checkNodeVersion, checkOs } +const checkGit = () => { + console.log(bgCyan('🤓 Revisando GIT')) + exec('git --version', (error) => { + if (error) { + console.error(red(`🔴 Se require instalar GIT`)) + process.exit(1) + } + }) + console.log(green(`Git: Compatible ✅`)) + console.log(``) +} + +module.exports = { checkNodeVersion, checkOs, checkGit } diff --git a/packages/cli/interactive/index.js b/packages/cli/interactive/index.js index a0a4034..5d0e197 100644 --- a/packages/cli/interactive/index.js +++ b/packages/cli/interactive/index.js @@ -3,7 +3,7 @@ const { join } = require('path') const { yellow, red, cyan, bgMagenta } = require('kleur') const { existsSync } = require('fs') const { copyBaseApp } = require('../create-app') -const { checkNodeVersion, checkOs } = require('../check') +const { checkNodeVersion, checkOs, checkGit } = require('../check') const bannerDone = () => { console.log(``) @@ -59,8 +59,9 @@ const startInteractive = async () => { ] console.clear() - checkNodeVersion() checkOs() + checkNodeVersion() + checkGit() const onCancel = () => { console.log('¡Proceso cancelado!') return true From 03b5b441ded82336376b192f6b55e25eae7d2332 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 13 Jan 2023 20:42:36 +0000 Subject: [PATCH 114/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/docs/src/routes/docs/requirements/index.mdx | 11 ++++++++++- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 8 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 1164b02..6ed70a3 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.64-alpha.0", + "version": "0.0.65-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 29c6e07..6418421 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.70-alpha.0", + "version": "0.0.71-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index ecd06e8..0f37f5f 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.14-alpha.0", + "version": "0.0.15-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index ac7ad87..c580a8b 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.81-alpha.0", + "version": "0.0.82-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index b8b625a..a83f31c 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.62-alpha.0", + "version": "0.0.63-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/docs/src/routes/docs/requirements/index.mdx b/packages/docs/src/routes/docs/requirements/index.mdx index d51a65b..8f1ef96 100644 --- a/packages/docs/src/routes/docs/requirements/index.mdx +++ b/packages/docs/src/routes/docs/requirements/index.mdx @@ -6,7 +6,9 @@ A continuación se describen los puntos técnicos que debes de tener en cuenta a - Node v16 o superior - **[descargar node](https://nodejs.org/es/download/)** - Git - **[descargar Git](https://git-scm.com/download/win)** + --- + ## ¿Como saber que tengo el Node? Solo debes ejecutar el siguiente comando y esperar que la versión que te arroja sea superior a v16 @@ -15,12 +17,16 @@ Solo debes ejecutar el siguiente comando y esperar que la versión que te arroja $ node -v v18.12.1 ``` + --- + ## ¿Como instalar Node? - **Windows**: [Ver video](https://youtu.be/xRXHQlqA3Ak?t=376). Si necesitas ayuda para instalar Node en Windows. A continuación te comparto un video en el minuto exacto donde explico como instalar. - **Ubuntu**: Te comparto un recurso de **[Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-es)** donde explica como instalar node en Ubuntu. -- --- + +--- + ## ¿Como saber que tengo Git? Solo debes ejecutar el siguiente comando y esperar que te mande la versión que tienes instalada, si te manda un error de comando no reconocido es que no lo tienes instalado. @@ -29,7 +35,9 @@ Solo debes ejecutar el siguiente comando y esperar que te mande la versión que $ git -v git ``` + --- + ## ¿Como instalar Git? - Solo es necesario instalar Git si estás usando **Windows**, ya que Mac y Linux lo traen preinstalado. @@ -37,6 +45,7 @@ git - Descarga la versión necesaria para tu sistema operativo (32-bit o 64-bit). - Una vez terminada la descarga, ejecuta el archivo descargado y dale "Siguiente" en todas las pantallas. - Haz clic en el botón de "Finalizar". + --- Date: Fri, 13 Jan 2023 22:31:45 +0100 Subject: [PATCH 115/117] chore: :zap: improvement cli --- packages/cli/check/index.js | 84 +++++++++++++---------- packages/cli/interactive/index.js | 22 ++++-- packages/create-bot-whatsapp/package.json | 2 +- 3 files changed, 67 insertions(+), 41 deletions(-) diff --git a/packages/cli/check/index.js b/packages/cli/check/index.js index abd4eb1..cbd8e08 100644 --- a/packages/cli/check/index.js +++ b/packages/cli/check/index.js @@ -2,50 +2,64 @@ const { red, yellow, green, bgCyan } = require('kleur') const { exec } = require('node:child_process') const checkNodeVersion = () => { - console.log(bgCyan('🚀 Revisando tu Node.js')) - const version = process.version - const majorVersion = parseInt(version.replace('v', '').split('.').shift()) - if (majorVersion < 16) { - console.error( - red( - `🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}` - ) + return new Promise((resolve, reject) => { + console.log(bgCyan('🚀 Revisando tu Node.js')) + const version = process.version + const majorVersion = parseInt( + version.replace('v', '').split('.').shift() ) - process.exit(1) - } - console.log(green(`Node.js: ${version} compatible ✅`)) - console.log(``) + if (majorVersion < 16) { + console.error( + red( + `🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}` + ) + ) + console.log(``) + reject('ERROR_NODE') + } + console.log(green(`Node.js: ${version} compatible ✅`)) + console.log(``) + resolve() + }) } const checkOs = () => { - console.log(bgCyan('🙂 Revisando tu sistema operativo')) - const os = process.platform - if (!os.includes('win32')) { - const messages = [ - `El sistema operativo actual (${os}) posiblemente requiera`, - `una configuración adicional referente al puppeteer`, - ``, - `Recuerda pasar por el WIKI`, - `🔗 https://github.com/leifermendez/bot-whatsapp/wiki/Instalación`, - ``, - ] + return new Promise((resolve, reject) => { + console.log(bgCyan('🙂 Revisando tu sistema operativo')) + const os = process.platform + if (!os.includes('win32')) { + const messages = [ + `El sistema operativo actual (${os}) posiblemente requiera`, + `una configuración adicional referente al puppeteer`, + ``, + `Recuerda pasar por el WIKI`, + `🔗 https://github.com/leifermendez/bot-whatsapp/wiki/Instalación`, + ``, + ] - console.log(yellow(messages.join(' \n'))) - } - console.log(green(`OS: compatible ✅`)) - console.log(``) + console.log(yellow(messages.join(' \n'))) + } + console.log(green(`OS: compatible ✅`)) + console.log(``) + resolve() + }) } const checkGit = () => { - console.log(bgCyan('🤓 Revisando GIT')) - exec('git --version', (error) => { - if (error) { - console.error(red(`🔴 Se require instalar GIT`)) - process.exit(1) - } + return new Promise((resolve, reject) => { + console.log(bgCyan('🤓 Revisando GIT')) + exec('git --version', (error) => { + if (error) { + console.error(red(`🔴 Se require instalar GIT`)) + console.log(``) + reject('ERROR_GIT') + } else { + console.log(green(`Git: Compatible ✅`)) + console.log(``) + resolve() + } + }) }) - console.log(green(`Git: Compatible ✅`)) - console.log(``) } module.exports = { checkNodeVersion, checkOs, checkGit } diff --git a/packages/cli/interactive/index.js b/packages/cli/interactive/index.js index 5d0e197..b3f063d 100644 --- a/packages/cli/interactive/index.js +++ b/packages/cli/interactive/index.js @@ -1,6 +1,6 @@ const prompts = require('prompts') const { join } = require('path') -const { yellow, red, cyan, bgMagenta } = require('kleur') +const { yellow, red, cyan, bgMagenta, bgRed } = require('kleur') const { existsSync } = require('fs') const { copyBaseApp } = require('../create-app') const { checkNodeVersion, checkOs, checkGit } = require('../check') @@ -21,6 +21,22 @@ const bannerDone = () => { } const startInteractive = async () => { + try { + console.clear() + await checkNodeVersion() + checkOs() + await checkGit() + console.clear() + await nextSteps() + } catch (e) { + console.error(bgRed(`Ups! 🙄 algo no va bien.`)) + console.error( + bgRed(`Revisa los requerimientos minimos en la documentacion`) + ) + } +} + +const nextSteps = async () => { const questions = [ { type: 'text', @@ -58,10 +74,6 @@ const startInteractive = async () => { }, ] - console.clear() - checkOs() - checkNodeVersion() - checkGit() const onCancel = () => { console.log('¡Proceso cancelado!') return true diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 49503df..873522f 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.78-alpha.0", + "version": "0.0.92-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ From f274379c53afcda6e602edbf1d963ec96ab972d2 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 13 Jan 2023 22:32:23 +0100 Subject: [PATCH 116/117] chore(release): 0.1.17 --- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48381f1..8d3865b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.17](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.16...v0.1.17) (2023-01-13) + + +### Features + +* mod de starters para habiltar portal ([eceb170](https://github.com/leifermendez/bot-whatsapp/commit/eceb170df03721dca4183b658c863b94fa04bc84)) + + +### Bug Fixes + +* **ci:** pre-release ([aaec075](https://github.com/leifermendez/bot-whatsapp/commit/aaec0751408ab49483d428810d94aaf7d46acb94)) +* correccion en starters app.js para portal QR ([f430380](https://github.com/leifermendez/bot-whatsapp/commit/f430380b4f23d41702395c96c628bf13bf443278)) +* **starters:** :zap: added dockerfile ([230981e](https://github.com/leifermendez/bot-whatsapp/commit/230981e2676361149cb2a99def7f705e75009260)) + ### [0.1.16](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.15...v0.1.16) (2023-01-11) ### [0.1.15](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.14...v0.1.15) (2023-01-11) diff --git a/package.json b/package.json index a6e64e7..354bc44 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.16", + "version": "0.1.17", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From e72794a296aa33218401379014e9eefcc3652c95 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Fri, 13 Jan 2023 21:36:53 +0000 Subject: [PATCH 117/117] ci(version): :zap: automatic - "${date}" updated versions every packages --- packages/bot/package.json | 2 +- packages/cli/package.json | 2 +- packages/contexts/package.json | 2 +- packages/create-bot-whatsapp/package.json | 2 +- packages/database/package.json | 2 +- packages/portal/package.json | 2 +- packages/provider/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index 6ed70a3..d3f004e 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.65-alpha.0", + "version": "0.0.66-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 6418421..60361be 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/cli", - "version": "0.0.71-alpha.0", + "version": "0.0.72-alpha.0", "description": "", "main": "index.js", "devDependencies": { diff --git a/packages/contexts/package.json b/packages/contexts/package.json index 0f37f5f..c186a5f 100644 --- a/packages/contexts/package.json +++ b/packages/contexts/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/contexts", - "version": "0.0.15-alpha.0", + "version": "0.0.16-alpha.0", "description": "", "main": "./lib/bundle.contexts.cjs", "files": [ diff --git a/packages/create-bot-whatsapp/package.json b/packages/create-bot-whatsapp/package.json index 873522f..3b372ca 100644 --- a/packages/create-bot-whatsapp/package.json +++ b/packages/create-bot-whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "create-bot-whatsapp", - "version": "0.0.92-alpha.0", + "version": "0.0.93-alpha.0", "description": "", "main": "./lib/bundle.create-bot-whatsapp.cjs", "files": [ diff --git a/packages/database/package.json b/packages/database/package.json index a83f31c..f69d0c9 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/database", - "version": "0.0.63-alpha.0", + "version": "0.0.64-alpha.0", "description": "Esto es el conector a mysql, pg, mongo", "main": "./lib/mock/index.cjs", "keywords": [], diff --git a/packages/portal/package.json b/packages/portal/package.json index 0892707..c26ab32 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/portal", - "version": "0.0.21-alpha.0", + "version": "0.0.22-alpha.0", "description": "Portal WEB para escanear QR", "main": "./lib/portal.http.cjs", "scripts": { diff --git a/packages/provider/package.json b/packages/provider/package.json index a5ab3b0..5c3ef0a 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/provider", - "version": "0.0.69-alpha.0", + "version": "0.0.70-alpha.0", "description": "Esto es el conector a Twilio, Meta, etc...", "main": "./lib/mock/index.cjs", "keywords": [],