From 716349a8394ed6a8355dedc69110ad2f6dbd711a Mon Sep 17 00:00:00 2001 From: leifermendez Date: Sat, 7 Jan 2023 09:08:56 +0000 Subject: [PATCH 01/75] =?UTF-8?q?ci(providers):=20=F0=9F=9A=A9=20Check=20B?= =?UTF-8?q?REAKING=20CHANGE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 2f8d5a3fb3ddce9b0c72440e8a3a7a623fb43201 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 13 Jan 2023 21:34:40 +0100 Subject: [PATCH 02/75] 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 03/75] 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 04/75] 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 05/75] 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 06/75] 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": [], From 6683715ad617ea1075654a475a1c62ea607c733f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 09:21:26 +0100 Subject: [PATCH 07/75] fix(cli): :zap: refactor --- .github/workflows/check-providers.yml | 13 ++- packages/portal/.vscode/extensions.json | 4 + .../portal/.vscode/qwik-city.code-snippets | 32 +++++++ packages/portal/.vscode/qwik.code-snippets | 84 +++++++++++++++++++ .../server/@qwik-city-not-found-paths.js | 15 ++++ packages/portal/server/@qwik-city-plan.mjs | 5 ++ .../portal/server/@qwik-city-static-paths.js | 23 +++++ packages/portal/server/entry.ssr.js | 1 + packages/portal/server/entry.ssr.mjs | 2 + packages/portal/server/package.json | 3 + 10 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 packages/portal/.vscode/extensions.json create mode 100644 packages/portal/.vscode/qwik-city.code-snippets create mode 100644 packages/portal/.vscode/qwik.code-snippets create mode 100644 packages/portal/server/@qwik-city-not-found-paths.js create mode 100644 packages/portal/server/@qwik-city-plan.mjs create mode 100644 packages/portal/server/@qwik-city-static-paths.js create mode 100644 packages/portal/server/entry.ssr.js create mode 100644 packages/portal/server/entry.ssr.mjs create mode 100644 packages/portal/server/package.json diff --git a/.github/workflows/check-providers.yml b/.github/workflows/check-providers.yml index 9965606..5811dc2 100644 --- a/.github/workflows/check-providers.yml +++ b/.github/workflows/check-providers.yml @@ -40,6 +40,15 @@ jobs: - name: Check Twilio run: yarn node ./scripts/checker.js --name=twilio --stable=true - - uses: stefanzweifel/git-auto-commit-action@v4 + - name: Add and commit changes to gh-pages branch + run: | + git config --local user.email 'action@github.com' + git config --local user.name 'GitHub Action' + git add . + git commit -m 'major' + + - name: Push changes + uses: ad-m/github-push-action@master with: - commit_message: 'ci(providers): 👍 updated versions stable providers' + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: feature/providers-major diff --git a/packages/portal/.vscode/extensions.json b/packages/portal/.vscode/extensions.json new file mode 100644 index 0000000..1396082 --- /dev/null +++ b/packages/portal/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "unifiedjs.vscode-mdx"], + "unwantedRecommendations": [] +} diff --git a/packages/portal/.vscode/qwik-city.code-snippets b/packages/portal/.vscode/qwik-city.code-snippets new file mode 100644 index 0000000..b6c1c17 --- /dev/null +++ b/packages/portal/.vscode/qwik-city.code-snippets @@ -0,0 +1,32 @@ +{ + "onGet": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:onGet", + "description": "onGet function for a route index", + "body": [ + "export const onGet: RequestHandler = (request) => {", + " $0", + "};" + ] + }, + "onGet (typed)": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:onGet typed", + "description": "onGet function for a route index", + "body": [ + "export interface ${1:PageData} {", + " $2", + "};", + "", + "export const onGet: RequestHandler<$1> = (request) => {", + " $4", + "};" + ] + }, + "useEndpoint": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useEndpoint", + "description": "useEndpoint declaration", + "body": "const $1 = useEndpoint();" + } +} diff --git a/packages/portal/.vscode/qwik.code-snippets b/packages/portal/.vscode/qwik.code-snippets new file mode 100644 index 0000000..4b89dbf --- /dev/null +++ b/packages/portal/.vscode/qwik.code-snippets @@ -0,0 +1,84 @@ +{ + "Qwik component (simple)": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:component", + "description": "Simple Qwik component", + "body": [ + "export const ${1:${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}} = component$(() => {", + " return <${2:div}>$4", + "});" + ] + }, + "Qwik component (props)": { + "scope": "typescriptreact", + "prefix": "q:component w/props", + "description": "Qwik component w/ props", + "body": [ + "export interface ${1:${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}}Props {", + " $2", + "}", + "", + "export const $1 = component$<$1Props>((props) => {", + " const ${2:count} = useSignal(0);", + " return (", + " <${3:div} on${4:Click}$={(ev) => {$5}}>", + " $6", + " ", + " );", + "});" + ] + }, + "Qwik signal": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useSignal", + "description": "useSignal() declaration", + "body": ["const ${1:foo} = useSignal($2);", "$0"] + }, + "Qwik store": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useStore", + "description": "useStore() declaration", + "body": ["const ${1:state} = useStore({", " $2", "});", "$0"] + }, + "$ hook": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:$", + "description": "$() function hook", + "body": ["$(() => {", " $0", "});", ""] + }, + "useClientEffect": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useClientEffect", + "description": "useClientEffect$() function hook", + "body": ["useClientEffect$(({ track }) => {", " $0", "});", ""] + }, + "useTask": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useTask", + "description": "useTask$() function hook", + "body": [ + "useTask$(({ track }) => {", + " track(() => $1);", + " $0", + "});", + "" + ] + }, + "useResource": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useResource", + "description": "useResource$() declaration", + "body": [ + "const $1 = useResource$(({ track, cleanup }) => {", + " $0", + "});", + "" + ] + }, + "useServerMount": { + "scope": "javascriptreact,typescriptreact", + "prefix": "q:useServerMount", + "description": "useServerMount$() function hook", + "body": ["useServerMount$(() => {", " $0", "});", ""] + } +} diff --git a/packages/portal/server/@qwik-city-not-found-paths.js b/packages/portal/server/@qwik-city-not-found-paths.js new file mode 100644 index 0000000..f5f657d --- /dev/null +++ b/packages/portal/server/@qwik-city-not-found-paths.js @@ -0,0 +1,15 @@ +const notFounds = [ + [ + '/', + '\n\n\n \n \n 404 Resource Not Found\n \n \n\n\n

404 Resource Not Found

\n\n', + ], +] +function getNotFound(p) { + for (const r of notFounds) { + if (p.startsWith(r[0])) { + return r[1] + } + } + return 'Resource Not Found' +} +export { getNotFound } diff --git a/packages/portal/server/@qwik-city-plan.mjs b/packages/portal/server/@qwik-city-plan.mjs new file mode 100644 index 0000000..4ae6623 --- /dev/null +++ b/packages/portal/server/@qwik-city-plan.mjs @@ -0,0 +1,5 @@ +import{componentQrl as o,inlinedQrl as i,useStylesScopedQrl as n,Slot as s,useStore as c,useClientEffectQrl as r,_noopQrl as l}from"@builder.io/qwik";import{jsxs as t,jsx as e,Fragment as d}from"@builder.io/qwik/jsx-runtime";const h=`.logo{display:flex;gap:.5rem;align-items:center;align-content:center;color:#1a1a1a}.logo h1{font-size:1.5rem;margin:0} +`,g=o(i(()=>(n(i(h,"s_a8xI1ebvPf4")),t("div",{class:"logo",children:[e("img",{width:"40",height:"40",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR4nO2YB1BVaba2P6D7TnfPdPe0rSQBSScAKoiiCIgCgkiQqCBIRlFEQURyzoqArWQFBQVMqKCgAoKo5JzTIWcOph57gsB+b52jE/q/809NzUzfufdWv1VPfTtUUbWevda394GQn/Nzfs6/MydnosiJqUjiOhlB/s8mZC6eBM+dJQHsM8SPfZrHlx3Le4odzefJjvzEYyH8k+Mvwz45thD6yVF26Ceu7BC+I+wQ3sPzwTyH50LI0dlQ8r82oTPxJHwunoTNx/OFL8Tzuc1GES92DPFiRxNPdhQ5wY4g7gvh5NjLMHJsIYwcZYcSVy5hxG0+ghAQ4jTv94nTnD+v46wfcZz1If8rEjWZQKJmE3lOz3/H5zwVQPznY4k/O4b4z1741Hf+jIQPO9bAix193JMdGX2CHZHkzg5PPcYOO+fGDgs5yg5zPsoOU3ebjxBQ+o0mcZ4PIAfngojwwgZiP+vDZzfrS2znvbn8j0rc3HckYvYsiZyJ54mfu8B3cjqChM3HEc/pmM+C5s/oBbHPpASxz3QEsk+/92fHwIcdDS92BE4shOH4QgiOsoNwhB0IF3YADrH9cXA+4O3B+YCqg3MB4QfnAjcZsp2Iw6wvcZ2OJraz3nx2U4HEbtqf2M74/nsLj5iOI8dGgwnQS6Jn4vlsx0+RiNk44jcTKxg+Fx8Yw04ciFs4j8SFZFxYSEPSQhrOL6QuJyxcWIpZSHwfyj793o8d+d5zPuS923zAosuc75Lz3CnKYc4LdnNesJ87Bfs5b9jP+bywn/W1cZ2M/pTTBaazzjw20368NjOniNXs8X9P8WGTZ0jgZAzxG48i8bPn+IKmY8jhyeDPo2bjgxLnk15eWsjErVc38fD1g+Unb0oXK9+ULz15U0Y9fv2QKnpVSN14eYPKWriC8+wURM2fpfznIimP2SDq8KwP5TR7krKdPbF0YNZj0XrWg7KePYEDsydhO3uq227G18Ji9iixnw4h1lM+fJeegjhMniMHJsP++4oPnoglgRPRxH8imgegSPj0aRIyHasdP3t+IIedjbLXJWj5vnax513bcv8PXdTADz1U/7tu9L7rpDp/04aW7xtR97YaFa/LUfSyEDkLV3F+Phnhs6fhNRsC1xlvynHmBA7MuFP7Z9woixm3JYsZt0XLGXdYzXjiwIx3sf10qPiBqUCyb8qdz24ikdhMxhKrifCfvviA8SjiPx5J/MYjeQ+O+JEL7AQSNnU6Imk2BcUv76L9+7r3A+/alwfedaL3N+1U1/ctVPv3TVTr20b8kba3zVxa3jai7s0LlL8qRcHCbWTMXUTM7Fl4T4fAdcob9lPulNXUUWrflCtlPnUEZlNHlsymXJf2TR/H/mmv1wemgk0sJ32I3oQpj81EHI/1RCyxHP8JJfgOhxPv0TDiMxbO6zoaQCxZ3p+ETZ4uSJ1NQ9nL+1TLm+dLzW9eoPrVE6rsZTH1gH2Hujt/E7fnb3ApmL+FIvZdPFooRuXLclS/eob619WoffWce17IvousuSycnomHz1QIDk96wXbiGCwmjlBmE4cok4mDMJ48RJlMurw3nXTFvklPWE0G+5pPuBPFUQFiPR7Hs38sluwd/QnGwYsVSk4OhZBTI6G8B4d8yYER718Ej8c8SZlJRdH8rfcl7ALq7nwecmYuUanTF6iEqbOInYxF1EQ0IieiETURg9jJM0iYTETKVAquzFzG7bkbKGHfR+VCGapeVqBioRRF83eRNZuF2Kk4eE0E4uC4B6zHXWE+dhDGY07UnnFHynDcCXvGnZeMJg5R5hMesJwIjjIZdyeaY7o8NmPniPVowr9ewLGBAHJiKJhnV5cLAUACRiMfnZ9KwrWZK+8zplKouInTCB0LobxH/SiPES8cHTmBw8PucBk+DpdhdxwZ9oDbyEmcGPGB72ggwsYiET+RgIypdNyYyUPxXBHK2Y9Qxn6Iu3O3cXE6AxETMXAf84H9mBv2jR6E8agjDEbtKT0OYw7QH3NcNhxzXjIZc8e+seAg07FTxHD0KN/ZmddEi+X4ryvevyeYuLGCSexoLG/ASCjxHg5NOzueiLTJlPeRY1HUieFTcBk6RtmzDuPA4EHsH3SExaAD9g3aY++gPfYNOsBi0BFWg86wYbnAkXUUR4Y8cHLYFyGj4UgYT8DlyUzcmbmFh3P3UTJXxJVyYfI8/MdCcGjUA/tHXGAy7ACDYTvsHrGB7ogtpTtqh92jDsv6o07LRqPuMB8LtjYdDSBGI958BqyTxIjl988Xf7TzFHHr8ianBoP5TgwGEI/BAOfIkdM4N3ZuyWcogHIcdIVlvyNl2mcLoz5rGPTuh36vJfR6Lf4CSxj07ceePmsY99vAfMCeK8Nh8AhcWR7wHvZH9GgM0iZScWMqF0Uzd3Bn5iayJi8ieiwGx0dOwWboMExZDtBn2UCXZY1dLGvoDB2gdg3bQHfYfmn3iBMMR078znw4TMZsOJQYD/vzmgwG/fMCXLq8yPFeP17nnpPEqdtTKmAw/N3p4Th4DHgv7+91glGPNbW72wI6XebY2WUKrU4TaHaaQKPTGBqc4y4TaHWZcO/pdJtjd48FDHutwBFmMeAIm8FDODR4DCdZvogciULKWBJyJ7NxayoPOZOXET92Fl7DfrBnucJs0AH6gwewa9AK2oP7sZNlBR3WAWrXkB12Dzsu6g8dgfGQTzWJIdwx3cv6JzdD52Y34t4XSKKGonkjhqOJZ2/AnfDBaHj0eS/u7bKHXocFtbPdFDvajaDetgfb2gyh1mbARfXjqtZuiG3thtjeYQTNLlOod+2BWo8B1PoMoDlgAv1BS5iwbGA56AAn1hF4D/vi9Ggs0saSkDGWgsTRePgPBcJ58Bj2DTrBcMAGugPW0Bm0guagBbYNmkOVZU6pDJtj6/C+RTWWI5T6Dh4PHE8n58dufIolkFev3/6jT9+TMwJ8Lh2e5FD7iV1+vcHw6vFb3ttuR+m0mlM7WowotWYDqDTrYWuzLpQ/sqV5FxflFl0uKq16UGk3wKZOHZgPOSF6+hxusO+h7OVTVL2qwbOXNah8+Rwl7FLcnruLqzPXcHEqA8kTSYgei4IbywP7Bxyh328JzT4zqPYbQXnAkDMCsBv3RORsEpXDvoOihfLlW3OPkTF1d76R3Udrnx4gVWPNvE1N7f+ggHZPcoEVx5MylEiOt58q9+7yh1Wr06J2kym2NRpQWxt2Y0v9LijV62BTvTY21e3ExvoPcM8btLG5SQdbWnZhS4cukqYyMft6Fj+8eoffLvwWv2X/Fj+w3+GHhR/wu5e/w+9e/Q7vXv2At6++x6tXrzH+chwdC52omH+KazM3cG4qDacnk5A0nYU78yVofdmJl69fffx7P1C/nf8BP8y9W341+xozs/Pv5ucWTGem58jU1Cxv38AwGRoe//uLt607TJya3HjtGl2JTcNhFfc2Lzi3uFK76s0otVp9aku1DjZV74TiC00ovNDgIv9iB+SrP6BQowGFWk1srNfG2iZ1JA9n4ofp32BsZByDrCEMsFh/YnBoCEPDwxgZHcX4+AQmJ6cwPTWDuel5vJx5hTezb/F2/i3est/ie/b3eMf+DX7L/gGvOYVOzWJ8YhKj4+MYHhujhkbHMDI6vjQ2NonxiWlMTM4oTkzMkPGJad6Rscm/r/j5uRmiWKFBPFu8+SzrbIlzw9Hkw01u2FNjuaj2TI/aXKVNbajUgHzldqyvVMe6v+SpOtZVqWPdM3UovNgBmRpVmLbaY5g1jN6ePnR196Knpw893X0fVi796O3tR1/vAPr7BzE4MAQWaxhDwyMYHuEwipHRMYxyGBvnMjw6huGRjwyPYmhoFCzWKDXIYXAUg6yxPwwNj2N4ZOLh0NA4GWKN8YyM/g0BALjMzkyS79++4e2Y6/iUcL4lMslndjXOo9bV9theob+sVL6Tki/bjnWl2yBXqgbZUtU/U6YK2XJVyD5RhVyFGtY/3QHJZ5twtiUJrI4hNLe2oa2t8wPtXWj/C9raPsA57uzs+Sjlg5CBARYGBocwODj8AdbHdXCYe71/4AN9A0Po7R+iWMPjVN/AMNXXP0wNssbAGhrfwBoaJ6yhcd7egdH/WnxUVCQpKXlA7t4t4OFIeP2STfAepHjuMYltijM8WH0Yuk+MqS2PdlLyxeqU3ANVyDzYCgYXZTCKP1KiDMbDrWA+3gqZUhUwy1WwvmI7btcVobWhAw1NzWhubkNzSxtauLRz4Vzr6OxBd08/BgaGuCtHUGdnL7q6+9Dd3Y+engGukN7eQfT2/QWc814Wej7SPzCCmtomqn9wFEMjk4s9/UPoZ42G9w+Okv7BEb5+1l/ZBxITz5Ky0kfk3t0CThd8yp6b2frm9Sv/779/U7L8+8VXzXMtUC/eRSncU6dk76iAUbAFtIItkL6z+QN3N4N2bzNoRZtBu78F9AdbwCzZCsmHm7C1ZDeeVD1DdXUD6uqaUN/QgobGVjQ2faSxlVvsvXtFSElORmxMLAoL73OL5nZERzdXTmdXL7q6+v4k5M8MoLtnAJ1d/WANTSAt/RKUNitjj5E59bisaok1PI7uXtaLtrZO0tXVy9M3OPZfBdwpuMnj5GRPjh1z/aa1pbFuafE9lpeXQFHL4GR5eZmyKTsIRp4SGPlbIJW3ERJ5ipDIV4TEdUVI3FCE5C1FSBZshNSdTZC+pwR6kTLE7ilA9/Y+lJU+Q2VVNaprGlBb14S6+mbU1zdzj1vbunD2bALExSVAo9FApzMhLiGFhPhEdHf3oqWl48N4tHejvaMH7Z296PgjXX3o7Orjrl09g2hp7YKMjByEhITAzy9AySupLTe29KCvf3i2ub1PuKd/hPT0DfP8qPiYmGiSkBDPFxEZTmJjY+zT09Pw9s2bxeXl5cXf//73i+9+eLeMP1AIfh5Jrbm4jqJdVsKaTHmIZclD7LI8xLLlseaqPNbkKkA8XwESNzZwZUgXKEE4Xw6mOfYoKixH2ZNnqHpehxc1DaipbURNTQMaGlpQWloOOp2B//jFZ/jil7+CtDQNAoJCkKbL4eGjcm4HcEaktbWTK6v1o4y29h60dXDoRWt7D3r6hvHw8ROsFhHD57/8EsLCwvhGiEalZOZTnM6obezY2NHNIh3dg7w/EnD69GkSEBTE5+fvT0LDQhO9fPxQW1Pz/vXLl9Ts9DQ1MTlGvZ19RX33NAmi5+UgmawAkaS1WJ0ih9VpchC5uBaimWshdmUdxHLWY801eYjnKUDy+kbwZzJgkuqA69dLUPK4Ak8qq/H0WS2evajDs+e1aGxuQ0pqOj777HN88csv8fUKfvzyy6+wil8Q/GIyiIs/z239+sYWNHH3jnY0t3SgpZVDJ1pbOUK60dLajc6uATx9Wg0pmgx+8cVXWLHiW3zyxVcICY9aGmBNoKa+dXdrRx9p7ejj+5GA4JAQYmZxgMfygC3x9vEtcHI5iqzLVxd7ujqptpYWNDU1oKu5HcnFqVhzWg6ip+UgFCcDwQQmBL+TgVCSDIRTZbE6QxYimXIQvbyWK0I8RwErz0tDN+4ALmYWoLC4FKXlVVwJlU9rUPG0GnX1LfjuQip+8dnn+PyLr/Dlr1fhi199hRXfrsJnv/oG0TFn0N7RixrO3tHYioamNi6Nze1cmlo60NzSiebWLjQ1d6C7dxAaWjr49NNPsFpYGCtFpKmCe8VLXT0s1Da0WTS3dpPm1u4fC/D08ua+/jhxO+7xdJ+1A4LDzywVF5dQnM2o4O49FN19gLjscxANkoVgMAP84XTwR9PAf4YOgQQGBM8zIZQsA+E0WYhclON2hGjGOqyIlcD2CHMkJuXh1r0SFD+q4Eoor3iBJxUv8Ox5HfJuFkKSJsMdgS+/XgFhwVVYuUoA0jKKKLh7n1twdU0jauuaUVvfgrr6VtQ1tKK+se0DTe1oaG7nHnd09SMj8yqkJMUhsFoCgeFnqa6ewaX6pg7UNbZb1Dd3kIbmjh8LcHVzJyV388lQRz2vs4trvaGZFVzcA5aS0rNxPuUSEpMv4nxyFvzjY7DaRwb8PtJYGSCNlaHSWBUpjVWxNPCfpUPwHANCF2QgnCKL1elyWH1eDt+ESWBTsC6iEi7j6o1CFD4oQ8njSjwur+LuCU8qn+P+wwocOxUKcUlp/PqrX2LlN19CZI0UgsNiUFPfgqoX9Xhe04gXtY2orm3iUlPXjJq6Fq6QWq6QNtR9FFLT0I7zGXk4m5yNGs6rt7ljiXOvuq5Vp6a+ldTUt/1YgMsRN4I/THK7wN7J5YWesSWsD55cCo5JogIiEhAQmYigyO/gFhwGYW9ZrPKWxkofKXwbIIWVoVJYFSEN/lgaBOLoEExkQui8DISTZbljsiJQAvQAZQSfSUdG9i3cvvcI90uecCU8KqtCWcVz7nl6zh2EnkmFw2FP2DofQ/z5iyivrEFlVS0qn9Xh6fN6PH1Rj6oXDR+obsQzDjVNeF7ThBe1zXhR28KZczyrbkJ5VQOePGukntU0U7UNbdTz2haq4nmjfMXzRvK0uunHm+Chw0eJgqo2zw7dPcTO6VChgZkV9jmcWPQMiqM8/GPgcjIUbt6ROOgTAGGvDwJWcbrATworA6WwitMJETTwx9IhEMeEUIIMhM7JQjBShtspIv7r4BFzBufT8pF7swh3ih5ziy5+VIlHpU+5Y3H1RhGycguRc7MEtwrLUVxahcflz1BeUc3dM55U1vwJjpjyytoPPK3Fk6o6VDyrR8XzBjx90YjK540oq6hFWWUd9bS6abmquhnlzxqG75VU/epuyVPyqKL2x6/Bw65uxMrWkc/G3ok4OLskmVraYq+9+/vjPuFwcPHAufPJCAiOgKXLQdAD5LHGnzMGNKzylcYqf2msCpYGfxgN/JF0CMQyIRgnA6E4WQiEMiEQyMQKfylYR3ri7HfXcDHnFq7fLkZB4WMUPijH/YdPUFRcjpt3HyLvdjHybxfjduEjFJU8wcPSp3hYVvUnSkqr8ODxU9x/VInChxUfqUTho6e4/7gKxWXP8bC8Go8ravDoSQ31qKIGj5/Wvn/4pBaFj54nPCitJsVl1XwTw1M//gg66HKEOB48/AlnPXTY9bCljRP2O7kveZzyp5TVNKmcy1mor34Kvf3aWO0tgXURipAIlIOAHw38/jTwB9LAH0KDQBgDApFMCMbKQDBaBgLBTAgGyeDXARJQDduDmPjLSEjNQda1O8i9dR8375TgduFjrgyOgBt3HuLm3UcoKCrFvQflXO4+KEPB/VLcKnqMW/dKcetOOW7eLsf1m2XIv1GKvBuPkX+zFDdulePmnSe4de8JCooqcfdBFe4XVy8XPahG/r3yxtS8wq8u3rhPrhaU/vjp/zGHjrjxHnU7Ro65uyvYOrosOxz2WI6KiljW3m1AmZpbYmRwgIqID6B+ZfMNREKlIBsuD6lgOQgF0D8ICKZDIJQBgXAmBKNkIBAuA/5gJgSCmOAPYnBX97hwJJ7PRUJ6DtKzbyIr9w5yrhfi2s2iP8ERk3v7wYf11gPk3XiI3PxHyLn2EMnZNxGRlQaPzCjYXzoFq0sesLl0Ei6ZQfC9HI+o7AwkXs1Fcu4tXMi7QcVeu7Jkl+8DlQIzTdO7rsT+jg/fjcIn5K/G1c2dhAR9eB0ePOLW7u3jg9SkOISF+i9v3KyymHnpItXf3YEdLtupr92FIBwsAakwGUiFykEkmFMgHQIh9A9dEM6EQBgT/CFM8HPuBTOxIkgKzPCtCPouHikp15Gcdh2pF28gLesWMq7cxqXsO8jMvous7EJkXrmHS5fv4ULmdYRnpMI1NRgGyTbYnKIN6bRNEL24HmJZGyB2eRPErmyB2GVliGYqg3ZpO+Qz9aCUaUStv7R7WfyiCkTzNs+vebhJmJTwk88LJHhuP6j86wI8vXzJKW9v3hOeJ8kJTy+DyIjQ0dOxkW8SE07D0soa+obGGOztprLz0yFqL0Xx+0iCP1AcIiHSEA9lQiyUCeEQBgQ5XRDGAH/oR0LoXARCmFgRLIU14fIwi3eA94VIhCWfQ3RKCqJTUhGefAEBSfE4cT4CtudOQDdhPzYl7IR0oiJELzCxJk0WkpfWg5atBMa1rWDkqoKZrw7mdQ0ujHwN0PJ2QOqaBqSualCS2epLtGs7IHtT86HwjU1ENF+ZVzPXmvzNHD5yhBxxc+c55u5J3AISf+HhHcwIjYzddvzESRfFzapv4+LOYHp0hLLytaBWuopDyJeGVYESEAiWxOoQaYiE0iESxoBQGEcEZyT+DH8oHYKhTKwMpeHrEHGsDJPGmkh50KKUQI9WgmS0IkSi12JVtDT4T0tD4Kw0Vp9jQDJ5PRgZimBmbgLz8mYwcraAfk0Z9DwVMPLVwbi+AwyOgOuaYFzfCeZ1HUrm+i4w83UWmfmcc01n5nVNwryuxUe/pv63BTg6OpFDru7E9ZgHj3fEeXLSL5RcSEkn+ntMyWYV9TBtXX00N9QvlpXdh+yh9ZSgJw1CfnQIBEmDP1gKAiFSEAqVhnAYDcJhdAhxYUAonAFBDhwx4UwIhctwV/4IOlZx4Lw9oukQimFC5IwsxOLXQvy7dZBMWg9aigLoGRvAuLQRjKxNoGdvBv2qMui5KmDkqYOZv+Nj8VofBWhTzOs6y7LXd0E2X2eeeVWLn3lVi8jkav/1ze+vJSgihgSGRpLA0AieY+4nPuFcc3S0/3rjFtUJb29vzE9OLPuePUkJukpSq08xuBIEg2gQ4LwJQqW5CIZJQyicBqFwOlZHMCASwYRIJBPCEUwIRTAgFMmBCaEoGQhHy0A4RgbCsTIQPsPE6rMyEE2Uhfh3ayGVtB70FAUw0hVBv7QR9KzNoGcrg35VBYxcdTDzdoCRrwlGvhYY+TspRr42ZPJ136/L18e6a7qJ6/P0yLq83Xz0Ai3yD0VpqxpRVtvBt37jFqKirnlk23YtPCy+v9jd1gwNDw1K0Esaot4MCPvTIRRMhxCn1cM40CDIFUCDUAQdqyPpWB3F4K5CETQIRtAgxDmOokMomsFFMJoO/hjOV6U0BE/TIBzHgEiCDNack4NUkjxoaYqgXVICPUsZ9GwVMK6qg3lNA4xcTTBytUDP20kx8rSX1+UbYEOu8bv1V/Ql5K8YEPkcQx5agQb5h6NnsIfExwQQ4He8m5S3tdrY2mN8mLXE2RClj8tSon5MiPoysDqAAeFgBoRDGRAOY0A4nAHhCAaEI/8IHUKRnMI5AqQ/EPlxjZDGqnBJfBsm/oFwcayMkMCqKCnuZ7ZovBykL2wALX0TaJeUQc9SBSN7O5hXNcC4qgn6VS2KcW0nZK7teq+Yuxdbru2PVs61Jkp5lnyyN3eSfyo7tLSJ2g4tvi2q24mmtq6e0lZ1JCbEL8+Oj1PHY45QIqdokPCXhag/EyJBDIiEMLiboUj4n1tfJIqzMrhwuyGCxkU4nLNnSEOQ85siSBzfBIjiGz9R/NpPhMs3/qJYESzOHRmpBHnQkjeBlqEMRqYaGFnbwbiiAUa2BkXP0QIjR3tp3VUjKF+z69fIPPKFZtZRopLt8PfP/v8vm1XUibOTExGRXsf7tYAEUVbTuKmhtQvlpY/e93a0Qs9vNyUWxIBUkBzWBDIhFsyEaCgTomFMiIYzIRrBhGjkXxDB4CIWzoBYGB1ioXSIBdOw2l8KAt5r8K2nCL5xF8Y3HsL4xksEK/3FIRolC+nzG0BLVQItRRmMi9vAzNwBRpYGRc/SBP3yzmWZK7upjTmWUM123q6Wc4go59jzKefYkn9JTM32kp279Hj1DAyJhaWl2EZl9Tf7LKzQ3dG2XFn5CKo+qpREmAzooesgESIL8VAZrAmTwZpwJsQ4RPwZzjUuYQyIhzEhEcKEVBATUv4MSPnQIeVHh9gJSfAfFMFKO2GsOiACIRtxiLpIQyJMHvQMFTDS1cG4tINiZGqAkalFMbJ0FtdnGUMpy9J3c/YBsjHbkk+l4DBRvvovEqCprUuUtqpznj7fFjUNorVLz37DZjUcPuy6NNTfRz0qLYR6gDolGcYEI3I96BHrIB2xFlIRcpCKlINkpOwHImQh9RHpcFnQw+XACJODTOhayIashVzgWoiZi0FAkR9rFERAXy8J2XU0yG+QwXp5JqTkJCHhvB7MzO0UI2MHGJc0KUamzvu1mYbYcMn00oZsC7L2piWPUpoZ2Rqzh/xLs0pMhhxzPUi+FmbyrpZWIOqaOpkKStvg5nbsD72dHaivfwaHBFtKNnQ9JMLokIhgQCKKAYloJsSjGVgTTf9AFA1rIqUhFi4FsVApiAdJQcJXCvQABr7d+S3+4/NPIcugw9J0D6z3mWCPnjZ27dwBdbWtWC+3jlojyaRoEapgXtZaZmZoL669ZACFiyb5jNx9RPk7I7LxojmP0kUL8pNk7769xNjEhCc+kvO7YZZ3m4ZOOUeClbXdHx4+eECN9PehpOoeFZIXSB1ItYbeOX1oxWtz2ZWgC704fRidNsL+s5ZwOecM7xRPhF8MRuylCFzIjkfmlVQobtgAQQF+qCorcVm/bi0YDAYkJaUpMUlpSkhAGuJOmxZlc3SxNsMQChkmGTK5pkTpgglRzDDlUbxoRjZeMv9pBGjv0iO6+gZE33APr72tFYn0P/7Fjp26FYrKGtimqU+d8vZfLLpTuNzZ2EyxurrA6u6iBro7qIHuTrC6u9HX3o7Oxia0NzSitbYe9c+q8ay8Eg/vP8CNvHzcuH4durq6+OyzLyAgIAgBQQ7CFP8HwL9adPnbr1a/l3JVhXyOCRRSTLzWZZoSlcS9ZEO6Cc+GdBOikGFCftJo7dIjOrv1iYHhHl5HOyuCqWK+3fqG323T1MXmbbugprUHRnttl5wPuy+e9AlYDggOR2BIOOUbGEyd9PaljrqfgLPLEdjYOcHS0gbmZvthamwBY0NzmJvsg6zcWs5/hqkVK1dSq/j5KX4BQawSEFpetVJocTX9qMUAAALTSURBVNWK1Vi9Xg7r4vZ0bcy1VFO8vo8wsg15NqSZcCAK6cbkvyXaunqE80YwNjbmTYn1IkqqmsTGet8WI2Oj3N0Ge2Z26e2Btt4e6OwyhK6O4aK+rtGikb7JsskeM8rc2Bx7zfdS5lbmlJmdOWXqZEYZuZhQ+seMqF3HDChpKUms+OJrSuDX3y4L/HrVosAKwSUhYTGIrmVCYpviSzkPXX9nXP9UqfAAUcg249uYYko2pJoShbSf+Mn/v9E33EPMzUyIpYU5j8Lm7byW+0yJyjYN4nfCmd/ZYf92y5N26eb+tq+NAy1hGGiG3cF7oB2qt6wRpbO0LVZrceuZHYub4tUXN5xTW1yXpLK4NoWD2tJ6X5UlWZMNFENPAQzzzZA9tAPrT+mObggxitBsOiFMt9pOTHGWbMy34FOqsCH/1lha7CVe7i7Ey+MoMTY24t2moc13ytWOONpaEBtLY6LxxFd4Z86hQ5qZtg+2X7Sc3pZhBtV0I6ikGWBrqh6UU3ZjC4dkPWxJ1seWFENsvmiELVlm2JK9j6V8dX+uSoGdqTHOfrnusA7RavUk0qaqfMrF9mTLfTuyIfUn2uz+kdjZO5EDNvbE1sqCx9pqH6+FhQnfznJvopHrQBTzdpJ9qSH8+uluqrrph1y0053itNLtr+1It3mwPf3Aw21pVkVqaVZXVNOsolSSrWy2nrNSVPVz+FK52IqoPnAghotRRNZOg0/xjBkP01aDiCsrkP/xcbyaSvQzXHl00uz51JJ385pcDiR6l44SnYvOZGeGPdHIOEC2p+8n29ItiVqaBVFNsyAq6Rz2E5U0G7Ij1Y1sTDPiU0rby7clzYpHKW0v2ZRmSv5XZXeGGzFI9yT66R5k98UjPDoZTrw7M2z5NNKt+LanW/BtS9vLp5ZmzqeSZsZla5o5n3LaPr6taft5t6Yd4FFLPvTvLuHn/Jyf83N+Dvm/mv8E+V/3sXmDKDwAAAAASUVORK5CYII=",alt:""}),e("h1",{children:"Chatbot"})]})),"s_PjfpaY6FOTY")),P=`header{display:flex;background:white}header .logo a{display:inline-block;padding:10px 10px 7px 20px;text-decoration:none}header ul{margin:0;padding:3px 10px 0 0;list-style:none;flex:1;text-align:right}header li{display:inline-block;margin:0;padding:0}header li a{display:inline-block;padding:15px 10px;text-decoration:none;color:#1a1a1a;font-weight:500}header li a:hover{text-decoration:underline} +`,p=o(i(()=>(n(i(P,"s_DUMnr602HUE")),t("header",{children:[e("div",{class:"logo",children:e("a",{href:"https://github.com/codigoencasa/bot-whatsapp",target:"_blank",title:"qwik",children:e(g,{},"k2_0")})}),t("ul",{children:[e("li",{children:e("a",{href:"https://github.com/codigoencasa/bot-whatsapp",target:"_blank",children:"Docs"})}),e("li",{children:e("a",{href:"https://github.com/codigoencasa/bot-whatsapp/tree/main/starters/apps",target:"_blank",children:"Examples"})}),e("li",{children:e("a",{href:"https://www.youtube.com/watch?v=1u0TTbjK5bo&list=PL_WGMLcL4jzViIlmyDZPnhAdkc8RXGkFh",target:"_blank",children:"Tutorials"})})]})]})),"s_rUlpxt0UkP8")),A=o(i(()=>t(d,{children:[t("main",{children:[e(p,{},"3N_0"),e("section",{children:e(s,{},"3N_1")})]}),e("footer",{children:t("a",{href:"https://qwik.builder.io/",target:"_blank",children:["Made with ",e("strong",{children:"Qwik"})]})})]},"3N_2"),"s_dyI7p8LxEE8")),u=Object.freeze(Object.defineProperty({__proto__:null,default:A},Symbol.toStringTag,{value:"Module"})),w=`div img{display:block;background-color:#f0f0f0;width:350px;height:350px;object-fit:contain;border-radius:10px}div{display:flex;justify-content:center} +`,j=o(i(()=>{n(i(w,"s_C1zLAObj2Tc"));const a=c({count:0});return r(l("s_9iPc0ZNOdxU",[a])),e("div",{children:e("img",{width:350,height:350,src:"qr.png?time="+a.count,alt:"QR"})})},"s_rghJxmpKVus")),m=`.page{display:grid;padding:1rem;gap:2rem}.page .qr-section.links{display:flex;gap:1rem;flex-wrap:wrap}.page .btn-link{background:white;box-shadow:#00000029 0 10px 36px,#0000000f 0 0 0 1px;padding:10px;border-radius:5px;font-weight:600;text-decoration:none;color:#1a1a1a;border:solid 1px #afafaf} +`,y=o(i(()=>(n(i(m,"s_A20fm0z03Yw")),t("div",{class:"page",children:[e("div",{class:"qr-section",children:e(j,{},"UZ_0")}),t("div",{class:"qr-section intructions",children:[e("h1",{children:"Whatsapp QR"}),t("p",{children:["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. ",e("br",{})," Además, nuestro Chatbot se integra fácilmente con otros sistemas y herramientas que ya esté utilizando en su negocio."]}),t("div",{class:"qr-section links",children:[e("a",{class:"btn-link ",target:"_blank",href:"https://bot-whatsapp.netlify.app/",children:"Ver documentación"}),e("a",{class:"btn-link ",target:"_blank",href:"https://www.youtube.com/watch?v=1u0TTbjK5bo&list=PL_WGMLcL4jzViIlmyDZPnhAdkc8RXGkFh",children:"Ver videos"}),e("a",{class:"btn-link ",target:"_blank",href:"https://opencollective.com/bot-whatsapp",children:"Comprar café"})]})]})]})),"s_4uCQXYaqoXY")),f={title:"🤖 Crear chatbot WhatsApp en minutos",meta:[{name:"description",content:"🤖 Crear chatbot WhatsApp en minutos"}]},b=Object.freeze(Object.defineProperty({__proto__:null,default:y,head:f},Symbol.toStringTag,{value:"Module"})),x=()=>u,z=[[/^\/$/,[x,()=>b],void 0,"/",["q-eaa41d1e.js","q-9cbd2586.js"]]],B=[],I=!0,E="/",L=!0,v={routes:z,menus:B,trailingSlash:I,basePathname:E,cacheModules:L};export{E as basePathname,L as cacheModules,v as default,B as menus,z as routes,I as trailingSlash}; diff --git a/packages/portal/server/@qwik-city-static-paths.js b/packages/portal/server/@qwik-city-static-paths.js new file mode 100644 index 0000000..1afa65f --- /dev/null +++ b/packages/portal/server/@qwik-city-static-paths.js @@ -0,0 +1,23 @@ +const staticPaths = new Set([ + '/', + '/favicon.svg', + '/manifest.json', + '/q-manifest.json', + '/robots.txt', + '/service-worker.js', + '/sitemap.xml', + '/water-mark.png', +]) +function isStaticPath(p) { + if (p.startsWith('/build/')) { + return true + } + if (p.startsWith('/assets/')) { + return true + } + if (staticPaths.has(p)) { + return true + } + return false +} +export { isStaticPath } diff --git a/packages/portal/server/entry.ssr.js b/packages/portal/server/entry.ssr.js new file mode 100644 index 0000000..eed19e1 --- /dev/null +++ b/packages/portal/server/entry.ssr.js @@ -0,0 +1 @@ +export * from './entry.ssr.mjs' diff --git a/packages/portal/server/entry.ssr.mjs b/packages/portal/server/entry.ssr.mjs new file mode 100644 index 0000000..c4fbac2 --- /dev/null +++ b/packages/portal/server/entry.ssr.mjs @@ -0,0 +1,2 @@ +import{jsx as r,jsxs as z,Fragment as qe}from"@builder.io/qwik/jsx-runtime";import{renderToStream as je}from"@builder.io/qwik/server";import{componentQrl as j,inlinedQrl as p,useContext as E,jsx as be,SkipRender as we,useEnvData as te,useStore as m,useContextProvider as u,useWatchQrl as ke,useLexicalScope as ne,getLocale as ve,noSerialize as se,Slot as U,useOnDocument as Ce,createContext as k,withLocale as H,_wrapSignal as P,_IMMUTABLE as W,useStylesQrl as Le}from"@builder.io/qwik";const Ne={symbols:{s_kzjavhDI3L0:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"Link_component_a_onClick",canonicalFilename:"s_kzjavhdi3l0",hash:"kzjavhDI3L0",ctxKind:"event",ctxName:"onClick$",captures:!0,parent:"s_8gdLBszqbaM"},s_yiXwCC0m3jY:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"Link_component_a_onMouseOver",canonicalFilename:"s_yixwcc0m3jy",hash:"yiXwCC0m3jY",ctxKind:"event",ctxName:"onMouseOver$",captures:!1,parent:"s_8gdLBszqbaM"},s_EpaZ5qQ4Lg4:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"Link_component_a_onQVisible",canonicalFilename:"s_epaz5qq4lg4",hash:"EpaZ5qQ4Lg4",ctxKind:"event",ctxName:"onQVisible$",captures:!1,parent:"s_8gdLBszqbaM"},s_9iPc0ZNOdxU:{origin:"components/qr/qr.tsx",displayName:"QR_component_useClientEffect",canonicalFilename:"s_9ipc0znodxu",hash:"9iPc0ZNOdxU",ctxKind:"function",ctxName:"useClientEffect$",captures:!0,parent:"s_rghJxmpKVus"},s_4uCQXYaqoXY:{origin:"routes/index.tsx",displayName:"routes_component",canonicalFilename:"s_4ucqxyaqoxy",hash:"4uCQXYaqoXY",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_8gdLBszqbaM:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"Link_component",canonicalFilename:"s_8gdlbszqbam",hash:"8gdLBszqbaM",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_AKetNByE5TM:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"RouterOutlet_component",canonicalFilename:"s_aketnbye5tm",hash:"AKetNByE5TM",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_BVs20TDbvq4:{origin:"root.tsx",displayName:"root_component",canonicalFilename:"s_bvs20tdbvq4",hash:"BVs20TDbvq4",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_D0p4a09aSQg:{origin:"components/router-head/router-head.tsx",displayName:"RouterHead_component",canonicalFilename:"s_d0p4a09asqg",hash:"D0p4a09aSQg",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_PjfpaY6FOTY:{origin:"components/icons/bot.tsx",displayName:"BotLogo_component",canonicalFilename:"s_pjfpay6foty",hash:"PjfpaY6FOTY",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_TxCFOy819ag:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"QwikCityProvider_component",canonicalFilename:"s_txcfoy819ag",hash:"TxCFOy819ag",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_WmYC5H00wtI:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"QwikCityMockProvider_component",canonicalFilename:"s_wmyc5h00wti",hash:"WmYC5H00wtI",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_dyI7p8LxEE8:{origin:"routes/layout.tsx",displayName:"layout_component",canonicalFilename:"s_dyi7p8lxee8",hash:"dyI7p8LxEE8",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_rUlpxt0UkP8:{origin:"components/header/header.tsx",displayName:"header_component",canonicalFilename:"s_rulpxt0ukp8",hash:"rUlpxt0UkP8",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_rghJxmpKVus:{origin:"components/qr/qr.tsx",displayName:"QR_component",canonicalFilename:"s_rghjxmpkvus",hash:"rghJxmpKVus",ctxKind:"function",ctxName:"component$",captures:!1,parent:null},s_xHG1bWPFcUU:{origin:"root.tsx",displayName:"root_component_useStyles",canonicalFilename:"s_xhg1bwpfcuu",hash:"xHG1bWPFcUU",ctxKind:"function",ctxName:"useStyles$",captures:!1,parent:"s_BVs20TDbvq4"},s_A20fm0z03Yw:{origin:"routes/index.tsx",displayName:"routes_component_useStylesScoped",canonicalFilename:"s_a20fm0z03yw",hash:"A20fm0z03Yw",ctxKind:"function",ctxName:"useStylesScoped$",captures:!1,parent:"s_4uCQXYaqoXY"},s_C1zLAObj2Tc:{origin:"components/qr/qr.tsx",displayName:"QR_component_useStylesScoped",canonicalFilename:"s_c1zlaobj2tc",hash:"C1zLAObj2Tc",ctxKind:"function",ctxName:"useStylesScoped$",captures:!1,parent:"s_rghJxmpKVus"},s_DUMnr602HUE:{origin:"components/header/header.tsx",displayName:"header_component_useStylesScoped",canonicalFilename:"s_dumnr602hue",hash:"DUMnr602HUE",ctxKind:"function",ctxName:"useStylesScoped$",captures:!1,parent:"s_rUlpxt0UkP8"},s_a8xI1ebvPf4:{origin:"components/icons/bot.tsx",displayName:"BotLogo_component_useStylesScoped",canonicalFilename:"s_a8xi1ebvpf4",hash:"a8xI1ebvPf4",ctxKind:"function",ctxName:"useStylesScoped$",captures:!1,parent:"s_PjfpaY6FOTY"},s_00bFc4tHmxA:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"useEndpoint_useResource",canonicalFilename:"s_00bfc4thmxa",hash:"00bFc4tHmxA",ctxKind:"function",ctxName:"useResource$",captures:!0,parent:null},s_2Eo7WCpaqI8:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"QwikCityProvider_component_useWatch",canonicalFilename:"s_2eo7wcpaqi8",hash:"2Eo7WCpaqI8",ctxKind:"function",ctxName:"useWatch$",captures:!0,parent:"s_TxCFOy819ag"},s_u0YVoxt2aTY:{origin:"../../../node_modules/@builder.io/qwik-city/index.qwik.mjs",displayName:"Link_component_useOnDocument",canonicalFilename:"s_u0yvoxt2aty",hash:"u0YVoxt2aTY",ctxKind:"function",ctxName:"useOnDocument",captures:!1,parent:"s_8gdLBszqbaM"}},mapping:{s_kzjavhDI3L0:"q-a72d609e.js",s_yiXwCC0m3jY:"q-a72d609e.js",s_EpaZ5qQ4Lg4:"q-a72d609e.js",s_9iPc0ZNOdxU:"q-a72d609e.js",s_4uCQXYaqoXY:"q-a72d609e.js",s_8gdLBszqbaM:"q-a72d609e.js",s_AKetNByE5TM:"q-a72d609e.js",s_BVs20TDbvq4:"q-a72d609e.js",s_D0p4a09aSQg:"q-a72d609e.js",s_PjfpaY6FOTY:"q-a72d609e.js",s_TxCFOy819ag:"q-a72d609e.js",s_WmYC5H00wtI:"q-a72d609e.js",s_dyI7p8LxEE8:"q-a72d609e.js",s_rUlpxt0UkP8:"q-a72d609e.js",s_rghJxmpKVus:"q-a72d609e.js",s_xHG1bWPFcUU:"q-a72d609e.js",s_A20fm0z03Yw:"q-a72d609e.js",s_C1zLAObj2Tc:"q-a72d609e.js",s_DUMnr602HUE:"q-a72d609e.js",s_a8xI1ebvPf4:"q-a72d609e.js",s_00bFc4tHmxA:"q-a72d609e.js",s_2Eo7WCpaqI8:"q-a72d609e.js",s_u0YVoxt2aTY:"q-a72d609e.js"},bundles:{"q-0d007131.js":{size:507,imports:["q-3e21ace4.js"],dynamicImports:["q-9cbd2586.js","q-eaa41d1e.js","q-f1036226.js"],origins:["@qwik-city-plan"]},"q-3e21ace4.js":{size:43312,origins:["\0vite/preload-helper","node_modules/@builder.io/qwik/core.min.mjs"]},"q-45aab3b6.js":{size:2536,origins:["../../node_modules/@builder.io/qwik-city/service-worker.mjs","src/routes/service-worker.ts"]},"q-9cbd2586.js":{size:319,imports:["q-3e21ace4.js"],dynamicImports:["q-a72d609e.js"],origins:["src/routes/index.tsx"]},"q-a72d609e.js":{size:25263,imports:["q-3e21ace4.js"],dynamicImports:["q-0d007131.js"],origins:["../../node_modules/@builder.io/qwik-city/index.qwik.mjs","src/components/header/header.css?used&inline","src/components/header/header.tsx","src/components/icons/bot.css?used&inline","src/components/icons/bot.tsx","src/components/qr/qr.css?used&inline","src/components/qr/qr.tsx","src/components/router-head/router-head.tsx","src/entry_hooks.js","src/global.css?used&inline","src/routes/index.css?used&inline","src/s_00bfc4thmxa.js","src/s_2eo7wcpaqi8.js","src/s_4ucqxyaqoxy.js","src/s_8gdlbszqbam.js","src/s_9ipc0znodxu.js","src/s_a20fm0z03yw.js","src/s_a8xi1ebvpf4.js","src/s_aketnbye5tm.js","src/s_bvs20tdbvq4.js","src/s_c1zlaobj2tc.js","src/s_d0p4a09asqg.js","src/s_dumnr602hue.js","src/s_dyi7p8lxee8.js","src/s_epaz5qq4lg4.js","src/s_kzjavhdi3l0.js","src/s_pjfpay6foty.js","src/s_rghjxmpkvus.js","src/s_rulpxt0ukp8.js","src/s_txcfoy819ag.js","src/s_u0yvoxt2aty.js","src/s_wmyc5h00wti.js","src/s_xhg1bwpfcuu.js","src/s_yixwcc0m3jy.js"],symbols:["s_00bFc4tHmxA","s_2Eo7WCpaqI8","s_4uCQXYaqoXY","s_8gdLBszqbaM","s_9iPc0ZNOdxU","s_A20fm0z03Yw","s_a8xI1ebvPf4","s_AKetNByE5TM","s_BVs20TDbvq4","s_C1zLAObj2Tc","s_D0p4a09aSQg","s_DUMnr602HUE","s_dyI7p8LxEE8","s_EpaZ5qQ4Lg4","s_kzjavhDI3L0","s_PjfpaY6FOTY","s_rghJxmpKVus","s_rUlpxt0UkP8","s_TxCFOy819ag","s_u0YVoxt2aTY","s_WmYC5H00wtI","s_xHG1bWPFcUU","s_yiXwCC0m3jY"]},"q-df6dc34c.js":{size:185,imports:["q-3e21ace4.js"],dynamicImports:["q-a72d609e.js"],origins:["src/root.tsx"]},"q-eaa41d1e.js":{size:185,imports:["q-3e21ace4.js"],dynamicImports:["q-a72d609e.js"],origins:["src/routes/layout.tsx"]},"q-f1036226.js":{size:112,imports:["q-3e21ace4.js"],dynamicImports:["q-45aab3b6.js"],origins:["@qwik-city-entries"]}},injections:[],version:"1",options:{target:"client",buildMode:"production",forceFullBuild:!0,entryStrategy:{type:"single"}},platform:{qwik:"0.16.2",vite:"",rollup:"3.9.1",env:"node",os:"win32",node:"18.12.1"}},Ee=!0,Ie=!1,oe=k("qc-c"),D=k("qc-ic"),O=k("qc-h"),Q=k("qc-l"),M=k("qc-n"),Pe=j(p(()=>{const{contents:e}=E(D);if(e&&e.length>0){const t=e.length;let n=null;for(let s=t-1;s>=0;s--)n=be(e[s].default,{children:n});return n}return we},"RouterOutlet_component_AKetNByE5TM")),R=new WeakMap,N=Symbol(),F=Symbol(),w=new Map,Se=async(e,t,n,s)=>{if(Array.isArray(e))for(const o of e){const a=o[0].exec(s);if(a){const i=o[1],c=Ye(o[2],a),l=o[4],f=new Array(i.length),y=[],_=Te(t,s);let v;return i.forEach((d,g)=>{$(d,y,I=>f[g]=I,n)}),$(_,y,d=>v=d==null?void 0:d.default,n),y.length>0&&await Promise.all(y),[c,f,v,l]}}return null},$=(e,t,n,s)=>{if(typeof e=="function"){const o=R.get(e);if(o)n(o);else{const a=e();typeof a.then=="function"?t.push(a.then(i=>{s!==!1&&R.set(e,i),n(i)})):a&&n(a)}}},Te=(e,t)=>{if(e){t=t.endsWith("/")?t:t+"/";const n=e.find(s=>s[0]===t||t.startsWith(s[0]+(t.endsWith("/")?"":"/")));if(n)return n[1]}},Ye=(e,t)=>{const n={};if(e)for(let s=0;s{const o=K(),a={data:e?e.body:null,head:o,withLocale:i=>H(s,i),...t};for(let i=n.length-1;i>=0;i--){const c=n[i]&&n[i].head;c&&(typeof c=="function"?V(o,H(s,()=>c(a))):typeof c=="object"&&V(o,c))}return a.head},V=(e,t)=>{typeof t.title=="string"&&(e.title=t.title),S(e.meta,t.meta),S(e.links,t.links),S(e.styles,t.styles),Object.assign(e.frontmatter,t.frontmatter)},S=(e,t)=>{if(Array.isArray(t))for(const n of t){if(typeof n.key=="string"){const s=e.findIndex(o=>o.key===n.key);if(s>-1){e[s]=n;continue}}e.push(n)}},K=()=>({title:"",meta:[],links:[],styles:[],frontmatter:{}}),Fe=()=>E(O),ae=()=>E(Q),Ue=()=>E(M),De=()=>se(te("qwikcity")),x=e=>e.pathname+e.search+e.hash,q=(e,t)=>new URL(e,t.href),ie=(e,t)=>e.origin===t.origin,ce=(e,t)=>e.pathname+e.search===t.pathname+t.search,Oe=(e,t)=>e.pathname===t.pathname,X=(e,t)=>ie(e,t)&&!ce(e,t),Qe=(e,t)=>e+(e.endsWith("/")?"":"/")+"q-data.json"+(t??""),Me=(e,t)=>{const n=e.href;if(typeof n=="string"&&n.trim()!==""&&typeof e.target!="string")try{const s=q(n,t),o=q("",t);if(ie(s,o))return x(s)}catch(s){console.error(s)}return null},Ke=(e,t,n)=>{if(e.prefetch!==!1&&t){const s=q(t,n);if(!Oe(s,q("",n)))return""}return null},Ae=(e,t)=>{const n=e.location,s=q(t.path,n);X(n,s)&&(Z(e,n,s),e.history.pushState("","",x(s))),e[F]||(e[F]=1,e.addEventListener("popstate",()=>{const o=e.location,a=q(t.path,o);X(o,a)&&(Z(e,a,o),t.path=x(o))}),e.removeEventListener("popstate",e[N]))},Z=async(e,t,n)=>{const s=e.document,o=n.hash;if(ce(t,n))t.hash!==o&&(await T(),o?J(s,o):e.scrollTo(0,0));else if(o)for(let a=0;a<24&&(await T(),!J(s,o));a++);else await T(),e.scrollTo(0,0)},T=()=>new Promise(e=>setTimeout(e,12)),J=(e,t)=>{const n=t.slice(1),s=e.getElementById(n);return s&&s.scrollIntoView(),s},G=e=>{typeof document<"u"&&document.dispatchEvent(new CustomEvent("qprefetch",{detail:e}))},re=async(e,t)=>{const n=new URL(e),s=n.pathname,o=n.search,a=Qe(s,o);let i=w.get(a);return G({links:[s]}),i||(i=fetch(a).then(c=>{if(c.ok&&(c.headers.get("content-type")||"").includes("json"))return c.json().then(l=>(G({bundles:l.prefetch}),t&&w.delete(a),l));w.delete(a)}),w.set(a,i)),i},Be=j(p(()=>{const e=De();if(!(e!=null&&e.params))throw new Error("Missing Qwik City Env Data");const t=te("url");if(!t)throw new Error("Missing Qwik URL Env Data");const n=new URL(t),s=m({href:n.href,pathname:n.pathname,query:Object.fromEntries(n.searchParams.entries()),params:e.params}),o=m({path:x(n)}),a=m(K),i=m({headings:void 0,menu:void 0}),c=m({contents:void 0});return u(oe,i),u(D,c),u(O,a),u(Q,s),u(M,o),ke(p(async({track:l})=>{const[f,y,_,v,d,g]=ne(),I=ve(""),{routes:le,menus:de,cacheModules:pe,trailingSlash:A}=await import("./@qwik-city-plan.mjs"),me=l(()=>g.path),h=new URL(me,d.href),C=h.pathname,ue=Se(le,de,pe,C),he=Ee?v.response:re(h.href,!0),B=await ue;if(B){const[fe,_e,xe]=B,L=_e,ye=L[L.length-1];if(C.endsWith("/")){if(!A){h.pathname=C.slice(0,-1),g.path=x(h);return}}else if(A){h.pathname+="/",g.path=x(h);return}d.href=h.href,d.pathname=C,d.params={...fe},d.query=Object.fromEntries(h.searchParams.entries()),f.headings=ye.headings,f.menu=xe,y.contents=se(L);const ge=await he,b=ze(ge,d,L,I);w.clear(),_.links=b.links,_.meta=b.meta,_.styles=b.styles,_.title=b.title,_.frontmatter=b.frontmatter,Ie&&Ae(window,g)}},"QwikCityProvider_component_useWatch_2Eo7WCpaqI8",[i,c,a,e,s,o])),r(U,{},"qY_0")},"QwikCityProvider_component_TxCFOy819ag"));p(e=>{const t=e.url??"http://localhost/",n=new URL(t),s=m({href:n.href,pathname:n.pathname,query:Object.fromEntries(n.searchParams.entries()),params:e.params??{}}),o=m({path:x(n)}),a=m(K),i=m({headings:void 0,menu:void 0}),c=m({contents:void 0});return u(oe,i),u(D,c),u(O,a),u(Q,s),u(M,o),r(U,{},"qY_1")},"QwikCityMockProvider_component_WmYC5H00wtI");p(e=>{const t=Ue(),n=ae(),s=e.href,o={...e},a=Me(o,n),i=Ke(e,a,n);return o["preventdefault:click"]=!!a,o.href=a||s,Ce("qinit",p(()=>{window[N]||(window[N]=()=>{window[F]||location.reload()},setTimeout(()=>{addEventListener("popstate",window[N])},0))},"Link_component_useOnDocument_u0YVoxt2aTY")),r("a",{...o,onClick$:p(()=>{const[c,l,f]=ne();c&&(f.path=l.href)},"Link_component_a_onClick_kzjavhDI3L0",[a,o,t]),"data-prefetch":i,onMouseOver$:p((c,l)=>ee(l),"Link_component_a_onMouseOver_yiXwCC0m3jY"),onQVisible$:p((c,l)=>ee(l,!0),"Link_component_a_onQVisible_EpaZ5qQ4Lg4"),children:r(U,{},"AD_0")})},"Link_component_8gdLBszqbaM");const ee=(e,t)=>{e&&e.href&&e.hasAttribute("data-prefetch")&&(Y||(Y=innerWidth),(!t||t&&Y<520)&&re(e.href))};let Y=0;const He=j(p(()=>{const e=Fe(),t=ae();return z(qe,{children:[r("title",{children:P(e,"title")}),r("link",{rel:"canonical",get href(){return t.href},[W]:{href:P(t,"href")}}),r("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),r("link",{rel:"icon",type:"image/svg+xml",href:"/favicon.svg"}),e.meta.map(n=>r("meta",{...n})),e.links.map(n=>r("link",{...n})),e.styles.map(n=>r("style",{...n.props,get dangerouslySetInnerHTML(){return n.style},[W]:{dangerouslySetInnerHTML:P(n,"style")}}))]},"Qn_0")},"s_D0p4a09aSQg")),We=`:root{--qwik-dark-blue: #1a1a1a;--qwik-light-blue: #349713;--qwik-light-purple: #73da51;--qwik-dark-purple: #3f9622}body{background-color:#fafafa;font-family:Inter,sans-serif,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,sans-serif;padding:20px 20px 40px}main{max-width:760px;margin:0 auto;background-color:#fff;border-radius:5px;box-shadow:#110c2e26 0 48px 100px;overflow:hidden}h1,h2{margin:0 0 5px}.lightning{filter:hue-rotate(180deg)}section{padding:20px}ul{list-style-type:square;margin:5px 0 30px;padding-left:25px}li{padding:8px 0}li::marker{color:var(--qwik-light-blue)}a,a:visited{color:var(--qwik-dark-blue)}a:hover{text-decoration:none}table.commands{margin:0 0 30px}.commands td{padding:5px}.commands td:first-child{white-space:nowrap;padding-right:20px}code{font-family:Menlo,Monaco,Courier New,monospace;font-size:.9em;background-color:#e0e0e0;padding:2px 4px;border-radius:3px;border-bottom:2px solid #bfbfbf}footer{padding:15px;text-align:center;font-size:.8em}footer a{text-decoration:none}footer a:hover{text-decoration:underline}a.mindblow{margin:0 auto;display:block;background:var(--qwik-dark-purple);padding:10px 20px;border-radius:10px;border:0;color:#fff;text-decoration:none;font-size:20px;width:fit-content;border-bottom:4px solid black;cursor:url("data:image/svg+xml;utf8,\\1f92f") 16 0,auto}a.mindblow:hover{border-bottom-width:0px;margin-bottom:4px;transform:translateY(4px)} +`,Re=j(p(()=>(Le(p(We,"s_xHG1bWPFcUU")),z(Be,{children:[z("head",{children:[r("meta",{charSet:"utf-8"}),r("link",{rel:"preconnect",href:"https://rsms.me/"}),r("link",{rel:"stylesheet",href:"https://rsms.me/inter/inter.css"}),r(He,{},"pq_0")]}),r("body",{lang:"en",children:r(Pe,{},"pq_1")})]},"pq_2")),"s_BVs20TDbvq4"));function Ze(e){return je(r(Re,{},"we_0"),{manifest:Ne,...e,containerAttributes:{lang:"en-us",...e.containerAttributes}})}export{Ze as default}; diff --git a/packages/portal/server/package.json b/packages/portal/server/package.json new file mode 100644 index 0000000..4720025 --- /dev/null +++ b/packages/portal/server/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} From f36cff1eefdd96be4ab531e1cb2d3b630b1a81c3 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 09:54:10 +0100 Subject: [PATCH 08/75] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 56dcd60..54fedc7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,7 +97,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m 'major' + git commit -m '"${{ github.event.head_commit.message }}"' - name: Push changes uses: ad-m/github-push-action@master From 56fcb8fb72169bc21fce7c4fcdceccf2acd39c73 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 09:58:46 +0100 Subject: [PATCH 09/75] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54fedc7..6920700 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,7 +97,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m '"${{ github.event.head_commit.message }}"' + git commit -m "${{ github.event.head_commit.message }}" - name: Push changes uses: ad-m/github-push-action@master From cc19974579379777b05cb69c38cec0fce6740471 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:04:07 +0100 Subject: [PATCH 10/75] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6920700..54fedc7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,7 +97,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m "${{ github.event.head_commit.message }}" + git commit -m '"${{ github.event.head_commit.message }}"' - name: Push changes uses: ad-m/github-push-action@master From 82a99b2c80e6738566042ea738bbab8208a17758 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:12:00 +0100 Subject: [PATCH 11/75] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54fedc7..47c545a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,6 +64,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + with: + fetch-depth: 0 + ref: ${{github.event.after}} - name: Setup Node uses: actions/setup-node@v3 @@ -92,12 +95,17 @@ jobs: - name: Check Twilio run: yarn node ./scripts/checker.js --name=twilio --stable=true + - name: Get Commit Message + run: | + MSG=$(git log --format=%B -n 1 ${{github.event.after}}) + echo "::set-env name=COMMIT_MESSAGE::${MSG}" + - name: Add and commit changes to gh-pages branch run: | git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m '"${{ github.event.head_commit.message }}"' + git commit -m '"${{env.COMMIT_MESSAGE}}"' - name: Push changes uses: ad-m/github-push-action@master From 21a72702817bc6b344223b34ca4513a7ff45fc93 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:34:19 +0100 Subject: [PATCH 12/75] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 47c545a..695b6da 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,6 +61,8 @@ jobs: check-providers: name: Check Providers Versions runs-on: ubuntu-latest + outputs: + commit: ${{ steps.vars.outputs.commit }} steps: - name: Checkout uses: actions/checkout@v3 @@ -95,6 +97,10 @@ jobs: - name: Check Twilio run: yarn node ./scripts/checker.js --name=twilio --stable=true + - name: Set output + id: vars + run: echo "commit=$(git log --format=%B -n 1 ${{github.event.after}})" >> $GITHUB_OUTPUT + - name: Get Commit Message run: | MSG=$(git log --format=%B -n 1 ${{github.event.after}}) @@ -105,7 +111,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m '"${{env.COMMIT_MESSAGE}}"' + git commit -m '"${{ steps.vars.outputs.commit }}"' - name: Push changes uses: ad-m/github-push-action@master From 5e879188b8bf9d486399b308a9a9c2612607d465 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:36:22 +0100 Subject: [PATCH 13/75] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 695b6da..d23fd3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -101,11 +101,6 @@ jobs: id: vars run: echo "commit=$(git log --format=%B -n 1 ${{github.event.after}})" >> $GITHUB_OUTPUT - - name: Get Commit Message - run: | - MSG=$(git log --format=%B -n 1 ${{github.event.after}}) - echo "::set-env name=COMMIT_MESSAGE::${MSG}" - - name: Add and commit changes to gh-pages branch run: | git config --local user.email 'action@github.com' From 039ce5dd7cac8115b335ad5de05f7bd871e24140 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:41:40 +0100 Subject: [PATCH 14/75] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d23fd3b..5998932 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,7 +106,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m '"${{ steps.vars.outputs.commit }}"' + git commit -m "${{ steps.vars.outputs.commit }}" - name: Push changes uses: ad-m/github-push-action@master From 0c0f4375b84549bee809340a85f9ce038ee2739e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:45:29 +0100 Subject: [PATCH 15/75] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5998932..2e2ee2c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,8 +108,8 @@ jobs: git add . git commit -m "${{ steps.vars.outputs.commit }}" - - name: Push changes - uses: ad-m/github-push-action@master + - name: Commit Versioning & Push changes + uses: stefanzweifel/git-auto-commit-action@v4 with: - github_token: ${{ secrets.GITHUB_TOKEN }} + commit_message: '${{ steps.vars.outputs.commit }}' branch: feature/providers-major From 8c825e7f6b7133f7cc7f3041ce331b80a9fe60e0 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:49:58 +0100 Subject: [PATCH 16/75] fix(cli): :zap: refactor --- packages/cli/check/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/check/index.js b/packages/cli/check/index.js index cbd8e08..454f67c 100644 --- a/packages/cli/check/index.js +++ b/packages/cli/check/index.js @@ -24,7 +24,7 @@ const checkNodeVersion = () => { } const checkOs = () => { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { console.log(bgCyan('🙂 Revisando tu sistema operativo')) const os = process.platform if (!os.includes('win32')) { From 32f6a70f8f6fb26d8ea2a0f1a4aec4827b9d6a93 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 10:56:34 +0100 Subject: [PATCH 17/75] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e2ee2c..df9c6d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,7 +106,6 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . - git commit -m "${{ steps.vars.outputs.commit }}" - name: Commit Versioning & Push changes uses: stefanzweifel/git-auto-commit-action@v4 From 3648757fa083bdb88a16bf6c2e90c828c233bdb1 Mon Sep 17 00:00:00 2001 From: leifermendez Date: Mon, 16 Jan 2023 09:58:30 +0000 Subject: [PATCH 18/75] fix(cli): :zap: refactor --- packages/provider/src/web-whatsapp/package.json | 2 +- starters/apps/base-wweb-json/package.json | 2 +- starters/apps/base-wweb-memory/package.json | 2 +- starters/apps/base-wweb-mongo/package.json | 2 +- starters/apps/base-wweb-mysql/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/provider/src/web-whatsapp/package.json b/packages/provider/src/web-whatsapp/package.json index 7514818..d15dbe0 100644 --- a/packages/provider/src/web-whatsapp/package.json +++ b/packages/provider/src/web-whatsapp/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "whatsapp-web.js": "1.18.4" + "whatsapp-web.js": "1.19.2" } } diff --git a/starters/apps/base-wweb-json/package.json b/starters/apps/base-wweb-json/package.json index f52ab5a..d01b825 100644 --- a/starters/apps/base-wweb-json/package.json +++ b/starters/apps/base-wweb-json/package.json @@ -14,7 +14,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", - "whatsapp-web.js": "1.18.4" + "whatsapp-web.js": "1.19.2" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-wweb-memory/package.json b/starters/apps/base-wweb-memory/package.json index b9c4712..d508c4f 100644 --- a/starters/apps/base-wweb-memory/package.json +++ b/starters/apps/base-wweb-memory/package.json @@ -14,7 +14,7 @@ "@bot-whatsapp/database": "latest", "@bot-whatsapp/provider": "latest", "@bot-whatsapp/portal": "latest", - "whatsapp-web.js": "1.18.4" + "whatsapp-web.js": "1.19.2" }, "author": "", "license": "ISC" diff --git a/starters/apps/base-wweb-mongo/package.json b/starters/apps/base-wweb-mongo/package.json index 9c51d8a..a64f35c 100644 --- a/starters/apps/base-wweb-mongo/package.json +++ b/starters/apps/base-wweb-mongo/package.json @@ -9,7 +9,7 @@ }, "keywords": [], "dependencies": { - "whatsapp-web.js": "1.18.4", + "whatsapp-web.js": "1.19.2", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", diff --git a/starters/apps/base-wweb-mysql/package.json b/starters/apps/base-wweb-mysql/package.json index e95ec1a..ee90e12 100644 --- a/starters/apps/base-wweb-mysql/package.json +++ b/starters/apps/base-wweb-mysql/package.json @@ -9,7 +9,7 @@ }, "keywords": [], "dependencies": { - "whatsapp-web.js": "1.18.4", + "whatsapp-web.js": "1.19.2", "@bot-whatsapp/bot": "latest", "@bot-whatsapp/cli": "latest", "@bot-whatsapp/database": "latest", From ecf0eef928917d76c59bd23886cb7a4108b421f1 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:11:33 +0100 Subject: [PATCH 19/75] fix(bot): :bug: body undefined --- .github/workflows/check-provider-major.yml | 8 +++++++- packages/bot/core/core.class.js | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-provider-major.yml b/.github/workflows/check-provider-major.yml index 9557ead..ed04610 100644 --- a/.github/workflows/check-provider-major.yml +++ b/.github/workflows/check-provider-major.yml @@ -39,8 +39,14 @@ jobs: - name: Check Twilio run: yarn node ./scripts/checker.js --name=twilio --stable=true + - name: Add and commit changes to gh-pages branch + run: | + git config --local user.email 'action@github.com' + git config --local user.name 'GitHub Action' + git add . + - uses: stefanzweifel/git-auto-commit-action@v4 with: - commit_message: 'ci(providers): 🚩 Check BREAKING CHANGE' + commit_message: 'ci(providers): check provider versions' create_branch: true branch: feature/breaking-change diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 79d996b..e3efc04 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -70,7 +70,7 @@ class CoreClass { const { body, from } = messageCtxInComming let msgToSend = [] let fallBackFlag = false - + if (!body) return if (!body.length) return const prevMsg = await this.databaseClass.getPrevByNumber(from) From 70dd4d73e814fc5636d19a887f3621c483b837c1 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:17:25 +0100 Subject: [PATCH 20/75] fix(bot): :bug: body undefined --- .github/workflows/check-provider-major.yml | 2 +- .github/workflows/ci.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check-provider-major.yml b/.github/workflows/check-provider-major.yml index ed04610..ea91659 100644 --- a/.github/workflows/check-provider-major.yml +++ b/.github/workflows/check-provider-major.yml @@ -49,4 +49,4 @@ jobs: with: commit_message: 'ci(providers): check provider versions' create_branch: true - branch: feature/breaking-change + branch: feature/providers-major diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df9c6d2..40e4d30 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,6 +106,7 @@ jobs: git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' git add . + git pull origin feature/providers-major - name: Commit Versioning & Push changes uses: stefanzweifel/git-auto-commit-action@v4 From 72e0a910503e9643db7dfbc6e09c41c96934e1f7 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:25:42 +0100 Subject: [PATCH 21/75] fix(bot): :bug: body undefined --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 40e4d30..2312061 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -105,7 +105,8 @@ jobs: run: | git config --local user.email 'action@github.com' git config --local user.name 'GitHub Action' - git add . + git add packages/provider + git add starters/apps git pull origin feature/providers-major - name: Commit Versioning & Push changes From f54dea52b01063acd6122eeba1fbbe324aa7805d Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:28:45 +0100 Subject: [PATCH 22/75] fix(bot): :bug: body undefined --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2312061..d176383 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -103,8 +103,8 @@ jobs: - name: Add and commit changes to gh-pages branch run: | - git config --local user.email 'action@github.com' - git config --local user.name 'GitHub Action' + git config --globa user.email 'action@github.com' + git config --globa user.name 'GitHub Action' git add packages/provider git add starters/apps git pull origin feature/providers-major From a118bbbf7f0a7023cb7f33c23f37db72adad151f Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:30:36 +0100 Subject: [PATCH 23/75] fix(bot): :bug: body undefined --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d176383..1c5761a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -103,8 +103,8 @@ jobs: - name: Add and commit changes to gh-pages branch run: | - git config --globa user.email 'action@github.com' - git config --globa user.name 'GitHub Action' + git config --global user.email 'action@github.com' + git config --global user.name 'GitHub Action' git add packages/provider git add starters/apps git pull origin feature/providers-major From 9234cf1c5d00abdd35e62a826b3c450ab056987a Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 11:44:23 +0100 Subject: [PATCH 24/75] fix(bot): :bug: body undefined --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1c5761a..a84ee99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,10 +107,10 @@ jobs: git config --global user.name 'GitHub Action' git add packages/provider git add starters/apps - git pull origin feature/providers-major - name: Commit Versioning & Push changes uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: '${{ steps.vars.outputs.commit }}' branch: feature/providers-major + push_options: '--force' From bb6ed4a084ae98070dfdf0c4ba1eca574c4092cc Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 12:20:51 +0100 Subject: [PATCH 25/75] fix(bot): :bug: body undefined --- .github/workflows/ci.yml | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a84ee99..12ab717 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,6 +69,7 @@ jobs: with: fetch-depth: 0 ref: ${{github.event.after}} + persist-credentials: false - name: Setup Node uses: actions/setup-node@v3 @@ -101,16 +102,8 @@ jobs: id: vars run: echo "commit=$(git log --format=%B -n 1 ${{github.event.after}})" >> $GITHUB_OUTPUT - - name: Add and commit changes to gh-pages branch - run: | - git config --global user.email 'action@github.com' - git config --global user.name 'GitHub Action' - git add packages/provider - git add starters/apps - - - name: Commit Versioning & Push changes - uses: stefanzweifel/git-auto-commit-action@v4 + - name: Commit & Push changes + uses: actions-js/push@master with: - commit_message: '${{ steps.vars.outputs.commit }}' branch: feature/providers-major - push_options: '--force' + github_token: ${{ secrets.GITHUB_TOKEN }} From 18ef4e9d726575ca390ca24354825860328d3347 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 12:30:53 +0100 Subject: [PATCH 26/75] fix(cli): :zap: refactor --- packages/provider/src/web-whatsapp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/provider/src/web-whatsapp/package.json b/packages/provider/src/web-whatsapp/package.json index d15dbe0..80f6152 100644 --- a/packages/provider/src/web-whatsapp/package.json +++ b/packages/provider/src/web-whatsapp/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "whatsapp-web.js": "1.19.2" + "whatsapp-web.js": "1.18.2" } } From a29b9d4e1f85fc163cf1d633c0857f0c8b7f03e1 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 12:38:47 +0100 Subject: [PATCH 27/75] fix(cli): :zap: refactor --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 12ab717..87e42a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,3 +107,4 @@ jobs: with: branch: feature/providers-major github_token: ${{ secrets.GITHUB_TOKEN }} + force: true From 464dd44ce21010b5a1165a4e91ce6d4b91e5cb67 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Jan 2023 11:39:58 +0000 Subject: [PATCH 28/75] chore: autopublish 2023-01-16T11:39:58Z --- packages/provider/src/web-whatsapp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/provider/src/web-whatsapp/package.json b/packages/provider/src/web-whatsapp/package.json index 80f6152..d15dbe0 100644 --- a/packages/provider/src/web-whatsapp/package.json +++ b/packages/provider/src/web-whatsapp/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "whatsapp-web.js": "1.18.2" + "whatsapp-web.js": "1.19.2" } } From 98793d0cfc1674830beaa3707f933c5a791eec14 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 16 Jan 2023 17:32:09 +0100 Subject: [PATCH 29/75] fix(bot): :memo: more docs --- .../src/components/widgets/Collaborator.tsx | 6 +- packages/docs/src/components/widgets/Hero.tsx | 2 +- .../docs/src/components/widgets/Members.tsx | 54 +++++++++ packages/docs/src/root.tsx | 12 +- .../src/routes/docs/deploy/cloud/index.mdx | 108 ++++++++++++++++++ .../src/routes/docs/deploy/docker/index.mdx | 32 ++++++ .../src/routes/docs/deploy/local/index.mdx | 26 +++++ .../docs/src/routes/docs/masterclass/index.md | 24 ---- .../src/routes/docs/masterclass/index.mdx | 26 +++++ packages/docs/src/routes/index.tsx | 21 +++- packages/docs/src/services/github.ts | 7 +- packages/docs/src/services/opencollective.ts | 19 +++ 12 files changed, 301 insertions(+), 36 deletions(-) create mode 100644 packages/docs/src/components/widgets/Members.tsx create mode 100644 packages/docs/src/routes/docs/deploy/cloud/index.mdx create mode 100644 packages/docs/src/routes/docs/deploy/docker/index.mdx create mode 100644 packages/docs/src/routes/docs/deploy/local/index.mdx delete mode 100644 packages/docs/src/routes/docs/masterclass/index.md create mode 100644 packages/docs/src/routes/docs/masterclass/index.mdx create mode 100644 packages/docs/src/services/opencollective.ts diff --git a/packages/docs/src/components/widgets/Collaborator.tsx b/packages/docs/src/components/widgets/Collaborator.tsx index 4337d2b..bc72b08 100644 --- a/packages/docs/src/components/widgets/Collaborator.tsx +++ b/packages/docs/src/components/widgets/Collaborator.tsx @@ -14,7 +14,7 @@ export default component$( {props.user.login}
-
{props.user.login}
+
+ {props.user.login} +
diff --git a/packages/docs/src/components/widgets/Hero.tsx b/packages/docs/src/components/widgets/Hero.tsx index 0e7cc5e..b3761f8 100644 --- a/packages/docs/src/components/widgets/Hero.tsx +++ b/packages/docs/src/components/widgets/Hero.tsx @@ -56,7 +56,7 @@ export default component$(() => {
Ver video diff --git a/packages/docs/src/components/widgets/Members.tsx b/packages/docs/src/components/widgets/Members.tsx new file mode 100644 index 0000000..36ec435 --- /dev/null +++ b/packages/docs/src/components/widgets/Members.tsx @@ -0,0 +1,54 @@ +import { component$ } from '@builder.io/qwik' +import { RequestHandlerCloudflarePages } from '@builder.io/qwik-city/middleware/cloudflare-pages' +import { User } from '~/contexts' +import Collaborator from './Collaborator' + +export const onRequest: RequestHandlerCloudflarePages = async () => { + console.log('??heree') +} + +export const TaleUsers = component$((props: { users: User[] }) => { + return ( + <> + {props.users.map((user) => ( +
+ {' '} + +
+ ))} + + ) +}) + +export default component$((props: { users: User[] }) => { + return ( +
+ +
+ ) +}) diff --git a/packages/docs/src/root.tsx b/packages/docs/src/root.tsx index 7d6db36..2cddda0 100644 --- a/packages/docs/src/root.tsx +++ b/packages/docs/src/root.tsx @@ -52,16 +52,22 @@ export default component$(() => { title: 'Avanzado', list: [ { name: 'Migración', link: '/docs/migration' }, - { name: 'Extender funcionalidades', link: '/docs/custom' }, + { name: 'MasterClass', link: '/docs/masterclass' }, + ], + }, + { + title: 'Despliegue', + list: [ + { name: 'Local', link: '/docs/deploy/local' }, + { name: 'Docker', link: '/docs/deploy/docker' }, + { name: 'Cloud', link: '/docs/deploy/cloud' }, ], }, { title: 'Comunidad', list: [ - { name: 'MasterClass', link: '/docs/masterclass' }, { name: 'Colabores', link: '/docs/contributing' }, { name: 'Unirme al proyecto', link: '/docs/join' }, - { name: 'Sponsors', link: '/docs/sponsors' }, ], }, ]) diff --git a/packages/docs/src/routes/docs/deploy/cloud/index.mdx b/packages/docs/src/routes/docs/deploy/cloud/index.mdx new file mode 100644 index 0000000..2e38ff3 --- /dev/null +++ b/packages/docs/src/routes/docs/deploy/cloud/index.mdx @@ -0,0 +1,108 @@ +import Alert from '../../../../components/widgets/Alert' +import Navigation from '../../../../components/widgets/Navigation' + +# Entorno Cloud + +Si deseas tener tu chatbot en ejecución en un servidor en la nueba esta, guía te ayudará. +El servidor deberá cumplir con los requisitos mínimos, puedes ver en [este enlace.](/docs/requirements) + +--- + +Dependiendo de tu proveedor de **servicio Cloud** debes crear una instancia (máquina virtual), este ejemplo iremos orientando en un entorno de AWS. +En nuestro ejemplo creamos una maquina virtual con **Ubuntu 20.04** + +![](https://i.imgur.com/5zRCz9q.png) + +--- + +Posterior al proceso de crear la máquina esperamos unos minutos hasta que ya está operativo y tomamos nota del usuario y la IP pública para proceder a conectarnos vía SSH + +## ![](https://i.imgur.com/ljyJPBm.png) + +## Conectarse via SSH + +Luego de obtener los datos necesarios para conectarnos a nuestra máquina, procedemos a hacerlo + +```shell +ssh -i llaveBot.pem ubutnu@34.228.208.104 +``` + +--- + +Luego puede aparecer un mensaje como el siguiente donde solo debes de responder **yes** + +![](https://i.imgur.com/rUBASqR.png) + +--- + +Una vez conectado ya estás dentro de la máquina virtual, te aconsejamos la primera vez hacer una actualización de dependencias de Ubuntu con los siguientes comandos + +```shell +sudo apt-get update +``` + +```shell +sudo apt-get upgrade +``` + +--- + +## Recuerda instalar Node 16 o superior + +Puedes ver más a detalle los pasos de la instalacion en este [blog](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-es) + +```shell +curl -sL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh +``` + +```shell +sudo bash nodesource_setup.sh +``` + +```shell +sudo apt-get install -y nodejs +``` + +--- + +## Implementar el bot + +Si tienes el código de tu chatbot en un repositorio, solo falta que clones el repo en el servidor y ejecutes `npm start` + +Para escanear el **QR** puedes hacerlo vía WEB accediendo a la URL `http://[TU_IP_PUBLICA]:3000` en este ejemplo seria `http://34.228.208.10:3000` + +![](https://i.imgur.com/xcovczm.png) + +--- + +## Firewall + +Si no te abre la pagina web asegurate de tener el puerto abierto en tu firewall. +Ejemplo permitir el puerto **3000** + +![](https://i.imgur.com/0dAz0B1.png) + +--- + +## Escanear QR + +![](https://i.imgur.com/2m3NbXC.png) + +--- + +## Ejecutar en Producción + +Debes ubicarte en el directorio donde tienes el codigo fuente de tu chatbot. + +Independientemente de tu sistema operativo deberás ejecutar el chatbot con el comando atrevés de un sistema que mantenga el proceso en ejecución. +Recomendamos [Pm2](https://pm2.keymetrics.io/) + +```shell +pm2 start app.js --name=bot1 +``` + +![](https://i.imgur.com/ilPS75H.png) + +La consola de devolver un mensaje con una lista de procesos, en el ejemplo puedes observar, que tenemos un proceso llamado `bot1` + +De esta manera ya puedes cerrar la terminal y tu bot seguirá en ejecución sin problema diff --git a/packages/docs/src/routes/docs/deploy/docker/index.mdx b/packages/docs/src/routes/docs/deploy/docker/index.mdx new file mode 100644 index 0000000..9db9e2e --- /dev/null +++ b/packages/docs/src/routes/docs/deploy/docker/index.mdx @@ -0,0 +1,32 @@ +import Alert from '../../../../components/widgets/Alert' +import Navigation from '../../../../components/widgets/Navigation' + +# Entorno Docker + +Previamente, necesitas tener instalado Docker en tu servidor dependiendo del sistema operativo, los procesos cambian, +puedes encontrar toda la información oficial de docker en [este enlace.](https://docs.docker.com/get-docker/) + +--- + +Dependiendo del proveedor que has elegido necesitaras una implementación de Docker específica, pero no te preocupes, ya que viene implementada automáticamente en un archivo llamado **Dockerfile**, también puedes ver los otros Dockerfile en el apartado de [plantillas.](https://github.com/codigoencasa/bot-whatsapp/tree/main/starters/apps) + +![](https://i.imgur.com/cDspa0R.png) + +--- + +## Contruir imagen + +Solo es necesario construir la imagen del docker lo puedes hacer con el siguiente comando + +```shell +docker build . -t botwhatsapp:latest +``` + +## Iniciar contenedor + +Para iniciar el contenedor con la imagen previamente construida puedes realizarlo ejecutando el siguiente comando. +Se utiliza el puerto **3001** solo com un ejemplo puedes usar el puerto que tu quieras + +```shell +docker run -e PORT=3001 -p 3001:3001 botwhatsapp:latest +``` diff --git a/packages/docs/src/routes/docs/deploy/local/index.mdx b/packages/docs/src/routes/docs/deploy/local/index.mdx new file mode 100644 index 0000000..394af82 --- /dev/null +++ b/packages/docs/src/routes/docs/deploy/local/index.mdx @@ -0,0 +1,26 @@ +import Alert from '../../../../components/widgets/Alert' +import Navigation from '../../../../components/widgets/Navigation' + +# Entorno Local + +Si deseas tener tu chatbot en ejecución en un servidor local (computadora personal, etc.) esta, guía te ayudará. +El servidor local deberá cumplir con los requisitos mínimos, puedes ver en [este enlace.](/docs/requirements) + +--- + +Si deseas instalar pm2 puedes ejecutar `npm install pm2 --global` + +Debes ubicarte en el directorio donde tienes el codigo fuente de tu chatbot. + +Independientemente de tu sistema operativo deberás ejecutar el chatbot con el comando atrevés de un sistema que mantenga el proceso en ejecución. +Recomendamos [Pm2](https://pm2.keymetrics.io/) + +```shell +pm2 start app.js --name=bot1 +``` + +![](https://i.imgur.com/ilPS75H.png) + +La consola de devolver un mensaje con una lista de procesos, en el ejemplo puedes observar, que tenemos un proceso llamado `bot1` + +De esta manera ya puedes cerrar la terminal y tu bot seguirá en ejecución sin problema diff --git a/packages/docs/src/routes/docs/masterclass/index.md b/packages/docs/src/routes/docs/masterclass/index.md deleted file mode 100644 index 9f94b4e..0000000 --- a/packages/docs/src/routes/docs/masterclass/index.md +++ /dev/null @@ -1,24 +0,0 @@ -[![hackmd-github-sync-badge](https://hackmd.io/79xQyVSgRD6RsTpqtMPPdw/badge)](https://hackmd.io/79xQyVSgRD6RsTpqtMPPdw) -### Preguntas Frecuentes para Master Class BOT v2 -> Anota aqui las preguntas o dudas que tengas -> Pronto estare publicando fecha y hora para la masterclass - -1.- Si necesito correr dos bots al mismo tiempo ¿donde puedo cambiar el puerto? - -2.- Si necesito agregar o modificar funciones del bot, ¿como puedo hacerlo? - -3.- Si quiero mi bot con otra base de datos diferente a MySQL ¿como lo puedo hacer? - -4.- Quiero conectarme a tal o cual API con JSON/XML/etc, ¿se puede hacer? - -5.- ¿Como integrar listas? - -6.- Preguntas y respuestas con el Bot - -7.- Guardar conversaciones en Excel. - -8.- ¿Puedo usar 2 o mas sesiones (códigos QR) al mismo tiempo? - -9.- ¿Puede ser que al usar el provider bailey, al leer el qr.png, que sea desde una url en el navegador, y no desde visual studio? Gracias - -10.- ¿Cómo tomo los datos que me envían en un mensaje para utilizarlo internamente en la búsqueda de datos propios y devolver la respuesta? diff --git a/packages/docs/src/routes/docs/masterclass/index.mdx b/packages/docs/src/routes/docs/masterclass/index.mdx new file mode 100644 index 0000000..97612b4 --- /dev/null +++ b/packages/docs/src/routes/docs/masterclass/index.mdx @@ -0,0 +1,26 @@ +# MasterClass + + + +--- + +### Preguntas de la masterclass + +- Si necesito correr dos bots al mismo tiempo ¿donde puedo cambiar el puerto? +- Si necesito agregar o modificar funciones del bot, ¿como puedo hacerlo? +- Si quiero mi bot con otra base de datos diferente a MySQL ¿como lo puedo hacer? +- Quiero conectarme a tal o cual API con JSON/XML/etc, ¿se puede hacer? +- ¿Como integrar listas? +- Preguntas y respuestas con el Bot +- Guardar conversaciones en Excel. +- ¿Puedo usar 2 o mas sesiones (códigos QR) al mismo tiempo? +- ¿Puede ser que al usar el provider bailey, al leer el qr.png, que sea desde una url en el navegador, y no desde visual studio? Gracias +- ¿Cómo tomo los datos que me envían en un mensaje para utilizarlo internamente en la búsqueda de datos propios y devolver la respuesta? diff --git a/packages/docs/src/routes/index.tsx b/packages/docs/src/routes/index.tsx index aa594f8..8ad3b75 100644 --- a/packages/docs/src/routes/index.tsx +++ b/packages/docs/src/routes/index.tsx @@ -5,7 +5,9 @@ import Features from '~/components/widgets/Features' import FAQs from '~/components/widgets/FAQs' import CallToAction from '~/components/widgets/CallToAction' import Collaborators from '~/components/widgets/Collaborators' +import Members from '~/components/widgets/Members' import { fetchGithub } from '~/services/github' +import { fetchOpenCollective } from '~/services/opencollective' import { RequestHandlerNetlify } from '@builder.io/qwik-city/middleware/netlify-edge' import { GITHUB_TOKEN } from './docs/constant' @@ -13,8 +15,12 @@ export const onGet: RequestHandlerNetlify = async ({ platform }) => { const CHECK_GITHUB_TOKEN = (platform as any)?.['GITHUB_TOKEN'] ?? GITHUB_TOKEN console.log(`[🚩 platform]: `, GITHUB_TOKEN) - const data = await fetchGithub(CHECK_GITHUB_TOKEN) - return data + const dataGithub = await fetchGithub(CHECK_GITHUB_TOKEN) + const dataOpenCollective = await fetchOpenCollective() + return { + dataGithub, + dataOpenCollective, + } } export default component$(() => { @@ -27,9 +33,16 @@ export default component$(() => { } + onResolved={(data: any) => { + return ( + <> + + + + + ) + }} > - ) }) diff --git a/packages/docs/src/services/github.ts b/packages/docs/src/services/github.ts index 05d2b8f..e60d250 100644 --- a/packages/docs/src/services/github.ts +++ b/packages/docs/src/services/github.ts @@ -14,6 +14,9 @@ export const fetchGithub = async (token: string) => { }, } ) - const listUsers = data.json() - return listUsers + const listUsers = await data.json() + return listUsers.map((u: any) => ({ + ...u, + avatar_url: `${u.avatar_url}&s=80`, + })) } diff --git a/packages/docs/src/services/opencollective.ts b/packages/docs/src/services/opencollective.ts new file mode 100644 index 0000000..2eb60c8 --- /dev/null +++ b/packages/docs/src/services/opencollective.ts @@ -0,0 +1,19 @@ +/** + * GET API from OpenCollective + * @returns + */ +export const fetchOpenCollective = async () => { + const data = await fetch( + `https://opencollective.com/bot-whatsapp/members/users.json?limit=10&offset=0`, + { + method: 'GET', + } + ) + const listUsers = await data.json() + return listUsers.map((u: any) => ({ + html_url: u.profile, + avatar_url: u.image ?? 'https://i.imgur.com/HhiYKwN.png', + login: u.name, + id: u.MemberId, + })) +} From 126158000449fab7612d42c605000b6f7d236696 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 09:05:29 +0100 Subject: [PATCH 30/75] chore: :rocket: launch DEV --- .github/workflows/releases-dev.yml | 1 - packages/cli/interactive/index.js | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 4e5c169..e793e01 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -54,4 +54,3 @@ jobs: uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: 'ci(version): :zap: automatic - "${date}" updated versions every packages' - branch: dev diff --git a/packages/cli/interactive/index.js b/packages/cli/interactive/index.js index b3f063d..53cc885 100644 --- a/packages/cli/interactive/index.js +++ b/packages/cli/interactive/index.js @@ -48,11 +48,11 @@ const nextSteps = async () => { name: 'providerWs', message: '¿Cuál proveedor de whatsapp quieres utilizar?', choices: [ - { title: 'whatsapp-web.js (gratis)', value: 'wweb' }, - { title: 'Venom (gratis)', value: 'venom' }, { title: 'Baileys (gratis)', value: 'baileys' }, + { title: 'Venom (gratis)', value: 'venom' }, + { title: 'whatsapp-web.js (gratis)', value: 'wweb' }, { title: 'Twilio', value: 'twilio' }, - { title: 'API Oficial (Meta)', value: 'meta' }, + { title: 'Meta', value: 'meta' }, ], max: 1, hint: 'Espacio para seleccionar', From 7e25dcaa93b036e2230b88ce58ee7c76872cc8dd Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 09:11:08 +0100 Subject: [PATCH 31/75] chore: :rocket: launch DEV --- .github/workflows/releases-dev.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index e793e01..2c11144 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -13,6 +13,10 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + with: + fetch-depth: 0 + ref: ${{github.event.after}} + persist-credentials: false - name: Setup Node uses: actions/setup-node@v3 @@ -50,7 +54,13 @@ 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 + - name: Set output + id: vars + run: echo "commit=$(git log --format=%B -n 1 ${{github.event.after}})" >> $GITHUB_OUTPUT + + - name: Commit & Push changes + uses: actions-js/push@master with: - commit_message: 'ci(version): :zap: automatic - "${date}" updated versions every packages' + branch: release/next + github_token: ${{ secrets.GITHUB_TOKEN }} + force: true From cb047cca8e9f356bdd8dbe5f226d99c3d9ac4fc4 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 09:17:32 +0100 Subject: [PATCH 32/75] chore: :rocket: launch DEV --- .github/workflows/releases-dev.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 2c11144..8a01895 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -10,6 +10,8 @@ jobs: release: name: Release runs-on: ubuntu-latest + outputs: + commit: ${{ steps.vars.outputs.commit }} steps: - name: Checkout uses: actions/checkout@v3 From 5edd755491ae0cc3611181a7b0bc653725507cca Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 09:23:22 +0100 Subject: [PATCH 33/75] chore: :rocket: launch DEV --- .github/workflows/releases-dev.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/releases-dev.yml b/.github/workflows/releases-dev.yml index 8a01895..be2e1d6 100644 --- a/.github/workflows/releases-dev.yml +++ b/.github/workflows/releases-dev.yml @@ -56,10 +56,6 @@ jobs: - name: Release @bot-whatsapp/portal run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}" - - name: Set output - id: vars - run: echo "commit=$(git log --format=%B -n 1 ${{github.event.after}})" >> $GITHUB_OUTPUT - - name: Commit & Push changes uses: actions-js/push@master with: From 4ade5f02a7eca55532fa735425670ea6d9fdd037 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 10:00:21 +0100 Subject: [PATCH 34/75] chore: :rocket: launch DEV --- .github/workflows/releases.yml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index d587c64..acbc5c4 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -67,13 +67,8 @@ 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' - 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 + - name: Commit & Push changes + uses: actions-js/push@master with: - commit_message: 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"' + github_token: ${{ secrets.GITHUB_TOKEN }} + force: true From fcd1a636765920445e8d871764647e772d75322e Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 17 Jan 2023 10:02:14 +0100 Subject: [PATCH 35/75] chore: :rocket: launch DEV --- .github/workflows/releases.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml index acbc5c4..a9b490f 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/releases.yml @@ -70,5 +70,6 @@ jobs: - name: Commit & Push changes uses: actions-js/push@master with: + branch: release/production github_token: ${{ secrets.GITHUB_TOKEN }} force: true From 9f9d8339252d60ebd8852f516240b1d10a6c4266 Mon Sep 17 00:00:00 2001 From: Developer RL Business <66280283+devrlbusiness@users.noreply.github.com> Date: Tue, 17 Jan 2023 09:33:59 -0700 Subject: [PATCH 36/75] Update index.mdx --- packages/docs/src/routes/docs/flows/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 7a2171c..2e078d7 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -55,7 +55,7 @@ Esta funcion se utliza para responder un mensaje despues del `addKeyword()` - delay: 0 (milisegundos) - media: url de imagen - buttons: array `[{body:'Boton1'}, {body:'Boton2'}, {body:'Boton3'}]` -- capture: false (para esperar respuesta) +- capture: true (para esperar respuesta) - child: Objecto tipo flujo o arra de flujos hijos ```js From f6130cf0b91c552cf41254f1807640dcfa26dd32 Mon Sep 17 00:00:00 2001 From: Developer RL Business <66280283+devrlbusiness@users.noreply.github.com> Date: Tue, 17 Jan 2023 09:35:21 -0700 Subject: [PATCH 37/75] Update index.mdx --- packages/docs/src/routes/docs/flows/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 7a2171c..2e078d7 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -55,7 +55,7 @@ Esta funcion se utliza para responder un mensaje despues del `addKeyword()` - delay: 0 (milisegundos) - media: url de imagen - buttons: array `[{body:'Boton1'}, {body:'Boton2'}, {body:'Boton3'}]` -- capture: false (para esperar respuesta) +- capture: true (para esperar respuesta) - child: Objecto tipo flujo o arra de flujos hijos ```js From f5a7de3a003c012e2164e51fff26892cfc3144be Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 20 Jan 2023 11:58:50 +0100 Subject: [PATCH 38/75] fix(bot): :bug: flowDynamic stranger behaviour --- .gitignore | 1 + packages/bot/core/core.class.js | 25 ++++++------------------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 1cc3038..9f6dbbc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /node_modules +/packages/repl /packages/*/starters /packages/*/node_modules /packages/*/dist diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index e3efc04..e1e16e4 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -89,14 +89,18 @@ class CoreClass { // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx const sendFlow = async (messageToSend, numberOrId) => { + // [1 Paso] esto esta bien! + if (prevMsg?.options?.capture) await cbEveryCtx(prevMsg?.ref) + 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), - resolveCbEveryCtx(ctxMessage), + this.sendProviderAndSave(numberOrId, ctxMessage).then( + () => resolveCbEveryCtx(ctxMessage) + ), ]) ) } @@ -139,7 +143,6 @@ class CoreClass { // 📄 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) } @@ -153,17 +156,6 @@ class CoreClass { }) } - if (prevMsg?.ref) resolveCbEveryCtx(prevMsg) - - // 📄 [options: callback]: Si se tiene un callback se ejecuta - //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) { const nestedRef = prevMsg.options.nested @@ -173,11 +165,6 @@ class CoreClass { msgToSend = this.flowClass.find(body, false, flowStandalone) || [] - // //TODO AQUI - // for (const ite of msgToSend) { - // cbEveryCtx(ite?.ref) - // } - sendFlow(msgToSend, from) return } From 877252bd4a8a7bbbbf083c3ceaeaeb952b0a1828 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Fri, 20 Jan 2023 12:02:01 +0100 Subject: [PATCH 39/75] fix(bot): :bug: flowDynamic stranger behaviour --- packages/bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index d3f004e..fe542c1 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.66-alpha.0", + "version": "0.0.73-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { From 7067b4a80b7938ccfaf1ed141a37d645a1a3a062 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 09:09:16 +0100 Subject: [PATCH 40/75] fix(contexts): :bug: fixed #524 issue --- packages/bot/core/core.class.js | 19 +++++++++++++++++++ .../src/dialogflow-cx/dialogflow-cx.class.js | 2 +- .../src/dialogflow/dialogflow.class.js | 4 ++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index e1e16e4..ea5eff3 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -212,5 +212,24 @@ class CoreClass { this.continue(null, responde.ref) } } + + /** + * Funcion dedicada a enviar el mensaje sin pasar por el flow + * (dialogflow) + * @param {*} messageToSend + * @param {*} numberOrId + * @returns + */ + sendFlowSimple = async (messageToSend, numberOrId) => { + const queue = [] + for (const ctxMessage of messageToSend) { + const delayMs = ctxMessage?.options?.delay || 0 + if (delayMs) await delay(delayMs) + QueuePrincipal.enqueue(() => + this.sendProviderAndSave(numberOrId, ctxMessage) + ) + } + return Promise.all(queue) + } } module.exports = CoreClass diff --git a/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js b/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js index 25bd2a6..2d0ebd2 100644 --- a/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js +++ b/packages/contexts/src/dialogflow-cx/dialogflow-cx.class.js @@ -117,7 +117,7 @@ class DialogFlowCXContext extends CoreClass { } }) - this.sendFlow(listMessages, from) + this.sendFlowSimple(listMessages, from) } } diff --git a/packages/contexts/src/dialogflow/dialogflow.class.js b/packages/contexts/src/dialogflow/dialogflow.class.js index ebd92bc..6a7cda0 100644 --- a/packages/contexts/src/dialogflow/dialogflow.class.js +++ b/packages/contexts/src/dialogflow/dialogflow.class.js @@ -107,7 +107,7 @@ class DialogFlowContext extends CoreClass { ...customPayload, answer: fields?.answer?.stringValue, } - this.sendFlow([ctxFromDX], from) + this.sendFlowSimple([ctxFromDX], from) return } @@ -115,7 +115,7 @@ class DialogFlowContext extends CoreClass { answer: queryResult?.fulfillmentText, } - this.sendFlow([ctxFromDX], from) + this.sendFlowSimple([ctxFromDX], from) } } From 79cc31a96f6a9836447cc4e6bb1e1521c54183fe Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 09:14:36 +0100 Subject: [PATCH 41/75] fix(contexts): :bug: fixed #524 issue --- packages/bot/tests/flow.class.test.js | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 packages/bot/tests/flow.class.test.js diff --git a/packages/bot/tests/flow.class.test.js b/packages/bot/tests/flow.class.test.js new file mode 100644 index 0000000..b9c55e2 --- /dev/null +++ b/packages/bot/tests/flow.class.test.js @@ -0,0 +1,29 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const FlowClass = require('../io/flow.class') +const MockProvider = require('../../../__mocks__/mock.provider') +const { addKeyword } = require('../index') + +test(`[FlowClass] Probando instanciamiento de clase`, async () => { + const MOCK_FLOW = addKeyword('hola').addAnswer('Buenas!') + const flowClass = new FlowClass([MOCK_FLOW]) + assert.is(flowClass instanceof FlowClass, true) +}) + +test(`[FlowClass] Probando find`, async () => { + const MOCK_FLOW = addKeyword('hola').addAnswer('Buenas!') + const flowClass = new FlowClass([MOCK_FLOW]) + + flowClass.find('hola') + assert.is(flowClass instanceof FlowClass, true) +}) + +test(`[FlowClass] Probando findBySerialize`, async () => { + const MOCK_FLOW = addKeyword('hola').addAnswer('Buenas!') + const flowClass = new FlowClass([MOCK_FLOW]) + + flowClass.findBySerialize('') + assert.is(flowClass instanceof FlowClass, true) +}) + +test.run() From 3c4b1c0fc4b6d98d67c67806d918d3604bb2209b Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 11:52:49 +0100 Subject: [PATCH 42/75] feat(bot): :zap: flowDynamic buttons, media --- packages/bot/core/core.class.js | 13 ++++++++++--- packages/bot/io/methods/toCtx.js | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index ea5eff3..3f20b7b 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -117,6 +117,7 @@ class CoreClass { // 📄 [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: 5, fallback: false } @@ -126,15 +127,21 @@ class CoreClass { fallBackFlag = optListMsg.fallback const parseListMsg = listMsg - .map(({ body }, index) => - toCtx({ + .map((opt, index) => { + const body = typeof opt === 'string' ? opt : opt.body + const media = opt?.media ?? null + const buttons = opt?.buttons ?? [] + + return toCtx({ body, from, keyword: null, index, + options: { media, buttons }, }) - ) + }) .slice(0, optListMsg.limit) + for (const msg of parseListMsg) { await this.sendProviderAndSave(from, msg) } diff --git a/packages/bot/io/methods/toCtx.js b/packages/bot/io/methods/toCtx.js index d29295e..980cbfb 100644 --- a/packages/bot/io/methods/toCtx.js +++ b/packages/bot/io/methods/toCtx.js @@ -5,12 +5,12 @@ const { generateRef, generateRefSerialize } = require('../../utils/hash') * @param options {media:string, buttons:[], capture:true default false} * @returns */ -const toCtx = ({ body, from, prevRef, index }) => { +const toCtx = ({ body, from, prevRef, options = {}, index }) => { return { ref: generateRef(), keyword: prevRef, answer: body, - options: {}, + options: options ?? {}, from, refSerialize: generateRefSerialize({ index, answer: body }), } From 7078dc4c93d01bf90ef08ecb34e89a1abbe16fd2 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 12:02:31 +0100 Subject: [PATCH 43/75] feat(bot): :zap: add blacklist --- packages/bot/core/core.class.js | 5 ++++- packages/bot/index.js | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 3f20b7b..30e6f4d 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -21,10 +21,12 @@ class CoreClass { flowClass databaseClass providerClass - constructor(_flow, _database, _provider) { + generalArgs = { blackList: [] } + constructor(_flow, _database, _provider, _args) { this.flowClass = _flow this.databaseClass = _database this.providerClass = _provider + this.generalArgs = { ...this.generalArgs, ..._args } for (const { event, func } of this.listenerBusEvents()) { this.providerClass.on(event, func) @@ -70,6 +72,7 @@ class CoreClass { const { body, from } = messageCtxInComming let msgToSend = [] let fallBackFlag = false + if (this.generalArgs.blackList.includes(from)) return if (!body) return if (!body.length) return diff --git a/packages/bot/index.js b/packages/bot/index.js index eb9df24..ac96063 100644 --- a/packages/bot/index.js +++ b/packages/bot/index.js @@ -8,8 +8,8 @@ const { addKeyword, addAnswer, addChild, toSerialize } = require('./io/methods') * @param {*} args * @returns */ -const createBot = async ({ flow, database, provider }) => - new CoreClass(flow, database, provider) +const createBot = async ({ flow, database, provider }, args = {}) => + new CoreClass(flow, database, provider, args) /** * Crear instancia de clase Io (Flow) From 767e0764d61a038d66ae510a97fbe1d5f10736af Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 13:09:41 +0100 Subject: [PATCH 44/75] test: :art: more test e2e --- __test__/01-case.test.js | 41 +++++++++++++++++ __test__/02-case.test.js | 99 ++++++++++++++++++++++++++++++++++++++++ package.json | 3 +- 3 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 __test__/01-case.test.js create mode 100644 __test__/02-case.test.js diff --git a/__test__/01-case.test.js b/__test__/01-case.test.js new file mode 100644 index 0000000..bce4a42 --- /dev/null +++ b/__test__/01-case.test.js @@ -0,0 +1,41 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot') + +test(`[Caso - 01] Flow Basico`, async () => { + const [VALUE_A, VALUE_B] = ['hola', 'buenas'] + + const flow = addKeyword(VALUE_A).addAnswer(VALUE_B) + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + createBot({ + database, + flow: createFlow([flow]), + provider, + }) + + provider.delaySendMessage(100, 'message', { + from: '000', + body: VALUE_A, + }) + + await delay(100) + + const prevMsg = database.getPrevByNumber('000') + + assert.is(prevMsg.answer, VALUE_B) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/__test__/02-case.test.js b/__test__/02-case.test.js new file mode 100644 index 0000000..426e110 --- /dev/null +++ b/__test__/02-case.test.js @@ -0,0 +1,99 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot/lib/bundle.bot.cjs') + +/** + * Falsear peticion async + * @param {*} fakeData + * @returns + */ +const fakeHTTP = async (fakeData = []) => { + console.log('⚡ Server request!') + await delay(50) + console.log('⚡ Server return!') + const data = fakeData.map((u, i) => ({ body: `${i + 1} ${u}` })) + console.log(data) + return Promise.resolve(data) +} + +test(`[Caso - 02] Flow Más Complejo`, async () => { + const MOCK_VALUES = [ + 'Bienvenido te envio muchas marcas (5510)', + 'Seleccione marca del auto a cotizar, con el *número* correspondiente', + 'Seleccione la sub marca del auto a cotizar, con el *número* correspondiente:', + 'Los precios rondan:', + ] + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer(MOCK_VALUES[0], null, async (ctx, { flowDynamic }) => { + console.log('execute...') + const data = await fakeHTTP(['Ford', 'GM', 'BMW']) + return flowDynamic(data) + }) + .addAnswer(MOCK_VALUES[1], null, async (ctx, { flowDynamic }) => { + const data = await fakeHTTP(['Ranger', 'Explorer']) + return flowDynamic(data) + }) + .addAnswer(MOCK_VALUES[2], null, async (ctx, { flowDynamic }) => { + const data = await fakeHTTP(['Usado', 'Nuevos']) + return flowDynamic(data) + }) + .addAnswer(MOCK_VALUES[3], null, async (ctx, { flowDynamic }) => { + const data = await fakeHTTP(['1000', '2000', '3000']) + return flowDynamic(data) + }) + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + await delay(1200) + const getHistory = database.listHistory.map((i) => i.answer) + assert.is(MOCK_VALUES[0], getHistory[0]) + + //FlowDynamic + assert.is('1 Ford', getHistory[1]) + assert.is('2 GM', getHistory[2]) + assert.is('3 BMW', getHistory[3]) + + assert.is(MOCK_VALUES[1], getHistory[4]) + + //FlowDynamic + assert.is('1 Ranger', getHistory[5]) + assert.is('2 Explorer', getHistory[6]) + + assert.is(MOCK_VALUES[2], getHistory[7]) + + //FlowDynamic + assert.is('1 Usado', getHistory[8]) + assert.is('2 Nuevos', getHistory[9]) + + assert.is(MOCK_VALUES[3], getHistory[10]) + + //FlowDynamic + assert.is('1 1000', getHistory[11]) + assert.is('2 2000', getHistory[12]) + assert.is('3 3000', getHistory[13]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/package.json b/package.json index 354bc44..2d1061e 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "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", + "test.e2e": "node ./node_modules/uvu/bin.js __test__", + "test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit && npm run test.e2e", "test": "npm run test.coverage", "cli": "node ./packages/cli/bin/cli.js", "create": "node ./packages/create-bot-whatsapp/bin/create.js", From 0af74602f52ef4b5164e818f5f4ddfc893c54245 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 13:13:41 +0100 Subject: [PATCH 45/75] test: :art: more test e2e --- __test__/02-case.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__test__/02-case.test.js b/__test__/02-case.test.js index 426e110..f400284 100644 --- a/__test__/02-case.test.js +++ b/__test__/02-case.test.js @@ -7,7 +7,7 @@ const { createBot, createFlow, createProvider, -} = require('../packages/bot/lib/bundle.bot.cjs') +} = require('../packages/bot/index') /** * Falsear peticion async From ac39ac831c1b0d2cf186908d33fc5a01f26236a3 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 14:38:43 +0100 Subject: [PATCH 46/75] test: :art: more test e2e --- __test__/02-case.test.js | 2 +- __test__/03-case.test.js | 44 +++++++++++++++++++++++++++ packages/bot/tests/flow.class.test.js | 1 - 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 __test__/03-case.test.js diff --git a/__test__/02-case.test.js b/__test__/02-case.test.js index f400284..a2a93ec 100644 --- a/__test__/02-case.test.js +++ b/__test__/02-case.test.js @@ -23,7 +23,7 @@ const fakeHTTP = async (fakeData = []) => { return Promise.resolve(data) } -test(`[Caso - 02] Flow Más Complejo`, async () => { +test(`[Caso - 02] Flow (flowDynamic)`, async () => { const MOCK_VALUES = [ 'Bienvenido te envio muchas marcas (5510)', 'Seleccione marca del auto a cotizar, con el *número* correspondiente', diff --git a/__test__/03-case.test.js b/__test__/03-case.test.js new file mode 100644 index 0000000..45c399a --- /dev/null +++ b/__test__/03-case.test.js @@ -0,0 +1,44 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot/index') + +test(`[Caso - 03] Flow puro`, async () => { + const MOCK_VALUES = ['Bienvenido a mi tienda', 'Como estas?'] + + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer(MOCK_VALUES[0]) + .addAnswer(MOCK_VALUES[1]) + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + await delay(10) + const getHistory = database.listHistory.map((i) => i.answer) + + assert.is(MOCK_VALUES[0], getHistory[0]) + assert.is(MOCK_VALUES[1], getHistory[1]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/tests/flow.class.test.js b/packages/bot/tests/flow.class.test.js index b9c55e2..e1c93d7 100644 --- a/packages/bot/tests/flow.class.test.js +++ b/packages/bot/tests/flow.class.test.js @@ -1,7 +1,6 @@ const { test } = require('uvu') const assert = require('uvu/assert') const FlowClass = require('../io/flow.class') -const MockProvider = require('../../../__mocks__/mock.provider') const { addKeyword } = require('../index') test(`[FlowClass] Probando instanciamiento de clase`, async () => { From cebfed03823e8fdbd4742aaad0408bf2d5a85b82 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Mon, 23 Jan 2023 20:27:55 +0100 Subject: [PATCH 47/75] test(bot): :zap: more test and endflow --- __test__/04-case.test.js | 82 +++++++++++++++++++++++++++++++++ packages/bot/core/core.class.js | 22 ++++++++- 2 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 __test__/04-case.test.js diff --git a/__test__/04-case.test.js b/__test__/04-case.test.js new file mode 100644 index 0000000..2291a0c --- /dev/null +++ b/__test__/04-case.test.js @@ -0,0 +1,82 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot/index') + +/** + * Falsear peticion async + * @param {*} fakeData + * @returns + */ +const fakeHTTP = async (fakeData = []) => { + console.log('⚡ Server request!') + await delay(50) + console.log('⚡ Server return!') + const data = fakeData.map((u, i) => ({ body: `${i + 1} ${u}` })) + console.log(data) + return Promise.resolve(data) +} + +test(`[Caso - 04] Romper flujo (endFlow)`, async () => { + const MOCK_VALUES = [ + 'Bienvenido te envio muchas marcas (5510)', + 'Seleccione marca del auto a cotizar, con el *número* correspondiente', + 'Seleccione la sub marca del auto a cotizar, con el *número* correspondiente:', + 'Los precios rondan:', + ] + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer(MOCK_VALUES[0], null, async (ctx, { flowDynamic }) => { + console.log('execute...') + const data = await fakeHTTP(['Ford', 'GM', 'BMW']) + return flowDynamic(data) + }) + .addAnswer(MOCK_VALUES[1], null, async (ctx, { endFlow }) => { + return endFlow() + }) + .addAnswer(MOCK_VALUES[2], null, async (ctx, { flowDynamic }) => { + const data = await fakeHTTP(['Usado', 'Nuevos']) + return flowDynamic(data) + }) + .addAnswer(MOCK_VALUES[3], null, async (ctx, { flowDynamic }) => { + const data = await fakeHTTP(['1000', '2000', '3000']) + return flowDynamic(data) + }) + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + await delay(1200) + const getHistory = database.listHistory.map((i) => i.answer) + assert.is(MOCK_VALUES[0], getHistory[0]) + + //FlowDynamic + assert.is('1 Ford', getHistory[1]) + assert.is('2 GM', getHistory[2]) + assert.is('3 BMW', getHistory[3]) + + assert.is(MOCK_VALUES[1], getHistory[4]) + assert.is(undefined, getHistory[5]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 30e6f4d..f7051b3 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -72,11 +72,12 @@ class CoreClass { const { body, from } = messageCtxInComming let msgToSend = [] let fallBackFlag = false + let endFlowFlag = false if (this.generalArgs.blackList.includes(from)) return if (!body) return if (!body.length) return - const prevMsg = await this.databaseClass.getPrevByNumber(from) + let prevMsg = await this.databaseClass.getPrevByNumber(from) const refToContinue = this.flowClass.findBySerialize( prevMsg?.refSerialize ) @@ -90,13 +91,28 @@ class CoreClass { this.databaseClass.save(ctxByNumber) } + // 📄 Limpiar cola de procesos + const clearQueue = () => { + QueuePrincipal.pendingPromise = false + QueuePrincipal.queue = [] + } + + // 📄 Finalizar flujo + const endFlow = async () => { + prevMsg = null + endFlowFlag = true + clearQueue() + return + } + // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx const sendFlow = async (messageToSend, numberOrId) => { // [1 Paso] esto esta bien! - if (prevMsg?.options?.capture) await cbEveryCtx(prevMsg?.ref) + if (prevMsg?.options?.capture) await cbEveryCtx(prevMsg?.ref) const queue = [] for (const ctxMessage of messageToSend) { + if (endFlowFlag) return const delayMs = ctxMessage?.options?.delay || 0 if (delayMs) await delay(delayMs) QueuePrincipal.enqueue(() => @@ -145,6 +161,7 @@ class CoreClass { }) .slice(0, optListMsg.limit) + if (endFlowFlag) return for (const msg of parseListMsg) { await this.sendProviderAndSave(from, msg) } @@ -163,6 +180,7 @@ class CoreClass { return this.flowClass.allCallbacks[inRef](messageCtxInComming, { fallBack, flowDynamic, + endFlow, }) } From 71c969f3e9f58217820afea2e22b3a3690767546 Mon Sep 17 00:00:00 2001 From: lisandroprada Date: Mon, 23 Jan 2023 16:34:53 -0300 Subject: [PATCH 48/75] Update index.mdx --- packages/docs/src/routes/docs/flows/index.mdx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 2e078d7..1a5e879 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -159,6 +159,19 @@ const flowString = addKeyword('hola') --- +# QRPortalWeb + +Argumento para asignar nombre y puerto al BOT + +```js +QRPortalWeb({name:BOTNAME, port:3005 }); + +``` + +--- + + + Date: Tue, 24 Jan 2023 09:10:45 +0000 Subject: [PATCH 49/75] docs(contributor): contrib-readme-action has updated readme --- README.md | 54 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b4a2271..777209f 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,13 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. + + + + - + + + + + - + + + - + + + +
+ + cheveguerra +
+ Jose Alberto Guerra Ugalde +
+
leifermendez @@ -62,6 +69,21 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Leifer Mendez + + danielcasta0398 +
+ Juan Daniel Castaño +
+
+ + marianarolfo +
+ Null +
+
HKong31 @@ -75,8 +97,14 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
Zvi
-
+ + JosephVTX +
+ Joseph Vega Callupe +
+
Gonzalito87 @@ -84,6 +112,21 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Null + + jlferrete +
+ Jose Luis Ferrete Olarte +
+
+ + 6rak0 +
+ Null +
+
tonyvazgar @@ -91,13 +134,6 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Luis Antonio Vázquez García - - ulisesvina -
- Ulises Viña -
-
rrruuuyyy From 77145bcc548f1a65e18f5118ca860b8a3a56499c Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 14:22:33 +0100 Subject: [PATCH 50/75] docs: :art: modal added --- .../src/components/widgets/SearchModal.tsx | 20 +++++++++++++++++++ packages/docs/src/routes/docs/layout!.tsx | 2 ++ packages/docs/src/routes/index.tsx | 2 +- packages/docs/src/services/opencollective.ts | 2 +- .../server/@qwik-city-not-found-paths.js | 2 +- .../portal/server/@qwik-city-static-paths.js | 1 - 6 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 packages/docs/src/components/widgets/SearchModal.tsx diff --git a/packages/docs/src/components/widgets/SearchModal.tsx b/packages/docs/src/components/widgets/SearchModal.tsx new file mode 100644 index 0000000..ed31b87 --- /dev/null +++ b/packages/docs/src/components/widgets/SearchModal.tsx @@ -0,0 +1,20 @@ +import { component$, useStore } from '@builder.io/qwik' + +export const SearchModal = component$(() => { + const state = useStore({ + open: false, + src: '', + }) + + return ( +
+
+ +
+
+ ) +}) + +export const SingleModal = component$(() => { + return
Modal singlke
+}) diff --git a/packages/docs/src/routes/docs/layout!.tsx b/packages/docs/src/routes/docs/layout!.tsx index cb34220..4d66df2 100644 --- a/packages/docs/src/routes/docs/layout!.tsx +++ b/packages/docs/src/routes/docs/layout!.tsx @@ -3,6 +3,7 @@ import type { DocumentHead } from '@builder.io/qwik-city' import ExtraBar from '~/components/widgets/ExtraBar' import Header from '~/components/widgets/Header' import NavBar from '~/components/widgets/NavBar' +import { SearchModal } from '~/components/widgets/SearchModal' import SponsorBar from '~/components/widgets/SponsorBar' import { GlobalStore } from '~/contexts' // import Navigation from '~/components/widgets/Navigation' @@ -14,6 +15,7 @@ export default component$(() => { return ( <> +
diff --git a/packages/docs/src/routes/index.tsx b/packages/docs/src/routes/index.tsx index 8ad3b75..dbfb2da 100644 --- a/packages/docs/src/routes/index.tsx +++ b/packages/docs/src/routes/index.tsx @@ -10,11 +10,11 @@ import { fetchGithub } from '~/services/github' import { fetchOpenCollective } from '~/services/opencollective' import { RequestHandlerNetlify } from '@builder.io/qwik-city/middleware/netlify-edge' import { GITHUB_TOKEN } from './docs/constant' +import { SearchModal } from '~/components/widgets/SearchModal' export const onGet: RequestHandlerNetlify = async ({ platform }) => { const CHECK_GITHUB_TOKEN = (platform as any)?.['GITHUB_TOKEN'] ?? GITHUB_TOKEN - console.log(`[🚩 platform]: `, GITHUB_TOKEN) const dataGithub = await fetchGithub(CHECK_GITHUB_TOKEN) const dataOpenCollective = await fetchOpenCollective() return { diff --git a/packages/docs/src/services/opencollective.ts b/packages/docs/src/services/opencollective.ts index 2eb60c8..9a89f25 100644 --- a/packages/docs/src/services/opencollective.ts +++ b/packages/docs/src/services/opencollective.ts @@ -4,7 +4,7 @@ */ export const fetchOpenCollective = async () => { const data = await fetch( - `https://opencollective.com/bot-whatsapp/members/users.json?limit=10&offset=0`, + `https://opencollective.com/bot-whatsapp/members/users.json?limit=22&offset=0`, { method: 'GET', } diff --git a/packages/portal/server/@qwik-city-not-found-paths.js b/packages/portal/server/@qwik-city-not-found-paths.js index f5f657d..473076c 100644 --- a/packages/portal/server/@qwik-city-not-found-paths.js +++ b/packages/portal/server/@qwik-city-not-found-paths.js @@ -1,7 +1,7 @@ const notFounds = [ [ '/', - '\n\n\n \n \n 404 Resource Not Found\n \n \n\n\n

404 Resource Not Found

\n\n', + '\n\n \n \n \n 404 Resource Not Found\n \n \n \n \n

404 Resource Not Found

\n \n\n', ], ] function getNotFound(p) { diff --git a/packages/portal/server/@qwik-city-static-paths.js b/packages/portal/server/@qwik-city-static-paths.js index 1afa65f..1835f6b 100644 --- a/packages/portal/server/@qwik-city-static-paths.js +++ b/packages/portal/server/@qwik-city-static-paths.js @@ -1,5 +1,4 @@ const staticPaths = new Set([ - '/', '/favicon.svg', '/manifest.json', '/q-manifest.json', From eab39e4ac06fd46f1a4671f8c15d1456b4400b97 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 16:54:31 +0100 Subject: [PATCH 51/75] feat: :fire: bailey add media --- package.json | 2 + packages/provider/common/fileType.js | 16 ++++++ packages/provider/src/baileys/index.js | 42 ++++++++++++++- packages/provider/src/baileys/package.json | 1 - packages/provider/src/baileys/utils.js | 50 ++++++++++++------ yarn.lock | 61 ++++++++++++++++++++-- 6 files changed, 149 insertions(+), 23 deletions(-) create mode 100644 packages/provider/common/fileType.js diff --git a/package.json b/package.json index 2d1061e..3f7f729 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,9 @@ "eslint-config-prettier": "^8.5.0", "fs-extra": "^11.1.0", "git-cz": "^4.9.0", + "got": "11.8.3", "husky": "^8.0.2", + "mime-types": "^2.1.35", "only-allow": "^1.1.1", "prettier": "^2.8.0", "pretty-quick": "^3.1.3", diff --git a/packages/provider/common/fileType.js b/packages/provider/common/fileType.js new file mode 100644 index 0000000..3521e61 --- /dev/null +++ b/packages/provider/common/fileType.js @@ -0,0 +1,16 @@ +const mimeDep = require('mime-types') +/** + * Extrar el mimetype from buffer + * @param {string} response + * @returns + */ +const fileTypeFromFile = async (response) => { + const type = response.headers['content-type'] ?? null + const ext = mimeDep.extension(type) + return { + type, + ext, + } +} + +module.exports = { fileTypeFromFile } diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index de6c66d..b12d094 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -170,12 +170,51 @@ class BaileysProvider extends ProviderClass { sendMedia = async (number, imageUrl, text) => { const fileDownloaded = await baileyDownloadMedia(imageUrl) + const mimeType = mime.lookup(fileDownloaded) + + if (mimeType.includes('image')) + return this.sendImage(number, fileDownloaded, text) + if (mimeType.includes('video')) + return this.sendVideo(number, fileDownloaded, text) + if (mimeType.includes('audio')) + return this.sendAudio(number, fileDownloaded, text) + + console.log(mimeType) return this.vendor.sendMessage(number, { image: readFileSync(fileDownloaded), caption: text, }) } + /** + * + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendImage = async (number, filePath, text) => { + return this.vendor.sendMessage(number, { + image: readFileSync(filePath), + caption: text, + }) + } + + /** + * + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendVideo = async (number, filePath, text) => { + return this.vendor.sendMessage(number, { + video: readFileSync(filePath), + caption: text, + gifPlayback: true, + }) + } + /** * @alpha * @param {string} number @@ -185,8 +224,7 @@ class BaileysProvider extends ProviderClass { */ sendAudio = async (number, audioUrl, voiceNote = false) => { - const numberClean = number.replace('+', '') - await this.vendor.sendMessage(`${numberClean}@c.us`, { + await this.vendor.sendMessage(number, { audio: { url: audioUrl }, ptt: voiceNote, }) diff --git a/packages/provider/src/baileys/package.json b/packages/provider/src/baileys/package.json index da529d3..918a8e9 100644 --- a/packages/provider/src/baileys/package.json +++ b/packages/provider/src/baileys/package.json @@ -1,7 +1,6 @@ { "dependencies": { "@adiwajshing/baileys": "4.4.0", - "mime-types": "2.1.35", "wa-sticker-formatter": "4.3.2" } } diff --git a/packages/provider/src/baileys/utils.js b/packages/provider/src/baileys/utils.js index 433ddee..22c36a7 100644 --- a/packages/provider/src/baileys/utils.js +++ b/packages/provider/src/baileys/utils.js @@ -1,10 +1,12 @@ -const { createWriteStream } = require('fs') +const { createWriteStream, rename } = require('fs') const combineImage = require('combine-image') const qr = require('qr-image') const { tmpdir } = require('os') const http = require('http') const https = require('https') +const { fileTypeFromFile } = require('../../common/fileType') + const baileyCleanNumber = (number, full = false) => { number = number.replace('@s.whatsapp.net', '') number = !full ? `${number}@s.whatsapp.net` : `${number}` @@ -47,27 +49,43 @@ const baileyIsValidNumber = (rawNumber) => { * @param {*} url * @returns */ -const baileyDownloadMedia = (url) => { - return new Promise((resolve, reject) => { - const ext = url.split('.').pop() +const baileyDownloadMedia = async (url) => { + const handleDownload = () => { const checkProtocol = url.includes('https:') const handleHttp = checkProtocol ? https : http - const name = `tmp-${Date.now()}.${ext}` + const name = `tmp-${Date.now()}-dat` const fullPath = `${tmpdir()}/${name}` const file = createWriteStream(fullPath) - handleHttp.get(url, function (response) { - response.pipe(file) - file.on('finish', function () { - file.close() - resolve(fullPath) - }) - file.on('error', function () { - console.log('errro') - file.close() - reject(null) + + return new Promise((res, rej) => { + handleHttp.get(url, function (response) { + response.pipe(file) + file.on('finish', async function () { + file.close() + res({ response, fullPath }) + }) + file.on('error', function () { + file.close() + rej(null) + }) }) }) - }) + } + + const handleFile = (pathInput, ext) => + new Promise((resolve, reject) => { + const fullPath = `${pathInput}.${ext}` + rename(pathInput, fullPath, (err) => { + if (err) reject(null) + resolve(fullPath) + }) + }) + + const httpResponse = await handleDownload() + const { ext } = await fileTypeFromFile(httpResponse.response) + const getPath = await handleFile(httpResponse.fullPath, ext) + + return getPath } module.exports = { diff --git a/yarn.lock b/yarn.lock index cf802d5..4b1ffb6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1112,7 +1112,10 @@ __metadata: eslint-config-prettier: ^8.5.0 fs-extra: ^11.1.0 git-cz: ^4.9.0 + got: 11.8.3 husky: ^8.0.2 + mime-types: ^2.1.35 + name2mime: ^1.0.1 only-allow: ^1.1.1 prettier: ^2.8.0 pretty-quick: ^3.1.3 @@ -2933,6 +2936,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^5.2.0": version: 5.3.0 resolution: "@sindresorhus/is@npm:5.3.0" @@ -2977,7 +2987,7 @@ __metadata: languageName: node linkType: hard -"@szmarczak/http-timer@npm:^4.0.0": +"@szmarczak/http-timer@npm:^4.0.0, @szmarczak/http-timer@npm:^4.0.5": version: 4.0.6 resolution: "@szmarczak/http-timer@npm:4.0.6" dependencies: @@ -5073,6 +5083,13 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d + languageName: node + linkType: hard + "cacheable-lookup@npm:^7.0.0": version: 7.0.0 resolution: "cacheable-lookup@npm:7.0.0" @@ -5125,7 +5142,7 @@ __metadata: languageName: node linkType: hard -"cacheable-request@npm:^7.0.1": +"cacheable-request@npm:^7.0.1, cacheable-request@npm:^7.0.2": version: 7.0.2 resolution: "cacheable-request@npm:7.0.2" dependencies: @@ -9899,6 +9916,25 @@ __metadata: languageName: node linkType: hard +"got@npm:11.8.3": + version: 11.8.3 + resolution: "got@npm:11.8.3" + dependencies: + "@sindresorhus/is": ^4.0.0 + "@szmarczak/http-timer": ^4.0.5 + "@types/cacheable-request": ^6.0.1 + "@types/responselike": ^1.0.0 + cacheable-lookup: ^5.0.3 + cacheable-request: ^7.0.2 + decompress-response: ^6.0.0 + http2-wrapper: ^1.0.0-beta.5.2 + lowercase-keys: ^2.0.0 + p-cancelable: ^2.0.0 + responselike: ^2.0.0 + checksum: 3b6db107d9765470b18e4cb22f7c7400381be7425b9be5823f0168d6c21b5d6b28b023c0b3ee208f73f6638c3ce251948ca9b54a1e8f936d3691139ac202d01b + languageName: node + linkType: hard + "got@npm:^10.0.0, got@npm:^10.7.0": version: 10.7.0 resolution: "got@npm:10.7.0" @@ -10446,6 +10482,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: ^5.1.1 + resolve-alpn: ^1.0.0 + checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e + languageName: node + linkType: hard + "http2-wrapper@npm:^2.1.10": version: 2.2.0 resolution: "http2-wrapper@npm:2.2.0" @@ -13443,7 +13489,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.35, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -13839,6 +13885,13 @@ __metadata: languageName: node linkType: hard +"name2mime@npm:^1.0.1": + version: 1.0.1 + resolution: "name2mime@npm:1.0.1" + checksum: 46630096d2a5c381231f5e5025d3aaef824b5db29677971b8a93f565e63979524d6f43457dd4b93591341c26af2abb44ef7aa87943c51d2eed60b94519815880 + languageName: node + linkType: hard + "named-placeholders@npm:^1.1.2": version: 1.1.2 resolution: "named-placeholders@npm:1.1.2" @@ -16820,7 +16873,7 @@ __metadata: languageName: node linkType: hard -"resolve-alpn@npm:^1.2.0": +"resolve-alpn@npm:^1.0.0, resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 From e19c3a25a40259c74b4add9635af4844907eed26 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 19:43:11 +0100 Subject: [PATCH 52/75] feat: :zap: more feature --- packages/provider/src/baileys/index.js | 32 +++++++++++--------------- yarn.lock | 8 ------- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index b12d094..4bc0a03 100644 --- a/packages/provider/src/baileys/index.js +++ b/packages/provider/src/baileys/index.js @@ -13,6 +13,7 @@ const { Browsers, DisconnectReason, } = require('@adiwajshing/baileys') + const { baileyGenerateImage, baileyCleanNumber, @@ -179,15 +180,11 @@ class BaileysProvider extends ProviderClass { if (mimeType.includes('audio')) return this.sendAudio(number, fileDownloaded, text) - console.log(mimeType) - return this.vendor.sendMessage(number, { - image: readFileSync(fileDownloaded), - caption: text, - }) + return this.sendFile() } /** - * + * Enviar imagen * @param {*} number * @param {*} imageUrl * @param {*} text @@ -201,7 +198,7 @@ class BaileysProvider extends ProviderClass { } /** - * + * Enviar video * @param {*} number * @param {*} imageUrl * @param {*} text @@ -216,6 +213,7 @@ class BaileysProvider extends ProviderClass { } /** + * Enviar audio * @alpha * @param {string} number * @param {string} message @@ -224,7 +222,7 @@ class BaileysProvider extends ProviderClass { */ sendAudio = async (number, audioUrl, voiceNote = false) => { - await this.vendor.sendMessage(number, { + return this.vendor.sendMessage(number, { audio: { url: audioUrl }, ptt: voiceNote, }) @@ -248,17 +246,13 @@ class BaileysProvider extends ProviderClass { */ sendFile = async (number, filePath) => { - if (existsSync(filePath)) { - const mimeType = mime.lookup(filePath) - const numberClean = number.replace('+', '') - const fileName = filePath.split('/').pop() - - await this.vendor.sendMessage(`${numberClean}@c.us`, { - document: { url: filePath }, - mimetype: mimeType, - fileName: fileName, - }) - } + const mimeType = mime.lookup(filePath) + const fileName = filePath.split('/').pop() + return this.vendor.sendMessage(number, { + document: { url: filePath }, + mimetype: mimeType, + fileName: fileName, + }) } /** diff --git a/yarn.lock b/yarn.lock index 4b1ffb6..c99a8c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1115,7 +1115,6 @@ __metadata: got: 11.8.3 husky: ^8.0.2 mime-types: ^2.1.35 - name2mime: ^1.0.1 only-allow: ^1.1.1 prettier: ^2.8.0 pretty-quick: ^3.1.3 @@ -13885,13 +13884,6 @@ __metadata: languageName: node linkType: hard -"name2mime@npm:^1.0.1": - version: 1.0.1 - resolution: "name2mime@npm:1.0.1" - checksum: 46630096d2a5c381231f5e5025d3aaef824b5db29677971b8a93f565e63979524d6f43457dd4b93591341c26af2abb44ef7aa87943c51d2eed60b94519815880 - languageName: node - linkType: hard - "named-placeholders@npm:^1.1.2": version: 1.1.2 resolution: "named-placeholders@npm:1.1.2" From 371b403456398d150b4839e1805cbb6afe76b2fe Mon Sep 17 00:00:00 2001 From: Gregoriotecnico <118696506+Gregoriotecnico@users.noreply.github.com> Date: Tue, 24 Jan 2023 21:38:38 +0100 Subject: [PATCH 53/75] =?UTF-8?q?Adici=C3=B3n=20de=20endFlow()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/src/routes/docs/flows/index.mdx | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 1a5e879..f1a8d3b 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -158,6 +158,51 @@ const flowString = addKeyword('hola') ``` --- +## endFlow() + +Esta funcion se utliza para finalizar un flujo con dos o más addAnswer. Un ejemplo de uso sería registrar 3 datos de un usuario en 3 preguntas distinas y +que el usuario pueda finalizar por él mismo el flujo. +Como podrás comprobar en el ejemplo siguiente, se puede vincular flowDynamic y todas sus funciones; como por ejemplo botones. + + + +```js +const flowFormulario = addKeyword(['Hola']) + +.addAnswer(['Hola!','Escriba su *Nombre* para generar su solicitud'], +{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, +async (ctx,{flowDynamic, endFlow})=>{ + if(ctx.body == '❌ Cancelar solicitud'){ + await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) + return endFlow() + } + }) + .addAnswer(['También necesito tus dos apellidos'], + {capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, + async (ctx,{flowDynamic, endFlow})=>{ + if(ctx.body == '❌ Cancelar solicitud'){ + await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) + return endFlow() + } + }) + .addAnswer(['Dejeme su número de teléfono y le llamaré lo antes posible.'], +{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, +async (ctx,{flowDynamic, endFlow})=>{ + if(ctx.body == '❌ Cancelar solicitud'){ + await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) + return endFlow() + } + }) + + + +``` + +--- + + + + # QRPortalWeb From 943fe8698caf82706386c60960bc79a9bd9412cd Mon Sep 17 00:00:00 2001 From: Gregoriotecnico <118696506+Gregoriotecnico@users.noreply.github.com> Date: Tue, 24 Jan 2023 21:55:11 +0100 Subject: [PATCH 54/75] =?UTF-8?q?Adici=C3=B3n=20blackList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/src/routes/docs/flows/index.mdx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 1a5e879..e363630 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -23,6 +23,23 @@ const flowPrincipal = addKeyword(['hola', 'alo']) --- +## blackList + +Éste argumento se utiliza para **evitar que el bot se active** cuando los números de la lista activen el bot. +Es importante que el número **vaya acompañado de su prefijo**, en el caso de España "34". + +```js +createBot({ + flow: adapterFlow, + provider: adapterProvider, + database: adapterDB, + },{ + blackList:['34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX'] + }) +``` + +--- + ## addKeyword() Esta funcion se utliza para iniciar un flujo de conversion.
Recibe un `string` o un `array` From 14d1a61fa259c09135c37c55bd79e97c9c8367e4 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 22:14:55 +0100 Subject: [PATCH 55/75] feat(provider): :zap: bailey add send file video audio --- packages/provider/common/download.js | 65 ++++++++++++++++++++++++++ packages/provider/common/fileType.js | 16 ------- packages/provider/src/baileys/index.js | 9 ++-- packages/provider/src/baileys/utils.js | 53 +-------------------- 4 files changed, 71 insertions(+), 72 deletions(-) create mode 100644 packages/provider/common/download.js delete mode 100644 packages/provider/common/fileType.js diff --git a/packages/provider/common/download.js b/packages/provider/common/download.js new file mode 100644 index 0000000..76e23a0 --- /dev/null +++ b/packages/provider/common/download.js @@ -0,0 +1,65 @@ +const mimeDep = require('mime-types') +const { tmpdir } = require('os') +const http = require('http') +const https = require('https') +const { rename, createWriteStream } = require('fs') + +/** + * Extrar el mimetype from buffer + * @param {string} response + * @returns + */ +const fileTypeFromFile = async (response) => { + const type = response.headers['content-type'] ?? null + const ext = mimeDep.extension(type) + return { + type, + ext, + } +} + +/** + * Descargar archivo binay en tmp + * @param {*} url + * @returns + */ +const generalDownload = async (url) => { + const handleDownload = () => { + const checkProtocol = url.includes('https:') + const handleHttp = checkProtocol ? https : http + const name = `tmp-${Date.now()}-dat` + const fullPath = `${tmpdir()}/${name}` + const file = createWriteStream(fullPath) + + return new Promise((res, rej) => { + handleHttp.get(url, function (response) { + response.pipe(file) + file.on('finish', async function () { + file.close() + res({ response, fullPath }) + }) + file.on('error', function () { + file.close() + rej(null) + }) + }) + }) + } + + const handleFile = (pathInput, ext) => + new Promise((resolve, reject) => { + const fullPath = `${pathInput}.${ext}` + rename(pathInput, fullPath, (err) => { + if (err) reject(null) + resolve(fullPath) + }) + }) + + const httpResponse = await handleDownload() + const { ext } = await fileTypeFromFile(httpResponse.response) + const getPath = await handleFile(httpResponse.fullPath, ext) + + return getPath +} + +module.exports = { generalDownload } diff --git a/packages/provider/common/fileType.js b/packages/provider/common/fileType.js deleted file mode 100644 index 3521e61..0000000 --- a/packages/provider/common/fileType.js +++ /dev/null @@ -1,16 +0,0 @@ -const mimeDep = require('mime-types') -/** - * Extrar el mimetype from buffer - * @param {string} response - * @returns - */ -const fileTypeFromFile = async (response) => { - const type = response.headers['content-type'] ?? null - const ext = mimeDep.extension(type) - return { - type, - ext, - } -} - -module.exports = { fileTypeFromFile } diff --git a/packages/provider/src/baileys/index.js b/packages/provider/src/baileys/index.js index 4bc0a03..9361731 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, readFileSync } = require('fs') +const { createWriteStream, readFileSync } = require('fs') const { Console } = require('console') const { @@ -18,9 +18,10 @@ const { baileyGenerateImage, baileyCleanNumber, baileyIsValidNumber, - baileyDownloadMedia, } = require('./utils') +const { generalDownload } = require('../../common/download') + const logger = new Console({ stdout: createWriteStream(`${process.cwd()}/baileys.log`), }) @@ -170,7 +171,7 @@ class BaileysProvider extends ProviderClass { */ sendMedia = async (number, imageUrl, text) => { - const fileDownloaded = await baileyDownloadMedia(imageUrl) + const fileDownloaded = await generalDownload(imageUrl) const mimeType = mime.lookup(fileDownloaded) if (mimeType.includes('image')) @@ -180,7 +181,7 @@ class BaileysProvider extends ProviderClass { if (mimeType.includes('audio')) return this.sendAudio(number, fileDownloaded, text) - return this.sendFile() + return this.sendFile(number, fileDownloaded) } /** diff --git a/packages/provider/src/baileys/utils.js b/packages/provider/src/baileys/utils.js index 22c36a7..0b2a886 100644 --- a/packages/provider/src/baileys/utils.js +++ b/packages/provider/src/baileys/utils.js @@ -1,11 +1,6 @@ -const { createWriteStream, rename } = require('fs') +const { createWriteStream } = require('fs') const combineImage = require('combine-image') const qr = require('qr-image') -const { tmpdir } = require('os') -const http = require('http') -const https = require('https') - -const { fileTypeFromFile } = require('../../common/fileType') const baileyCleanNumber = (number, full = false) => { number = number.replace('@s.whatsapp.net', '') @@ -43,54 +38,8 @@ const baileyIsValidNumber = (rawNumber) => { return !exist } -/** - * Incompleta - * Descargar archivo multimedia para enviar - * @param {*} url - * @returns - */ -const baileyDownloadMedia = async (url) => { - const handleDownload = () => { - const checkProtocol = url.includes('https:') - const handleHttp = checkProtocol ? https : http - const name = `tmp-${Date.now()}-dat` - const fullPath = `${tmpdir()}/${name}` - const file = createWriteStream(fullPath) - - return new Promise((res, rej) => { - handleHttp.get(url, function (response) { - response.pipe(file) - file.on('finish', async function () { - file.close() - res({ response, fullPath }) - }) - file.on('error', function () { - file.close() - rej(null) - }) - }) - }) - } - - const handleFile = (pathInput, ext) => - new Promise((resolve, reject) => { - const fullPath = `${pathInput}.${ext}` - rename(pathInput, fullPath, (err) => { - if (err) reject(null) - resolve(fullPath) - }) - }) - - const httpResponse = await handleDownload() - const { ext } = await fileTypeFromFile(httpResponse.response) - const getPath = await handleFile(httpResponse.fullPath, ext) - - return getPath -} - module.exports = { baileyCleanNumber, baileyGenerateImage, baileyIsValidNumber, - baileyDownloadMedia, } From 24220822f431afb0b4765addca90587576e0b7d2 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 22:44:24 +0100 Subject: [PATCH 56/75] chore(release): 0.1.18 --- CHANGELOG.md | 41 +++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d3865b..9b39939 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,47 @@ 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.18](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.17...v0.1.18) (2023-01-24) + + +### Features + +* **bot:** :zap: add blacklist ([7078dc4](https://github.com/leifermendez/bot-whatsapp/commit/7078dc4c93d01bf90ef08ecb34e89a1abbe16fd2)) +* **bot:** :zap: flowDynamic buttons, media ([3c4b1c0](https://github.com/leifermendez/bot-whatsapp/commit/3c4b1c0fc4b6d98d67c67806d918d3604bb2209b)) + + +### Bug Fixes + +* **bot:** :bug: body undefined ([bb6ed4a](https://github.com/leifermendez/bot-whatsapp/commit/bb6ed4a084ae98070dfdf0c4ba1eca574c4092cc)) +* **bot:** :bug: body undefined ([9234cf1](https://github.com/leifermendez/bot-whatsapp/commit/9234cf1c5d00abdd35e62a826b3c450ab056987a)) +* **bot:** :bug: body undefined ([a118bbb](https://github.com/leifermendez/bot-whatsapp/commit/a118bbbf7f0a7023cb7f33c23f37db72adad151f)) +* **bot:** :bug: body undefined ([f54dea5](https://github.com/leifermendez/bot-whatsapp/commit/f54dea52b01063acd6122eeba1fbbe324aa7805d)) +* **bot:** :bug: body undefined ([72e0a91](https://github.com/leifermendez/bot-whatsapp/commit/72e0a910503e9643db7dfbc6e09c41c96934e1f7)) +* **bot:** :bug: body undefined ([70dd4d7](https://github.com/leifermendez/bot-whatsapp/commit/70dd4d73e814fc5636d19a887f3621c483b837c1)) +* **bot:** :bug: body undefined ([ecf0eef](https://github.com/leifermendez/bot-whatsapp/commit/ecf0eef928917d76c59bd23886cb7a4108b421f1)) +* **bot:** :bug: flowDynamic stranger behaviour ([877252b](https://github.com/leifermendez/bot-whatsapp/commit/877252bd4a8a7bbbbf083c3ceaeaeb952b0a1828)) +* **bot:** :bug: flowDynamic stranger behaviour ([f5a7de3](https://github.com/leifermendez/bot-whatsapp/commit/f5a7de3a003c012e2164e51fff26892cfc3144be)) +* **bot:** :memo: more docs ([98793d0](https://github.com/leifermendez/bot-whatsapp/commit/98793d0cfc1674830beaa3707f933c5a791eec14)) +* **cli:** :zap: refactor ([a29b9d4](https://github.com/leifermendez/bot-whatsapp/commit/a29b9d4e1f85fc163cf1d633c0857f0c8b7f03e1)) +* **cli:** :zap: refactor ([18ef4e9](https://github.com/leifermendez/bot-whatsapp/commit/18ef4e9d726575ca390ca24354825860328d3347)) +* **cli:** :zap: refactor ([3648757](https://github.com/leifermendez/bot-whatsapp/commit/3648757fa083bdb88a16bf6c2e90c828c233bdb1)) +* **cli:** :zap: refactor ([32f6a70](https://github.com/leifermendez/bot-whatsapp/commit/32f6a70f8f6fb26d8ea2a0f1a4aec4827b9d6a93)) +* **cli:** :zap: refactor ([8c825e7](https://github.com/leifermendez/bot-whatsapp/commit/8c825e7f6b7133f7cc7f3041ce331b80a9fe60e0)) +* **cli:** :zap: refactor ([0c0f437](https://github.com/leifermendez/bot-whatsapp/commit/0c0f4375b84549bee809340a85f9ce038ee2739e)) +* **cli:** :zap: refactor ([039ce5d](https://github.com/leifermendez/bot-whatsapp/commit/039ce5dd7cac8115b335ad5de05f7bd871e24140)) +* **cli:** :zap: refactor ([5e87918](https://github.com/leifermendez/bot-whatsapp/commit/5e879188b8bf9d486399b308a9a9c2612607d465)) +* **cli:** :zap: refactor ([21a7270](https://github.com/leifermendez/bot-whatsapp/commit/21a72702817bc6b344223b34ca4513a7ff45fc93)) +* **cli:** :zap: refactor ([82a99b2](https://github.com/leifermendez/bot-whatsapp/commit/82a99b2c80e6738566042ea738bbab8208a17758)) +* **cli:** :zap: refactor ([cc19974](https://github.com/leifermendez/bot-whatsapp/commit/cc19974579379777b05cb69c38cec0fce6740471)) +* **cli:** :zap: refactor ([56fcb8f](https://github.com/leifermendez/bot-whatsapp/commit/56fcb8fb72169bc21fce7c4fcdceccf2acd39c73)) +* **cli:** :zap: refactor ([f36cff1](https://github.com/leifermendez/bot-whatsapp/commit/f36cff1eefdd96be4ab531e1cb2d3b630b1a81c3)) +* **cli:** :zap: refactor ([b393c11](https://github.com/leifermendez/bot-whatsapp/commit/b393c11af6c0ebccb0a690be8b90b9df8877dad1)) +* **cli:** :zap: refactor ([6683715](https://github.com/leifermendez/bot-whatsapp/commit/6683715ad617ea1075654a475a1c62ea607c733f)) +* **contexts:** :bug: fixed [#524](https://github.com/leifermendez/bot-whatsapp/issues/524) issue ([79cc31a](https://github.com/leifermendez/bot-whatsapp/commit/79cc31a96f6a9836447cc4e6bb1e1521c54183fe)) +* **contexts:** :bug: fixed [#524](https://github.com/leifermendez/bot-whatsapp/issues/524) issue ([7067b4a](https://github.com/leifermendez/bot-whatsapp/commit/7067b4a80b7938ccfaf1ed141a37d645a1a3a062)) +* **provider:** wwebjs upgrade ([345f256](https://github.com/leifermendez/bot-whatsapp/commit/345f256a1b4a238519dafc15c9a31bc5e6bad4fe)) +* se agrego @bot-whatsapp/portal a package.json ([46a9fa6](https://github.com/leifermendez/bot-whatsapp/commit/46a9fa6793e06600335de998d2bd9d0691b02ca4)) + ### [0.1.17](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.16...v0.1.17) (2023-01-13) diff --git a/package.json b/package.json index 2d1061e..fda898a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.17", + "version": "0.1.18", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From 558013b2b4ca7d72977045485bedbbdb7113ff63 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Tue, 24 Jan 2023 22:50:59 +0100 Subject: [PATCH 57/75] docs: :memo: add --- packages/docs/src/components/widgets/SearchModal.tsx | 10 +++++----- packages/docs/src/routes/index.tsx | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/docs/src/components/widgets/SearchModal.tsx b/packages/docs/src/components/widgets/SearchModal.tsx index ed31b87..287a28b 100644 --- a/packages/docs/src/components/widgets/SearchModal.tsx +++ b/packages/docs/src/components/widgets/SearchModal.tsx @@ -1,10 +1,10 @@ -import { component$, useStore } from '@builder.io/qwik' +import { component$ } from '@builder.io/qwik' export const SearchModal = component$(() => { - const state = useStore({ - open: false, - src: '', - }) + // const state = useStore({ + // open: false, + // src: '', + // }) return (
diff --git a/packages/docs/src/routes/index.tsx b/packages/docs/src/routes/index.tsx index dbfb2da..9b0f04a 100644 --- a/packages/docs/src/routes/index.tsx +++ b/packages/docs/src/routes/index.tsx @@ -10,7 +10,7 @@ import { fetchGithub } from '~/services/github' import { fetchOpenCollective } from '~/services/opencollective' import { RequestHandlerNetlify } from '@builder.io/qwik-city/middleware/netlify-edge' import { GITHUB_TOKEN } from './docs/constant' -import { SearchModal } from '~/components/widgets/SearchModal' +// import { SearchModal } from '~/components/widgets/SearchModal' export const onGet: RequestHandlerNetlify = async ({ platform }) => { const CHECK_GITHUB_TOKEN = From b2feaea588278a4bf85cfaf70e4673d8f2bc7226 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Wed, 25 Jan 2023 09:05:01 +0100 Subject: [PATCH 58/75] docs: :bug: fix modal --- packages/docs/src/routes/docs/layout!.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/docs/src/routes/docs/layout!.tsx b/packages/docs/src/routes/docs/layout!.tsx index 4d66df2..8f49e8a 100644 --- a/packages/docs/src/routes/docs/layout!.tsx +++ b/packages/docs/src/routes/docs/layout!.tsx @@ -3,7 +3,7 @@ import type { DocumentHead } from '@builder.io/qwik-city' import ExtraBar from '~/components/widgets/ExtraBar' import Header from '~/components/widgets/Header' import NavBar from '~/components/widgets/NavBar' -import { SearchModal } from '~/components/widgets/SearchModal' +// import { SearchModal } from '~/components/widgets/SearchModal' import SponsorBar from '~/components/widgets/SponsorBar' import { GlobalStore } from '~/contexts' // import Navigation from '~/components/widgets/Navigation' @@ -15,7 +15,7 @@ export default component$(() => { return ( <> - + {/* */}
From e7a8e85ead9a7dffbdbb04e172f83c3f66bc7262 Mon Sep 17 00:00:00 2001 From: lisandroprada Date: Wed, 25 Jan 2023 08:21:12 -0300 Subject: [PATCH 59/75] Update index.mdx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agregado: Definición de la constante BOTNAME. --- packages/docs/src/routes/docs/flows/index.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 0cb1222..cf6c23c 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -226,6 +226,7 @@ async (ctx,{flowDynamic, endFlow})=>{ Argumento para asignar nombre y puerto al BOT ```js +const BOTNAME = 'bot'; QRPortalWeb({name:BOTNAME, port:3005 }); ``` From 9dd7c02b6a5474aff063f7d6be0ca8519504b93c Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Wed, 25 Jan 2023 16:10:13 -0500 Subject: [PATCH 60/75] feat(provider): :rocket: implements all send media to venom provider --- packages/provider/src/venom/index.js | 67 +++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js index 4b7c231..10fe5aa 100644 --- a/packages/provider/src/venom/index.js +++ b/packages/provider/src/venom/index.js @@ -2,18 +2,20 @@ const { ProviderClass } = require('@bot-whatsapp/bot') const venom = require('venom-bot') const { createWriteStream } = require('fs') const { Console } = require('console') +const mime = require('mime-types') const { venomCleanNumber, venomGenerateImage, venomisValidNumber, - venomDownloadMedia, } = require('./utils') const logger = new Console({ stdout: createWriteStream(`${process.cwd()}/venom.log`), }) +const { generalDownload } = require('../../common/download') + /** * ⚙️ VenomProvider: Es una clase tipo adaptor * que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) @@ -134,6 +136,53 @@ class VenomProvider extends ProviderClass { // return this.vendor.sendButtons(number, "Title", buttons1, "Description"); } + /** + * Enviar audio + * @alpha + * @param {string} number + * @param {string} message + * @param {boolean} voiceNote optional + * @example await sendMessage('+XXXXXXXXXXX', 'audio.mp3') + */ + + sendAudio = async (number, audioPath, voiceNote = false) => { + return this.vendor.sendVoice(number, audioPath) + } + + /** + * Enviar imagen + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendImage = async (number, filePath, text) => { + return this.vendor.sendImage(number, filePath, 'image-name', text) + } + + /** + * + * @param {string} number + * @param {string} filePath + * @example await sendMessage('+XXXXXXXXXXX', './document/file.pdf') + */ + + sendFile = async (number, filePath, text) => { + const fileName = filePath.split('/').pop() + return this.vendor.sendFile(number, filePath, fileName, text) + } + + /** + * Enviar video + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendVideo = async (number, filePath, text) => { + return this.vendor.sendVideoAsGif(number, filePath, 'video.gif', text) + } + /** * Enviar imagen o multimedia * @param {*} number @@ -141,10 +190,18 @@ class VenomProvider extends ProviderClass { * @param {*} message * @returns */ - sendMedia = async (number, mediaInput, message) => { - if (!mediaInput) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`) - const fileDownloaded = await venomDownloadMedia(mediaInput) - return this.vendor.sendImage(number, fileDownloaded, '.', message) + sendMedia = async (number, mediaUrl, text) => { + const fileDownloaded = await generalDownload(mediaUrl) + const mimeType = mime.lookup(fileDownloaded) + + if (mimeType.includes('image')) + return this.sendImage(number, fileDownloaded, text) + if (mimeType.includes('video')) + return this.sendVideo(number, fileDownloaded, text) + if (mimeType.includes('audio')) + return this.sendAudio(number, fileDownloaded) + + return this.sendFile(number, fileDownloaded, text) } /** From 6ff1a3a980196c01c66ed04ee07d0e7e57256504 Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 12:51:15 -0500 Subject: [PATCH 61/75] feat(provider): :rocket: send file wwebjs --- packages/provider/src/web-whatsapp/index.js | 122 +++++++++++++++++--- 1 file changed, 104 insertions(+), 18 deletions(-) diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index f7f8bd0..2709960 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -1,7 +1,7 @@ const { Client, LocalAuth, MessageMedia, Buttons } = require('whatsapp-web.js') const { ProviderClass } = require('@bot-whatsapp/bot') const { Console } = require('console') -const { createWriteStream } = require('fs') +const { createWriteStream, readFileSync } = require('fs') const { wwebCleanNumber, wwebDownloadMedia, @@ -13,6 +13,9 @@ const logger = new Console({ stdout: createWriteStream('./log'), }) +const { generalDownload } = require('../../common/download') +const mime = require('mime-types') + /** * ⚙️ WebWhatsappProvider: Es una clase tipo adaptor * que extiende clases de ProviderClass (la cual es como interfaz para sber que funciones rqueridas) @@ -35,6 +38,7 @@ class WebWhatsappProvider extends ProviderClass { '--disable-setuid-sandbox', '--unhandled-rejections=strict', ], + //executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe', }, }) @@ -103,23 +107,6 @@ class WebWhatsappProvider extends ProviderClass { }, ] - /** - * Enviar un archivo multimedia - * https://docs.wwebjs.dev/MessageMedia.html - * @private - * @param {*} number - * @param {*} mediaInput - * @returns - */ - sendMedia = async (number, mediaInput = null) => { - if (!mediaInput) throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`) - const fileDownloaded = await wwebDownloadMedia(mediaInput) - const media = MessageMedia.fromFilePath(fileDownloaded) - return this.vendor.sendMessage(number, media, { - sendAudioAsVoice: true, - }) - } - /** * Enviar botones * https://docs.wwebjs.dev/Buttons.html @@ -170,6 +157,105 @@ class WebWhatsappProvider extends ProviderClass { return this.vendor.sendMessage(number, message) } + /** + * Enviar imagen + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendImage = async (number, filePath, text) => { + const base64 = readFileSync(filePath, { encoding: 'base64' }) + const mimeType = mime.lookup(filePath) + const media = new MessageMedia(mimeType, base64) + return this.vendor.sendMessage(number, media, text) + } + + /** + * Enviar audio + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + /** + * Enviar audio + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendAudio = async (number, filePath, text) => { + const base64 = readFileSync(filePath, { encoding: 'base64' }) + const mimeType = mime.lookup(filePath) + const media = new MessageMedia(mimeType, base64) + return this.vendor.sendMessage(number, media, text) + } + /** + * Enviar audio + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendAudio = async (number, filePath, text) => { + const base64 = readFileSync(filePath, { encoding: 'base64' }) + const mimeType = mime.lookup(filePath) + const media = new MessageMedia(mimeType, base64) + return this.vendor.sendMessage(number, media, text) + } + + /** + * Enviar video + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendVideo = async (number, filePath) => { + const base64 = readFileSync(filePath, { encoding: 'base64' }) + const mimeType = mime.lookup(filePath) + const media = new MessageMedia(mimeType, base64) + return this.vendor.sendMessage(number, media, { + sendMediaAsDocument: true, + }) + } + + /** + * Enviar Arhivos/pdf + * @param {*} number + * @param {*} imageUrl + * @param {*} text + * @returns + */ + sendFile = async (number, filePath, text) => { + const base64 = readFileSync(filePath, { encoding: 'base64' }) + const mimeType = mime.lookup(filePath) + const media = new MessageMedia(mimeType, base64) + return this.vendor.sendMessage(number, media, text) + } + + /** + * Enviar imagen o multimedia + * @param {*} number + * @param {*} mediaInput + * @param {*} message + * @returns + */ + sendMedia = async (number, mediaUrl, text) => { + const fileDownloaded = await generalDownload(mediaUrl) + const mimeType = mime.lookup(fileDownloaded) + + if (mimeType.includes('image')) + return this.sendImage(number, fileDownloaded, text) + if (mimeType.includes('video')) + return this.sendVideo(number, fileDownloaded) + if (mimeType.includes('audio')) + return this.sendAudio(number, fileDownloaded) + + return this.sendFile(number, fileDownloaded) + } + /** * * @param {*} userId From cbe438b77854e8df48b9dafaf7a837d21124ac5f Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:28:25 -0500 Subject: [PATCH 62/75] feat(provider): :rocket: fix issues in providers venom and wwebjs --- packages/provider/src/venom/index.js | 2 +- packages/provider/src/web-whatsapp/index.js | 34 ++++++--------------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/packages/provider/src/venom/index.js b/packages/provider/src/venom/index.js index 10fe5aa..3e1b630 100644 --- a/packages/provider/src/venom/index.js +++ b/packages/provider/src/venom/index.js @@ -145,7 +145,7 @@ class VenomProvider extends ProviderClass { * @example await sendMessage('+XXXXXXXXXXX', 'audio.mp3') */ - sendAudio = async (number, audioPath, voiceNote = false) => { + sendAudio = async (number, audioPath) => { return this.vendor.sendVoice(number, audioPath) } diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index 2709960..f66e97a 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -4,7 +4,6 @@ const { Console } = require('console') const { createWriteStream, readFileSync } = require('fs') const { wwebCleanNumber, - wwebDownloadMedia, wwebGenerateImage, wwebIsValidNumber, } = require('./utils') @@ -168,7 +167,9 @@ class WebWhatsappProvider extends ProviderClass { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) - return this.vendor.sendMessage(number, media, text) + return this.vendor.sendMessage(number, media, { + caption: 'soy una imagen', + }) } /** @@ -178,31 +179,14 @@ class WebWhatsappProvider extends ProviderClass { * @param {*} text * @returns */ - /** - * Enviar audio - * @param {*} number - * @param {*} imageUrl - * @param {*} text - * @returns - */ + sendAudio = async (number, filePath, text) => { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) - return this.vendor.sendMessage(number, media, text) - } - /** - * Enviar audio - * @param {*} number - * @param {*} imageUrl - * @param {*} text - * @returns - */ - sendAudio = async (number, filePath, text) => { - const base64 = readFileSync(filePath, { encoding: 'base64' }) - const mimeType = mime.lookup(filePath) - const media = new MessageMedia(mimeType, base64) - return this.vendor.sendMessage(number, media, text) + return this.vendor.sendMessage(number, media, { + caption: 'soy un audio', + }) } /** @@ -228,11 +212,11 @@ class WebWhatsappProvider extends ProviderClass { * @param {*} text * @returns */ - sendFile = async (number, filePath, text) => { + sendFile = async (number, filePath) => { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) - return this.vendor.sendMessage(number, media, text) + return this.vendor.sendMessage(number, media) } /** From dcb0566d2bc3da40cd0c71554bb5ea0ec115d9ca Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:31:05 -0500 Subject: [PATCH 63/75] feat(provider): :rocket: fix provider venom and wwebjs From b2afa45352a7ab1f5d9775f3c1fde475bd8ca204 Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:32:42 -0500 Subject: [PATCH 64/75] feat(provider): :rocket: fix provider From f8c7184487065443ab10f77aaf585e8bd63ca441 Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:42:45 -0500 Subject: [PATCH 65/75] feat(provider): :rocket: fix provider From 0ad4c58457b548dc41c0f9e8470d59c48de7b95a Mon Sep 17 00:00:00 2001 From: aurik3 <37228512+aurik3@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:51:20 -0500 Subject: [PATCH 66/75] feat(provider): :rocket: fix provider --- packages/provider/src/web-whatsapp/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/provider/src/web-whatsapp/index.js b/packages/provider/src/web-whatsapp/index.js index f66e97a..693d1b9 100644 --- a/packages/provider/src/web-whatsapp/index.js +++ b/packages/provider/src/web-whatsapp/index.js @@ -163,7 +163,7 @@ class WebWhatsappProvider extends ProviderClass { * @param {*} text * @returns */ - sendImage = async (number, filePath, text) => { + sendImage = async (number, filePath) => { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) @@ -180,7 +180,7 @@ class WebWhatsappProvider extends ProviderClass { * @returns */ - sendAudio = async (number, filePath, text) => { + sendAudio = async (number, filePath) => { const base64 = readFileSync(filePath, { encoding: 'base64' }) const mimeType = mime.lookup(filePath) const media = new MessageMedia(mimeType, base64) From e22780d3faba94f71a70f1f201a20690608fa5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leifer=20Jes=C3=BAs=20Mendez?= Date: Sat, 28 Jan 2023 15:46:13 +0100 Subject: [PATCH 67/75] fix(bot): :zap: fix fallback refactor --- __test__/05-case.test.js | 118 ++++++++++++++++++ packages/bot/core/core.class.js | 48 ++++--- packages/docs/src/routes/docs/flows/index.mdx | 98 ++++++++------- 3 files changed, 204 insertions(+), 60 deletions(-) create mode 100644 __test__/05-case.test.js diff --git a/__test__/05-case.test.js b/__test__/05-case.test.js new file mode 100644 index 0000000..6ca65d0 --- /dev/null +++ b/__test__/05-case.test.js @@ -0,0 +1,118 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot/index') + +/** + * Falsear peticion async + * @param {*} fakeData + * @returns + */ +const fakeHTTP = async (fakeData = []) => { + await delay(5) + const data = fakeData.map((u, i) => ({ body: `${i + 1} ${u}` })) + return Promise.resolve(data) +} + +test(`[Caso - 05] Continuar Flujo (continueFlow)`, async () => { + const MOCK_VALUES = [ + '¿CUal es tu email?', + 'Continuamos....', + '¿Cual es tu edad?', + ] + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer( + MOCK_VALUES[0], + { + capture: true, + }, + async (ctx, { flowDynamic, fallBack }) => { + const validation = ctx.body.includes('@') + + if (validation) { + const getDataFromApi = await fakeHTTP([ + 'Gracias por tu email se ha validado de manera correcta', + ]) + return flowDynamic(getDataFromApi) + } + return fallBack(validation) + } + ) + .addAnswer(MOCK_VALUES[1]) + .addAnswer( + MOCK_VALUES[2], + { capture: true }, + async (ctx, { flowDynamic, fallBack }) => { + if (ctx.body !== '18') { + await delay(50) + return fallBack(false, 'Ups creo que no eres mayor de edad') + } + return flowDynamic('Bien tu edad es correcta!') + } + ) + .addAnswer('Puedes pasar') + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + provider.delaySendMessage(10, 'message', { + from: '000', + body: 'this is not email value', + }) + + provider.delaySendMessage(20, 'message', { + from: '000', + body: 'test@test.com', + }) + + provider.delaySendMessage(90, 'message', { + from: '000', + body: '20', + }) + + provider.delaySendMessage(200, 'message', { + from: '000', + body: '18', + }) + + await delay(1200) + const getHistory = database.listHistory.map((i) => i.answer) + assert.is(MOCK_VALUES[0], getHistory[0]) + assert.is('this is not email value', getHistory[1]) + assert.is(MOCK_VALUES[0], getHistory[2]) + assert.is('test@test.com', getHistory[3]) + assert.is( + '1 Gracias por tu email se ha validado de manera correcta', + getHistory[4] + ) + assert.is(MOCK_VALUES[1], getHistory[5]) + assert.is(MOCK_VALUES[2], getHistory[6]) + assert.is('20', getHistory[7]) + assert.is('Ups creo que no eres mayor de edad', getHistory[8]) + assert.is('18', getHistory[9]) + assert.is('Bien tu edad es correcta!', getHistory[10]) + assert.is('Puedes pasar', getHistory[11]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index f7051b3..418fef4 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -71,8 +71,8 @@ class CoreClass { logger.log(`[handleMsg]: `, messageCtxInComming) const { body, from } = messageCtxInComming let msgToSend = [] - let fallBackFlag = false let endFlowFlag = false + let fallBackFlag = false if (this.generalArgs.blackList.includes(from)) return if (!body) return if (!body.length) return @@ -105,11 +105,23 @@ class CoreClass { return } - // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx - const sendFlow = async (messageToSend, numberOrId) => { - // [1 Paso] esto esta bien! + // 📄 Continuar con el siguiente flujo + const continueFlow = async () => { + const cotinueMessage = + this.flowClass.find(refToContinue?.ref, true) || [] + sendFlow(cotinueMessage, from, { continue: true }) + return + } + + // 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx + const sendFlow = async ( + messageToSend, + numberOrId, + options = { continue: false } + ) => { + if (!options.continue && prevMsg?.options?.capture) + await cbEveryCtx(prevMsg?.ref) - if (prevMsg?.options?.capture) await cbEveryCtx(prevMsg?.ref) const queue = [] for (const ctxMessage of messageToSend) { if (endFlowFlag) return @@ -127,11 +139,13 @@ class CoreClass { } // 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje - const fallBack = async () => { - fallBackFlag = true - await this.sendProviderAndSave(from, refToContinue) + const fallBack = async (next = false, message = null) => { QueuePrincipal.queue = [] - return refToContinue + if (next) return continueFlow() + return this.sendProviderAndSave(from, { + ...refToContinue, + answer: message ?? refToContinue.answer, + }) } // 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes @@ -141,8 +155,7 @@ class CoreClass { listMsg = [], optListMsg = { limit: 5, fallback: false } ) => { - if (!Array.isArray(listMsg)) - throw new Error('Esto debe ser un ARRAY') + if (!Array.isArray(listMsg)) listMsg = [listMsg] fallBackFlag = optListMsg.fallback const parseListMsg = listMsg @@ -165,7 +178,7 @@ class CoreClass { for (const msg of parseListMsg) { await this.sendProviderAndSave(from, msg) } - return + return continueFlow() } // 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback @@ -181,11 +194,12 @@ class CoreClass { fallBack, flowDynamic, endFlow, + continueFlow, }) } // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa - if (!fallBackFlag && prevMsg?.options?.nested?.length) { + if (prevMsg?.options?.nested?.length) { const nestedRef = prevMsg.options.nested const flowStandalone = nestedRef.map((f) => ({ ...nestedRef.find((r) => r.refSerialize === f.refSerialize), @@ -197,12 +211,11 @@ class CoreClass { return } - // 📄🤘(tiene return) [options: capture (boolean)]: Si se tiene option boolean - if (!fallBackFlag && !prevMsg?.options?.nested?.length) { + // 📄🤘(tiene return) Si el mensaje previo implementa capture + if (!prevMsg?.options?.nested?.length) { const typeCapture = typeof prevMsg?.options?.capture - const valueCapture = prevMsg?.options?.capture - if (['string', 'boolean'].includes(typeCapture) && valueCapture) { + if (typeCapture === 'boolean' && fallBackFlag) { msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] sendFlow(msgToSend, from) return @@ -228,6 +241,7 @@ class CoreClass { } /** + * @deprecated * @private * @param {*} message * @param {*} ref diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 0cb1222..29a0c63 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -29,13 +29,16 @@ const flowPrincipal = addKeyword(['hola', 'alo']) Es importante que el número **vaya acompañado de su prefijo**, en el caso de España "34". ```js -createBot({ +createBot( + { flow: adapterFlow, provider: adapterProvider, database: adapterDB, - },{ - blackList:['34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX'] - }) + }, + { + blackList: ['34XXXXXXXXX', '34XXXXXXXXX', '34XXXXXXXXX', '34XXXXXXXXX'], + } +) ``` --- @@ -175,65 +178,74 @@ const flowString = addKeyword('hola') ``` --- + ## endFlow() -Esta funcion se utliza para finalizar un flujo con dos o más addAnswer. Un ejemplo de uso sería registrar 3 datos de un usuario en 3 preguntas distinas y +Esta funcion se utliza para finalizar un flujo con dos o más addAnswer. Un ejemplo de uso sería registrar 3 datos de un usuario en 3 preguntas distinas y que el usuario pueda finalizar por él mismo el flujo. Como podrás comprobar en el ejemplo siguiente, se puede vincular flowDynamic y todas sus funciones; como por ejemplo botones. - - ```js const flowFormulario = addKeyword(['Hola']) - -.addAnswer(['Hola!','Escriba su *Nombre* para generar su solicitud'], -{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, -async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - .addAnswer(['También necesito tus dos apellidos'], - {capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, - async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - .addAnswer(['Dejeme su número de teléfono y le llamaré lo antes posible.'], -{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, -async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - - - + .addAnswer( + ['Hola!', 'Escriba su *Nombre* para generar su solicitud'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) + .addAnswer( + ['También necesito tus dos apellidos'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) + .addAnswer( + ['Dejeme su número de teléfono y le llamaré lo antes posible.'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) ``` --- - - - - # QRPortalWeb Argumento para asignar nombre y puerto al BOT ```js -QRPortalWeb({name:BOTNAME, port:3005 }); - +QRPortalWeb({ name: BOTNAME, port: 3005 }) ``` --- - - Date: Sat, 28 Jan 2023 16:06:12 +0100 Subject: [PATCH 68/75] fix(cli): :zap: refactor fallback in child flow --- packages/bot/core/core.class.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 418fef4..b3bc15b 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -143,8 +143,8 @@ class CoreClass { QueuePrincipal.queue = [] if (next) return continueFlow() return this.sendProviderAndSave(from, { - ...refToContinue, - answer: message ?? refToContinue.answer, + ...prevMsg, + answer: message ?? prevMsg.answer, }) } From f95331d3dc70e76a3dfbe4c8d24059f0e7a164ef Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 28 Jan 2023 16:25:22 +0100 Subject: [PATCH 69/75] feat(provider): :zap: venom wweb --- package.json | 1 - packages/docs/src/routes/docs/flows/index.mdx | 98 +++++++++++-------- .../provider/src/web-whatsapp/package.json | 2 +- yarn.lock | 50 +--------- 4 files changed, 59 insertions(+), 92 deletions(-) diff --git a/package.json b/package.json index 859f059..2ad9893 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,6 @@ "eslint-config-prettier": "^8.5.0", "fs-extra": "^11.1.0", "git-cz": "^4.9.0", - "got": "11.8.3", "husky": "^8.0.2", "mime-types": "^2.1.35", "only-allow": "^1.1.1", diff --git a/packages/docs/src/routes/docs/flows/index.mdx b/packages/docs/src/routes/docs/flows/index.mdx index 0cb1222..29a0c63 100644 --- a/packages/docs/src/routes/docs/flows/index.mdx +++ b/packages/docs/src/routes/docs/flows/index.mdx @@ -29,13 +29,16 @@ const flowPrincipal = addKeyword(['hola', 'alo']) Es importante que el número **vaya acompañado de su prefijo**, en el caso de España "34". ```js -createBot({ +createBot( + { flow: adapterFlow, provider: adapterProvider, database: adapterDB, - },{ - blackList:['34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX','34XXXXXXXXX'] - }) + }, + { + blackList: ['34XXXXXXXXX', '34XXXXXXXXX', '34XXXXXXXXX', '34XXXXXXXXX'], + } +) ``` --- @@ -175,65 +178,74 @@ const flowString = addKeyword('hola') ``` --- + ## endFlow() -Esta funcion se utliza para finalizar un flujo con dos o más addAnswer. Un ejemplo de uso sería registrar 3 datos de un usuario en 3 preguntas distinas y +Esta funcion se utliza para finalizar un flujo con dos o más addAnswer. Un ejemplo de uso sería registrar 3 datos de un usuario en 3 preguntas distinas y que el usuario pueda finalizar por él mismo el flujo. Como podrás comprobar en el ejemplo siguiente, se puede vincular flowDynamic y todas sus funciones; como por ejemplo botones. - - ```js const flowFormulario = addKeyword(['Hola']) - -.addAnswer(['Hola!','Escriba su *Nombre* para generar su solicitud'], -{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, -async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - .addAnswer(['También necesito tus dos apellidos'], - {capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, - async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - .addAnswer(['Dejeme su número de teléfono y le llamaré lo antes posible.'], -{capture: true,buttons:[{body:'❌ Cancelar solicitud'}]}, -async (ctx,{flowDynamic, endFlow})=>{ - if(ctx.body == '❌ Cancelar solicitud'){ - await flowDynamic([{body: "❌ *Su solicitud de cita ha sido cancelada* ❌", buttons:[{body:'⬅️ Volver al Inicio'}]}]) - return endFlow() - } - }) - - - + .addAnswer( + ['Hola!', 'Escriba su *Nombre* para generar su solicitud'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) + .addAnswer( + ['También necesito tus dos apellidos'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) + .addAnswer( + ['Dejeme su número de teléfono y le llamaré lo antes posible.'], + { capture: true, buttons: [{ body: '❌ Cancelar solicitud' }] }, + async (ctx, { flowDynamic, endFlow }) => { + if (ctx.body == '❌ Cancelar solicitud') { + await flowDynamic([ + { + body: '❌ *Su solicitud de cita ha sido cancelada* ❌', + buttons: [{ body: '⬅️ Volver al Inicio' }], + }, + ]) + return endFlow() + } + } + ) ``` --- - - - - # QRPortalWeb Argumento para asignar nombre y puerto al BOT ```js -QRPortalWeb({name:BOTNAME, port:3005 }); - +QRPortalWeb({ name: BOTNAME, port: 3005 }) ``` --- - - Date: Sat, 28 Jan 2023 16:44:30 +0100 Subject: [PATCH 70/75] feat(provider): :zap: venom wweb --- packages/bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bot/package.json b/packages/bot/package.json index fe542c1..30211e4 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.73-alpha.0", + "version": "0.0.84-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { From 1c66f178a56d284bb8cb9df5ca17685c7e5d1ddd Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sat, 28 Jan 2023 18:41:58 +0100 Subject: [PATCH 71/75] fix(cli): :zap: endflow --- __test__/06-case.test.js | 111 ++++++++++++++++++++++++++++++++ packages/bot/core/core.class.js | 11 +++- packages/bot/package.json | 2 +- 3 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 __test__/06-case.test.js diff --git a/__test__/06-case.test.js b/__test__/06-case.test.js new file mode 100644 index 0000000..c68679e --- /dev/null +++ b/__test__/06-case.test.js @@ -0,0 +1,111 @@ +const { test } = require('uvu') +const assert = require('uvu/assert') +const MOCK_DB = require('../packages/database/src/mock') +const PROVIDER_DB = require('../packages/provider/src/mock') +const { + addKeyword, + createBot, + createFlow, + createProvider, +} = require('../packages/bot/index') + +/** + * Falsear peticion async + * @param {*} fakeData + * @returns + */ +const fakeHTTP = async (fakeData = []) => { + await delay(5) + const data = fakeData.map((u, i) => ({ body: `${i + 1} ${u}` })) + return Promise.resolve(data) +} + +test(`[Caso - 06] Finalizar Flujo (endFlow)`, async () => { + const MOCK_VALUES = [ + '¿CUal es tu email?', + 'Continuamos....', + '¿Cual es tu edad?', + ] + const provider = createProvider(PROVIDER_DB) + const database = new MOCK_DB() + + const flujoPrincipal = addKeyword(['hola']) + .addAnswer( + MOCK_VALUES[0], + { + capture: true, + }, + async (ctx, { flowDynamic, fallBack }) => { + const validation = ctx.body.includes('@') + + if (validation) { + const getDataFromApi = await fakeHTTP([ + 'Gracias por tu email se ha validado de manera correcta', + ]) + return flowDynamic(getDataFromApi) + } + return fallBack(validation) + } + ) + .addAnswer(MOCK_VALUES[1], null, async (_, { endFlow }) => { + return endFlow() + }) + .addAnswer( + MOCK_VALUES[2], + { capture: true }, + async (ctx, { flowDynamic, fallBack }) => { + if (ctx.body !== '18') { + await delay(50) + return fallBack(false, 'Ups creo que no eres mayor de edad') + } + return flowDynamic('Bien tu edad es correcta!') + } + ) + .addAnswer('Puedes pasar') + + createBot({ + database, + flow: createFlow([flujoPrincipal]), + provider, + }) + + provider.delaySendMessage(0, 'message', { + from: '000', + body: 'hola', + }) + + provider.delaySendMessage(10, 'message', { + from: '000', + body: 'this is not email value', + }) + + provider.delaySendMessage(20, 'message', { + from: '000', + body: 'test@test.com', + }) + + provider.delaySendMessage(90, 'message', { + from: '000', + body: '20', + }) + + await delay(1200) + const getHistory = database.listHistory.map((i) => i.answer) + assert.is(MOCK_VALUES[0], getHistory[0]) + assert.is('this is not email value', getHistory[1]) + assert.is(MOCK_VALUES[0], getHistory[2]) + assert.is('test@test.com', getHistory[3]) + assert.is( + '1 Gracias por tu email se ha validado de manera correcta', + getHistory[4] + ) + assert.is(MOCK_VALUES[1], getHistory[5]) + assert.is('20', getHistory[6]) + assert.is(undefined, getHistory[7]) +}) + +test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index b3bc15b..90340e6 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -98,10 +98,15 @@ class CoreClass { } // 📄 Finalizar flujo - const endFlow = async () => { + const endFlow = async (message = null) => { prevMsg = null endFlowFlag = true clearQueue() + if (message) + this.sendProviderAndSave(from, { + ...prevMsg, + answer: message ?? prevMsg.answer, + }) return } @@ -199,7 +204,7 @@ class CoreClass { } // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa - if (prevMsg?.options?.nested?.length) { + if (!endFlowFlag && prevMsg?.options?.nested?.length) { const nestedRef = prevMsg.options.nested const flowStandalone = nestedRef.map((f) => ({ ...nestedRef.find((r) => r.refSerialize === f.refSerialize), @@ -212,7 +217,7 @@ class CoreClass { } // 📄🤘(tiene return) Si el mensaje previo implementa capture - if (!prevMsg?.options?.nested?.length) { + if (!endFlowFlag && !prevMsg?.options?.nested?.length) { const typeCapture = typeof prevMsg?.options?.capture if (typeCapture === 'boolean' && fallBackFlag) { diff --git a/packages/bot/package.json b/packages/bot/package.json index 30211e4..827194b 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.84-alpha.0", + "version": "0.0.86-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { From b655ae449e7958ea940d8cc3c678fd66f60b6385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leifer=20Jes=C3=BAs=20Mendez?= Date: Sun, 29 Jan 2023 12:46:31 +0100 Subject: [PATCH 72/75] fix(bot): :fire: endFlow with ctx --- packages/bot/core/core.class.js | 48 ++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index b3bc15b..9ddf444 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -91,6 +91,25 @@ class CoreClass { this.databaseClass.save(ctxByNumber) } + // 📄 Crar CTX de mensaje (uso private) + const createCtxMessage = (payload = {}, index = 0) => { + const body = + typeof payload === 'string' + ? payload + : payload?.body ?? payload?.answer + const media = payload?.media ?? null + const buttons = payload?.buttons ?? [] + const capture = payload?.capture ?? false + + return toCtx({ + body, + from, + keyword: null, + index, + options: { media, buttons, capture }, + }) + } + // 📄 Limpiar cola de procesos const clearQueue = () => { QueuePrincipal.pendingPromise = false @@ -98,9 +117,12 @@ class CoreClass { } // 📄 Finalizar flujo - const endFlow = async () => { + const endFlow = async (message = null) => { prevMsg = null endFlowFlag = true + if (message) + this.sendProviderAndSave(from, createCtxMessage(message)) + clearQueue() return } @@ -151,28 +173,12 @@ class CoreClass { // 📄 [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: 5, fallback: false } - ) => { + const flowDynamic = async (listMsg = []) => { if (!Array.isArray(listMsg)) listMsg = [listMsg] - fallBackFlag = optListMsg.fallback - const parseListMsg = listMsg - .map((opt, index) => { - const body = typeof opt === 'string' ? opt : opt.body - const media = opt?.media ?? null - const buttons = opt?.buttons ?? [] - - return toCtx({ - body, - from, - keyword: null, - index, - options: { media, buttons }, - }) - }) - .slice(0, optListMsg.limit) + const parseListMsg = listMsg.map((opt, index) => + createCtxMessage(opt, index) + ) if (endFlowFlag) return for (const msg of parseListMsg) { From f6114affadfbc324536a86167d1fdfe8da3c8de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leifer=20Jes=C3=BAs=20Mendez?= Date: Sun, 29 Jan 2023 13:39:09 +0100 Subject: [PATCH 73/75] fix(bot): :fire: endFlow with ctx --- packages/bot/core/core.class.js | 9 ++++++++- packages/bot/package.json | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index 9ddf444..60644a5 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -166,7 +166,14 @@ class CoreClass { if (next) return continueFlow() return this.sendProviderAndSave(from, { ...prevMsg, - answer: message ?? prevMsg.answer, + answer: + typeof message === 'string' + ? message + : message?.body ?? prevMsg.answer, + options: { + ...prevMsg.options, + buttons: message?.buttons ?? prevMsg.options?.buttons, + }, }) } diff --git a/packages/bot/package.json b/packages/bot/package.json index 30211e4..5d2dc0c 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/bot", - "version": "0.0.84-alpha.0", + "version": "0.0.89-alpha.0", "description": "", "main": "./lib/bundle.bot.cjs", "scripts": { From f7d90efc2f48dad8fed3cbd21b2578ad296c2bd6 Mon Sep 17 00:00:00 2001 From: Leifer Mendez Date: Sun, 29 Jan 2023 18:33:32 +0100 Subject: [PATCH 74/75] chore(release): 0.1.19 --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b39939..d0bdbfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,36 @@ 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.19](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.18...v0.1.19) (2023-01-29) + + +### Features + +* :fire: bailey add media ([eab39e4](https://github.com/leifermendez/bot-whatsapp/commit/eab39e4ac06fd46f1a4671f8c15d1456b4400b97)) +* :zap: more feature ([e19c3a2](https://github.com/leifermendez/bot-whatsapp/commit/e19c3a25a40259c74b4add9635af4844907eed26)) +* **provider:** :rocket: fix issues in providers venom and wwebjs ([cbe438b](https://github.com/leifermendez/bot-whatsapp/commit/cbe438b77854e8df48b9dafaf7a837d21124ac5f)) +* **provider:** :rocket: fix provider ([0ad4c58](https://github.com/leifermendez/bot-whatsapp/commit/0ad4c58457b548dc41c0f9e8470d59c48de7b95a)) +* **provider:** :rocket: fix provider ([f8c7184](https://github.com/leifermendez/bot-whatsapp/commit/f8c7184487065443ab10f77aaf585e8bd63ca441)) +* **provider:** :rocket: fix provider ([b2afa45](https://github.com/leifermendez/bot-whatsapp/commit/b2afa45352a7ab1f5d9775f3c1fde475bd8ca204)) +* **provider:** :rocket: fix provider venom and wwebjs ([dcb0566](https://github.com/leifermendez/bot-whatsapp/commit/dcb0566d2bc3da40cd0c71554bb5ea0ec115d9ca)) +* **provider:** :rocket: implements all send media to venom provider ([9dd7c02](https://github.com/leifermendez/bot-whatsapp/commit/9dd7c02b6a5474aff063f7d6be0ca8519504b93c)) +* **provider:** :rocket: send file wwebjs ([6ff1a3a](https://github.com/leifermendez/bot-whatsapp/commit/6ff1a3a980196c01c66ed04ee07d0e7e57256504)) +* **provider:** :zap: bailey add send file video audio ([14d1a61](https://github.com/leifermendez/bot-whatsapp/commit/14d1a61fa259c09135c37c55bd79e97c9c8367e4)) +* **provider:** :zap: venom wweb ([fd2847a](https://github.com/leifermendez/bot-whatsapp/commit/fd2847aea0db17a0bdf33b5bca67a4cb8db2da16)) +* **provider:** :zap: venom wweb ([f95331d](https://github.com/leifermendez/bot-whatsapp/commit/f95331d3dc70e76a3dfbe4c8d24059f0e7a164ef)) +* **provider:** 🚀 implements all send media to venom provider ([bd7d150](https://github.com/leifermendez/bot-whatsapp/commit/bd7d150c047af41fdbb47f0a50a21e82cd79ee85)) + + +### Bug Fixes + +* **bot:** :fire: endFlow with ctx ([f6114af](https://github.com/leifermendez/bot-whatsapp/commit/f6114affadfbc324536a86167d1fdfe8da3c8de6)) +* **bot:** :fire: endFlow with ctx ([b655ae4](https://github.com/leifermendez/bot-whatsapp/commit/b655ae449e7958ea940d8cc3c678fd66f60b6385)) +* **bot:** :zap: endFlow butons ([87a4203](https://github.com/leifermendez/bot-whatsapp/commit/87a4203cd5b88f566387a76d586248e4265d6e4e)) +* **bot:** :zap: fix fallback refactor ([e22780d](https://github.com/leifermendez/bot-whatsapp/commit/e22780d3faba94f71a70f1f201a20690608fa5bf)) +* **cli:** :zap: endflow ([1c66f17](https://github.com/leifermendez/bot-whatsapp/commit/1c66f178a56d284bb8cb9df5ca17685c7e5d1ddd)) +* **cli:** :zap: refactor fallback in child flow ([b33e346](https://github.com/leifermendez/bot-whatsapp/commit/b33e34692d3abcb6874308a9be79f74be4a2c3a8)) +* **cli:** :zap: refactor fallback in child flow ([8da4b20](https://github.com/leifermendez/bot-whatsapp/commit/8da4b204b41125b5d0fa0aee4fa87c1f5faf5568)) + ### [0.1.18](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.17...v0.1.18) (2023-01-24) diff --git a/package.json b/package.json index 2ad9893..30e3cf4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bot-whatsapp/root", - "version": "0.1.18", + "version": "0.1.19", "description": "Bot de wahtsapp open source para MVP o pequeños negocios", "main": "app.js", "private": true, From 331d2a309c3377342c8e7d9519c19e9456a4f78c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 Feb 2023 09:10:57 +0000 Subject: [PATCH 75/75] docs(contributor): contrib-readme-action has updated readme --- README.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 777209f..ce15a85 100644 --- a/README.md +++ b/README.md @@ -112,14 +112,35 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación. Null
+ + devrlbusiness +
+ Developer RL Business +
+
+ + Gregoriotecnico +
+ Null +
+
jlferrete
Jose Luis Ferrete Olarte
-
+ + lisandroprada +
+ Null +
+
6rak0 @@ -140,7 +161,8 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
Rodrigo Mendoza Cabrera
-
yond1994