Compare commits

...

496 Commits

Author SHA1 Message Date
8067c91904 Merge branch 'codigoencasa:dev' into dev 2023-02-18 12:52:19 -06:00
Leifer Mendez
420be044f1 Merge pull request #636 from codigoencasa/wwebjs-patch-lastest
update wwejs package json
2023-02-16 19:34:17 +01:00
aurik3
7e599bf9d0 update wwejs package json
update wwejs package
2023-02-16 13:31:55 -05:00
Leifer Mendez
8d46862b0d Merge branch 'dev' of github.com:codigoencasa/bot-whatsapp into dev 2023-02-14 17:43:06 +01:00
Leifer Mendez
4d0d455865 Merge pull request #634 from jcdevsoft/dev
bug wweb 1.19.2 to 1.19.4 fix queryExists to queryWidExists by @shirs…
2023-02-14 15:24:11 +01:00
Leifer Mendez
565f995c24 Merge pull request #634 from jcdevsoft/dev
bug wweb 1.19.2 to 1.19.4 fix queryExists to queryWidExists by @shirs…
2023-02-14 09:23:47 +01:00
ac7c56694a Merge branch 'codigoencasa:dev' into dev 2023-02-13 20:25:23 -06:00
jcdevsoft
b3680bd363 bug wweb 1.19.2 to 1.19.4 fix queryExists to queryWidExists by @shirser121 in #1987, Fixing the queryWidExists function by @tofers in #1989, Fix mute chat by @tofers in #1982, Update WhatsApp Web Version (2.2306.7) by @github-actions in # #1954 2023-02-13 00:30:15 -06:00
Leifer Mendez
eb79505c19 Merge pull request #632 from codigoencasa/release/production
Release/production
2023-02-12 22:22:16 +01:00
Leifer Mendez
1c602ff955 chore(release): 0.1.22
chore(release): 0.1.22
2023-02-12 22:17:33 +01:00
Leifer Mendez
ce066c3922 chore(release): 0.1.21
chore(release): 0.1.21
2023-02-12 22:16:32 +01:00
Leifer Mendez
647d6afd4b Merge branch 'release/next' into dev 2023-02-12 22:16:25 +01:00
Leifer Mendez
e26040f4ce chore(release): 0.1.21 2023-02-12 22:15:38 +01:00
Leifer Mendez
9a7f113d66 chore(release): 0.1.21 2023-02-12 22:15:04 +01:00
Leifer Mendez
1eb0403529 Merge pull request #627 from codigoencasa/fix/json-refactor
test:  ci test e2e
2023-02-10 21:46:59 +01:00
Leifer Mendez
2c20d47c53 test: ci test e2e 2023-02-10 21:15:28 +01:00
Leifer Mendez
b158e50824 test: ci test e2e 2023-02-10 21:08:29 +01:00
Leifer Mendez
104cde012c perf(adapter): 🐛 database json and lot tests
perf(adapter): 🐛 database json and lot tests
2023-02-10 20:59:36 +01:00
Leifer Mendez
8609c30c89 perf(adapter): 🐛 database json and lot tests 2023-02-10 20:57:31 +01:00
Leifer Mendez
856165e7a5 ci: remove stuff 2023-02-10 11:48:03 +01:00
Leifer Mendez
bd9093956a Merge pull request #556 from DiegoAlonso27/main
fix: arreglando dir y varios mensajes en dialog flow essential
2023-02-10 11:42:44 +01:00
Leifer Mendez
2f07d86fb9 Update dialogflow.class.js 2023-02-10 11:39:19 +01:00
Leifer Mendez
64cea7f050 Merge branch 'dev' into main 2023-02-10 11:38:07 +01:00
Leifer Mendez
405d73af04 Merge pull request #623 from jcdevsoft/dev
@jcdevsoft gracias por la implementación
2023-02-10 11:36:20 +01:00
Leifer Mendez
bea38cff3b Merge pull request #624 from codigoencasa/fix/callback-01
@Zamphiropolos excelente trabajo
2023-02-10 11:27:26 +01:00
Leifer Mendez
a147677a26 feat(provider): support location � 2023-02-10 11:17:49 +01:00
Leifer Mendez
2b2b4ef2ee Merge branch 'dev' into fix/callback-01 2023-02-10 09:01:35 +01:00
Leifer Mendez
c7de860803 feat(provider): add location provider
feat(provider):  add location provider
2023-02-10 08:59:40 +01:00
jcdevsoft
6933fed395 Se agrega variable para puerto de mysql, para configurar en caso de que no sea el que trae por defecto 2023-02-09 22:27:13 -06:00
Zamphi
a46a9efd8d feat(provider): 🐛 add_location 2023-02-09 19:27:05 -03:00
Leifer Mendez
b343204040 Merge pull request #622 from codigoencasa/dev
Dev
2023-02-09 21:00:25 +01:00
Leifer Mendez
ba2ed54405 Merge branch 'release/next' into dev 2023-02-09 21:00:17 +01:00
Leifer Mendez
b558afb3f9 refactor(bot): 🚑 flowDynamic, fallBack and a lot test
refactor(bot): 🚑 flowDynamic, fallBack
2023-02-09 20:55:28 +01:00
Leifer Mendez
c9a6350f42 test: 🔥 a lot test e2e 2023-02-09 20:54:26 +01:00
Leifer Mendez
6f7808c167 test: 🔥 a lot test e2e 2023-02-09 20:48:23 +01:00
Leifer Mendez
b238752df1 Actualización de función endFlow()
Actualización de función endFlow()
2023-02-09 17:17:48 +01:00
Leifer Mendez
a88b01e69f refactor: 🚸 rm workflow 2023-02-09 17:17:10 +01:00
Leifer Mendez
31a42ddcad test: 🎨 a lot test 2023-02-09 17:10:54 +01:00
Leifer Mendez
dda59fa93b test: a lot test 2023-02-09 15:09:52 +01:00
d2bcf4cc0e Merge branch 'codigoencasa:dev' into dev 2023-02-09 05:12:19 -06:00
Leifer Mendez
14ee9eea89 Merge pull request #620 from codigoencasa/dev
Dev
2023-02-08 22:17:51 +01:00
Leifer Mendez
cfc5309e52 Merge pull request #617 from codigoencasa/feat/provider-raw
Feat/provider raw
2023-02-08 22:17:08 +01:00
Leifer Mendez
af803415e3 refactor(bot): 🚑 flowDynamic, fallBack 2023-02-08 22:10:17 +01:00
Zamphi
c0ece6feb2 feat(provider): add location provider 2023-02-08 17:50:21 -03:00
aurik3
2278149295 feat(provider): 🚀 feat Instance provider 2023-02-08 14:38:04 -05:00
aurik3
2d44a002ff feat(provider): 🚀 provider raw 2023-02-08 13:21:55 -05:00
Leifer Mendez
652d0ef2c3 chore(release): 0.1.21
chore(release): 0.1.21
2023-02-05 15:09:55 +01:00
Leifer Mendez
9a63fa54e1 chore(release): 0.1.21
chore(release): 0.1.21
2023-02-05 15:06:27 +01:00
Leifer Mendez
0b6729c6ad chore(release): 0.1.20
chore(release): 0.1.20
2023-02-05 15:03:14 +01:00
Leifer Mendez
309dd1da99 Merge branch 'release/next' into dev 2023-02-05 15:03:06 +01:00
Leifer Mendez
93bee15ab8 Merge branch 'dev' of github.com:codigoencasa/bot-whatsapp into dev 2023-02-05 15:02:17 +01:00
Leifer Mendez
276fc0cf88 chore(release): 0.1.20 2023-02-05 15:01:32 +01:00
9af15d5389 Merge branch 'codigoencasa:dev' into dev 2023-02-04 20:10:24 -06:00
Leifer Mendez
5d38cd377c Merge pull request #602 from codigoencasa/dev
Dev
2023-02-04 18:40:33 +01:00
Leifer Mendez
176f337f18 Merge branch 'release/next' into dev 2023-02-04 18:40:28 +01:00
Leifer Mendez
76ba717927 feat(provider): possible get class provider 2023-02-04 18:31:51 +01:00
Leifer Mendez
2ecc41f3f0 chore: pre-chore 2023-02-04 18:03:57 +01:00
Leifer Mendez
99b9b17f52 chore: pre-chore 2023-02-04 17:59:45 +01:00
Leifer Mendez
cd082f2350 fix(database): fix naming
fix(database): fix naming
2023-02-04 17:51:19 +01:00
Leifer Mendez
1afc3ba182 fix(database): fix naming 2023-02-04 17:50:11 +01:00
Leifer Mendez
8b79e4e616 Merge pull request #600 from codigoencasa/fix/dev
fix(database): fix naming
2023-02-04 17:46:06 +01:00
Leifer Mendez
c9831d202a fix(database): fix naming 2023-02-04 17:39:34 +01:00
Leifer Mendez
9311aa0a65 fix(database): add support emoji in mysql
Modificacion de centencia sql
2023-02-04 17:08:35 +01:00
Leifer Jesús Mendez
e34560c77d feat(cli): 🔥 add regex expression in addKeyworkd 2023-02-04 17:01:10 +01:00
Zamphi
d220f2c622 Modificacion de centencia sql
Se agregó CHARACTER SET utf8mb4 COLLATE utf8mb4_General_ci al final de la sentencia SQL para especificar el conjunto de caracteres y la collación para la tabla. Este conjunto de caracteres y collación permitirán que la tabla almacene una amplia gama de caracteres y símbolos, y determine cómo se comparan y ordenan.
2023-02-04 12:38:16 -03:00
Leifer Jesús Mendez
c0113ca492 fix(cli): working flowDynamic test 2023-02-03 19:32:04 +01:00
Leifer Jesús Mendez
aef52d2694 fix(cli): working flowDynamic test 2023-02-03 19:26:00 +01:00
Leifer Mendez
f76932021c fix(cli): working flowDynamic test 2023-02-03 18:17:46 +01:00
5b1f070a53 Merge branch 'codigoencasa:dev' into dev 2023-02-03 09:10:31 -06:00
Leifer Mendez
23e09efaec fix(cli): working flowDynamic test 2023-02-03 15:46:07 +01:00
Leifer Mendez
96c2bffd09 fix(provider): baily wa.link 2023-02-03 13:37:21 +01:00
Leifer Mendez
c3a4162ff6 Merge branch 'feat/docs-digitalocean' into feat/queue-by-id 2023-02-03 11:02:51 +01:00
Leifer Mendez
186c48d884 Merge pull request #595 from codigoencasa/dev
Dev
2023-02-03 10:59:35 +01:00
Leifer Mendez
bb31045a95 Merge pull request #594 from codigoencasa/feat/docs-digitalocean
Feat/docs-digitalocean
2023-02-03 10:53:54 +01:00
Leifer Mendez
74fb3b864d docs: digitalocean sponsor 2023-02-03 10:39:17 +01:00
Leifer Mendez
88c05c12a4 docs: digitalocean sponsor 2023-02-03 10:24:48 +01:00
Leifer Mendez
5260a7eb47 Merge branch 'contributors-readme-action-2AwvRwXk2x' 2023-02-03 10:20:02 +01:00
Leifer Mendez
9e1698b729 docs: digitalocean sponsor 2023-02-03 10:19:10 +01:00
Leifer Mendez
811618b256 docs: digitalocean sponsor 2023-02-03 10:12:45 +01:00
github-actions[bot]
331d2a309c docs(contributor): contrib-readme-action has updated readme 2023-02-02 09:10:57 +00:00
Leifer Mendez
c655c48009 refactor(bot): working fallBack 2023-02-01 16:58:10 +01:00
Leifer Mendez
ebd30ea1d7 refactor(cli): flowDynamic 2023-02-01 16:34:24 +01:00
Leifer Mendez
0f8a33cc0c refactor(cli): flowDynamic 2023-02-01 16:33:57 +01:00
Leifer Mendez
85b2d13290 Merge pull request #586 from codigoencasa/dev
Dev
2023-01-31 16:01:36 +01:00
Leifer Mendez
318ac3adec Merge pull request #585 from Jhonarias13/fix/caption-sendImage
corrige caption 'soy una imagen' en el método sendImage() con whatsapp web provider
@Jhonarias13 gracias buen trabajo
2023-01-31 16:00:31 +01:00
Jhonarias13
0a69b8d9b5 corrige caption 'soy una imagen' en sendImage() wwebprovider 2023-01-31 09:35:02 -05:00
Leifer Mendez
f434d6a101 chore(release): 0.1.20
chore(release): 0.1.20
2023-01-29 18:44:19 +01:00
Leifer Mendez
753d80b93e chore(release): 0.1.20
chore(release): 0.1.20
2023-01-29 18:39:07 +01:00
Leifer Mendez
c07e148dfd Merge pull request #578 from codigoencasa/dev
chore(release): 0.1.20
2023-01-29 18:35:48 +01:00
Leifer Mendez
3f30a1cb51 Merge branch 'release/next' into dev 2023-01-29 18:35:42 +01:00
Leifer Mendez
9b679192db Merge pull request #577 from codigoencasa/fix/end-flow
chore(release): 0.1.20
2023-01-29 18:35:08 +01:00
Leifer Mendez
f7d90efc2f chore(release): 0.1.19 2023-01-29 18:33:32 +01:00
Gregoriotecnico
de5de37d65 Actualización de función endFlow() 2023-01-29 15:09:15 +01:00
Leifer Mendez
0aa793e08c Merge pull request #575 from codigoencasa/dev
Dev
2023-01-29 14:55:31 +01:00
Leifer Mendez
eeb4bb305e Merge branch 'release/next' into dev 2023-01-29 14:54:54 +01:00
Leifer Mendez
012d43847c Merge pull request #574 from codigoencasa/fix/end-flow
Fix/end flow
2023-01-29 14:07:29 +01:00
Leifer Mendez
87a4203cd5 fix(bot): endFlow butons 2023-01-29 14:06:23 +01:00
Leifer Jesús Mendez
f6114affad fix(bot): 🔥 endFlow with ctx 2023-01-29 13:39:09 +01:00
Leifer Mendez
15b64185cb Merge commit 'b655ae449e7958ea940d8cc3c678fd66f60b6385' into fix/end-flow 2023-01-29 12:48:50 +01:00
Leifer Jesús Mendez
b655ae449e fix(bot): 🔥 endFlow with ctx 2023-01-29 12:46:31 +01:00
Leifer Mendez
1c66f178a5 fix(cli): endflow 2023-01-28 18:41:58 +01:00
Leifer Mendez
f201c5097b Merge pull request #570 from codigoencasa/545-cuando-se-activa-fallback-dentro-de-un-addanswer-con-capture-true-no-espera-el-capture-true-y-se-salta-al-siguiente-addanswer
fix(cli):  refactor fallback in child flow
2023-01-28 16:53:52 +01:00
Leifer Mendez
b33e34692d fix(cli): refactor fallback in child flow 2023-01-28 16:46:46 +01:00
Leifer Mendez
8f967578c6 Merge branch 'fix/send-media-all' into 545-cuando-se-activa-fallback-dentro-de-un-addanswer-con-capture-true-no-espera-el-capture-true-y-se-salta-al-siguiente-addanswer 2023-01-28 16:44:39 +01:00
Leifer Mendez
fd2847aea0 feat(provider): venom wweb 2023-01-28 16:44:30 +01:00
Leifer Mendez
f95331d3dc feat(provider): venom wweb 2023-01-28 16:25:22 +01:00
Leifer Mendez
791ab8e970 Merge pull request #566 from codigoencasa/feat/send-media-wwebjs
feat(provider): 🚀 send file wwebjs
2023-01-28 16:12:12 +01:00
Leifer Mendez
880c729199 Merge commit '8da4b204b41125b5d0fa0aee4fa87c1f5faf5568' into 545-cuando-se-activa-fallback-dentro-de-un-addanswer-con-capture-true-no-espera-el-capture-true-y-se-salta-al-siguiente-addanswer 2023-01-28 16:07:16 +01:00
Leifer Jesús Mendez
8da4b204b4 fix(cli): refactor fallback in child flow 2023-01-28 16:06:12 +01:00
Leifer Mendez
3fdd49ff86 Merge pull request #568 from codigoencasa/fix/fallback-issue
fix(bot):  fix fallback refactor
2023-01-28 15:47:03 +01:00
Leifer Jesús Mendez
e22780d3fa fix(bot): fix fallback refactor 2023-01-28 15:46:13 +01:00
aurik3
0ad4c58457 feat(provider): 🚀 fix provider 2023-01-27 14:51:20 -05:00
aurik3
f8c7184487 feat(provider): 🚀 fix provider 2023-01-27 14:42:45 -05:00
aurik3
b2afa45352 feat(provider): 🚀 fix provider 2023-01-27 14:32:42 -05:00
aurik3
dcb0566d2b feat(provider): 🚀 fix provider venom and wwebjs 2023-01-27 14:31:05 -05:00
aurik3
cbe438b778 feat(provider): 🚀 fix issues in providers venom and wwebjs 2023-01-27 14:28:25 -05:00
aurik3
6ff1a3a980 feat(provider): 🚀 send file wwebjs 2023-01-27 12:51:15 -05:00
Leifer Mendez
dceb13f4f5 Merge pull request #563 from codigoencasa/dev
Dev
2023-01-25 22:13:48 +01:00
Leifer Mendez
bbbdb1c206 Merge branch 'release/next' into dev 2023-01-25 22:13:39 +01:00
Leifer Mendez
bd7d150c04 feat(provider): 🚀 implements all send media to venom provider
Muchas gracias @aurik3
2023-01-25 22:11:59 +01:00
aurik3
9dd7c02b6a feat(provider): 🚀 implements all send media to venom provider 2023-01-25 16:10:13 -05:00
Leifer Mendez
11a74b8bea Merge pull request #561 from lisandroprada/patch-2
muchas gracias @lisandroprada
2023-01-25 12:44:23 +01:00
lisandroprada
e7a8e85ead Update index.mdx
Agregado: Definición de la constante BOTNAME.
2023-01-25 08:21:12 -03:00
Leifer Mendez
6bfbae7b94 Merge pull request #559 from codigoencasa/dev
Dev
2023-01-25 09:33:32 +01:00
Leifer Mendez
d5d7f9dfee Merge branch 'release/next' into dev 2023-01-25 09:30:42 +01:00
Leifer Mendez
0a23d2c761 Merge pull request #558 from codigoencasa:feat/docs-modal-fix
docs: 🐛 fix modal
2023-01-25 09:06:00 +01:00
Leifer Mendez
b2feaea588 docs: 🐛 fix modal 2023-01-25 09:05:01 +01:00
DiegoAlonso27
01c7db8fe7 fix: arreglando dir y varios mensajes en dialog flow essential 2023-01-25 00:23:47 -05:00
d87dc3c188 Merge branch 'codigoencasa:dev' into dev 2023-01-24 19:15:43 -06:00
Leifer Mendez
7e2bf22d63 Merge pull request #554 from codigoencasa/release/production
Release/production
2023-01-24 23:00:48 +01:00
Leifer Mendez
a4b610e21f Merge pull request #553 from codigoencasa/release/next
Release/next
2023-01-24 23:00:25 +01:00
Leifer Mendez
120520df50 Merge pull request #552 from codigoencasa/dev
Dev
2023-01-24 22:52:28 +01:00
Leifer Mendez
1551aafd54 Merge branch 'release/next' into dev 2023-01-24 22:52:21 +01:00
Leifer Mendez
eca876db9c Merge pull request #551 from codigoencasa/feat/test-e2e
Feat/test e2e
2023-01-24 22:52:00 +01:00
Leifer Mendez
96a387ed50 Merge branch 'feat/test-e2e' of github.com:codigoencasa/bot-whatsapp into feat/test-e2e 2023-01-24 22:51:08 +01:00
Leifer Mendez
558013b2b4 docs: 📝 add 2023-01-24 22:50:59 +01:00
Leifer Mendez
58df7ddc71 Merge pull request #546 from Gregoriotecnico/patch-1
Adición de endFlow()
2023-01-24 22:47:58 +01:00
Leifer Mendez
e25f3abf1c Merge pull request #547 from Gregoriotecnico/patch-2
Adición blackList a la Documentación
2023-01-24 22:47:35 +01:00
Leifer Mendez
0f6b82a9ab Merge pull request #549 from codigoencasa/feat/test-e2e
Feat/test e2e
2023-01-24 22:46:27 +01:00
Leifer Mendez
8f505bdb2b Merge branch 'release/next' into feat/test-e2e 2023-01-24 22:45:48 +01:00
Leifer Mendez
24220822f4 chore(release): 0.1.18 2023-01-24 22:44:24 +01:00
Leifer Mendez
14d1a61fa2 feat(provider): bailey add send file video audio 2023-01-24 22:14:55 +01:00
Gregoriotecnico
943fe8698c Adición blackList 2023-01-24 21:55:11 +01:00
Gregoriotecnico
371b403456 Adición de endFlow() 2023-01-24 21:38:38 +01:00
Leifer Mendez
e19c3a25a4 feat: more feature 2023-01-24 19:43:11 +01:00
Leifer Mendez
eab39e4ac0 feat: 🔥 bailey add media 2023-01-24 16:54:31 +01:00
Leifer Mendez
77145bcc54 docs: 🎨 modal added 2023-01-24 14:22:33 +01:00
Leifer Mendez
8f241834e8 Merge pull request #543 from codigoencasa/contributors-readme-action-gll8X6WZnt
docs(contributor): contributors readme action update
2023-01-24 10:14:49 +01:00
github-actions[bot]
5174c6b3bb docs(contributor): contrib-readme-action has updated readme 2023-01-24 09:10:45 +00:00
d9639c8e8d Merge branch 'codigoencasa:dev' into dev 2023-01-23 21:58:16 -06:00
Leifer Mendez
f3ed6da4ba Merge pull request #542 from lisandroprada/patch-1
Patch 1
2023-01-23 21:21:04 +01:00
Leifer Mendez
0dc839e531 Merge pull request #541 from codigoencasa/dev
Dev
2023-01-23 20:37:55 +01:00
Leifer Mendez
7475d6f8fd Merge branch 'release/next' into dev 2023-01-23 20:36:41 +01:00
Leifer Mendez
a6a33ac7b7 Merge pull request #540 from codigoencasa/feat/test-e2e
test(bot):  more test and endflow
2023-01-23 20:35:54 +01:00
lisandroprada
71c969f3e9 Update index.mdx 2023-01-23 16:34:53 -03:00
Leifer Mendez
cebfed0382 test(bot): more test and endflow 2023-01-23 20:27:55 +01:00
Leifer Mendez
e89ad450a1 Merge pull request #539 from codigoencasa/feat/test-e2e
test: 🎨 more test e2e
2023-01-23 14:41:40 +01:00
Leifer Mendez
ac39ac831c test: 🎨 more test e2e 2023-01-23 14:38:43 +01:00
Leifer Mendez
0af74602f5 test: 🎨 more test e2e 2023-01-23 13:13:41 +01:00
Leifer Mendez
767e0764d6 test: 🎨 more test e2e 2023-01-23 13:09:41 +01:00
Leifer Mendez
b2a3343f82 Merge pull request #538 from codigoencasa/dev
Dev
2023-01-23 12:05:49 +01:00
Leifer Mendez
5ddd885554 Merge pull request #537 from codigoencasa/fix/flowdynamic-buttons
feat(bot):  add blacklist
2023-01-23 12:03:22 +01:00
Leifer Mendez
7078dc4c93 feat(bot): add blacklist 2023-01-23 12:02:31 +01:00
Leifer Mendez
c7e829e954 Merge pull request #518 from devrlbusiness/patch-1
Update index.mdx
2023-01-23 11:55:01 +01:00
Leifer Mendez
5a81a77802 Merge pull request #526 from codigoencasa/506-concatenación-flowdynamic
506 concatenación flowdynamic
2023-01-23 11:54:42 +01:00
Leifer Mendez
588411653e Merge pull request #536 from codigoencasa/fix/flowdynamic-buttons
Fix/flowdynamic buttons
2023-01-23 11:54:13 +01:00
Leifer Mendez
3c4b1c0fc4 feat(bot): flowDynamic buttons, media 2023-01-23 11:52:49 +01:00
Leifer Mendez
0f06fd3e80 Merge pull request #533 from codigoencasa/leifermendez/issue524
fix(contexts): 🐛 fixed #524 issue
2023-01-23 09:19:09 +01:00
Leifer Mendez
79cc31a96f fix(contexts): 🐛 fixed #524 issue 2023-01-23 09:14:36 +01:00
Leifer Mendez
7067b4a80b fix(contexts): 🐛 fixed #524 issue 2023-01-23 09:09:16 +01:00
Leifer Mendez
aa7e4239ae Merge branch 'fix/issuess-01' into 506-concatenación-flowdynamic 2023-01-20 12:04:59 +01:00
Leifer Mendez
877252bd4a fix(bot): 🐛 flowDynamic stranger behaviour 2023-01-20 12:02:01 +01:00
Leifer Mendez
f5a7de3a00 fix(bot): 🐛 flowDynamic stranger behaviour 2023-01-20 11:58:50 +01:00
10ab7e671f Merge branch 'codigoencasa:dev' into dev 2023-01-19 21:18:55 -06:00
Leifer Mendez
c792d47344 Merge pull request #519 from devrlbusiness/patch-2
Muchs gracias @devrlbusiness
2023-01-18 10:14:34 +01:00
Developer RL Business
f6130cf0b9 Update index.mdx 2023-01-17 09:35:21 -07:00
Developer RL Business
9f9d833925 Update index.mdx 2023-01-17 09:33:59 -07:00
2631e4dcb4 Merge branch 'codigoencasa:dev' into dev 2023-01-17 09:43:53 -06:00
Leifer Mendez
02c0d8af76 Merge pull request #517 from codigoencasa/release/production
Release/production
2023-01-17 10:30:03 +01:00
Leifer Mendez
880d5323e8 Merge pull request #513 from codigoencasa/release/next
Release/next
2023-01-17 10:26:50 +01:00
Leifer Mendez
9bb33582fb Merge pull request #516 from codigoencasa/dev
Dev
2023-01-17 10:22:54 +01:00
Leifer Mendez
c8ff84e9cd Merge branch 'release/next' into dev 2023-01-17 10:21:29 +01:00
Leifer Mendez
e942bd1d5e Merge pull request #514 from codigoencasa/fix/launch-dev
Fix/launch dev
2023-01-17 10:21:00 +01:00
Leifer Mendez
7e557bdd30 Merge branch 'fix/launch-dev' of github.com:leifermendez/bot-whatsapp into fix/launch-dev 2023-01-17 10:02:23 +01:00
Leifer Mendez
fcd1a63676 chore: 🚀 launch DEV 2023-01-17 10:02:14 +01:00
Leifer Mendez
4ade5f02a7 chore: 🚀 launch DEV 2023-01-17 10:00:21 +01:00
Leifer Mendez
05c834d6b1 Merge pull request #512 from codigoencasa/fix/launch-dev
Fix/launch dev
2023-01-17 09:24:27 +01:00
Leifer Mendez
234cc3ffb6 Merge branch 'release/next' into fix/launch-dev 2023-01-17 09:24:18 +01:00
Leifer Mendez
e321f35d86 Merge branch 'fix/launch-dev' of github.com:leifermendez/bot-whatsapp into fix/launch-dev 2023-01-17 09:23:32 +01:00
Leifer Mendez
5edd755491 chore: 🚀 launch DEV 2023-01-17 09:23:22 +01:00
Leifer Mendez
10748a46a4 Merge pull request #511 from codigoencasa/fix/launch-dev
chore: 🚀 launch DEV
2023-01-17 09:19:20 +01:00
Leifer Mendez
5b3136999b Merge branch 'release/next' into fix/launch-dev 2023-01-17 09:18:33 +01:00
Leifer Mendez
cb047cca8e chore: 🚀 launch DEV 2023-01-17 09:17:32 +01:00
Leifer Mendez
4b8c09633e Merge pull request #510 from codigoencasa/dev
Dev
2023-01-17 09:13:36 +01:00
Leifer Mendez
7cabc53eed Merge branch 'release/next' into dev 2023-01-17 09:13:28 +01:00
Leifer Mendez
40c34dd7a5 Merge pull request #509 from codigoencasa:fix/launch-dev
chore: 🚀 launch DEV
2023-01-17 09:12:12 +01:00
Leifer Mendez
7e25dcaa93 chore: 🚀 launch DEV 2023-01-17 09:11:08 +01:00
Leifer Mendez
bfa622fad0 Merge pull request #508 from codigoencasa/dev
Dev
2023-01-17 09:07:13 +01:00
Leifer Mendez
e88141077f Merge branch 'release/next' into dev 2023-01-17 09:07:05 +01:00
Leifer Mendez
d743fdcfe3 Merge pull request #507 from codigoencasa/feat/docs-member
chore: 🚀 launch DEV
2023-01-17 09:06:31 +01:00
Leifer Mendez
1261580004 chore: 🚀 launch DEV 2023-01-17 09:05:29 +01:00
714718c0fc Merge branch 'codigoencasa:dev' into dev 2023-01-16 21:32:34 -06:00
Leifer Mendez
a14c67ad45 Merge pull request #505 from codigoencasa/dev
Dev
2023-01-16 17:38:30 +01:00
Leifer Mendez
c5af1f8107 Merge branch 'release/next' into dev 2023-01-16 17:38:22 +01:00
Leifer Mendez
01a4edb7e3 Merge pull request #504 from codigoencasa/feat/docs-member
fix(bot): 📝 more docs
2023-01-16 17:37:59 +01:00
Leifer Mendez
98793d0cfc fix(bot): 📝 more docs 2023-01-16 17:32:09 +01:00
Leifer Mendez
168b81315b Merge pull request #503 from codigoencasa/dev
Dev
2023-01-16 14:48:47 +01:00
Leifer Mendez
8520b09dac Merge pull request #502 from codigoencasa/feature/providers-major
chore: autopublish 2023-01-16T11:39:58Z
2023-01-16 12:43:08 +01:00
Leifer Mendez
adb0e49029 Merge pull request #501 from codigoencasa/feature/breaking-change
Feature/breaking change
2023-01-16 12:42:27 +01:00
github-actions[bot]
464dd44ce2 chore: autopublish 2023-01-16T11:39:58Z 2023-01-16 11:39:58 +00:00
Leifer Mendez
e3c94a49d7 Merge branch 'feature/breaking-change' of github.com:leifermendez/bot-whatsapp into feature/breaking-change 2023-01-16 12:38:55 +01:00
Leifer Mendez
a29b9d4e1f fix(cli): refactor 2023-01-16 12:38:47 +01:00
Leifer Mendez
e036817e84 Merge branch 'dev' into feature/breaking-change 2023-01-16 12:34:50 +01:00
Leifer Mendez
18ef4e9d72 fix(cli): refactor 2023-01-16 12:30:53 +01:00
Leifer Mendez
fe129f62fe Merge branch 'feature/providers-major' into feature/breaking-change 2023-01-16 12:28:16 +01:00
Leifer Mendez
bb6ed4a084 fix(bot): 🐛 body undefined 2023-01-16 12:20:51 +01:00
Leifer Mendez
9234cf1c5d fix(bot): 🐛 body undefined 2023-01-16 11:44:23 +01:00
Leifer Mendez
a118bbbf7f fix(bot): 🐛 body undefined 2023-01-16 11:30:36 +01:00
Leifer Mendez
f54dea52b0 fix(bot): 🐛 body undefined 2023-01-16 11:28:45 +01:00
Leifer Mendez
72e0a91050 fix(bot): 🐛 body undefined 2023-01-16 11:25:42 +01:00
Leifer Mendez
70dd4d73e8 fix(bot): 🐛 body undefined 2023-01-16 11:17:25 +01:00
Leifer Mendez
ecf0eef928 fix(bot): 🐛 body undefined 2023-01-16 11:11:33 +01:00
Leifer Mendez
345f256a1b fix(provider): wwebjs upgrade
fix(cli):  refactor
2023-01-16 11:00:32 +01:00
leifermendez
3648757fa0 fix(cli): refactor 2023-01-16 09:58:30 +00:00
Leifer Mendez
32f6a70f8f fix(cli): refactor 2023-01-16 10:56:34 +01:00
Leifer Mendez
8c825e7f6b fix(cli): refactor 2023-01-16 10:49:58 +01:00
Leifer Mendez
0c0f4375b8 fix(cli): refactor 2023-01-16 10:45:29 +01:00
Leifer Mendez
039ce5dd7c fix(cli): refactor 2023-01-16 10:41:40 +01:00
Leifer Mendez
5e879188b8 fix(cli): refactor 2023-01-16 10:36:22 +01:00
Leifer Mendez
21a7270281 fix(cli): refactor 2023-01-16 10:34:19 +01:00
Leifer Mendez
82a99b2c80 fix(cli): refactor 2023-01-16 10:12:00 +01:00
Leifer Mendez
cc19974579 fix(cli): refactor 2023-01-16 10:04:07 +01:00
Leifer Mendez
56fcb8fb72 fix(cli): refactor 2023-01-16 09:58:46 +01:00
Leifer Mendez
f36cff1eef fix(cli): refactor 2023-01-16 09:54:10 +01:00
Leifer Mendez
09fd0dd2e1 Merge pull request #497 from codigoencasa/feature/breaking-change
Feature/breaking change
2023-01-16 09:44:35 +01:00
Leifer Mendez
b393c11af6 fix(cli): refactor 2023-01-16 09:42:43 +01:00
Leifer Mendez
6683715ad6 fix(cli): refactor 2023-01-16 09:21:26 +01:00
Leifer Mendez
8cbfd560a3 ci(providers): � Check BREAKING CHANGE 2023-01-16 09:13:52 +01:00
ea5a806392 docs: env 2023-01-15 19:50:42 -06:00
6ecf97678f docs: env 2023-01-15 19:43:55 -06:00
leifermendez
e72794a296 ci(version): automatic - "${date}" updated versions every packages 2023-01-13 21:36:53 +00:00
Leifer Mendez
13e0530c01 Merge pull request #493 from codigoencasa/dev
Dev
2023-01-13 22:34:44 +01:00
Leifer Mendez
e5ee70f088 Merge branch 'release/next' into dev 2023-01-13 22:34:34 +01:00
Leifer Mendez
bb1f60c6e3 Merge pull request #492 from codigoencasa/fix/refactor-cb
Fix/refactor cb
2023-01-13 22:34:09 +01:00
Leifer Mendez
b9a1703b20 Merge branch 'dev' into fix/refactor-cb 2023-01-13 22:34:03 +01:00
Leifer Mendez
f274379c53 chore(release): 0.1.17 2023-01-13 22:32:23 +01:00
Leifer Mendez
d18efc88a9 chore: improvement cli 2023-01-13 22:31:45 +01:00
leifermendez
03b5b441de ci(version): automatic - "${date}" updated versions every packages 2023-01-13 20:42:36 +00:00
Leifer Mendez
06862abece Merge pull request #491 from codigoencasa/dev
Dev
2023-01-13 21:40:11 +01:00
Leifer Mendez
d25307dd2d Merge branch 'release/next' into dev 2023-01-13 21:40:04 +01:00
Leifer Mendez
04c5209cac Merge pull request #479 from codigoencasa/dev
Dev
2023-01-13 21:38:35 +01:00
Leifer Mendez
5362fcec7a Merge pull request #490 from codigoencasa/fix/refactor-cb
ci: 🐛 add message cli GIT
2023-01-13 21:36:55 +01:00
Leifer Mendez
2f8d5a3fb3 ci: 🐛 add message cli GIT 2023-01-13 21:34:40 +01:00
Leifer Mendez
4f32e6f2c2 Merge pull request #488 from codigoencasa/main
docs(git): added git
2023-01-13 21:28:37 +01:00
Leifer Mendez
553d7fcba9 Merge pull request #487 from cheveguerra/patch-2
docs: git como requisito e instrucciones de instalación
2023-01-13 21:27:29 +01:00
d483b91359 git como requisito e instrucciones
Se agregó Git como requisito e instrucciones para instalarlo en Windows
2023-01-13 13:41:19 -06:00
leifermendez
6aed100d96 ci(version): automatic - "${date}" updated versions every packages 2023-01-13 19:08:08 +00:00
Leifer Mendez
c8335c37c2 Merge pull request #486 from codigoencasa/dev
Dev
2023-01-13 20:06:13 +01:00
Leifer Mendez
4a7c2fe553 Merge branch 'release/next' into dev 2023-01-13 20:06:07 +01:00
Leifer Mendez
a02e373cd9 Merge pull request #485 from cheveguerra/dev
fix:  Se agregó @bot-whatsapp/portal a package.json
2023-01-13 20:05:33 +01:00
a9755da8c9 Merge branch 'dev' of https://github.com/cheveguerra/bot-whatsapp into dev 2023-01-13 11:57:57 -06:00
46a9fa6793 fix: se agrego @bot-whatsapp/portal a package.json
se agrego @bot-whatsapp/portal a package.json
2023-01-13 11:57:42 -06:00
Leifer Mendez
4ee1136115 Merge pull request #481 from codigoencasa/release/production
Release/production
2023-01-12 21:47:07 +01:00
Leifer Mendez
b60db404a9 Merge pull request #480 from codigoencasa/release/next
Release/next
2023-01-12 21:41:22 +01:00
Leifer Mendez
44efbd8518 Merge branch 'release/production' into release/next 2023-01-12 21:41:13 +01:00
leifermendez
8357eda573 ci(version): automatic - "${date}" updated versions every packages 2023-01-12 20:10:58 +00:00
Leifer Mendez
05dbf2f240 Merge pull request #478 from codigoencasa/dev
Dev
2023-01-12 21:09:04 +01:00
Leifer Mendez
b65c40e59b Merge branch 'release/next' into dev 2023-01-12 21:08:57 +01:00
Leifer Mendez
d8bb1418dd Merge pull request #477 from codigoencasa/fix/refactor-cb
Fix/refactor cb
2023-01-12 21:08:33 +01:00
Leifer Mendez
8f27d34081 ci(cli): fix 2023-01-12 21:04:44 +01:00
Leifer Mendez
ee30df73b8 ci(cli): fix 2023-01-12 21:04:04 +01:00
Leifer Mendez
8a1bdc5878 refactor(bot): 🔥 fallback 2023-01-12 16:35:43 +01:00
Leifer Mendez
f742caa9a4 refactor(bot): async callbacks 2023-01-12 11:43:58 +01:00
Leifer Mendez
a1ce98bdc8 docs: 🎨 more doc 2023-01-12 10:31:41 +01:00
Leifer Mendez
230981e267 fix(starters): added dockerfile 2023-01-12 09:35:06 +01:00
Leifer Mendez
7242ab92f7 Merge remote-tracking branch 'origin/dev' into fix/githubaction 2023-01-12 09:28:29 +01:00
Leifer Mendez
d3c937579a Merge pull request #469 from cheveguerra/dev
[feat] Modificación de Starters para agregar el portal del código QR
2023-01-12 09:27:49 +01:00
1302491869 Merge branch 'codigoencasa:dev' into dev 2023-01-11 16:08:35 -06:00
Leifer Mendez
45cbc09b0e Merge branch 'dev' of github.com:leifermendez/bot-whatsapp into fix/githubaction 2023-01-11 21:18:16 +01:00
Leifer Mendez
aaec075140 fix(ci): pre-release 2023-01-11 21:17:32 +01:00
Leifer Mendez
42b98801db chore(release): 0.1.16 2023-01-11 21:16:19 +01:00
Leifer Mendez
b681be3f11 Merge pull request #476 from codigoencasa/fix/githubaction
Fix/githubaction
2023-01-11 21:04:45 +01:00
Leifer Mendez
e442d05aa4 chore(version): launch release 2023-01-11 21:04:00 +01:00
Leifer Mendez
b682b0b6ba chore(release): 0.1.15 2023-01-11 21:03:43 +01:00
Leifer Mendez
96b6430efe Merge pull request #475 from codigoencasa/fix/githubaction
chore(release): 0.1.14
2023-01-11 20:49:47 +01:00
Leifer Mendez
9723e9d908 chore(release): 0.1.14 2023-01-11 20:49:04 +01:00
Leifer Mendez
1bea3401dc Merge pull request #474 from codigoencasa/release/next
Release/next
2023-01-11 20:44:37 +01:00
leifermendez
0f9e57df37 ci(version): automatic - "${date}" updated versions every packages 2023-01-11 19:44:10 +00:00
Leifer Mendez
49b9b77543 Merge pull request #473 from codigoencasa/dev
Dev
2023-01-11 20:42:01 +01:00
Leifer Mendez
804ea2b258 Merge branch 'release/next' into dev 2023-01-11 20:41:55 +01:00
Leifer Mendez
939cea03cc Merge pull request #472 from codigoencasa:fix/githubaction
ci: 🔥 fix github action
2023-01-11 20:41:12 +01:00
Leifer Mendez
89cf909888 ci: 🔥 fix github action 2023-01-11 20:40:41 +01:00
Leifer Mendez
f323184b34 Merge pull request #471 from codigoencasa/dev
Dev
2023-01-11 20:36:24 +01:00
Leifer Mendez
65ad00e4ec Merge branch 'release/next' into dev 2023-01-11 20:36:16 +01:00
Leifer Mendez
c4158cbac6 Merge pull request #470 from codigoencasa/feat/docs-modal-video
Feat/docs modal video
2023-01-11 20:35:52 +01:00
Leifer Mendez
5a06d2cf88 Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 20:35:11 +01:00
Leifer Mendez
675046cc58 ci: 🔥 fix github action 2023-01-11 20:34:59 +01:00
f430380b4f fix: correccion en starters app.js para portal QR
correccion en starters app.js para portal QR
2023-01-11 10:49:48 -06:00
8a1c9f3b0e Merge branch 'codigoencasa:dev' into dev 2023-01-11 10:37:55 -06:00
eceb170df0 feat: mod de starters para habiltar portal
Modificacion de starters para habiltar el portal para el QR
2023-01-11 10:36:18 -06:00
leifermendez
ef03478683 ci(version): automatic - "${date}" updated versions every packages 2023-01-11 15:36:27 +00:00
Leifer Mendez
fb3e2913e3 Merge pull request #468 from codigoencasa/release/production
Release/production
2023-01-11 16:32:27 +01:00
leifermendez
9fb34cc9e0 ci(providers): 👍 updated versions stable providers 2023-01-11 15:30:38 +00:00
Leifer Mendez
3d2c3e1452 Merge pull request #467 from codigoencasa/dev
Dev
2023-01-11 16:27:57 +01:00
Leifer Mendez
83e262b818 Merge pull request #466 from codigoencasa/feat/docs-modal-video
Feat/docs modal video
2023-01-11 16:27:36 +01:00
Leifer Mendez
389169fc58 Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 16:26:25 +01:00
Leifer Mendez
f80a051fa9 chore(release): 0.1.13 2023-01-11 16:26:16 +01:00
Leifer Mendez
9688ec1844 chore(release): 0.1.13 2023-01-11 16:26:04 +01:00
leifermendez
288894ee8e ci(providers): 👍 updated versions stable providers 2023-01-11 15:22:46 +00:00
Leifer Mendez
f3151850d5 Merge pull request #465 from codigoencasa/dev
Dev
2023-01-11 16:19:49 +01:00
Leifer Mendez
49e9c70d7c Merge pull request #464 from codigoencasa/feat/docs-modal-video
Feat/docs modal video
2023-01-11 16:19:28 +01:00
Leifer Mendez
6a156183ad Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 16:18:55 +01:00
Leifer Mendez
f029c7317a chore(release): 0.1.12 2023-01-11 16:18:47 +01:00
leifermendez
fea6276b89 ci(providers): 👍 updated versions stable providers 2023-01-11 15:16:00 +00:00
Leifer Mendez
4b8c1d0ec6 Merge pull request #463 from codigoencasa/dev
Dev
2023-01-11 16:13:54 +01:00
Leifer Mendez
552a425cc0 Merge pull request #462 from codigoencasa/feat/docs-modal-video
Feat/docs modal video
2023-01-11 16:13:21 +01:00
Leifer Mendez
7566059073 Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 16:12:32 +01:00
Leifer Mendez
b321b03b2a chore(release): 0.1.12 2023-01-11 16:12:24 +01:00
Leifer Mendez
edf5fdcbdc chore(release): 0.1.12 2023-01-11 16:12:09 +01:00
Leifer Mendez
eb1fcbff22 chore(release): 0.1.11 2023-01-11 16:11:55 +01:00
leifermendez
68a6e4b241 ci(providers): 👍 updated versions stable providers 2023-01-11 14:39:57 +00:00
Leifer Mendez
837bbf3c36 Merge pull request #461 from codigoencasa/dev
Dev
2023-01-11 15:37:34 +01:00
Leifer Mendez
c8c5a03bad Merge pull request #460 from codigoencasa/feat/docs-modal-video
Feat/docs modal video
2023-01-11 15:37:06 +01:00
Leifer Mendez
353e25c204 Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 15:36:27 +01:00
Leifer Mendez
be6c609570 chore: set MANUAL version to bypass 2023-01-11 15:36:19 +01:00
Leifer Mendez
c6f58e913d chore(release): 0.1.10 2023-01-11 15:35:47 +01:00
leifermendez
e2fec5d521 ci(providers): 👍 updated versions stable providers 2023-01-11 14:33:19 +00:00
Leifer Mendez
681ec2e1ab Merge pull request #459 from codigoencasa/dev
Dev
2023-01-11 15:31:37 +01:00
Leifer Mendez
0dc5f99089 Merge pull request #458 from codigoencasa/feat/docs-modal-video
Feat/docs modal video
2023-01-11 15:30:19 +01:00
Leifer Mendez
5c880eddf1 Merge branch 'dev' into feat/docs-modal-video 2023-01-11 15:30:04 +01:00
Leifer Mendez
57fc150331 Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 15:28:41 +01:00
Leifer Mendez
9704bc0f02 docs: 📝 meta added 2023-01-11 15:28:30 +01:00
Leifer Mendez
7d65fee978 Merge pull request #457 from codigoencasa/dev
Dev
2023-01-11 15:16:41 +01:00
leifermendez
faa3a21ffe ci(providers): 👍 updated versions stable providers 2023-01-11 14:16:19 +00:00
Leifer Mendez
84f689cee1 Merge pull request #456 from codigoencasa/feat/docs-modal-video
Feat/docs modal video
2023-01-11 15:16:18 +01:00
Leifer Mendez
5175f66dd0 Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 15:15:03 +01:00
Leifer Mendez
0af9ef2dae ci: 🔥 fix ci version name 2023-01-11 15:14:51 +01:00
leifermendez
787cdc69a0 ci(providers): 👍 updated versions stable providers 2023-01-11 13:45:16 +00:00
Leifer Mendez
f8ceb01eca Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 14:41:22 +01:00
Leifer Mendez
d52951adf9 ci: 🔥 fix ci version name 2023-01-11 14:41:13 +01:00
leifermendez
c621d0ee24 ci(providers): 👍 updated versions stable providers 2023-01-11 13:36:55 +00:00
Leifer Mendez
f047ba6e71 ci: add github release
Dev
2023-01-11 14:34:09 +01:00
Leifer Mendez
401c012e00 ci: add github release
ci:  add github release
2023-01-11 14:33:46 +01:00
Leifer Mendez
39859f819c Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 14:33:08 +01:00
Leifer Mendez
5b3e7cefde ci: add github release 2023-01-11 14:32:59 +01:00
Leifer Mendez
8436d7b0d3 ci: add github release
ci:  add github release
2023-01-11 14:27:34 +01:00
Leifer Mendez
135961daf0 ci: add github release
ci:  add github release
2023-01-11 14:26:21 +01:00
leifermendez
375a997f25 ci(providers): 👍 updated versions stable providers 2023-01-11 12:49:52 +00:00
Leifer Mendez
625ca405fc Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 13:48:45 +01:00
Leifer Mendez
8e3413ca80 ci: add github release 2023-01-11 13:48:33 +01:00
Leifer Mendez
09407401eb ci: add github release
ci:  add github release
2023-01-11 13:39:03 +01:00
Leifer Mendez
1fa17dc601 ci: add github release
ci:  add github release
2023-01-11 13:38:31 +01:00
Leifer Mendez
73f3e6245d Merge branch 'release/next' into dev 2023-01-11 13:38:17 +01:00
leifermendez
afb127278a ci(providers): 👍 updated versions stable providers 2023-01-11 12:38:01 +00:00
Leifer Mendez
15bfb19853 Merge branch 'feat/docs-modal-video' of github.com:leifermendez/bot-whatsapp into feat/docs-modal-video 2023-01-11 13:34:01 +01:00
Leifer Mendez
d90a42b962 ci: add github release 2023-01-11 13:33:52 +01:00
leifermendez
0619641f82 ci(providers): 👍 updated versions stable providers 2023-01-11 12:33:39 +00:00
Leifer Mendez
d00547866a ci: add github release 2023-01-11 13:31:34 +01:00
Leifer Mendez
ca978867ff ci: add github release
ci:  add github release
2023-01-11 13:30:38 +01:00
Leifer Mendez
af44ed1268 ci: add github release 2023-01-11 13:25:18 +01:00
Leifer Mendez
2a416bf751 docs: 📝 meta added
docs: 📝 meta added
2023-01-11 11:59:59 +01:00
Leifer Mendez
2fc274725d docs: 📝 meta added 2023-01-11 11:58:25 +01:00
Leifer Mendez
ecde23fdea fix: 🔥 update qr package 2023-01-10 22:46:08 +01:00
Leifer Mendez
a73ff9c217 chore(release): 0.1.8
chore(release): 0.1.8
2023-01-10 19:46:46 +01:00
Leifer Mendez
16e4575777 chore(release): 0.1.8 2023-01-10 19:45:31 +01:00
Leifer Mendez
74a1301342 chore(release): 0.1.7 2023-01-10 19:45:17 +01:00
Leifer Mendez
210c013290 ci: change set commit
ci:  change set commit
2023-01-10 19:43:17 +01:00
Leifer Mendez
bfb76c87a1 ci: change set commit 2023-01-10 19:42:35 +01:00
Leifer Mendez
8f2eb6d4f2 Merge pull request #440 from codigoencasa/feat/docs-twilio
ci(version):  automatic - "${date}" updated versions every packages
2023-01-10 19:28:55 +01:00
Leifer Mendez
44dfe8ed1a ci(version): automatic - "${date}" updated versions every packages 2023-01-10 19:28:00 +01:00
Leifer Mendez
63ecac6f2b Merge pull request #438 from codigoencasa/feat/docs-twilio
Feat/docs twilio
2023-01-10 19:25:56 +01:00
Leifer Mendez
ac72c5e4e7 ci: change set commit 2023-01-10 19:25:17 +01:00
Leifer Mendez
50d64596c7 Merge commit '4289b7c3ddb35492aa83f75510c2e0477bbebe98' into feat/docs-twilio 2023-01-10 19:22:05 +01:00
Leifer Mendez
a7801d1fa2 Merge branch 'feat/docs-twilio' of github.com:leifermendez/bot-whatsapp into feat/docs-twilio 2023-01-10 19:21:46 +01:00
Leifer Mendez
74e6aae631 Merge commit 'a6607f1896c951474be8a72b78bf65d123bd4879' into feat/docs-twilio 2023-01-10 19:21:13 +01:00
Leifer Mendez
c913d5ee5c ci: change set commit 2023-01-10 19:21:02 +01:00
leifermendez
eafd27c25a ci(version): automatic - "${date}" updated versions every packages 2023-01-10 18:17:47 +00:00
Leifer Mendez
4289b7c3dd Merge pull request #436 from codigoencasa/next-release
ci(providers): 👍 updated versions stable providers
2023-01-10 19:16:30 +01:00
leifermendez
c793890c50 ci(providers): 👍 updated versions stable providers 2023-01-10 18:16:18 +00:00
Leifer Mendez
48a87fff26 ci(providers): 👍 updated versions stable providers
ci(providers): 👍 updated versions stable providers
2023-01-10 19:16:07 +01:00
Leifer Mendez
98bff0285d Merge branch 'next-release' into dev 2023-01-10 19:15:55 +01:00
Leifer Mendez
f5b8e42608 ci(providers): 👍 updated versions stable providers
ci(providers): 👍 updated versions stable providers
2023-01-10 19:15:30 +01:00
Leifer Mendez
6469c83552 Merge branch 'feat/docs-twilio' of github.com:leifermendez/bot-whatsapp into feat/docs-twilio 2023-01-10 19:14:33 +01:00
Leifer Mendez
dba33359a0 ci: push tag pre- 2023-01-10 19:14:18 +01:00
leifermendez
14f3893727 ci(providers): 👍 updated versions stable providers 2023-01-10 17:54:00 +00:00
Leifer Mendez
a6607f1896 ci: change set commit
ci:  change set commit
2023-01-10 18:53:37 +01:00
Leifer Mendez
9669cc0807 ci: change set commit
ci:  change set commit
2023-01-10 18:53:10 +01:00
Leifer Mendez
1ee05d925a Merge branch 'feat/docs-twilio' of github.com:leifermendez/bot-whatsapp into feat/docs-twilio 2023-01-10 18:52:18 +01:00
Leifer Mendez
3e18bc1f57 ci: change set commit 2023-01-10 18:52:01 +01:00
leifermendez
5872d860c9 ci(version): automatic - "${date}" updated versions every packages 2023-01-10 17:44:02 +00:00
Leifer Mendez
caa2a42933 chore(release): 0.1.6
chore(release): 0.1.6
2023-01-10 18:42:09 +01:00
leifermendez
6b407a1d72 ci(providers): 👍 updated versions stable providers 2023-01-10 17:42:02 +00:00
Leifer Mendez
da67b75d98 chore(release): 0.1.6
chore(release): 0.1.6
2023-01-10 18:41:37 +01:00
Leifer Mendez
28b5739f3f Merge branch 'next-release' into dev 2023-01-10 18:41:29 +01:00
Leifer Mendez
2d9da1e584 chore(release): 0.1.6
chore(release): 0.1.6
2023-01-10 18:41:07 +01:00
Leifer Mendez
11bcb3f2c8 Merge branch 'feat/docs-twilio' of github.com:leifermendez/bot-whatsapp into feat/docs-twilio 2023-01-10 18:40:10 +01:00
Leifer Mendez
7731f4149e chore(release): 0.1.6 2023-01-10 18:39:07 +01:00
Leifer Mendez
ae645643d5 chore(release): 0.1.5 2023-01-10 18:38:57 +01:00
leifermendez
9960227006 ci(version): automatic - "${date}" updated versions every packages 2023-01-10 17:38:41 +00:00
Leifer Mendez
c0bbf5c48f chore(release): 0.1.4 2023-01-10 18:38:41 +01:00
Leifer Mendez
512207207c docs: 📝 add more documentation about twilio
docs: 📝 add more documentation about twilio
2023-01-10 18:37:13 +01:00
Leifer Mendez
200dd6b187 docs: 📝 add more documentation about twilio
docs: 📝 add more documentation about twilio
2023-01-10 18:36:38 +01:00
Leifer Mendez
cad73dca99 Merge branch 'next-release' into dev 2023-01-10 18:36:29 +01:00
leifermendez
2114f997db ci(providers): 👍 updated versions stable providers 2023-01-10 17:11:25 +00:00
Leifer Mendez
c5d4d82538 docs: 📝 add more documentation about twilio
docs: 📝 add more documentation about twilio
2023-01-10 18:10:38 +01:00
Leifer Mendez
fdab223786 docs: 📝 add more documentation about twilio 2023-01-10 18:07:55 +01:00
Leifer Mendez
f4d1ae3199 docs: 📝 add more documentation about twilio 2023-01-10 18:04:34 +01:00
Leifer Mendez
527eac4962 Merge pull request #418 from codigoencasa/next-release
Next release
2023-01-10 11:07:31 +01:00
leifermendez
8ef6d6b560 ci(version): automatic - "${date}" updated versions every packages 2023-01-10 09:57:06 +00:00
Leifer Mendez
0d588f067f Merge pull request #417 from codigoencasa/dev
Dev
2023-01-10 10:54:50 +01:00
Leifer Mendez
b4368fd30a Merge branch 'next-release' into dev 2023-01-10 10:54:39 +01:00
Leifer Mendez
b0dd007918 Merge pull request #415 from codigoencasa/feature/qr-file-name
Feature/qr file name
2023-01-10 10:52:18 +01:00
Leifer Mendez
246ecdc11a feat: qr portal 2023-01-10 10:44:49 +01:00
Leifer Mendez
891ea75f62 Merge branch 'feature/qr-file-name' of github.com:leifermendez/bot-whatsapp into feature/qr-file-name 2023-01-10 10:42:08 +01:00
Leifer Mendez
af8b401d07 feat: qr portal 2023-01-10 10:41:56 +01:00
leifermendez
3658efd98a ci(version): automatic - "${date}" updated versions every packages 2023-01-09 21:30:46 +00:00
leifermendez
fd044fb169 ci(providers): 👍 updated versions stable providers 2023-01-09 21:28:34 +00:00
Leifer Mendez
3fb0f2282c Merge pull request #414 from codigoencasa/dev
Dev
2023-01-09 22:28:20 +01:00
Leifer Mendez
46ef98cb23 Merge branch 'next-release' into dev 2023-01-09 22:28:13 +01:00
Leifer Mendez
b61a4d7fa0 Merge pull request #412 from codigoencasa/feature/qr-file-name
Feature/qr file name
2023-01-09 22:27:42 +01:00
Leifer Mendez
6417f8e63b Merge branch 'feature/qr-file-name' of github.com:leifermendez/bot-whatsapp into feature/qr-file-name 2023-01-09 22:26:46 +01:00
Leifer Mendez
20f752e6c1 fix: fix inject port args 2023-01-09 22:26:34 +01:00
leifermendez
2b37e5a29d ci(providers): 👍 updated versions stable providers 2023-01-09 20:29:26 +00:00
Leifer Mendez
8ec7c2108a Merge pull request #410 from codigoencasa/feature/qr-file-name
fix:  fix inject port args
2023-01-09 21:28:32 +01:00
Leifer Mendez
dfc7847573 Merge branch 'feature/qr-file-name' of github.com:leifermendez/bot-whatsapp into feature/qr-file-name 2023-01-09 21:27:45 +01:00
Leifer Mendez
7a23eb0cc6 fix: fix inject port args 2023-01-09 21:27:35 +01:00
leifermendez
ab2a21ee42 ci(providers): 👍 updated versions stable providers 2023-01-09 18:48:23 +00:00
leifermendez
249a97862f ci(version): automatic - "${date}" updated versions every packages 2023-01-09 18:48:18 +00:00
Leifer Mendez
feb9ede912 Merge pull request #409 from codigoencasa/dev
Dev
2023-01-09 19:46:21 +01:00
Leifer Mendez
03918fb091 Merge branch 'next-release' into dev 2023-01-09 19:46:12 +01:00
Leifer Mendez
1fee5b6bfa Merge pull request #407 from codigoencasa/feature/qr-file-name
feat:  qr code filename
2023-01-09 19:45:03 +01:00
Leifer Mendez
131d3b7f03 Merge pull request #405 from codigoencasa:feature/qr-file-name
Feature/qr-file-name
2023-01-09 19:43:58 +01:00
Leifer Mendez
d794f604ac feat: qr code filename 2023-01-09 19:43:22 +01:00
leifermendez
b2559731da ci(version): automatic - "${date}" updated versions every packages 2023-01-09 18:04:14 +00:00
Leifer Mendez
f0c332e278 Merge pull request #404 from codigoencasa/dev
Dev
2023-01-09 18:59:49 +01:00
Leifer Mendez
4450245d91 Merge branch 'next-release' into dev 2023-01-09 18:59:41 +01:00
Leifer Mendez
ca960cd80c Merge pull request #402 from codigoencasa/feature/portal
Feature/portal
2023-01-09 18:55:18 +01:00
Leifer Mendez
4d721f99e2 Merge branch 'feature/portal' of github.com:leifermendez/bot-whatsapp into feature/portal 2023-01-09 18:54:47 +01:00
Leifer Mendez
cb2e8692a3 feat: new portal web for qr scan 2023-01-09 18:54:04 +01:00
leifermendez
969ffe177f ci(providers): 👍 updated versions stable providers 2023-01-09 17:51:39 +00:00
Leifer Mendez
83383e2022 Merge pull request #400 from codigoencasa/feature/portal
Feature/portal
2023-01-09 18:48:46 +01:00
Leifer Mendez
09aa3c8ca9 Merge branch 'feature/portal' of github.com:leifermendez/bot-whatsapp into feature/portal 2023-01-09 18:47:02 +01:00
Leifer Mendez
9e93795e6f feat: new portal web for qr scan 2023-01-09 18:46:54 +01:00
Leifer Mendez
3c178ea113 feat: new portal web for qr scan 2023-01-09 18:44:52 +01:00
Leifer Mendez
1f1f564f4e feat: new portal web for qr scan 2023-01-09 18:44:38 +01:00
leifermendez
21cc0e3c7d ci(providers): 👍 updated versions stable providers 2023-01-09 17:42:14 +00:00
Leifer Mendez
40c51236db feat: new portal web for qr scan
feat:  new portal web for qr scan
2023-01-09 18:38:39 +01:00
Leifer Mendez
3de5f4b77a feat: new portal web for qr scan 2023-01-09 18:37:58 +01:00
Leifer Mendez
c6af472d42 Merge pull request #396 from codigoencasa/next-release
Next release
2023-01-08 17:01:13 +01:00
leifermendez
1c5da9cc6a ci(version): automatic - "${date}" updated versions every packages 2023-01-08 15:52:28 +00:00
Leifer Mendez
96bfb9af4e fix: add Dockerfile, starter
fix:  add Dockerfile, starter
2023-01-08 16:51:06 +01:00
Leifer Mendez
dd07526a3d Merge branch 'next-release' into dev 2023-01-08 16:50:58 +01:00
Leifer Mendez
fd935b9785 fix: add Dockerfile, starter
fix:  add Dockerfile, starter
2023-01-08 16:48:17 +01:00
Leifer Mendez
4e0d33c6bb fix: add Dockerfile, starter 2023-01-08 16:47:28 +01:00
Leifer Mendez
5e6077dd8f Merge commit '41de8b9b5af5ffa31d8a1212c03d446d3611f24d' into feat/ci-02 2023-01-08 16:11:33 +01:00
Leifer Mendez
41de8b9b5a Merge pull request #390 from cheveguerra/dev
Se agregan dockerfile y web server para código QR a Starters
2023-01-08 16:11:20 +01:00
Leifer Mendez
5d0929efb4 Merge pull request #391 from codigoencasa/fix/wweb-docker
Fix/wweb docker
2023-01-08 16:11:02 +01:00
Leifer Mendez
5a033da83a fix(provider): fix error docker as root user 2023-01-08 15:54:32 +01:00
Leifer Mendez
8ff9cacae0 Merge remote-tracking branch 'origin/dev' into feat/ci-02 2023-01-08 14:30:04 +01:00
f9e3bbc665 feat: agregamos dockerfile y webserver a starters
agregamos  dockerfile y webserver a starters
2023-01-08 04:57:27 -06:00
e5f6cf8563 Merge branch 'codigoencasa:dev' into dev 2023-01-07 17:03:27 -06:00
leifermendez
2ad57a8be1 ci(version): automatic - "${date}" updated versions every packages 2023-01-07 16:57:52 +00:00
leifermendez
4f2fbaf21b ci(providers): 👍 updated versions stable providers 2023-01-07 16:57:18 +00:00
Leifer Mendez
b7694d7857 build: fix
build:  fix
2023-01-07 17:56:38 +01:00
Leifer Mendez
b3eec37fa9 Merge branch 'next-release' into dev 2023-01-07 17:56:32 +01:00
Leifer Mendez
bdbf529cb6 build: fix
build:  fix
2023-01-07 17:56:13 +01:00
Leifer Mendez
4ff02d2bfa build: fix 2023-01-07 17:55:11 +01:00
Leifer Mendez
2ddea5468d fix(provider): fix send image baileys 2023-01-07 14:59:48 +01:00
Leifer Mendez
391e11ce73 fix(provider): fix send image baileys 2023-01-07 14:59:25 +01:00
Leifer Mendez
5d10cb9026 fix(provider): fix send image baileys 2023-01-07 14:34:17 +01:00
leifermendez
716349a839 ci(providers): 🚩 Check BREAKING CHANGE 2023-01-07 09:08:56 +00:00
Leifer Mendez
9e0a61b7ba Merge branch 'feat/ci-02' of github.com:leifermendez/bot-whatsapp into feat/ci-02 2023-01-06 21:20:18 +01:00
Leifer Mendez
6ea377e9e5 build: working fallback, flowDynamic 2023-01-06 21:20:08 +01:00
leifermendez
8017426cfc ci(version): automatic - "${date}" updated versions every packages 2023-01-06 19:18:41 +00:00
leifermendez
b588479fd1 ci(providers): 👍 updated versions stable providers 2023-01-06 19:17:18 +00:00
Leifer Mendez
25f90e4162 Merge pull request #385 from codigoencasa/dev
Dev
2023-01-06 20:16:58 +01:00
Leifer Mendez
b2e57396fb Merge branch 'next-release' into dev 2023-01-06 20:16:52 +01:00
Leifer Mendez
df786f7d34 Merge pull request #384 from codigoencasa/feat/ci-02
ci(providers): 👍 updated versions stable providers
2023-01-06 20:16:31 +01:00
leifermendez
930e120d70 ci(version): automatic - "${date}" updated versions every packages 2023-01-06 15:09:04 +00:00
Leifer Mendez
0ebead27f5 Merge pull request #383 from codigoencasa/dev
Dev
2023-01-06 16:07:48 +01:00
Leifer Mendez
397c143952 Merge branch 'next-release' into dev 2023-01-06 16:07:42 +01:00
leifermendez
0451043a21 ci(providers): 👍 updated versions stable providers 2023-01-06 15:05:32 +00:00
Leifer Mendez
2cb032a5da Merge pull request #381 from codigoencasa/feat/ci-02
Feat/ci 02
2023-01-06 16:04:29 +01:00
Leifer Mendez
a31ded6b02 Merge branch 'feat/ci-02' of github.com:leifermendez/bot-whatsapp into feat/ci-02 2023-01-06 16:03:42 +01:00
Leifer Mendez
e8e14d3b65 build: ready for video 2023-01-06 15:12:33 +01:00
Leifer Mendez
a6c10fe414 chore: 🎨 working 2023-01-06 14:31:04 +01:00
b040790129 Merge branch 'codigoencasa:dev' into dev 2023-01-06 07:01:34 -06:00
leifermendez
a71566f2ad ci(version): automatic - "${date}" updated versions every packages 2023-01-06 11:45:52 +00:00
leifermendez
2040f857a5 ci(providers): 👍 updated versions stable providers 2023-01-06 11:44:19 +00:00
cheveguerra
ec2041b75a ci(providers): 👍 updated versions stable providers 2023-01-06 06:46:09 +00:00
d3eb10d1b3 Merge branch 'dev' of https://github.com/cheveguerra/bot-whatsapp into dev 2023-01-06 00:44:48 -06:00
cheveguerra
983db5c7b8 ci(providers): 👍 updated versions stable providers 2023-01-06 06:29:55 +00:00
95947cdefc Merge branch 'codigoencasa:dev' into dev 2023-01-06 00:29:05 -06:00
leifermendez
3905ae40ae ci(providers): 👍 updated versions stable providers 2023-01-05 21:09:08 +00:00
cheveguerra
8dad0a49b1 ci(providers): 👍 updated versions stable providers 2023-01-05 15:33:48 +00:00
cheveguerra
faa4ea0152 ci(providers): 👍 updated versions stable providers 2023-01-05 00:44:27 +00:00
243 changed files with 8000 additions and 3664 deletions

View File

@@ -1 +1,2 @@
packages/docs/* packages/docs/*
packages/portal/*

View File

@@ -1,46 +0,0 @@
name: Rev Major Providers
on:
schedule:
- cron: '0 9 * * *'
jobs:
check-npm:
name: Install Dependencies
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 16.x
cache: 'yarn'
registry-url: https://registry.npmjs.org/
- run: corepack enable
- name: Install NPM Dependencies
run: yarn install --immutable --network-timeout 300000
- name: Check Baileys
run: yarn node ./scripts/checker.js --name=baileys --stable=true
- name: Check Venom
run: yarn node ./scripts/checker.js --name=venom --stable=true
- name: Check web-whatsapp
run: yarn node ./scripts/checker.js --name=web-whatsapp --stable=true
- name: Check Meta
run: yarn node ./scripts/checker.js --name=meta --stable=true
- name: Check Twilio
run: yarn node ./scripts/checker.js --name=twilio --stable=true
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: 'ci(providers): 🚩 Check BREAKING CHANGE'
create_branch: true
branch: feature/breaking-change

View File

@@ -1,45 +0,0 @@
name: Rev Providers
on:
pull_request:
branches:
- dev
jobs:
check-npm:
name: Install Dependencies
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 16.x
cache: 'yarn'
registry-url: https://registry.npmjs.org/
- run: corepack enable
- name: Install NPM Dependencies
run: yarn install --immutable --network-timeout 300000
- name: Check Baileys
run: yarn node ./scripts/checker.js --name=baileys --stable=true
- name: Check Venom
run: yarn node ./scripts/checker.js --name=venom --stable=true
- name: Check web-whatsapp
run: yarn node ./scripts/checker.js --name=web-whatsapp --stable=true
- name: Check Meta
run: yarn node ./scripts/checker.js --name=meta --stable=true
- name: Check Twilio
run: yarn node ./scripts/checker.js --name=twilio --stable=true
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: 'ci(providers): 👍 updated versions stable providers'

View File

@@ -12,6 +12,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: needs:
- test-unit - test-unit
- test-e2e
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
@@ -29,7 +30,7 @@ jobs:
run: yarn install --immutable --network-timeout 300000 run: yarn install --immutable --network-timeout 300000
- name: Build Package - name: Build Package
run: yarn build run: yarn build:full
- name: Build Eslint rules - name: Build Eslint rules
run: yarn lint:fix run: yarn lint:fix
@@ -56,3 +57,27 @@ jobs:
- name: Unit Tests - name: Unit Tests
run: yarn test run: yarn test
############ UNIT TEST ############
test-e2e:
name: e2e Tests
runs-on: ubuntu-latest
needs:
- test-unit
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 16.x
cache: 'yarn'
registry-url: https://registry.npmjs.org/
- run: corepack enable
- name: Install NPM Dependencies
run: yarn install --immutable --network-timeout 300000
- name: e2e Tests
run: yarn test.e2e

View File

@@ -13,7 +13,7 @@ name: 'CodeQL'
on: on:
push: push:
branches: ['main', dev, next-release] branches: [release/next]
pull_request: pull_request:
# The branches below must be a subset of the branches above # The branches below must be a subset of the branches above
branches: ['main'] branches: ['main']
@@ -22,6 +22,7 @@ on:
jobs: jobs:
analyze: analyze:
if: ${{ !github.event.act }}
name: Analyze name: Analyze
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:

View File

@@ -1,21 +0,0 @@
name: Revisando Colaboradores
on:
push:
branches:
- main
pull_request:
branches:
- dev
types: [closed]
jobs:
contrib-readme-job:
runs-on: ubuntu-latest
name: A job to automate contrib in readme
steps:
- name: Contribute List
uses: akhilmhdh/contributors-readme-action@v2.3.6
with:
image_size: 50
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -13,6 +13,7 @@ on:
jobs: jobs:
############ DOCUMENTATION BUILD ############ ############ DOCUMENTATION BUILD ############
build-documentation: build-documentation:
if: ${{ !github.event.act }}
name: Build Package name: Build Package
runs-on: ubuntu-latest runs-on: ubuntu-latest

View File

@@ -3,12 +3,11 @@ name: 📄 (PROD) Desplegando documentacion
on: on:
push: push:
branches: branches:
- main - release/next
- next-release
jobs: jobs:
############ DOCUMENTATION BUILD ############ ############ DOCUMENTATION BUILD ############
build-documentation: build-documentation-prod:
name: Build Package name: Build Package
runs-on: ubuntu-latest runs-on: ubuntu-latest

View File

@@ -3,16 +3,22 @@ name: 🚀 (DEV) Liberando versiones
on: on:
push: push:
branches: branches:
- next-release - release/next
jobs: jobs:
############ RELEASE ############ ############ RELEASE ############
release: release:
name: Release name: Release
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs:
commit: ${{ steps.vars.outputs.commit }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
with:
fetch-depth: 0
ref: ${{github.event.after}}
persist-credentials: false
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v3 uses: actions/setup-node@v3
@@ -27,7 +33,7 @@ jobs:
run: yarn install --immutable --network-timeout 300000 run: yarn install --immutable --network-timeout 300000
- name: Build Package - name: Build Package
run: yarn build run: yarn build:full
- name: Release @bot-whatsapp/bot - name: Release @bot-whatsapp/bot
run: yarn node ./scripts/release.js --name=bot --version= --token="${{ secrets.NPM_TOKEN }}" run: yarn node ./scripts/release.js --name=bot --version= --token="${{ secrets.NPM_TOKEN }}"
@@ -44,8 +50,15 @@ jobs:
- name: Release @bot-whatsapp/provider - name: Release @bot-whatsapp/provider
run: yarn node ./scripts/release.js --name=provider --version= --token="${{ secrets.NPM_TOKEN }}" run: yarn node ./scripts/release.js --name=provider --version= --token="${{ secrets.NPM_TOKEN }}"
- name: Commit Versioning & Push changes - name: Release @bot-whatsapp/contexts
uses: stefanzweifel/git-auto-commit-action@v4 run: yarn node ./scripts/release.js --name=contexts --version= --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/portal
run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}"
- name: Commit & Push changes
uses: actions-js/push@master
with: with:
commit_message: 'ci(version): :zap: automatic - "${date}" updated versions every packages' branch: release/next
branch: dev github_token: ${{ secrets.GITHUB_TOKEN }}
force: true

View File

@@ -2,12 +2,12 @@ name: 🚀⚡ Liberando versiones
on: on:
push: push:
tags: branches:
- 'v*.*.*' - release/production
jobs: jobs:
############ RELEASE ############ ############ RELEASE ############
release: release-prod:
if: ${{ !github.event.act }}
name: Release name: Release
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@@ -27,32 +27,49 @@ jobs:
- run: corepack enable - run: corepack enable
- name: Set User
run: git config --global user.email "leifer.contacto@gmail.com" && git config --global user.name "Leifer Mendez"
- name: Install NPM Dependencies - name: Install NPM Dependencies
run: yarn install --immutable --network-timeout 300000 run: yarn install --immutable --network-timeout 300000
- name: Build Package
run: yarn build
- name: Release @bot-whatsapp/bot
run: yarn node ./scripts/release.js --name=bot --version="${{ steps.vars.outputs.tag }}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/cli
run: yarn node ./scripts/release.js --name=cli --version="${{ steps.vars.outputs.tag }}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/create-bot-whatsapp
run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.vars.outputs.tag }}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/database
run: yarn node ./scripts/release.js --name=database --version="${{ steps.vars.outputs.tag }}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/provider
run: yarn node ./scripts/release.js --name=provider --version="${{ steps.vars.outputs.tag }}" --token="${{ secrets.NPM_TOKEN }}"
- name: Set CHANGELOG - name: Set CHANGELOG
run: yarn release run: yarn release
- name: Commit Versioning & Push changes - name: get-npm-version
uses: stefanzweifel/git-auto-commit-action@v4 id: package-version
uses: martinbeentjes/npm-get-version-action@main
- name: Build Package
run: yarn build:full
- name: Release @bot-whatsapp/bot
run: yarn node ./scripts/release.js --name=bot --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/cli
run: yarn node ./scripts/release.js --name=cli --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/create-bot-whatsapp
run: yarn node ./scripts/release.js --name=create-bot-whatsapp --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/database
run: yarn node ./scripts/release.js --name=database --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/provider
run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/contexts
run: yarn node ./scripts/release.js --name=contexts --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release @bot-whatsapp/portal
run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
- name: Release Github
run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}"
- name: Commit & Push changes
uses: actions-js/push@master
with: with:
commit_message: 'release(version): 🚀 - "${{ steps.vars.outputs.tag }}" release' branch: release/production
branch: dev github_token: ${{ secrets.GITHUB_TOKEN }}
force: true

7
.gitignore vendored
View File

@@ -1,4 +1,5 @@
/node_modules /node_modules
/packages/repl
/packages/*/starters /packages/*/starters
/packages/*/node_modules /packages/*/node_modules
/packages/*/dist /packages/*/dist
@@ -14,6 +15,10 @@ mediaSend/*
!mediaSend/nota-de-voz.mp3 !mediaSend/nota-de-voz.mp3
.env .env
.wwebjs_auth .wwebjs_auth
/session
/session/*
/tokens
/tokens/*
packages/cli/config.json packages/cli/config.json
config.json config.json
.yarnrc.yml .yarnrc.yml
@@ -31,6 +36,7 @@ tmp/
.fleet/ .fleet/
example-app*/ example-app*/
base-*/ base-*/
test-*.json
!starters/apps/base-*/ !starters/apps/base-*/
qr.svg qr.svg
package-lock.json package-lock.json
@@ -38,3 +44,4 @@ yarn-error.log
.npmrc .npmrc
# Local Netlify folder # Local Netlify folder
.netlify .netlify
.secrets

View File

@@ -1,4 +1,4 @@
#!/usr/bin/env sh #!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh" . "$(dirname -- "$0")/_/husky.sh"
npx --no -- commitlint --edit npm run lint:fix && npx --no -- commitlint --edit

View File

@@ -1,5 +1,5 @@
packages/**/lib packages/**/lib
packages/docs/*.json packages/docs/
**/.git **/.git
**/.svn **/.svn
**/.hg **/.hg

View File

@@ -2,5 +2,6 @@
"trailingComma": "es5", "trailingComma": "es5",
"tabWidth": 4, "tabWidth": 4,
"semi": false, "semi": false,
"singleQuote": true "singleQuote": true,
"printWidth": 120
} }

View File

@@ -1,3 +1,3 @@
{ {
"recommendations": ["xyc.vscode-mdx-preview"] "recommendations": ["xyc.vscode-mdx-preview", "vivaxy.vscode-conventional-commits", "mhutchie.git-graph"]
} }

View File

@@ -2,6 +2,216 @@
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. 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.21](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.20...v0.1.21) (2023-02-12)
### Features
* **provider:** :bug: add_location ([a46a9ef](https://github.com/leifermendez/bot-whatsapp/commit/a46a9efd8dbd921c773395d331154dc9a8aae783))
* **provider:** :rocket: feat Instance provider ([2278149](https://github.com/leifermendez/bot-whatsapp/commit/227814929561cedc11a1f69c8029515a7f47c9ff))
* **provider:** :rocket: provider raw ([2d44a00](https://github.com/leifermendez/bot-whatsapp/commit/2d44a002ff226fb0eb7362ad49936f1e00b84242))
* **provider:** :zap: add location provider ([c7de860](https://github.com/leifermendez/bot-whatsapp/commit/c7de860803fb362f5afe06cc38ad71b2c316d524))
* **provider:** :zap: add location provider ([c0ece6f](https://github.com/leifermendez/bot-whatsapp/commit/c0ece6feb2b0325476880a604c32de341eb60544))
* **provider:** :zap: support location <20> ([a147677](https://github.com/leifermendez/bot-whatsapp/commit/a147677a26b36bba429c3dd3c2c81a44a7a4d2b6))
### Bug Fixes
* arreglando dir y varios mensajes en dialog flow essential ([01c7db8](https://github.com/leifermendez/bot-whatsapp/commit/01c7db8fe7dda2482eb0aa1fd7b3469b6ae8eae1))
### [0.1.20](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.19...v0.1.20) (2023-02-05)
### Features
* **cli:** :fire: add regex expression in addKeyworkd ([e34560c](https://github.com/leifermendez/bot-whatsapp/commit/e34560c77d4852d2e90930f0858e51aa67d4eeab))
* **provider:** :zap: possible get class provider ([76ba717](https://github.com/leifermendez/bot-whatsapp/commit/76ba717927a75b3d6299206aa0b8aee2bc25b726))
### Bug Fixes
* **cli:** :zap: working flowDynamic test ([c0113ca](https://github.com/leifermendez/bot-whatsapp/commit/c0113ca49295aff220d8defcb53f2ba7f2872d75))
* **cli:** :zap: working flowDynamic test ([aef52d2](https://github.com/leifermendez/bot-whatsapp/commit/aef52d2694fa6616d614338643db198b4f7f1fe8))
* **cli:** :zap: working flowDynamic test ([f769320](https://github.com/leifermendez/bot-whatsapp/commit/f76932021ce968d93241b55cfcdb8ae0e0e6c934))
* **cli:** :zap: working flowDynamic test ([23e09ef](https://github.com/leifermendez/bot-whatsapp/commit/23e09efaeccaf51018c55da492edff45b625f0a9))
* **database:** add support emoji in mysql ([9311aa0](https://github.com/leifermendez/bot-whatsapp/commit/9311aa0a65623a1bf40e96207a281625154dae90))
* **database:** fix naming ([cd082f2](https://github.com/leifermendez/bot-whatsapp/commit/cd082f235012cd5f5844c6437f51711beee0c865))
* **database:** fix naming ([1afc3ba](https://github.com/leifermendez/bot-whatsapp/commit/1afc3ba182070713b5bec40eaab0fa1f680830cd))
* **database:** fix naming ([c9831d2](https://github.com/leifermendez/bot-whatsapp/commit/c9831d202ab2c85f15a0247cd2a2426bc435270c))
* **provider:** :zap: baily wa.link ([96c2bff](https://github.com/leifermendez/bot-whatsapp/commit/96c2bffd093269be8e39474a84c156938504a6cb))
### [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)
### 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)
### 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)
### [0.1.14](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.13...v0.1.14) (2023-01-11)
### [0.1.13](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.12...v0.1.13) (2023-01-11)
### [0.1.12](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.12) (2023-01-11)
### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10)
### [0.1.7-pre-1](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-alpha...v0.1.7-pre-1) (2023-01-10)
### [0.1.7-alpha](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7-alpha) (2023-01-10)
### [0.1.11](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.11) (2023-01-11)
### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10)
### [0.1.7-pre-1](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-alpha...v0.1.7-pre-1) (2023-01-10)
### [0.1.7-alpha](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7-alpha) (2023-01-10)
### [0.1.10](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.8...v0.1.10) (2023-01-11)
### Bug Fixes
* :fire: update qr package ([ecde23f](https://github.com/leifermendez/bot-whatsapp/commit/ecde23fdea65def209aa874af35a3f293e6b1a91))
### [0.1.8](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.8) (2023-01-10)
### [0.1.7](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7) (2023-01-10)
### [0.1.6](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.5...v0.1.6) (2023-01-10)
### Features
* :zap: new portal web for qr scan ([cb2e869](https://github.com/leifermendez/bot-whatsapp/commit/cb2e8692a3f94c8b24993cd11dd564f094b0e4ef))
* :zap: new portal web for qr scan ([9e93795](https://github.com/leifermendez/bot-whatsapp/commit/9e93795e6fce38890045389da95184fef1fbe0da))
* :zap: new portal web for qr scan ([3c178ea](https://github.com/leifermendez/bot-whatsapp/commit/3c178ea113b140535a51f5dcd521dbb66251670e))
* :zap: new portal web for qr scan ([1f1f564](https://github.com/leifermendez/bot-whatsapp/commit/1f1f564f4e2e3aa13b84de500fe215e0c45c2770))
* :zap: new portal web for qr scan ([3de5f4b](https://github.com/leifermendez/bot-whatsapp/commit/3de5f4b77a10e30632ff7555f5af5d8e93cb2019))
* :zap: qr code filename ([d794f60](https://github.com/leifermendez/bot-whatsapp/commit/d794f604ac8a835e523709dbf18c9b1609bbd00e))
* :zap: qr portal ([246ecdc](https://github.com/leifermendez/bot-whatsapp/commit/246ecdc11a8c4e652867c842b612dc4ce73f9828))
* :zap: qr portal ([af8b401](https://github.com/leifermendez/bot-whatsapp/commit/af8b401d075e1c35065589ede61476461ce86b4d))
* agregamos dockerfile y webserver a starters ([f9e3bbc](https://github.com/leifermendez/bot-whatsapp/commit/f9e3bbc6655060408e4fdbe1d7e920c2ed4fca53))
### Bug Fixes
* :zap: add Dockerfile, starter ([4e0d33c](https://github.com/leifermendez/bot-whatsapp/commit/4e0d33c6bb46ad259774f6d0c38c6c0b5f8ca4a9))
* :zap: fix inject port args ([20f752e](https://github.com/leifermendez/bot-whatsapp/commit/20f752e6c1b1f7d11948fc4f2f8950f7834df7d9))
* :zap: fix inject port args ([7a23eb0](https://github.com/leifermendez/bot-whatsapp/commit/7a23eb0cc6f93ec21c5ab34e46981ae7a93f42ff))
* **provider:** :zap: fix send image baileys ([2ddea54](https://github.com/leifermendez/bot-whatsapp/commit/2ddea5468d235035478d4e91e63c821da19da179))
* **provider:** :zap: fix send image baileys ([391e11c](https://github.com/leifermendez/bot-whatsapp/commit/391e11ce738cd64792b5237d69f3739b0263c198))
* **provider:** :zap: fix send image baileys ([5d10cb9](https://github.com/leifermendez/bot-whatsapp/commit/5d10cb9026da60043e9a2f86117ebb04d0631a3f))
* **provider:** fix error docker as root user ([5a033da](https://github.com/leifermendez/bot-whatsapp/commit/5a033da83aee1f614120bccf27c9f330500cc7b0))
### [0.1.4](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.5...v0.1.4) (2023-01-10)
### Features
* :zap: new portal web for qr scan ([cb2e869](https://github.com/leifermendez/bot-whatsapp/commit/cb2e8692a3f94c8b24993cd11dd564f094b0e4ef))
* :zap: new portal web for qr scan ([9e93795](https://github.com/leifermendez/bot-whatsapp/commit/9e93795e6fce38890045389da95184fef1fbe0da))
* :zap: new portal web for qr scan ([3c178ea](https://github.com/leifermendez/bot-whatsapp/commit/3c178ea113b140535a51f5dcd521dbb66251670e))
* :zap: new portal web for qr scan ([1f1f564](https://github.com/leifermendez/bot-whatsapp/commit/1f1f564f4e2e3aa13b84de500fe215e0c45c2770))
* :zap: new portal web for qr scan ([3de5f4b](https://github.com/leifermendez/bot-whatsapp/commit/3de5f4b77a10e30632ff7555f5af5d8e93cb2019))
* :zap: qr code filename ([d794f60](https://github.com/leifermendez/bot-whatsapp/commit/d794f604ac8a835e523709dbf18c9b1609bbd00e))
* :zap: qr portal ([246ecdc](https://github.com/leifermendez/bot-whatsapp/commit/246ecdc11a8c4e652867c842b612dc4ce73f9828))
* :zap: qr portal ([af8b401](https://github.com/leifermendez/bot-whatsapp/commit/af8b401d075e1c35065589ede61476461ce86b4d))
* agregamos dockerfile y webserver a starters ([f9e3bbc](https://github.com/leifermendez/bot-whatsapp/commit/f9e3bbc6655060408e4fdbe1d7e920c2ed4fca53))
### Bug Fixes
* :zap: add Dockerfile, starter ([4e0d33c](https://github.com/leifermendez/bot-whatsapp/commit/4e0d33c6bb46ad259774f6d0c38c6c0b5f8ca4a9))
* :zap: fix inject port args ([20f752e](https://github.com/leifermendez/bot-whatsapp/commit/20f752e6c1b1f7d11948fc4f2f8950f7834df7d9))
* :zap: fix inject port args ([7a23eb0](https://github.com/leifermendez/bot-whatsapp/commit/7a23eb0cc6f93ec21c5ab34e46981ae7a93f42ff))
* **provider:** :zap: fix send image baileys ([2ddea54](https://github.com/leifermendez/bot-whatsapp/commit/2ddea5468d235035478d4e91e63c821da19da179))
* **provider:** :zap: fix send image baileys ([391e11c](https://github.com/leifermendez/bot-whatsapp/commit/391e11ce738cd64792b5237d69f3739b0263c198))
* **provider:** :zap: fix send image baileys ([5d10cb9](https://github.com/leifermendez/bot-whatsapp/commit/5d10cb9026da60043e9a2f86117ebb04d0631a3f))
* **provider:** fix error docker as root user ([5a033da](https://github.com/leifermendez/bot-whatsapp/commit/5a033da83aee1f614120bccf27c9f330500cc7b0))
### [0.1.3](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.2...v0.1.3) (2023-01-04) ### [0.1.3](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.2...v0.1.3) (2023-01-04)

View File

@@ -1,8 +1,7 @@
# Chatbot Library # Chatbot Library
![](https://img.shields.io/npm/v/@bot-whatsapp/bot?color=%2300c200&label=%40bot-whatsapp) ![](https://img.shields.io/npm/v/@bot-whatsapp/bot?color=%2300c200&label=%40bot-whatsapp)
[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)
[![BotWhatsapp Releases(Prod)](https://github.com/codigoencasa/bot-whatsapp/actions/workflows/releases.yml/badge.svg)](https://github.com/codigoencasa/bot-whatsapp/actions/workflows/releases.yml) [![](https://img.shields.io/discord/915193197645402142?logo=discord)](https://link.codigoencasa.com/DISCORD)
<p align="center"> <p align="center">
<img width="300" src="https://i.imgur.com/Oauef6t.png"> <img width="300" src="https://i.imgur.com/Oauef6t.png">
@@ -34,6 +33,13 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
<!-- readme: collaborators,contributors -start --> <!-- readme: collaborators,contributors -start -->
<table> <table>
<tr> <tr>
<td align="center">
<a href="https://github.com/cheveguerra">
<img src="https://avatars.githubusercontent.com/u/5891114?v=4" width="50;" alt="cheveguerra"/>
<br />
<sub><b>Jose Alberto Guerra Ugalde</b></sub>
</a>
</td>
<td align="center"> <td align="center">
<a href="https://github.com/leifermendez"> <a href="https://github.com/leifermendez">
<img src="https://avatars.githubusercontent.com/u/15802366?v=4" width="50;" alt="leifermendez"/> <img src="https://avatars.githubusercontent.com/u/15802366?v=4" width="50;" alt="leifermendez"/>
@@ -62,6 +68,21 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
<sub><b>Leifer Mendez</b></sub> <sub><b>Leifer Mendez</b></sub>
</a> </a>
</td> </td>
<td align="center">
<a href="https://github.com/danielcasta0398">
<img src="https://avatars.githubusercontent.com/u/98791147?v=4" width="50;" alt="danielcasta0398"/>
<br />
<sub><b>Juan Daniel Castaño</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/marianarolfo">
<img src="https://avatars.githubusercontent.com/u/68322254?v=4" width="50;" alt="marianarolfo"/>
<br />
<sub><b>Null</b></sub>
</a>
</td>
<td align="center"> <td align="center">
<a href="https://github.com/HKong31"> <a href="https://github.com/HKong31">
<img src="https://avatars.githubusercontent.com/u/113340082?v=4" width="50;" alt="HKong31"/> <img src="https://avatars.githubusercontent.com/u/113340082?v=4" width="50;" alt="HKong31"/>
@@ -75,8 +96,14 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
<br /> <br />
<sub><b>Zvi</b></sub> <sub><b>Zvi</b></sub>
</a> </a>
</td></tr> </td>
<tr> <td align="center">
<a href="https://github.com/JosephVTX">
<img src="https://avatars.githubusercontent.com/u/91026290?v=4" width="50;" alt="JosephVTX"/>
<br />
<sub><b>Joseph Vega Callupe</b></sub>
</a>
</td>
<td align="center"> <td align="center">
<a href="https://github.com/Gonzalito87"> <a href="https://github.com/Gonzalito87">
<img src="https://avatars.githubusercontent.com/u/100331586?v=4" width="50;" alt="Gonzalito87"/> <img src="https://avatars.githubusercontent.com/u/100331586?v=4" width="50;" alt="Gonzalito87"/>
@@ -84,6 +111,42 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
<sub><b>Null</b></sub> <sub><b>Null</b></sub>
</a> </a>
</td> </td>
<td align="center">
<a href="https://github.com/devrlbusiness">
<img src="https://avatars.githubusercontent.com/u/66280283?v=4" width="50;" alt="devrlbusiness"/>
<br />
<sub><b>Developer RL Business</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/Gregoriotecnico">
<img src="https://avatars.githubusercontent.com/u/118696506?v=4" width="50;" alt="Gregoriotecnico"/>
<br />
<sub><b>Null</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/jlferrete">
<img src="https://avatars.githubusercontent.com/u/36698913?v=4" width="50;" alt="jlferrete"/>
<br />
<sub><b>Jose Luis Ferrete Olarte</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/lisandroprada">
<img src="https://avatars.githubusercontent.com/u/7232326?v=4" width="50;" alt="lisandroprada"/>
<br />
<sub><b>Null</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/6rak0">
<img src="https://avatars.githubusercontent.com/u/12260031?v=4" width="50;" alt="6rak0"/>
<br />
<sub><b>Null</b></sub>
</a>
</td>
<td align="center"> <td align="center">
<a href="https://github.com/tonyvazgar"> <a href="https://github.com/tonyvazgar">
<img src="https://avatars.githubusercontent.com/u/21047090?v=4" width="50;" alt="tonyvazgar"/> <img src="https://avatars.githubusercontent.com/u/21047090?v=4" width="50;" alt="tonyvazgar"/>
@@ -91,20 +154,14 @@ Entiende más a fondo sus funcionalidades explicadas en nuestra documentación.
<sub><b>Luis Antonio Vázquez García</b></sub> <sub><b>Luis Antonio Vázquez García</b></sub>
</a> </a>
</td> </td>
<td align="center">
<a href="https://github.com/ulisesvina">
<img src="https://avatars.githubusercontent.com/u/20508563?v=4" width="50;" alt="ulisesvina"/>
<br />
<sub><b>Ulises Viña</b></sub>
</a>
</td>
<td align="center"> <td align="center">
<a href="https://github.com/rrruuuyyy"> <a href="https://github.com/rrruuuyyy">
<img src="https://avatars.githubusercontent.com/u/33061671?v=4" width="50;" alt="rrruuuyyy"/> <img src="https://avatars.githubusercontent.com/u/33061671?v=4" width="50;" alt="rrruuuyyy"/>
<br /> <br />
<sub><b>Rodrigo Mendoza Cabrera</b></sub> <sub><b>Rodrigo Mendoza Cabrera</b></sub>
</a> </a>
</td> </td></tr>
<tr>
<td align="center"> <td align="center">
<a href="https://github.com/yond1994"> <a href="https://github.com/yond1994">
<img src="https://avatars.githubusercontent.com/u/47557263?v=4" width="50;" alt="yond1994"/> <img src="https://avatars.githubusercontent.com/u/47557263?v=4" width="50;" alt="yond1994"/>

50
__mocks__/env.js Normal file
View File

@@ -0,0 +1,50 @@
const MOCK_DB = require('../packages/database/src/mock')
const PROVIDER_DB = require('../packages/provider/src/mock')
class MOCK_FLOW {
allCallbacks = { ref: () => 1 }
flowSerialize = []
flowRaw = []
find = (arg) => {
if (arg) {
return [{ answer: 'answer', ref: 'ref' }]
} else {
return null
}
}
findBySerialize = () => ({})
findIndexByRef = () => 0
}
const cleaName = (name) => {
name = name.toLowerCase()
name = name.replaceAll(' ', '-')
name = name.replaceAll(':', '-')
name = name.replaceAll('"', '-')
return name
}
/**
* Preparar env para el test
* @param {*} context
*/
const setup = async (context) => {
const name = cleaName(`${context.__suite__}-${context.__test__}`)
const filename = `test-${name}.json`
context.provider = new PROVIDER_DB()
context.database = new MOCK_DB({ filename })
context.flow = new MOCK_FLOW()
await delay(10)
}
const clear = async (context) => {
context.provider = null
context.database = null
context.flow = null
}
function delay(ms) {
return new Promise((res) => setTimeout(res, ms))
}
module.exports = { setup, clear, delay }

View File

@@ -1,6 +0,0 @@
const MOCK_MOBILE_WS = {
from: 'XXXXXX',
hasMedia: false,
}
module.exports = { MOCK_MOBILE_WS }

View File

@@ -0,0 +1,51 @@
const { suite } = require('uvu')
const assert = require('uvu/assert')
const { addKeyword, createBot, createFlow } = require('../packages/bot/index')
const { setup, clear, delay } = require('../__mocks__/env')
const suiteCase = suite('Flujo: Simple')
suiteCase.before.each(setup)
suiteCase.after.each(clear)
suiteCase(`Responder a "hola"`, async ({ database, provider }) => {
const flow = addKeyword('hola').addAnswer('Buenas!').addAnswer('Como vamos!')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await delay(10)
assert.is('Buenas!', database.listHistory[0].answer)
assert.is('Como vamos!', database.listHistory[1].answer)
assert.is(undefined, database.listHistory[2])
})
suiteCase(`NO reponder a "pepe"`, async ({ database, provider }) => {
const flow = addKeyword('hola').addAnswer('Buenas!').addAnswer('Como vamos!')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'pepe',
})
await delay(100)
assert.is(undefined, database.listHistory[0])
assert.is(undefined, database.listHistory[1])
})
suiteCase.run()

View File

@@ -0,0 +1,31 @@
const { suite } = require('uvu')
const assert = require('uvu/assert')
const { addKeyword, createBot, createFlow } = require('../packages/bot/index')
const { setup, clear, delay } = require('../__mocks__/env')
const suiteCase = suite('Flujo: Provider envia un location')
suiteCase.before.each(setup)
suiteCase.after.each(clear)
suiteCase(`Responder a "CURRENT_LOCATION"`, async ({ database, provider }) => {
const flow = addKeyword('#CURRENT_LOCATION#').addAnswer('Gracias por tu location')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: '#CURRENT_LOCATION#',
})
await delay(200)
const getHistory = database.listHistory.map((i) => i.answer)
assert.is('Gracias por tu location', getHistory[0])
assert.is(undefined, getHistory[1])
})
suiteCase.run()

View File

@@ -0,0 +1,51 @@
const { suite } = require('uvu')
const assert = require('uvu/assert')
const { addKeyword, createBot, createFlow } = require('../packages/bot/index')
const { setup, clear, delay } = require('../__mocks__/env')
const suiteCase = suite('Flujo: sensitive')
suiteCase.before.each(setup)
suiteCase.after.each(clear)
suiteCase(`Responder a "ole" en minuscula`, async ({ database, provider }) => {
const flow = addKeyword(['ola', 'ole'], { sensitive: true }).addAnswer('Bienvenido a la OLA')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'ole',
})
await delay(100)
assert.is('Bienvenido a la OLA', database.listHistory[0].answer)
assert.is(undefined, database.listHistory[1])
})
suiteCase(`NO Responder a "ole" en minuscula`, async ({ database, provider }) => {
const flow = addKeyword(['ola', 'ole'], { sensitive: true }).addAnswer('Bienvenido a la OLA')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'OLE',
})
await delay(100)
assert.is(undefined, database.listHistory[0])
assert.is(undefined, database.listHistory[1])
})
suiteCase.run()

View File

@@ -0,0 +1,89 @@
const { suite } = require('uvu')
const assert = require('uvu/assert')
const { addKeyword, createBot, createFlow } = require('../packages/bot/index')
const { setup, clear, delay } = require('../__mocks__/env')
const fakeHTTP = async () => {
await delay(10)
}
const suiteCase = suite('Flujo: hijos con callbacks')
suiteCase.before.each(setup)
suiteCase.after.each(clear)
suiteCase(`Debe continuar el flujo del hijo`, async ({ database, provider }) => {
const flowCash = addKeyword('cash').addAnswer('Traeme los billetes! 😎')
const flowOnline = addKeyword('paypal')
.addAnswer('Voy generar un link de paypal *escribe algo*', { capture: true }, async (_, { flowDynamic }) => {
await fakeHTTP()
await flowDynamic('Esperate.... estoy generando esto toma su tiempo')
})
.addAnswer('Aqui lo tienes 😎😎', null, async (_, { flowDynamic }) => {
await fakeHTTP()
await flowDynamic('http://paypal.com')
})
.addAnswer('Apurate!')
const flujoPrincipal = addKeyword('hola')
.addAnswer('¿Como estas todo bien?')
.addAnswer('Espero que si')
.addAnswer('¿Cual es tu email?', { capture: true }, async (ctx, { fallBack }) => {
if (!ctx.body.includes('@')) {
return fallBack('Veo que no es um mail *bien*')
}
})
.addAnswer('Voy a validar tu email...', null, async (_, { flowDynamic }) => {
await fakeHTTP()
return flowDynamic('Email validado correctamten!')
})
.addAnswer('¿Como vas a pagar *paypal* o *cash*?', { capture: true }, async () => {}, [flowCash, flowOnline])
createBot({
database,
flow: createFlow([flujoPrincipal]),
provider,
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await provider.delaySendMessage(30, 'message', {
from: '000',
body: 'test@test.com',
})
await provider.delaySendMessage(60, 'message', {
from: '000',
body: 'paypal',
})
await provider.delaySendMessage(90, 'message', {
from: '000',
body: 'continue!',
})
await delay(800)
const getHistory = database.listHistory.map((i) => i.answer)
assert.is('¿Como estas todo bien?', getHistory[0])
assert.is('Espero que si', getHistory[1])
assert.is('¿Cual es tu email?', getHistory[2])
assert.is('test@test.com', getHistory[3])
assert.is('Voy a validar tu email...', getHistory[4])
assert.is('Email validado correctamten!', getHistory[5])
assert.is('¿Como vas a pagar *paypal* o *cash*?', getHistory[6])
assert.is('paypal', getHistory[7])
assert.is('Voy generar un link de paypal *escribe algo*', getHistory[8])
assert.is('continue!', getHistory[9])
assert.is('Esperate.... estoy generando esto toma su tiempo', getHistory[10])
assert.is('Aqui lo tienes 😎😎', getHistory[11])
assert.is('http://paypal.com', getHistory[12])
assert.is('Apurate!', getHistory[13])
assert.is(undefined, getHistory[14])
})
suiteCase.run()

View File

@@ -0,0 +1,59 @@
const { suite } = require('uvu')
const assert = require('uvu/assert')
const { addKeyword, createBot, createFlow } = require('../packages/bot/index')
const { setup, clear, delay } = require('../__mocks__/env')
const suiteCase = suite('Flujo: regex')
suiteCase.before.each(setup)
suiteCase.after.each(clear)
suiteCase(`Responder a una expresion regular`, async ({ database, provider }) => {
const REGEX_CREDIT_NUMBER = `/(^4[0-9]{12}(?:[0-9]{3})?$)|(^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$)|(3[47][0-9]{13})|(^3(?:0[0-5]|[68][0-9])[0-9]{11}$)|(^6(?:011|5[0-9]{2})[0-9]{12}$)|(^(?:2131|1800|35\d{3})\d{11}$)/gm`
const flow = addKeyword(REGEX_CREDIT_NUMBER, { regex: true })
.addAnswer(`Gracias por proporcionar un numero de tarjeta valido`)
.addAnswer('Fin!')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: '374245455400126',
})
await delay(100)
assert.is('Gracias por proporcionar un numero de tarjeta valido', database.listHistory[0].answer)
assert.is('Fin!', database.listHistory[1].answer)
assert.is(undefined, database.listHistory[2])
})
suiteCase(`NO Responder a una expresion regular`, async ({ database, provider }) => {
const REGEX_CREDIT_NUMBER = `/(^4[0-9]{12}(?:[0-9]{3})?$)|(^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$)|(3[47][0-9]{13})|(^3(?:0[0-5]|[68][0-9])[0-9]{11}$)|(^6(?:011|5[0-9]{2})[0-9]{12}$)|(^(?:2131|1800|35\d{3})\d{11}$)/gm`
const flow = addKeyword(REGEX_CREDIT_NUMBER, { regex: true })
.addAnswer(`Gracias por proporcionar un numero de tarjeta valido`)
.addAnswer('Fin!')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await delay(100)
assert.is(undefined, database.listHistory[0])
assert.is(undefined, database.listHistory[1])
})
suiteCase.run()

View File

@@ -0,0 +1,40 @@
const { suite } = require('uvu')
const assert = require('uvu/assert')
const { addKeyword, createBot, createFlow } = require('../packages/bot/index')
const { setup, clear, delay } = require('../__mocks__/env')
const suiteCase = suite('Flujo: capture')
suiteCase.before.each(setup)
suiteCase.after.each(clear)
suiteCase(`Responder a "pregunta"`, async ({ database, provider }) => {
const flow = addKeyword(['hola'])
.addAnswer(['Hola como estas?', '¿Cual es tu edad?'], { capture: true })
.addAnswer('Gracias por tu respuesta')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await provider.delaySendMessage(10, 'message', {
from: '000',
body: '90',
})
await delay(100)
assert.is(['Hola como estas?', '¿Cual es tu edad?'].join('\n'), database.listHistory[0].answer)
assert.is('90', database.listHistory[1].answer)
assert.is('Gracias por tu respuesta', database.listHistory[2].answer)
assert.is(undefined, database.listHistory[3])
})
suiteCase.run()

162
__test__/0.1.4-case.test.js Normal file
View File

@@ -0,0 +1,162 @@
const { suite } = require('uvu')
const assert = require('uvu/assert')
const { addKeyword, createBot, createFlow } = require('../packages/bot/index')
const { setup, clear, delay } = require('../__mocks__/env')
const fakeHTTP = async (fakeData = []) => {
await delay(50)
const data = fakeData.map((u) => ({ body: `${u}` }))
return Promise.resolve(data)
}
const suiteCase = suite('Flujo: flowDynamic')
suiteCase.before.each(setup)
suiteCase.after.each(clear)
suiteCase(`Responder con mensajes asyncronos`, async ({ database, provider }) => {
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 flow = addKeyword(['hola'])
.addAnswer(MOCK_VALUES[0], null, async (_, { flowDynamic }) => {
const data = await fakeHTTP(['Ford', 'GM', 'BMW'])
return flowDynamic(data)
})
.addAnswer(MOCK_VALUES[1], null, async (_, { flowDynamic }) => {
const data = await fakeHTTP(['Ranger', 'Explorer'])
return flowDynamic(data)
})
.addAnswer(MOCK_VALUES[2], null, async (_, { flowDynamic }) => {
const data = await fakeHTTP(['Usado', 'Nuevos'])
return flowDynamic(data)
})
.addAnswer(MOCK_VALUES[3], null, async (_, { flowDynamic }) => {
const data = await fakeHTTP(['1000', '2000', '3000'])
return flowDynamic(data)
})
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await delay(1500)
const getHistory = database.listHistory.map((i) => i.answer)
assert.is(MOCK_VALUES[0], getHistory[0])
//FlowDynamic
assert.is('Ford', getHistory[1])
assert.is('GM', getHistory[2])
assert.is('BMW', getHistory[3])
assert.is(MOCK_VALUES[1], getHistory[4])
//FlowDynamic
assert.is('Ranger', getHistory[5])
assert.is('Explorer', getHistory[6])
assert.is(MOCK_VALUES[2], getHistory[7])
//FlowDynamic
assert.is('Usado', getHistory[8])
assert.is('Nuevos', getHistory[9])
assert.is(MOCK_VALUES[3], getHistory[10])
//FlowDynamic
assert.is('1000', getHistory[11])
assert.is('2000', getHistory[12])
assert.is('3000', getHistory[13])
assert.is(undefined, getHistory[14])
})
suiteCase(`Responder con un "string"`, async ({ database, provider }) => {
const flow = addKeyword(['hola'])
.addAnswer('Como vas?', null, async (_, { flowDynamic }) => {
return flowDynamic('Todo bien!')
})
.addAnswer('y vos?')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await delay(100)
const getHistory = database.listHistory.map((i) => i.answer)
assert.is('Como vas?', getHistory[0])
assert.is('Todo bien!', getHistory[1])
assert.is('y vos?', getHistory[2])
assert.is(undefined, getHistory[3])
})
suiteCase(`Responder con un "array"`, async ({ database, provider }) => {
const flow = addKeyword(['hola'])
.addAnswer('Como vas?', null, async (_, { flowDynamic }) => {
return flowDynamic(['Todo bien!', 'trabajando'])
})
.addAnswer('y vos?')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await delay(100)
const getHistory = database.listHistory.map((i) => i.answer)
assert.is('Como vas?', getHistory[0])
assert.is('Todo bien!', getHistory[1])
assert.is('trabajando', getHistory[2])
assert.is('y vos?', getHistory[3])
assert.is(undefined, getHistory[4])
})
suiteCase(`Responder con un "object"`, async ({ database, provider }) => {
const flow = addKeyword(['hola'])
.addAnswer('Como vas?', null, async (_, { flowDynamic }) => {
return flowDynamic([{ body: 'Todo bien!' }])
})
.addAnswer('y vos?')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await delay(100)
const getHistory = database.listHistory.map((i) => i.answer)
assert.is('Como vas?', getHistory[0])
assert.is('Todo bien!', getHistory[1])
assert.is('y vos?', getHistory[2])
assert.is(undefined, getHistory[3])
})
suiteCase.run()

167
__test__/0.1.5-case.test.js Normal file
View File

@@ -0,0 +1,167 @@
const { suite } = require('uvu')
const assert = require('uvu/assert')
const { addKeyword, createBot, createFlow } = require('../packages/bot/index')
const { setup, clear, delay } = require('../__mocks__/env')
const fakeHTTP = async (fakeData = []) => {
await delay(50)
const data = fakeData.map((u) => ({ body: `${u}` }))
return Promise.resolve(data)
}
const suiteCase = suite('Flujo: endFlow')
suiteCase.before.each(setup)
suiteCase.after.each(clear)
suiteCase(`Detener el flujo`, async ({ database, provider }) => {
const MOCK_VALUES = [
'Bienvenido te envio muchas marcas',
'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 flow = addKeyword(['hola'])
.addAnswer(MOCK_VALUES[0], null, async (_, { flowDynamic }) => {
const data = await fakeHTTP(['Ford', 'GM', 'BMW'])
return flowDynamic(data)
})
.addAnswer(MOCK_VALUES[1], null, async (_, { endFlow }) => {
return endFlow()
})
.addAnswer(MOCK_VALUES[2])
.addAnswer(MOCK_VALUES[3], null, async (_, { flowDynamic }) => {
const data = await fakeHTTP(['1000', '2000', '3000'])
return flowDynamic(data)
})
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await delay(900)
const getHistory = database.listHistory.map((i) => i.answer)
assert.is(MOCK_VALUES[0], getHistory[0])
//FlowDynamic
assert.is('Ford', getHistory[1])
assert.is('GM', getHistory[2])
assert.is('BMW', getHistory[3])
assert.is(MOCK_VALUES[1], getHistory[4])
//FlowDynamic
assert.is(undefined, getHistory[5])
assert.is(undefined, getHistory[6])
})
suiteCase(`Detener el flujo flowDynamic`, async ({ database, provider }) => {
const flow = addKeyword(['hola'])
.addAnswer('Buenas!', null, async (_, { endFlow, flowDynamic }) => {
await flowDynamic('Continuamos...')
return endFlow()
})
.addAnswer('Como estas!')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await delay(100)
const getHistory = database.listHistory.map((i) => i.answer)
assert.is('Buenas!', getHistory[0])
assert.is('Continuamos...', getHistory[1])
assert.is(undefined, getHistory[2])
})
suiteCase(`flowDynamic con capture`, async ({ database, provider }) => {
const MOCK_VALUES = ['¿CUal es tu email?', 'Continuamos....', '¿Cual es tu edad?']
const flow = 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()
}
)
.addAnswer(MOCK_VALUES[1])
.addAnswer(MOCK_VALUES[2], { capture: true }, async (ctx, { flowDynamic, fallBack }) => {
if (ctx.body !== '18') {
await delay(20)
return fallBack('Ups creo que no eres mayor de edad')
}
return flowDynamic('Bien tu edad es correcta!')
})
.addAnswer('Puedes pasar')
createBot({
database,
provider,
flow: createFlow([flow]),
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await provider.delaySendMessage(10, 'message', {
from: '000',
body: 'this is not email value',
})
await provider.delaySendMessage(20, 'message', {
from: '000',
body: 'test@test.com',
})
await provider.delaySendMessage(90, 'message', {
from: '000',
body: '20',
})
await provider.delaySendMessage(200, 'message', {
from: '000',
body: '18',
})
await delay(900)
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('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])
})
suiteCase.run()

View File

@@ -0,0 +1,97 @@
const { suite } = require('uvu')
const assert = require('uvu/assert')
const { addKeyword, createBot, createFlow } = require('../packages/bot/index')
const { setup, clear, delay } = require('../__mocks__/env')
const suiteCase = suite('Flujo: manejo de estado')
suiteCase.before.each(setup)
suiteCase.after.each(clear)
suiteCase(`Debe retornar un mensaje resumen`, async ({ database, provider }) => {
let STATE_APP = {}
const MOCK_VALUES = ['¿Cual es tu nombre?', '¿Cual es tu edad?', 'Tu datos son:']
const flujoPrincipal = addKeyword(['hola'])
.addAnswer(
MOCK_VALUES[0],
{
capture: true,
},
async (ctx, { flowDynamic }) => {
STATE_APP[ctx.from] = { ...STATE_APP[ctx.from], name: ctx.body }
flowDynamic('Gracias por tu nombre!')
}
)
.addAnswer(
MOCK_VALUES[1],
{
capture: true,
},
async (ctx, { flowDynamic }) => {
STATE_APP[ctx.from] = { ...STATE_APP[ctx.from], age: ctx.body }
await flowDynamic(`Gracias por tu edad! ${STATE_APP[ctx.from].name}`)
}
)
.addAnswer(MOCK_VALUES[2], null, async (ctx, { flowDynamic }) => {
flowDynamic(`Nombre: ${STATE_APP[ctx.from].name} Edad: ${STATE_APP[ctx.from].age}`)
})
.addAnswer('🤖🤖 Gracias por tu participacion')
createBot({
database,
flow: createFlow([flujoPrincipal]),
provider,
})
await provider.delaySendMessage(0, 'message', {
from: '000',
body: 'hola',
})
await provider.delaySendMessage(5, 'message', {
from: '001',
body: 'hola',
})
await provider.delaySendMessage(10, 'message', {
from: '000',
body: 'Leifer',
})
await provider.delaySendMessage(15, 'message', {
from: '000',
body: '90',
})
await provider.delaySendMessage(20, 'message', {
from: '001',
body: 'Maria',
})
await provider.delaySendMessage(25, 'message', {
from: '001',
body: '100',
})
await delay(1000)
const getHistory = database.listHistory.map((i) => i.answer)
assert.is(MOCK_VALUES[0], getHistory[0])
assert.is('¿Cual es tu nombre?', getHistory[1])
assert.is('Leifer', getHistory[2])
assert.is('Gracias por tu nombre!', getHistory[3])
assert.is('¿Cual es tu edad?', getHistory[4])
assert.is('90', getHistory[5])
assert.is('Gracias por tu edad! Leifer', getHistory[6])
assert.is('Tu datos son:', getHistory[7])
assert.is('Nombre: Leifer Edad: 90', getHistory[8])
assert.is('🤖🤖 Gracias por tu participacion', getHistory[9])
assert.is('Maria', getHistory[10])
assert.is('Gracias por tu nombre!', getHistory[11])
assert.is('100', getHistory[12])
assert.is(undefined, getHistory[13])
})
suiteCase.run()

View File

@@ -1,28 +1,10 @@
module.exports = { module.exports = {
disableEmoji: false, disableEmoji: false,
format: '{type}{scope}: {emoji}{subject}', format: '{type}{scope}: {emoji}{subject}',
list: [ list: ['test', 'feat', 'fix', 'chore', 'docs', 'refactor', 'style', 'ci', 'perf'],
'test',
'feat',
'fix',
'chore',
'docs',
'refactor',
'style',
'ci',
'perf',
],
maxMessageLength: 64, maxMessageLength: 64,
minMessageLength: 3, minMessageLength: 3,
questions: [ questions: ['type', 'scope', 'subject', 'body', 'breaking', 'issues', 'lerna'],
'type',
'scope',
'subject',
'body',
'breaking',
'issues',
'lerna',
],
scopes: [], scopes: [],
types: { types: {
chore: { chore: {
@@ -56,8 +38,7 @@ module.exports = {
value: 'perf', value: 'perf',
}, },
refactor: { refactor: {
description: description: 'A code change that neither fixes a bug or adds a feature',
'A code change that neither fixes a bug or adds a feature',
emoji: '(💡)', emoji: '(💡)',
value: 'refactor', value: 'refactor',
}, },
@@ -67,8 +48,7 @@ module.exports = {
value: 'release', value: 'release',
}, },
style: { style: {
description: description: 'Markup, white-space, formatting, missing semi-colons...',
'Markup, white-space, formatting, missing semi-colons...',
emoji: '(💄)', emoji: '(💄)',
value: 'style', value: 'style',
}, },
@@ -80,8 +60,7 @@ module.exports = {
messages: { messages: {
type: "Select the type of change that you're committing:", type: "Select the type of change that you're committing:",
customScope: 'Select the scope this component affects:', customScope: 'Select the scope this component affects:',
subject: subject: 'Write a short, imperative mood description of the change:\n',
'Write a short, imperative mood description of the change:\n',
body: 'Provide a longer description of the change:\n ', body: 'Provide a longer description of the change:\n ',
breaking: 'List any breaking changes:\n', breaking: 'List any breaking changes:\n',
footer: 'Issues this commit closes, e.g #123:', footer: 'Issues this commit closes, e.g #123:',

View File

@@ -1,6 +1,6 @@
{ {
"name": "@bot-whatsapp/root", "name": "@bot-whatsapp/root",
"version": "0.1.3", "version": "0.1.21",
"description": "Bot de wahtsapp open source para MVP o pequeños negocios", "description": "Bot de wahtsapp open source para MVP o pequeños negocios",
"main": "app.js", "main": "app.js",
"private": true, "private": true,
@@ -13,14 +13,18 @@
"contexts:rollup": "rollup --config ./packages/contexts/rollup-contexts.config.js", "contexts:rollup": "rollup --config ./packages/contexts/rollup-contexts.config.js",
"database:rollup": "rollup --config ./packages/database/rollup-database.config.js", "database:rollup": "rollup --config ./packages/database/rollup-database.config.js",
"create-bot-whatsapp:rollup": "rollup --config ./packages/create-bot-whatsapp/rollup-create.config.js", "create-bot-whatsapp:rollup": "rollup --config ./packages/create-bot-whatsapp/rollup-create.config.js",
"portal:rollup": "rollup --config ./packages/portal/rollup-portal.config.js",
"format:check": "prettier --check ./packages", "format:check": "prettier --check ./packages",
"format:write": "prettier --write ./packages", "format:write": "prettier --write ./packages",
"fmt.staged": "pretty-quick --staged", "fmt.staged": "pretty-quick --staged",
"lint:check": "eslint ./packages", "lint:check": "eslint ./packages",
"lint:fix": "eslint --fix ./packages", "lint:fix": "eslint --fix ./packages",
"build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup", "build:portal-web": "cd ./packages/portal/ && yarn run build.types && yarn run build.client && yarn run build.server && yarn run lint --fix",
"build:full": "yarn run build:portal-web && yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup && yarn run portal:rollup",
"build": "yarn run cli:rollup && yarn run bot:rollup && yarn run provider:rollup && yarn run database:rollup && yarn run contexts:rollup && yarn run create-bot-whatsapp:rollup && yarn run portal:rollup",
"copy.lib": "node ./scripts/move.js", "copy.lib": "node ./scripts/move.js",
"test.unit": "node ./node_modules/uvu/bin.js packages test", "test.unit": "node ./node_modules/uvu/bin.js packages test",
"test.e2e": "node ./node_modules/uvu/bin.js __test__",
"test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit", "test.coverage": "node ./node_modules/c8/bin/c8.js npm run test.unit",
"test": "npm run test.coverage", "test": "npm run test.coverage",
"cli": "node ./packages/cli/bin/cli.js", "cli": "node ./packages/cli/bin/cli.js",
@@ -39,6 +43,7 @@
"packages/database", "packages/database",
"packages/provider", "packages/provider",
"packages/contexts", "packages/contexts",
"packages/portal",
"packages/docs" "packages/docs"
], ],
"keywords": [ "keywords": [
@@ -63,6 +68,7 @@
"devDependencies": { "devDependencies": {
"@commitlint/cli": "^17.3.0", "@commitlint/cli": "^17.3.0",
"@commitlint/config-conventional": "^17.3.0", "@commitlint/config-conventional": "^17.3.0",
"@octokit/core": "^4.1.0",
"@rollup/plugin-commonjs": "^23.0.2", "@rollup/plugin-commonjs": "^23.0.2",
"@rollup/plugin-json": "^5.0.1", "@rollup/plugin-json": "^5.0.1",
"@rollup/plugin-node-resolve": "^15.0.1", "@rollup/plugin-node-resolve": "^15.0.1",
@@ -75,6 +81,7 @@
"fs-extra": "^11.1.0", "fs-extra": "^11.1.0",
"git-cz": "^4.9.0", "git-cz": "^4.9.0",
"husky": "^8.0.2", "husky": "^8.0.2",
"mime-types": "^2.1.35",
"only-allow": "^1.1.1", "only-allow": "^1.1.1",
"prettier": "^2.8.0", "prettier": "^2.8.0",
"pretty-quick": "^3.1.3", "pretty-quick": "^3.1.3",

View File

@@ -8,6 +8,9 @@ const { createWriteStream } = require('fs')
const logger = new Console({ const logger = new Console({
stdout: createWriteStream(`${process.cwd()}/core.class.log`), stdout: createWriteStream(`${process.cwd()}/core.class.log`),
}) })
const QueuePrincipal = new Queue()
/** /**
* [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos * [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos
* [ ] Guardar historial en db * [ ] Guardar historial en db
@@ -18,10 +21,12 @@ class CoreClass {
flowClass flowClass
databaseClass databaseClass
providerClass providerClass
constructor(_flow, _database, _provider) { generalArgs = { blackList: [] }
constructor(_flow, _database, _provider, _args) {
this.flowClass = _flow this.flowClass = _flow
this.databaseClass = _database this.databaseClass = _database
this.providerClass = _provider this.providerClass = _provider
this.generalArgs = { ...this.generalArgs, ..._args }
for (const { event, func } of this.listenerBusEvents()) { for (const { event, func } of this.listenerBusEvents()) {
this.providerClass.on(event, func) this.providerClass.on(event, func)
@@ -38,8 +43,7 @@ class CoreClass {
}, },
{ {
event: 'require_action', event: 'require_action',
func: ({ instructions, title = '⚡⚡ ACCIÓN REQUERIDA ⚡⚡' }) => func: ({ instructions, title = '⚡⚡ ACCIÓN REQUERIDA ⚡⚡' }) => printer(instructions, title),
printer(instructions, title),
}, },
{ {
event: 'ready', event: 'ready',
@@ -47,8 +51,7 @@ class CoreClass {
}, },
{ {
event: 'auth_failure', event: 'auth_failure',
func: ({ instructions }) => func: ({ instructions }) => printer(instructions, '⚡⚡ ERROR AUTH ⚡⚡'),
printer(instructions, '⚡⚡ ERROR AUTH ⚡⚡'),
}, },
{ {
@@ -66,14 +69,14 @@ class CoreClass {
logger.log(`[handleMsg]: `, messageCtxInComming) logger.log(`[handleMsg]: `, messageCtxInComming)
const { body, from } = messageCtxInComming const { body, from } = messageCtxInComming
let msgToSend = [] let msgToSend = []
let endFlowFlag = false
let fallBackFlag = false let fallBackFlag = false
if (this.generalArgs.blackList.includes(from)) return
if (!body) return
if (!body.length) return if (!body.length) return
const prevMsg = await this.databaseClass.getPrevByNumber(from) let prevMsg = await this.databaseClass.getPrevByNumber(from)
const refToContinue = this.flowClass.findBySerialize( const refToContinue = this.flowClass.findBySerialize(prevMsg?.refSerialize)
prevMsg?.refSerialize
)
if (prevMsg?.ref) { if (prevMsg?.ref) {
const ctxByNumber = toCtx({ const ctxByNumber = toCtx({
@@ -81,56 +84,148 @@ class CoreClass {
from, from,
prevRef: prevMsg.refSerialize, prevRef: prevMsg.refSerialize,
}) })
this.databaseClass.save(ctxByNumber) await this.databaseClass.save(ctxByNumber)
} }
// 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje // 📄 Crar CTX de mensaje (uso private)
const fallBack = () => { const createCtxMessage = (payload = {}, index = 0) => {
fallBackFlag = true const body = typeof payload === 'string' ? payload : payload?.body ?? payload?.answer
msgToSend = this.flowClass.find(refToContinue?.keyword, true) || [] const media = payload?.media ?? null
this.sendFlow(msgToSend, from) const buttons = payload?.buttons ?? []
return refToContinue const capture = payload?.capture ?? false
}
// 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes return toCtx({
// para evitar bloque de whatsapp body,
const flowDynamic = (listMsg = [], optListMsg = { limit: 3 }) => { from,
if (!Array.isArray(listMsg)) keyword: null,
throw new Error('Esto debe ser un ARRAY') index,
options: { media, buttons, capture },
const parseListMsg = listMsg
.map(({ body }, index) =>
toCtx({
body,
from,
keyword: null,
index,
})
)
.slice(0, optListMsg.limit)
msgToSend = parseListMsg
this.sendFlow(msgToSend, from)
return
}
// 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo
const cbEveryCtx = (inRef) => {
this.flowClass.allCallbacks[inRef](messageCtxInComming, {
fallBack,
flowDynamic,
}) })
} }
// 📄 [options: callback]: Si se tiene un callback se ejecuta // 📄 Limpiar cola de procesos
if (!fallBackFlag) { const clearQueue = () => {
if (refToContinue?.options?.capture) cbEveryCtx(refToContinue?.ref) QueuePrincipal.pendingPromise = false
for (const ite of this.flowClass.find(body)) { QueuePrincipal.queue = []
if (!ite?.options?.capture) cbEveryCtx(ite?.ref) }
// 📄 Finalizar flujo
const endFlow =
(flag) =>
async (message = null) => {
flag.endFlow = true
endFlowFlag = true
if (message) this.sendProviderAndSave(from, createCtxMessage(message))
clearQueue()
sendFlow([])
return
} }
// 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx
const sendFlow = async (messageToSend, numberOrId, options = { prev: prevMsg }) => {
if (options.prev?.options?.capture) await cbEveryCtx(options.prev?.ref)
const queue = []
for (const ctxMessage of messageToSend) {
if (endFlowFlag) return
const delayMs = ctxMessage?.options?.delay || 0
if (delayMs) await delay(delayMs)
await QueuePrincipal.enqueue(() =>
this.sendProviderAndSave(numberOrId, ctxMessage).then(() => resolveCbEveryCtx(ctxMessage))
)
}
return Promise.all(queue)
}
const continueFlow = async () => {
const currentPrev = await this.databaseClass.getPrevByNumber(from)
const nextFlow = (await this.flowClass.find(refToContinue?.ref, true)) ?? []
const filterNextFlow = nextFlow.filter((msg) => msg.refSerialize !== currentPrev?.refSerialize)
const isContinueFlow = filterNextFlow.map((i) => i.keyword).includes(currentPrev?.ref)
if (!isContinueFlow) {
const refToContinueChild = this.flowClass.getRefToContinueChild(currentPrev?.keyword)
const flowStandaloneChild = this.flowClass.getFlowsChild()
const nextChildMessages =
(await this.flowClass.find(refToContinueChild?.ref, true, flowStandaloneChild)) || []
if (nextChildMessages?.length) return await sendFlow(nextChildMessages, from, { prev: undefined })
}
if (!isContinueFlow) {
await sendFlow(filterNextFlow, from, { prev: undefined })
return
}
}
// 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje
const fallBack =
(flag) =>
async (message = null) => {
QueuePrincipal.queue = []
flag.fallBack = true
await this.sendProviderAndSave(from, {
...prevMsg,
answer: typeof message === 'string' ? message : message?.body ?? prevMsg.answer,
options: {
...prevMsg.options,
buttons: prevMsg.options?.buttons,
},
})
return
}
// 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes
// para evitar bloque de whatsapp
const flowDynamic =
(flag) =>
async (listMsg = []) => {
flag.flowDynamic = true
if (!Array.isArray(listMsg)) listMsg = [listMsg]
const parseListMsg = listMsg.map((opt, index) => createCtxMessage(opt, index))
if (endFlowFlag) return
for (const msg of parseListMsg) {
await this.sendProviderAndSave(from, msg)
}
await continueFlow()
return
}
// 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback
const resolveCbEveryCtx = async (ctxMessage) => {
if (!ctxMessage?.options?.capture) return await cbEveryCtx(ctxMessage?.ref)
}
// 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo
const cbEveryCtx = async (inRef) => {
let flags = {
endFlow: false,
fallBack: false,
flowDynamic: false,
wait: true,
}
const provider = this.providerClass
if (!this.flowClass.allCallbacks[inRef]) return Promise.resolve()
const argsCb = {
provider,
fallBack: fallBack(flags),
flowDynamic: flowDynamic(flags),
endFlow: endFlow(flags),
}
await this.flowClass.allCallbacks[inRef](messageCtxInComming, argsCb)
const wait = !(!flags.endFlow && !flags.fallBack && !flags.flowDynamic)
if (!wait) await continueFlow()
return
} }
// 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa // 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa
if (!fallBackFlag && prevMsg?.options?.nested?.length) { if (!endFlowFlag && prevMsg?.options?.nested?.length) {
const nestedRef = prevMsg.options.nested const nestedRef = prevMsg.options.nested
const flowStandalone = nestedRef.map((f) => ({ const flowStandalone = nestedRef.map((f) => ({
...nestedRef.find((r) => r.refSerialize === f.refSerialize), ...nestedRef.find((r) => r.refSerialize === f.refSerialize),
@@ -138,28 +233,23 @@ class CoreClass {
msgToSend = this.flowClass.find(body, false, flowStandalone) || [] msgToSend = this.flowClass.find(body, false, flowStandalone) || []
for (const ite of msgToSend) { await sendFlow(msgToSend, from)
cbEveryCtx(ite?.ref)
}
this.sendFlow(msgToSend, from)
return return
} }
// 📄🤘(tiene return) [options: capture (boolean)]: Si se tiene option boolean // 📄🤘(tiene return) Si el mensaje previo implementa capture
if (!fallBackFlag && !prevMsg?.options?.nested?.length) { if (!endFlowFlag && !prevMsg?.options?.nested?.length) {
const typeCapture = typeof prevMsg?.options?.capture 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) || [] msgToSend = this.flowClass.find(refToContinue?.ref, true) || []
this.sendFlow(msgToSend, from) await sendFlow(msgToSend, from)
return return
} }
} }
msgToSend = this.flowClass.find(body) || [] msgToSend = this.flowClass.find(body) || []
this.sendFlow(msgToSend, from) sendFlow(msgToSend, from)
} }
/** /**
@@ -168,27 +258,15 @@ class CoreClass {
* @param {*} ctxMessage ver más en GLOSSARY.md * @param {*} ctxMessage ver más en GLOSSARY.md
* @returns * @returns
*/ */
sendProviderAndSave = (numberOrId, ctxMessage) => { sendProviderAndSave = async (numberOrId, ctxMessage) => {
const { answer } = ctxMessage const { answer } = ctxMessage
return Promise.all([ await this.providerClass.sendMessage(numberOrId, answer, ctxMessage)
this.providerClass.sendMessage(numberOrId, answer, ctxMessage), await this.databaseClass.save({ ...ctxMessage, from: numberOrId })
this.databaseClass.save({ ...ctxMessage, from: numberOrId }), return
])
}
sendFlow = async (messageToSend, numberOrId) => {
const queue = []
for (const ctxMessage of messageToSend) {
const delayMs = ctxMessage?.options?.delay || 0
if (delayMs) await delay(delayMs)
Queue.enqueue(() =>
this.sendProviderAndSave(numberOrId, ctxMessage)
)
}
return Promise.all(queue)
} }
/** /**
* @deprecated
* @private * @private
* @param {*} message * @param {*} message
* @param {*} ref * @param {*} ref
@@ -201,5 +279,22 @@ class CoreClass {
this.continue(null, responde.ref) 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 module.exports = CoreClass

View File

@@ -8,8 +8,7 @@ const { addKeyword, addAnswer, addChild, toSerialize } = require('./io/methods')
* @param {*} args * @param {*} args
* @returns * @returns
*/ */
const createBot = async ({ flow, database, provider }) => const createBot = async ({ flow, database, provider }, args = {}) => new CoreClass(flow, database, provider, args)
new CoreClass(flow, database, provider)
/** /**
* Crear instancia de clase Io (Flow) * Crear instancia de clase Io (Flow)
@@ -29,8 +28,7 @@ const createFlow = (args) => {
*/ */
const createProvider = (providerClass = class {}, args = null) => { const createProvider = (providerClass = class {}, args = null) => {
const providerInstance = new providerClass(args) const providerInstance = new providerClass(args)
if (!providerClass.prototype instanceof ProviderClass) if (!providerClass.prototype instanceof ProviderClass) throw new Error('El provider no implementa ProviderClass')
throw new Error('El provider no implementa ProviderClass')
return providerInstance return providerInstance
} }

View File

@@ -25,9 +25,9 @@ class FlowClass {
let refSymbol = null let refSymbol = null
overFlow = overFlow ?? this.flowSerialize overFlow = overFlow ?? this.flowSerialize
/** Retornar expresion regular para buscar coincidencia */ const mapSensitive = (str, mapOptions = { sensitive: false, regex: false }) => {
const mapSensitive = (str, flag = false) => { if (mapOptions.regex) return new RegExp(str)
const regexSensitive = flag ? 'g' : 'i' const regexSensitive = mapOptions.sensitive ? 'g' : 'i'
if (Array.isArray(str)) { if (Array.isArray(str)) {
return new RegExp(str.join('|'), regexSensitive) return new RegExp(str.join('|'), regexSensitive)
} }
@@ -35,9 +35,7 @@ class FlowClass {
} }
const findIn = (keyOrWord, symbol = false, flow = overFlow) => { const findIn = (keyOrWord, symbol = false, flow = overFlow) => {
const sensitive = refSymbol?.options?.sensitive || false
capture = refSymbol?.options?.capture || false capture = refSymbol?.options?.capture || false
if (capture) return messages if (capture) return messages
if (symbol) { if (symbol) {
@@ -46,7 +44,9 @@ class FlowClass {
if (refSymbol?.ref) findIn(refSymbol.ref, true) if (refSymbol?.ref) findIn(refSymbol.ref, true)
} else { } else {
refSymbol = flow.find((c) => { refSymbol = flow.find((c) => {
return mapSensitive(c.keyword, sensitive).test(keyOrWord) const sensitive = c?.options?.sensitive || false
const regex = c?.options?.regex || false
return mapSensitive(c.keyword, { sensitive, regex }).test(keyOrWord)
}) })
if (refSymbol?.ref) findIn(refSymbol.ref, true) if (refSymbol?.ref) findIn(refSymbol.ref, true)
return messages return messages
@@ -56,10 +56,40 @@ class FlowClass {
return messages return messages
} }
findBySerialize = (refSerialize) => findBySerialize = (refSerialize) => this.flowSerialize.find((r) => r.refSerialize === refSerialize)
this.flowSerialize.find((r) => r.refSerialize === refSerialize)
findIndexByRef = (ref) => this.flowSerialize.findIndex((r) => r.ref === ref) findIndexByRef = (ref) => this.flowSerialize.findIndex((r) => r.ref === ref)
getRefToContinueChild = (keyword) => {
try {
const flowChilds = this.flowSerialize
.reduce((acc, cur) => {
const merge = [...acc, cur?.options?.nested].flat(2)
return merge
}, [])
.filter((i) => !!i && i?.refSerialize === keyword)
.shift()
return flowChilds
} catch (e) {
return undefined
}
}
getFlowsChild = () => {
try {
const flowChilds = this.flowSerialize
.reduce((acc, cur) => {
const merge = [...acc, cur?.options?.nested].flat(2)
return merge
}, [])
.filter((i) => !!i)
return flowChilds
} catch (e) {
return []
}
}
} }
module.exports = FlowClass module.exports = FlowClass

View File

@@ -17,15 +17,10 @@ const addAnswer =
* @returns * @returns
*/ */
const getAnswerOptions = () => ({ const getAnswerOptions = () => ({
media: media: typeof options?.media === 'string' ? `${options?.media}` : null,
typeof options?.media === 'string' ? `${options?.media}` : null,
buttons: Array.isArray(options?.buttons) ? options.buttons : [], buttons: Array.isArray(options?.buttons) ? options.buttons : [],
capture: capture: typeof options?.capture === 'boolean' ? options?.capture : false,
typeof options?.capture === 'boolean' child: typeof options?.child === 'string' ? `${options?.child}` : null,
? options?.capture
: false,
child:
typeof options?.child === 'string' ? `${options?.child}` : null,
delay: typeof options?.delay === 'number' ? options?.delay : 0, delay: typeof options?.delay === 'number' ? options?.delay : 0,
}) })
@@ -49,8 +44,7 @@ const addAnswer =
* Esta funcion aplana y busca los callback anidados de los hijos * Esta funcion aplana y busca los callback anidados de los hijos
* @returns * @returns
*/ */
const getCbFromNested = () => const getCbFromNested = () => flatObject(Array.isArray(nested) ? nested : [nested])
flatObject(Array.isArray(nested) ? nested : [nested])
const callback = typeof cb === 'function' ? cb : () => null const callback = typeof cb === 'function' ? cb : () => null

View File

@@ -8,12 +8,14 @@ const { toJson } = require('./toJson')
* @param {*} options {sensitive:boolean} default false * @param {*} options {sensitive:boolean} default false
*/ */
const addKeyword = (keyword, options) => { const addKeyword = (keyword, options) => {
if (typeof keyword !== 'string' && !Array.isArray(keyword)) {
throw new Error('DEBE_SER_STRING_ARRAY_REGEX')
}
const parseOptions = () => { const parseOptions = () => {
const defaultProperties = { const defaultProperties = {
sensitive: sensitive: typeof options?.sensitive === 'boolean' ? options?.sensitive : false,
typeof options?.sensitive === 'boolean' regex: typeof options?.regex === 'boolean' ? options?.regex : false,
? options?.sensitive
: false,
} }
return defaultProperties return defaultProperties

View File

@@ -5,12 +5,12 @@ const { generateRef, generateRefSerialize } = require('../../utils/hash')
* @param options {media:string, buttons:[], capture:true default false} * @param options {media:string, buttons:[], capture:true default false}
* @returns * @returns
*/ */
const toCtx = ({ body, from, prevRef, index }) => { const toCtx = ({ body, from, prevRef, options = {}, index }) => {
return { return {
ref: generateRef(), ref: generateRef(),
keyword: prevRef, keyword: prevRef,
answer: body, answer: body,
options: {}, options: options ?? {},
from, from,
refSerialize: generateRefSerialize({ index, answer: body }), refSerialize: generateRefSerialize({ index, answer: body }),
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@bot-whatsapp/bot", "name": "@bot-whatsapp/bot",
"version": "0.0.41-alpha.0", "version": "0.0.100-alpha.0",
"description": "", "description": "",
"main": "./lib/bundle.bot.cjs", "main": "./lib/bundle.bot.cjs",
"scripts": { "scripts": {
@@ -28,5 +28,9 @@
}, },
"dependencies": { "dependencies": {
"dotenv": "^16.0.3" "dotenv": "^16.0.3"
},
"repository": {
"type": "git",
"url": "https://github.com/codigoencasa/bot-whatsapp/tree/main/packages/bot"
} }
} }

View File

@@ -20,10 +20,11 @@ class ProviderClass extends EventEmitter {
*/ */
sendMessage = async (userId, message) => { sendMessage = async (userId, message) => {
if (NODE_ENV !== 'production') if (NODE_ENV !== 'production') console.log('[sendMessage]', { userId, message })
console.log('[sendMessage]', { userId, message })
return message return message
} }
getInstance = () => this.vendor
} }
module.exports = ProviderClass module.exports = ProviderClass

View File

@@ -10,6 +10,7 @@ module.exports = [
banner: banner['banner.output'].join(''), banner: banner['banner.output'].join(''),
file: join(__dirname, 'lib', 'bundle.bot.cjs'), file: join(__dirname, 'lib', 'bundle.bot.cjs'),
format: 'cjs', format: 'cjs',
sourcemap: true,
}, },
plugins: [commonjs(), nodeResolve()], plugins: [commonjs(), nodeResolve()],
}, },

View File

@@ -2,13 +2,7 @@ const { test } = require('uvu')
const assert = require('uvu/assert') const assert = require('uvu/assert')
const FlowClass = require('../io/flow.class') const FlowClass = require('../io/flow.class')
const MockProvider = require('../../../__mocks__/mock.provider') const MockProvider = require('../../../__mocks__/mock.provider')
const { const { createBot, CoreClass, createFlow, createProvider, ProviderClass } = require('../index')
createBot,
CoreClass,
createFlow,
createProvider,
ProviderClass,
} = require('../index')
class MockFlow { class MockFlow {
allCallbacks = { ref: () => 1 } allCallbacks = { ref: () => 1 }
@@ -23,6 +17,8 @@ class MockFlow {
} }
findBySerialize = () => ({}) findBySerialize = () => ({})
findIndexByRef = () => 0 findIndexByRef = () => 0
getRefToContinueChild = () => ({})
getFlowsChild = () => []
} }
class MockDBA { class MockDBA {
@@ -100,20 +96,13 @@ test(`[Bot] Eventos 'require_action,ready,auth_failure,message '`, async () => {
await createBot(setting) await createBot(setting)
/// Escuchamos eventos /// Escuchamos eventos
mockProvider.on( mockProvider.on('require_action', (r) => (responseEvents['require_action'] = r))
'require_action',
(r) => (responseEvents['require_action'] = r)
)
mockProvider.on('ready', (r) => (responseEvents['ready'] = r)) mockProvider.on('ready', (r) => (responseEvents['ready'] = r))
mockProvider.on('auth_failure', (r) => (responseEvents['auth_failure'] = r)) mockProvider.on('auth_failure', (r) => (responseEvents['auth_failure'] = r))
mockProvider.on('message', (r) => (responseEvents['message'] = r)) mockProvider.on('message', (r) => (responseEvents['message'] = r))
/// Emitimos eventos /// Emitimos eventos
mockProvider.delaySendMessage( mockProvider.delaySendMessage(0, 'require_action', MOCK_EVENTS.require_action)
0,
'require_action',
MOCK_EVENTS.require_action
)
mockProvider.delaySendMessage(0, 'ready', MOCK_EVENTS.ready) mockProvider.delaySendMessage(0, 'ready', MOCK_EVENTS.ready)
mockProvider.delaySendMessage(0, 'auth_failure', MOCK_EVENTS.auth_failure) mockProvider.delaySendMessage(0, 'auth_failure', MOCK_EVENTS.auth_failure)
mockProvider.delaySendMessage(0, 'message', MOCK_EVENTS.message) mockProvider.delaySendMessage(0, 'message', MOCK_EVENTS.message)
@@ -121,21 +110,12 @@ test(`[Bot] Eventos 'require_action,ready,auth_failure,message '`, async () => {
await delay(0) await delay(0)
/// Testeamos eventos /// Testeamos eventos
assert.is( assert.is(JSON.stringify(responseEvents.require_action), JSON.stringify(MOCK_EVENTS.require_action))
JSON.stringify(responseEvents.require_action),
JSON.stringify(MOCK_EVENTS.require_action)
)
assert.is(responseEvents.ready, MOCK_EVENTS.ready) assert.is(responseEvents.ready, MOCK_EVENTS.ready)
assert.is( assert.is(JSON.stringify(responseEvents.auth_failure), JSON.stringify(MOCK_EVENTS.auth_failure))
JSON.stringify(responseEvents.auth_failure),
JSON.stringify(MOCK_EVENTS.auth_failure)
)
assert.is( assert.is(JSON.stringify(responseEvents.message), JSON.stringify(MOCK_EVENTS.message))
JSON.stringify(responseEvents.message),
JSON.stringify(MOCK_EVENTS.message)
)
}) })
test(`[Bot] Probando Flujos Internos`, async () => { test(`[Bot] Probando Flujos Internos`, async () => {
@@ -166,20 +146,13 @@ test(`[Bot] Probando Flujos Internos`, async () => {
await createBot(setting) await createBot(setting)
/// Escuchamos eventos /// Escuchamos eventos
mockProvider.on( mockProvider.on('require_action', (r) => (responseEvents['require_action'] = r))
'require_action',
(r) => (responseEvents['require_action'] = r)
)
mockProvider.on('ready', (r) => (responseEvents['ready'] = r)) mockProvider.on('ready', (r) => (responseEvents['ready'] = r))
mockProvider.on('auth_failure', (r) => (responseEvents['auth_failure'] = r)) mockProvider.on('auth_failure', (r) => (responseEvents['auth_failure'] = r))
mockProvider.on('message', (r) => (responseEvents['message'] = r)) mockProvider.on('message', (r) => (responseEvents['message'] = r))
/// Emitimos eventos /// Emitimos eventos
mockProvider.delaySendMessage( mockProvider.delaySendMessage(0, 'require_action', MOCK_EVENTS.require_action)
0,
'require_action',
MOCK_EVENTS.require_action
)
mockProvider.delaySendMessage(0, 'ready', MOCK_EVENTS.ready) mockProvider.delaySendMessage(0, 'ready', MOCK_EVENTS.ready)
mockProvider.delaySendMessage(0, 'auth_failure', MOCK_EVENTS.auth_failure) mockProvider.delaySendMessage(0, 'auth_failure', MOCK_EVENTS.auth_failure)
mockProvider.delaySendMessage(0, 'message', MOCK_EVENTS.message) mockProvider.delaySendMessage(0, 'message', MOCK_EVENTS.message)
@@ -187,21 +160,12 @@ test(`[Bot] Probando Flujos Internos`, async () => {
await delay(0) await delay(0)
/// Testeamos eventos /// Testeamos eventos
assert.is( assert.is(JSON.stringify(responseEvents.require_action), JSON.stringify(MOCK_EVENTS.require_action))
JSON.stringify(responseEvents.require_action),
JSON.stringify(MOCK_EVENTS.require_action)
)
assert.is(responseEvents.ready, MOCK_EVENTS.ready) assert.is(responseEvents.ready, MOCK_EVENTS.ready)
assert.is( assert.is(JSON.stringify(responseEvents.auth_failure), JSON.stringify(MOCK_EVENTS.auth_failure))
JSON.stringify(responseEvents.auth_failure),
JSON.stringify(MOCK_EVENTS.auth_failure)
)
assert.is( assert.is(JSON.stringify(responseEvents.message), JSON.stringify(MOCK_EVENTS.message))
JSON.stringify(responseEvents.message),
JSON.stringify(MOCK_EVENTS.message)
)
}) })
test(`[Bot] Probando Flujos Nested`, async () => { test(`[Bot] Probando Flujos Nested`, async () => {
@@ -234,20 +198,13 @@ test(`[Bot] Probando Flujos Nested`, async () => {
botInstance.sendProviderAndSave('xxxxx', 'xxxxx') botInstance.sendProviderAndSave('xxxxx', 'xxxxx')
botInstance.continue('xxxxx', 'xxxxx') botInstance.continue('xxxxx', 'xxxxx')
/// Escuchamos eventos /// Escuchamos eventos
mockProvider.on( mockProvider.on('require_action', (r) => (responseEvents['require_action'] = r))
'require_action',
(r) => (responseEvents['require_action'] = r)
)
mockProvider.on('ready', (r) => (responseEvents['ready'] = r)) mockProvider.on('ready', (r) => (responseEvents['ready'] = r))
mockProvider.on('auth_failure', (r) => (responseEvents['auth_failure'] = r)) mockProvider.on('auth_failure', (r) => (responseEvents['auth_failure'] = r))
mockProvider.on('message', (r) => (responseEvents['message'] = r)) mockProvider.on('message', (r) => (responseEvents['message'] = r))
/// Emitimos eventos /// Emitimos eventos
mockProvider.delaySendMessage( mockProvider.delaySendMessage(0, 'require_action', MOCK_EVENTS.require_action)
0,
'require_action',
MOCK_EVENTS.require_action
)
mockProvider.delaySendMessage(0, 'ready', MOCK_EVENTS.ready) mockProvider.delaySendMessage(0, 'ready', MOCK_EVENTS.ready)
mockProvider.delaySendMessage(0, 'auth_failure', MOCK_EVENTS.auth_failure) mockProvider.delaySendMessage(0, 'auth_failure', MOCK_EVENTS.auth_failure)
mockProvider.delaySendMessage(0, 'message', MOCK_EVENTS.message) mockProvider.delaySendMessage(0, 'message', MOCK_EVENTS.message)
@@ -255,21 +212,12 @@ test(`[Bot] Probando Flujos Nested`, async () => {
await delay(0) await delay(0)
/// Testeamos eventos /// Testeamos eventos
assert.is( assert.is(JSON.stringify(responseEvents.require_action), JSON.stringify(MOCK_EVENTS.require_action))
JSON.stringify(responseEvents.require_action),
JSON.stringify(MOCK_EVENTS.require_action)
)
assert.is(responseEvents.ready, MOCK_EVENTS.ready) assert.is(responseEvents.ready, MOCK_EVENTS.ready)
assert.is( assert.is(JSON.stringify(responseEvents.auth_failure), JSON.stringify(MOCK_EVENTS.auth_failure))
JSON.stringify(responseEvents.auth_failure),
JSON.stringify(MOCK_EVENTS.auth_failure)
)
assert.is( assert.is(JSON.stringify(responseEvents.message), JSON.stringify(MOCK_EVENTS.message))
JSON.stringify(responseEvents.message),
JSON.stringify(MOCK_EVENTS.message)
)
}) })
test.run() test.run()

View File

@@ -0,0 +1,28 @@
const { test } = require('uvu')
const assert = require('uvu/assert')
const FlowClass = require('../io/flow.class')
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()

View File

@@ -35,10 +35,7 @@ test('Debere probar toSerialize', () => {
const ARRANGE = { const ARRANGE = {
keyword: ['hola!', 'ole'], keyword: ['hola!', 'ole'],
} }
const MAIN_CTX = addKeyword(ARRANGE.keyword) const MAIN_CTX = addKeyword(ARRANGE.keyword).addAnswer('Segundo!').addAnswer('Segundo!').toJson()
.addAnswer('Segundo!')
.addAnswer('Segundo!')
.toJson()
const [ANSWER_A] = MAIN_CTX const [ANSWER_A] = MAIN_CTX
@@ -71,9 +68,7 @@ test('Debere probar la anidación', () => {
answer_A: 'Bienvenido', answer_A: 'Bienvenido',
answer_B: 'Continuar', answer_B: 'Continuar',
} }
const MAIN_CTX = addKeyword(ARRANGE.keyword) const MAIN_CTX = addKeyword(ARRANGE.keyword).addAnswer(ARRANGE.answer_A).addAnswer(ARRANGE.answer_B)
.addAnswer(ARRANGE.answer_A)
.addAnswer(ARRANGE.answer_B)
assert.is(MAIN_CTX.ctx.answer, ARRANGE.answer_B) assert.is(MAIN_CTX.ctx.answer, ARRANGE.answer_B)
}) })
@@ -107,10 +102,7 @@ test('Debere probar error las addAnswer', () => {
}) })
test('Obtener toJson', () => { test('Obtener toJson', () => {
const [ctxA, ctxB, ctxC] = addKeyword('hola') const [ctxA, ctxB, ctxC] = addKeyword('hola').addAnswer('pera!').addAnswer('chao').toJson()
.addAnswer('pera!')
.addAnswer('chao')
.toJson()
assert.is(ctxA.keyword, 'hola') assert.is(ctxA.keyword, 'hola')
assert.match(ctxA.ref, /^key_/) assert.match(ctxA.ref, /^key_/)

View File

@@ -1,4 +1,3 @@
const delay = (miliseconds) => const delay = (miliseconds) => new Promise((res) => setTimeout(res, miliseconds))
new Promise((res) => setTimeout(res, miliseconds))
module.exports = { delay } module.exports = { delay }

View File

@@ -3,9 +3,7 @@ const flatObject = (listArray = []) => {
if (!listArray.length) return {} if (!listArray.length) return {}
const cbNestedObj = cbNestedList const cbNestedObj = cbNestedList.map(({ ctx }) => ctx?.callbacks).filter((i) => !!i)
.map(({ ctx }) => ctx?.callbacks)
.filter((i) => !!i)
const queueCb = cbNestedObj.reduce((acc, current) => { const queueCb = cbNestedObj.reduce((acc, current) => {
const getKeys = Object.keys(current) const getKeys = Object.keys(current)
const parse = getKeys.map((icb, i) => ({ const parse = getKeys.map((icb, i) => ({

View File

@@ -16,9 +16,6 @@ const generateRef = (prefix = false) => {
* @returns * @returns
*/ */
const generateRefSerialize = ({ index, answer, keyword }) => const generateRefSerialize = ({ index, answer, keyword }) =>
crypto crypto.createHash('md5').update(JSON.stringify({ index, answer, keyword })).digest('hex')
.createHash('md5')
.update(JSON.stringify({ index, answer, keyword }))
.digest('hex')
module.exports = { generateRef, generateRefSerialize } module.exports = { generateRef, generateRefSerialize }

View File

@@ -4,9 +4,7 @@ const printer = (message, title) => {
if (NODE_ENV !== 'test') { if (NODE_ENV !== 'test') {
// console.clear() // console.clear()
if (title) console.log(bgRed(`${title}`)) if (title) console.log(bgRed(`${title}`))
console.log( console.log(yellow(Array.isArray(message) ? message.join('\n') : message))
yellow(Array.isArray(message) ? message.join('\n') : message)
)
console.log(``) console.log(``)
} }
} }

View File

@@ -1,8 +1,8 @@
class Queue { class Queue {
static queue = [] queue = []
static pendingPromise = false pendingPromise = false
static enqueue(promise) { enqueue(promise) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.queue.push({ this.queue.push({
promise, promise,
@@ -13,7 +13,7 @@ class Queue {
}) })
} }
static dequeue() { dequeue() {
if (this.workingOnPromise) { if (this.workingOnPromise) {
return false return false
} }

View File

@@ -1,38 +1,59 @@
const { red, yellow, green, bgCyan } = require('kleur') const { red, yellow, green, bgCyan } = require('kleur')
const { exec } = require('node:child_process')
const checkNodeVersion = () => { const checkNodeVersion = () => {
console.log(bgCyan('🚀 Revisando tu Node.js')) return new Promise((resolve, reject) => {
const version = process.version console.log(bgCyan('🚀 Revisando tu Node.js'))
const majorVersion = parseInt(version.replace('v', '').split('.').shift()) const version = process.version
if (majorVersion < 16) { const majorVersion = parseInt(version.replace('v', '').split('.').shift())
console.error( if (majorVersion < 16) {
red( console.error(red(`🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}`))
`🔴 Se require Node.js 16 o superior. Actualmente esta ejecutando Node.js ${version}` console.log(``)
) reject('ERROR_NODE')
) }
process.exit(1) console.log(green(`Node.js: ${version} compatible ✅`))
} console.log(``)
console.log(green(`Node.js compatible ${version}`)) resolve()
console.log(``) })
} }
const checkOs = () => { const checkOs = () => {
console.log(bgCyan('🙂 Revisando tu sistema operativo')) return new Promise((resolve) => {
const os = process.platform console.log(bgCyan('🙂 Revisando tu sistema operativo'))
if (!os.includes('win32')) { const os = process.platform
const messages = [ if (!os.includes('win32')) {
`El sistema operativo actual (${os}) posiblemente requiera`, const messages = [
`una configuración adicional referente al puppeteer`, `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`, `Recuerda pasar por el WIKI`,
``, `🔗 https://github.com/leifermendez/bot-whatsapp/wiki/Instalación`,
] ``,
]
console.log(yellow(messages.join(' \n'))) console.log(yellow(messages.join(' \n')))
} }
console.log(green(`OS: compatible ✅`))
console.log(``) console.log(``)
resolve()
})
} }
module.exports = { checkNodeVersion, checkOs } const checkGit = () => {
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()
}
})
})
}
module.exports = { checkNodeVersion, checkOs, checkGit }

View File

@@ -2,10 +2,7 @@ const rimraf = require('rimraf')
const { yellow } = require('kleur') const { yellow } = require('kleur')
const { join } = require('path') const { join } = require('path')
const PATH_WW = [ const PATH_WW = [join(process.cwd(), '.wwebjs_auth'), join(process.cwd(), 'session.json')]
join(process.cwd(), '.wwebjs_auth'),
join(process.cwd(), 'session.json'),
]
const cleanSession = () => { const cleanSession = () => {
const queue = [] const queue = []

View File

@@ -23,11 +23,7 @@ const JSON_TEMPLATE = {
const PATH_CONFIG = join(process.cwd(), 'config.json') const PATH_CONFIG = join(process.cwd(), 'config.json')
const jsonConfig = () => { const jsonConfig = () => {
return writeFile( return writeFile(PATH_CONFIG, JSON.stringify(JSON_TEMPLATE, null, 2), 'utf-8')
PATH_CONFIG,
JSON.stringify(JSON_TEMPLATE, null, 2),
'utf-8'
)
} }
module.exports = { jsonConfig } module.exports = { jsonConfig }

View File

@@ -20,13 +20,9 @@ const installDeps = (pkgManager, packageList) => {
const installSingle = (pkgInstall) => () => { const installSingle = (pkgInstall) => () => {
new Promise((resolve) => { new Promise((resolve) => {
try { try {
childProcess = spawn( childProcess = spawn(pkgManager, [PKG_OPTION[pkgManager], pkgInstall], {
pkgManager, stdio: 'inherit',
[PKG_OPTION[pkgManager], pkgInstall], })
{
stdio: 'inherit',
}
)
childProcess.on('error', (e) => { childProcess.on('error', (e) => {
console.error(e) console.error(e)

View File

@@ -1,9 +1,9 @@
const prompts = require('prompts') const prompts = require('prompts')
const { join } = require('path') const { join } = require('path')
const { yellow, red, cyan, bgMagenta } = require('kleur') const { yellow, red, cyan, bgMagenta, bgRed } = require('kleur')
const { existsSync } = require('fs') const { existsSync } = require('fs')
const { copyBaseApp } = require('../create-app') const { copyBaseApp } = require('../create-app')
const { checkNodeVersion, checkOs } = require('../check') const { checkNodeVersion, checkOs, checkGit } = require('../check')
const bannerDone = () => { const bannerDone = () => {
console.log(``) console.log(``)
@@ -21,6 +21,20 @@ const bannerDone = () => {
} }
const startInteractive = async () => { 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 = [ const questions = [
{ {
type: 'text', type: 'text',
@@ -32,11 +46,11 @@ const startInteractive = async () => {
name: 'providerWs', name: 'providerWs',
message: '¿Cuál proveedor de whatsapp quieres utilizar?', message: '¿Cuál proveedor de whatsapp quieres utilizar?',
choices: [ choices: [
{ title: 'whatsapp-web.js (gratis)', value: 'wweb' },
{ title: 'Venom (gratis)', value: 'venom' },
{ title: 'Baileys (gratis)', value: 'baileys' }, { title: 'Baileys (gratis)', value: 'baileys' },
{ title: 'Venom (gratis)', value: 'venom' },
{ title: 'whatsapp-web.js (gratis)', value: 'wweb' },
{ title: 'Twilio', value: 'twilio' }, { title: 'Twilio', value: 'twilio' },
{ title: 'API Oficial (Meta)', value: 'meta' }, { title: 'Meta', value: 'meta' },
], ],
max: 1, max: 1,
hint: 'Espacio para seleccionar', hint: 'Espacio para seleccionar',
@@ -58,9 +72,6 @@ const startInteractive = async () => {
}, },
] ]
console.clear()
checkNodeVersion()
checkOs()
const onCancel = () => { const onCancel = () => {
console.log('¡Proceso cancelado!') console.log('¡Proceso cancelado!')
return true return true
@@ -69,8 +80,7 @@ const startInteractive = async () => {
const { outDir = '', providerDb = [], providerWs = [] } = response const { outDir = '', providerDb = [], providerWs = [] } = response
const createApp = async (templateName = null) => { const createApp = async (templateName = null) => {
if (!templateName) if (!templateName) throw new Error('TEMPLATE_NAME_INVALID: ', templateName)
throw new Error('TEMPLATE_NAME_INVALID: ', templateName)
const possiblesPath = [ const possiblesPath = [
join(__dirname, '..', '..', 'starters', 'apps', templateName), join(__dirname, '..', '..', 'starters', 'apps', templateName),
@@ -102,11 +112,7 @@ const startInteractive = async () => {
const vendorProvider = async () => { const vendorProvider = async () => {
const [answer] = providerWs const [answer] = providerWs
if (!providerWs.length) { if (!providerWs.length) {
console.log( console.log(red(`Debes seleccionar un proveedor de whatsapp. Tecla [Space] para seleccionar`))
red(
`Debes seleccionar un proveedor de whatsapp. Tecla [Space] para seleccionar`
)
)
process.exit(1) process.exit(1)
} }
return answer return answer
@@ -119,11 +125,7 @@ const startInteractive = async () => {
const dbProvider = async () => { const dbProvider = async () => {
const [answer] = providerDb const [answer] = providerDb
if (!providerDb.length) { if (!providerDb.length) {
console.log( console.log(red(`Debes seleccionar un proveedor de base de datos. Tecla [Space] para seleccionar`))
red(
`Debes seleccionar un proveedor de base de datos. Tecla [Space] para seleccionar`
)
)
process.exit(1) process.exit(1)
} }
return answer return answer

View File

@@ -1,6 +1,6 @@
{ {
"name": "@bot-whatsapp/cli", "name": "@bot-whatsapp/cli",
"version": "0.0.48-alpha.0", "version": "0.0.72-alpha.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"devDependencies": { "devDependencies": {
@@ -15,5 +15,9 @@
], ],
"bin": { "bin": {
"bot": "./bin/cli.js" "bot": "./bin/cli.js"
},
"repository": {
"type": "git",
"url": "https://github.com/codigoencasa/bot-whatsapp/tree/main/packages/cli"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@bot-whatsapp/contexts", "name": "@bot-whatsapp/contexts",
"version": "0.0.1", "version": "0.0.16-alpha.0",
"description": "", "description": "",
"main": "./lib/bundle.contexts.cjs", "main": "./lib/bundle.contexts.cjs",
"files": [ "files": [
@@ -13,5 +13,9 @@
}, },
"dependencies": { "dependencies": {
"@bot-whatsapp/bot": "*" "@bot-whatsapp/bot": "*"
},
"repository": {
"type": "git",
"url": "https://github.com/codigoencasa/bot-whatsapp/tree/main/packages/contexts"
} }
} }

View File

@@ -38,10 +38,8 @@ class DialogFlowCXContext extends CoreClass {
* */ * */
} }
if (!this.optionsDX.location.length) if (!this.optionsDX.location.length) throw new Error('LOCATION_NO_ENCONTRADO')
throw new Error('LOCATION_NO_ENCONTRADO') if (!this.optionsDX.agentId.length) throw new Error('AGENTID_NO_ENCONTRADO')
if (!this.optionsDX.agentId.length)
throw new Error('AGENTID_NO_ENCONTRADO')
const rawJson = readFileSync(GOOGLE_ACCOUNT_PATH, 'utf-8') const rawJson = readFileSync(GOOGLE_ACCOUNT_PATH, 'utf-8')
const { project_id, private_key, client_email } = JSON.parse(rawJson) const { project_id, private_key, client_email } = JSON.parse(rawJson)
@@ -86,9 +84,7 @@ class DialogFlowCXContext extends CoreClass {
}, },
} }
const [single] = (await this.sessionClient.detectIntent(reqDialog)) || [ const [single] = (await this.sessionClient.detectIntent(reqDialog)) || [null]
null,
]
const listMessages = single.queryResult.responseMessages.map((res) => { const listMessages = single.queryResult.responseMessages.map((res) => {
if (res.message == 'text') { if (res.message == 'text') {
@@ -96,17 +92,11 @@ class DialogFlowCXContext extends CoreClass {
} }
if (res.message == 'payload') { if (res.message == 'payload') {
const { const { media = null, buttons = [], answer = '' } = res.payload.fields
media = null, const buttonsArray = buttons?.listValue?.values?.map((btnValue) => {
buttons = [], const { stringValue } = btnValue.structValue.fields.body
answer = '', return { body: stringValue }
} = res.payload.fields })
const buttonsArray = buttons?.listValue?.values?.map(
(btnValue) => {
const { stringValue } = btnValue.structValue.fields.body
return { body: stringValue }
}
)
return { return {
answer: answer?.stringValue, answer: answer?.stringValue,
options: { options: {
@@ -117,7 +107,7 @@ class DialogFlowCXContext extends CoreClass {
} }
}) })
this.sendFlow(listMessages, from) this.sendFlowSimple(listMessages, from)
} }
} }

View File

@@ -5,8 +5,7 @@ const DialogCXFlowClass = require('./dialogflow-cx.class')
* @param {*} args * @param {*} args
* @returns * @returns
*/ */
const createBotDialog = async ({ database, provider }, _options) => const createBotDialog = async ({ database, provider }, _options) => new DialogCXFlowClass(database, provider, _options)
new DialogCXFlowClass(database, provider, _options)
module.exports = { module.exports = {
createBotDialog, createBotDialog,

View File

@@ -65,10 +65,7 @@ class DialogFlowContext extends CoreClass {
* para evitar este problema. * para evitar este problema.
* https://github.com/codigoencasa/bot-whatsapp/pull/140 * https://github.com/codigoencasa/bot-whatsapp/pull/140
*/ */
const session = this.sessionClient.projectAgentSessionPath( const session = this.sessionClient.projectAgentSessionPath(this.projectId, from)
this.projectId,
from
)
const reqDialog = { const reqDialog = {
session, session,
queryInput: { queryInput: {
@@ -79,15 +76,11 @@ class DialogFlowContext extends CoreClass {
}, },
} }
const [single] = (await this.sessionClient.detectIntent(reqDialog)) || [ const [single] = (await this.sessionClient.detectIntent(reqDialog)) || [null]
null,
]
const { queryResult } = single const { queryResult } = single
const msgPayload = queryResult?.fulfillmentMessages?.find( const msgPayload = queryResult?.fulfillmentMessages?.find((a) => a.message === 'payload')
(a) => a.message === 'payload'
)
// Revisamos si el dialogFlow tiene multimedia // Revisamos si el dialogFlow tiene multimedia
if (msgPayload && msgPayload?.payload) { if (msgPayload && msgPayload?.payload) {
@@ -97,17 +90,33 @@ class DialogFlowContext extends CoreClass {
}) })
customPayload = { customPayload = {
media: fields?.media?.stringValue, options: {
buttons: mapButtons, media: fields?.media?.stringValue,
buttons: mapButtons,
},
} }
const ctxFromDX = {
...customPayload,
answer: fields?.answer?.stringValue,
}
this.sendFlowSimple([ctxFromDX], from)
return
} }
const ctxFromDX = { /* const ctxFromDX = {
...customPayload,
answer: queryResult?.fulfillmentText, answer: queryResult?.fulfillmentText,
} } */
this.sendFlow([ctxFromDX], from) const messagesFromCX = queryResult['fulfillmentMessages']
.map((a) => {
if (a.message === 'text') {
return { answer: a.text.text[0] }
}
})
.filter((e) => e)
this.sendFlowSimple(messagesFromCX, from)
} }
} }

View File

@@ -5,8 +5,7 @@ const DialogFlowClass = require('./dialogflow.class')
* @param {*} args * @param {*} args
* @returns * @returns
*/ */
const createBotDialog = async ({ database, provider }) => const createBotDialog = async ({ database, provider }) => new DialogFlowClass(database, provider)
new DialogFlowClass(database, provider)
module.exports = { module.exports = {
createBotDialog, createBotDialog,

View File

@@ -5,8 +5,7 @@ const MockClass = require('./mock.class')
* @param {*} args * @param {*} args
* @returns * @returns
*/ */
const createBotMock = async ({ database, provider }) => const createBotMock = async ({ database, provider }) => new MockClass(database, provider)
new MockClass(database, provider)
module.exports = { module.exports = {
createBotMock, createBotMock,

View File

@@ -1,6 +1,6 @@
{ {
"name": "create-bot-whatsapp", "name": "create-bot-whatsapp",
"version": "0.0.59-alpha.0", "version": "0.0.93-alpha.0",
"description": "", "description": "",
"main": "./lib/bundle.create-bot-whatsapp.cjs", "main": "./lib/bundle.create-bot-whatsapp.cjs",
"files": [ "files": [
@@ -11,5 +11,9 @@
"bin": "./bin/create.js", "bin": "./bin/create.js",
"dependencies": { "dependencies": {
"@bot-whatsapp/cli": "*" "@bot-whatsapp/cli": "*"
},
"repository": {
"type": "git",
"url": "https://github.com/codigoencasa/bot-whatsapp/tree/main/packages/create-bot-whatsapp"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@bot-whatsapp/database", "name": "@bot-whatsapp/database",
"version": "0.0.40-alpha.0", "version": "0.0.64-alpha.0",
"description": "Esto es el conector a mysql, pg, mongo", "description": "Esto es el conector a mysql, pg, mongo",
"main": "./lib/mock/index.cjs", "main": "./lib/mock/index.cjs",
"keywords": [], "keywords": [],
@@ -19,5 +19,9 @@
"./mongo": "./lib/mongo/index.cjs", "./mongo": "./lib/mongo/index.cjs",
"./json": "./lib/json/index.cjs", "./json": "./lib/json/index.cjs",
"./mysql": "./lib/mysql/index.cjs" "./mysql": "./lib/mysql/index.cjs"
},
"repository": {
"type": "git",
"url": "https://github.com/codigoencasa/bot-whatsapp/tree/main/packages/database"
} }
} }

View File

@@ -1,63 +1,79 @@
const { join } = require('path') const { join } = require('path')
const { existsSync, writeFileSync, readFileSync } = require('fs') const { existsSync } = require('fs')
const { writeFile, readFile } = require('fs').promises
class JsonFileAdapter { class JsonFileAdapter {
db db
pathFile pathFile
listHistory = [] listHistory = []
options = { filename: 'db.json' }
constructor() { constructor(options = {}) {
this.pathFile = join(process.cwd(), 'db.json') this.options = { ...this.options, ...options }
this.pathFile = join(process.cwd(), this.options.filename)
this.init().then() this.init().then()
} }
databaseExists() { /**
return existsSync(this.pathFile) * Revisamos si existe o no el json file
} * @returns
*/
async init() { init = async () => {
const dbExists = await this.databaseExists() if (existsSync(this.pathFile)) {
return Promise.resolve()
if (!dbExists) { }
const data = { try {
history: [], const parseData = JSON.stringify([], null, 2)
} return writeFile(this.pathFile, parseData, 'utf-8')
await this.saveData(data) } catch (e) {
return Promise.reject(e.message)
} }
} }
readDatabase() { validateJson = (raw) => {
const db = readFileSync(this.pathFile) try {
return JSON.parse(db) return JSON.parse(raw)
} catch (e) {
return {}
}
} }
saveData(data) { /**
writeFileSync(this.pathFile, JSON.stringify(data, null, 2)) * Leer archivo y parsear
* @returns
*/
readFileAndParse = async () => {
const data = await readFile(this.pathFile, 'utf-8')
const parseData = this.validateJson(data)
return parseData
} }
/**
* Buscamos el ultimo mensaje por numero
* @param {*} from
* @returns
*/
getPrevByNumber = async (from) => { getPrevByNumber = async (from) => {
const { history } = await this.readDatabase() const history = await this.readFileAndParse()
if (!history.length) { if (!history.length) {
return null return []
} }
const result = history.filter((res) => res.from === from).pop() const result = history
.slice()
return { .reverse()
...result, .filter((i) => !!i.keyword)
} return result.find((a) => a.from === from)
} }
/**
* Guardar dato
* @param {*} ctx
*/
save = async (ctx) => { save = async (ctx) => {
this.db = await this.readDatabase()
this.db.history.push(ctx)
await this.saveData(this.db)
this.listHistory.push(ctx) this.listHistory.push(ctx)
console.log('Guardado en DB...', ctx) const parseData = JSON.stringify(this.listHistory, null, 2)
await writeFile(this.pathFile, parseData, 'utf-8')
} }
} }

View File

@@ -10,7 +10,10 @@ class MockDatabase {
constructor() {} constructor() {}
getPrevByNumber = (from) => { getPrevByNumber = (from) => {
const history = this.listHistory.slice().reverse() const history = this.listHistory
.slice()
.reverse()
.filter((i) => !!i.keyword)
return history.find((a) => a.from === from) return history.find((a) => a.from === from)
} }

View File

@@ -24,18 +24,12 @@ class MongoAdapter {
} }
getPrevByNumber = async (from) => { getPrevByNumber = async (from) => {
const result = await this.db const result = await this.db.collection('history').find({ from }).sort({ _id: -1 }).limit(1).toArray()
.collection('history')
.find({ from })
.sort({ _id: -1 })
.limit(1)
.toArray()
return result[0] return result[0]
} }
save = async (ctx) => { save = async (ctx) => {
await this.db.collection('history').insert(ctx) await this.db.collection('history').insert(ctx)
console.log('Guardando DB...', ctx)
this.listHistory.push(ctx) this.listHistory.push(ctx)
} }
} }

View File

@@ -46,18 +46,8 @@ class MyslAdapter {
}) })
save = (ctx) => { save = (ctx) => {
const values = [ const values = [[ctx.ref, ctx.keyword, ctx.answer, ctx.refSerialize, ctx.from, JSON.stringify(ctx.options)]]
[ const sql = 'INSERT INTO history (ref, keyword, answer, refSerialize, phone, options ) values ?'
ctx.ref,
ctx.keyword,
ctx.answer,
ctx.refSerialize,
ctx.from,
JSON.stringify(ctx.options),
],
]
const sql =
'INSERT INTO history (ref, keyword, answer, refSerialize, phone, options ) values ?'
this.db.query(sql, [values], (err) => { this.db.query(sql, [values], (err) => {
if (err) throw err if (err) throw err
@@ -71,14 +61,14 @@ class MyslAdapter {
const tableName = 'history' const tableName = 'history'
const sql = `CREATE TABLE ${tableName} const sql = `CREATE TABLE ${tableName}
(id INT AUTO_INCREMENT PRIMARY KEY, (id INT AUTO_INCREMENT PRIMARY KEY,
ref varchar(255) NOT NULL, ref varchar(255) NOT NULL,
keyword varchar(255) NOT NULL, keyword varchar(255) NOT NULL,
answer longtext NOT NULL, answer longtext NOT NULL,
refSerialize varchar(255) NOT NULL, refSerialize varchar(255) NOT NULL,
phone varchar(255) NOT NULL, phone varchar(255) NOT NULL,
options longtext NOT NULL options longtext NOT NULL)
)` CHARACTER SET utf8mb4 COLLATE utf8mb4_General_ci`
this.db.query(sql, (err) => { this.db.query(sql, (err) => {
if (err) throw err if (err) throw err

View File

@@ -8,6 +8,5 @@
font-family: IBMPlexMono-Regular; font-family: IBMPlexMono-Regular;
src: url(IBMPlexMono-Regular-subset.woff2) format('woff2'), src: url(IBMPlexMono-Regular-subset.woff2) format('woff2'),
url(IBMPlexMono-Regular-subset.zopfli.woff) format('woff'); url(IBMPlexMono-Regular-subset.zopfli.woff) format('woff');
unicode-range: U+20, U+2C, U+2E, U+41-43, U+46, U+49, U+4B-4F, U+53-55, U+58, unicode-range: U+20, U+2C, U+2E, U+41-43, U+46, U+49, U+4B-4F, U+53-55, U+58, U+61-65, U+67-69, U+6C-76;
U+61-65, U+67-69, U+6C-76;
} }

View File

@@ -8,6 +8,6 @@
font-family: IBMPlexMono-SemiBold; font-family: IBMPlexMono-SemiBold;
src: url(IBMPlexMono-SemiBold-subset.woff2) format('woff2'), src: url(IBMPlexMono-SemiBold-subset.woff2) format('woff2'),
url(IBMPlexMono-SemiBold-subset.zopfli.woff) format('woff'); url(IBMPlexMono-SemiBold-subset.zopfli.woff) format('woff');
unicode-range: U+20, U+24, U+2E, U+30, U+38, U+39, U+41, U+42, U+44, U+47, unicode-range: U+20, U+24, U+2E, U+30, U+38, U+39, U+41, U+42, U+44, U+47, U+4E, U+4F, U+52-55, U+57, U+59, U+65,
U+4E, U+4F, U+52-55, U+57, U+59, U+65, U+68, U+6F, U+72, U+74; U+68, U+6F, U+72, U+74;
} }

View File

@@ -6,9 +6,8 @@
@font-face { @font-face {
font-family: Pally-Variable; font-family: Pally-Variable;
src: url(Pally-Variable-subset.woff2) format('woff2'), src: url(Pally-Variable-subset.woff2) format('woff2'), url(Pally-Variable-subset.zopfli.woff) format('woff');
url(Pally-Variable-subset.zopfli.woff) format('woff'); unicode-range: U+20, U+24, U+2C, U+2E, U+30, U+33, U+39, U+41-43, U+46, U+49-4D, U+53, U+55, U+58, U+61-65, U+67-69,
unicode-range: U+20, U+24, U+2C, U+2E, U+30, U+33, U+39, U+41-43, U+46, U+6B-77, U+79;
U+49-4D, U+53, U+55, U+58, U+61-65, U+67-69, U+6B-77, U+79;
font-weight: 400 700; font-weight: 400 700;
} }

View File

@@ -8,6 +8,5 @@
font-family: SourceSerifPro-Regular; font-family: SourceSerifPro-Regular;
src: url(SourceSerifPro-Regular-subset.woff2) format('woff2'), src: url(SourceSerifPro-Regular-subset.woff2) format('woff2'),
url(SourceSerifPro-Regular-subset.zopfli.woff) format('woff'); url(SourceSerifPro-Regular-subset.zopfli.woff) format('woff');
unicode-range: U+20, U+2C, U+2E, U+41-44, U+49, U+4A, U+4C, U+53, U+55, unicode-range: U+20, U+2C, U+2E, U+41-44, U+49, U+4A, U+4C, U+53, U+55, U+61-65, U+67-69, U+6B-76, U+79;
U+61-65, U+67-69, U+6B-76, U+79;
} }

View File

@@ -6,9 +6,8 @@
@font-face { @font-face {
font-family: Synonym-Variable; font-family: Synonym-Variable;
src: url(Synonym-Variable-subset.woff2) format('woff2'), src: url(Synonym-Variable-subset.woff2) format('woff2'), url(Synonym-Variable-subset.zopfli.woff) format('woff');
url(Synonym-Variable-subset.zopfli.woff) format('woff'); unicode-range: U+20, U+24, U+2C, U+2E, U+30, U+33, U+35, U+41-44, U+46, U+47, U+49, U+4B-4F, U+53-55, U+57-59, U+61,
unicode-range: U+20, U+24, U+2C, U+2E, U+30, U+33, U+35, U+41-44, U+46, U+47, U+63-65, U+67-69, U+6C-76;
U+49, U+4B-4F, U+53-55, U+57-59, U+61, U+63-65, U+67-69, U+6C-76;
font-weight: 400 700; font-weight: 400 700;
} }

View File

@@ -6,8 +6,7 @@
@font-face { @font-face {
font-family: TenorSans-Regular; font-family: TenorSans-Regular;
src: url(TenorSans-Regular-subset.woff2) format('woff2'), src: url(TenorSans-Regular-subset.woff2) format('woff2'), url(TenorSans-Regular-subset.zopfli.woff) format('woff');
url(TenorSans-Regular-subset.zopfli.woff) format('woff'); unicode-range: U+20, U+24, U+2E, U+30, U+36, U+46, U+49, U+4A, U+53, U+54, U+61, U+63, U+65, U+69, U+6B, U+6E, U+6F,
unicode-range: U+20, U+24, U+2E, U+30, U+36, U+46, U+49, U+4A, U+53, U+54, U+72-75, U+79;
U+61, U+63, U+65, U+69, U+6B, U+6E, U+6F, U+72-75, U+79;
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

View File

@@ -0,0 +1,189 @@
export const DigitalOcean = () => (
<svg
version="1.1"
id="Layer_1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px"
y="0px"
viewBox="0 0 604 129"
style="enable-background:new 0 0 604 129;"
xml:space="preserve"
>
<g>
<g>
<g>
<path
class="st0"
d="M174.3,3c4.9,0,8.7,2.9,8.7,8.6c0,5.6-3.8,8.5-8.7,8.5h-7.6v11.1h-3.5V3H174.3z M166.7,17.1h7.2
c3,0,5.6-1.8,5.6-5.5c0-3.8-2.5-5.5-5.6-5.5h-7.2V17.1z"
/>
<path
class="st0"
d="M208.8,21.7c0,6.1-4.3,10-9.9,10c-5.6,0-9.9-3.9-9.9-10c0-6.1,4.3-10,9.9-10
C204.5,11.7,208.8,15.6,208.8,21.7z M192.3,21.7c0,4.5,2.9,7.2,6.6,7.2c3.7,0,6.6-2.7,6.6-7.2c0-4.5-2.9-7.1-6.6-7.1
C195.2,14.5,192.3,17.2,192.3,21.7z"
/>
<path
class="st0"
d="M234.4,31.3l-5.2-13.8L224,31.3h-2.6L214.1,12h3.6l5.2,14l5.2-14h2.3l5.3,14l5.2-14h3.5L237,31.3H234.4z"
/>
<path
class="st0"
d="M253,22.9c0.2,3.7,2.6,5.9,6,5.9c2.8,0,4.8-1.3,5.4-3.4l3.2,0.2c-0.8,3.5-4.1,6.1-8.6,6.1
c-5.5,0-9.6-3.7-9.6-10c0-6.3,4-10,9.5-10c5.5,0,8.8,3.7,8.8,9.4v1.8H253z M253,20.3h11.6c-0.1-3.4-2-5.7-5.6-5.7
C255.6,14.5,253.2,16.5,253,20.3z"
/>
<path
class="st0"
d="M285.4,14.9c-3.4,0-5.6,2.3-5.6,5.3v11.1h-3.2V12h3.2v2.9c0.7-1.6,2.5-3.1,5.7-3.1V14.9z"
/>
<path
class="st0"
d="M294.7,22.9c0.2,3.7,2.6,5.9,6,5.9c2.8,0,4.8-1.3,5.4-3.4l3.2,0.2c-0.8,3.5-4.1,6.1-8.6,6.1
c-5.5,0-9.6-3.7-9.6-10c0-6.3,4-10,9.5-10c5.5,0,8.8,3.7,8.8,9.4v1.8H294.7z M294.7,20.3h11.6c-0.1-3.4-2-5.7-5.6-5.7
C297.4,14.5,294.9,16.5,294.7,20.3z"
/>
<path
class="st0"
d="M333.1,31.3v-3.1c-1.1,2-3.6,3.5-6.8,3.5c-5.3,0-9.3-3.8-9.3-10c0-6.2,4-10,9.3-10c3.2,0,5.6,1.4,6.6,3.2V2
h3.2v29.4H333.1z M320.3,21.7c0,4.6,2.8,7.2,6.5,7.2c3.6,0,6.2-2.2,6.2-6.6v-1.1c0-4.3-2.6-6.6-6.2-6.6
C323.1,14.5,320.3,17.1,320.3,21.7z"
/>
<path
class="st0"
d="M361.8,14.9c1.1-1.9,3.4-3.2,6.7-3.2c5.3,0,9.3,3.8,9.3,10c0,6.2-4,10-9.3,10c-3.3,0-5.7-1.5-6.8-3.5v3.1
h-3.1V2h3.2V14.9z M361.9,21.1v1.1c0,4.4,2.6,6.6,6.2,6.6c3.7,0,6.5-2.5,6.5-7.2c0-4.6-2.8-7.1-6.5-7.1
C364.5,14.5,361.9,16.8,361.9,21.1z"
/>
<path class="st0" d="M386.3,40.9l4.6-10.7L383.2,12h3.6l5.8,14.5l5.8-14.5h3.6l-12.2,28.9H386.3z" />
</g>
</g>
<g id="XMLID_2369_">
<g>
<g id="XMLID_281_">
<g id="XMLID_282_">
<g>
<g id="XMLID_283_">
<g id="XMLID_287_">
<path
id="XMLID_288_"
class="st0"
d="M64.4,127l0-24.2c25.6,0,45.5-25.4,35.7-52.3c-3.6-10-11.6-17.9-21.6-21.6
c-27-9.8-52.3,10-52.3,35.7c0,0,0,0,0,0L2,64.7C2,23.8,41.5-8,84.3,5.4c18.7,5.8,33.6,20.7,39.4,39.4
C137,87.6,105.2,127,64.4,127z"
/>
</g>
<polygon
id="XMLID_286_"
class="st1"
points="64.4,102.9 40.4,102.9 40.4,78.9 40.4,78.9 64.4,78.9 64.4,78.9 "
/>
<polygon
id="XMLID_285_"
class="st1"
points="40.3,121.5 21.8,121.5 21.8,121.5 21.8,102.9 40.4,102.9 40.4,121.5 "
/>
<path
id="XMLID_284_"
class="st1"
d="M21.9,102.9H6.3c0,0,0,0,0,0V87.4c0,0,0,0,0,0h15.5c0,0,0,0,0,0V102.9z"
/>
</g>
</g>
</g>
</g>
<g id="XMLID_254_">
<path
id="XMLID_278_"
class="st0"
d="M200.9,52.4c-5.5-3.8-12.4-5.8-20.5-5.8h-17.5v55.5h17.5c8,0,14.9-2.1,20.5-6.1
c3-2.1,5.4-5.1,7.1-8.9c1.7-3.7,2.5-8.2,2.5-13.1c0-4.9-0.8-9.3-2.5-13C206.3,57.4,203.9,54.4,200.9,52.4z M173.1,56h5.5
c6.1,0,11.1,1.2,15,3.6c4.2,2.6,6.4,7.4,6.4,14.4c0,7.2-2.2,12.3-6.4,15.1h0c-3.7,2.4-8.7,3.6-14.9,3.6h-5.6V56z"
/>
<path
id="XMLID_277_"
class="st0"
d="M222.6,45.9c-1.7,0-3.1,0.6-4.3,1.8c-1.2,1.1-1.8,2.6-1.8,4.2c0,1.7,0.6,3.1,1.8,4.3
c1.2,1.2,2.6,1.8,4.3,1.8c1.7,0,3.1-0.6,4.3-1.8c1.2-1.2,1.8-2.6,1.8-4.3c0-1.7-0.6-3.1-1.8-4.2
C225.7,46.5,224.3,45.9,222.6,45.9z"
/>
<rect id="XMLID_276_" x="217.6" y="63" class="st0" width="9.8" height="39.1" />
<path
id="XMLID_273_"
class="st0"
d="M263.2,66.3c-3-2.6-6.3-4.2-9.9-4.2c-5.4,0-9.9,1.9-13.4,5.6c-3.5,3.7-5.3,8.4-5.3,14.1
c0,5.5,1.8,10.2,5.2,14c3.5,3.7,8,5.5,13.5,5.5c3.8,0,7.1-1.1,9.7-3.1V99c0,3.2-0.9,5.8-2.6,7.5c-1.7,1.7-4.1,2.6-7.1,2.6
c-4.5,0-7.4-1.8-10.9-6.5l-6.7,6.4l0.2,0.3c1.4,2,3.7,4,6.6,5.9c2.9,1.9,6.6,2.8,10.9,2.8c5.8,0,10.6-1.8,14.1-5.4
c3.5-3.6,5.3-8.4,5.3-14.2V63h-9.7V66.3z M260.6,89.4c-1.7,2-3.9,2.9-6.8,2.9c-2.8,0-5-0.9-6.7-2.9c-1.7-1.9-2.5-4.5-2.5-7.7
c0-3.2,0.9-5.8,2.5-7.7c1.7-1.9,3.9-2.9,6.7-2.9c2.8,0,5,1,6.8,2.9c1.7,2,2.6,4.6,2.6,7.7C263.2,84.9,262.3,87.5,260.6,89.4z"
/>
<rect id="XMLID_272_" x="281.3" y="63" class="st0" width="9.8" height="39.1" />
<path
id="XMLID_271_"
class="st0"
d="M286.3,45.9c-1.7,0-3.1,0.6-4.3,1.8c-1.2,1.1-1.8,2.6-1.8,4.2c0,1.7,0.6,3.1,1.8,4.3
c1.2,1.2,2.6,1.8,4.3,1.8c1.7,0,3.1-0.6,4.3-1.8c1.2-1.2,1.8-2.6,1.8-4.3c0-1.7-0.6-3.1-1.8-4.2C289.4,46.5,288,45.9,286.3,45.9
z"
/>
<path
id="XMLID_270_"
class="st0"
d="M312.7,52.5H303V63h-5.6v9h5.6v16.2c0,5.1,1,8.7,3,10.8c2,2.1,5.6,3.2,10.6,3.2
c1.6,0,3.2-0.1,4.8-0.2l0.4,0v-9l-3.4,0.2c-2.3,0-3.9-0.4-4.7-1.2c-0.8-0.8-1.1-2.6-1.1-5.2V72h9.2v-9h-9.2V52.5z"
/>
<rect id="XMLID_269_" x="368" y="46.6" class="st0" width="9.8" height="55.5" />
<path
id="XMLID_268_"
class="st0"
d="M477.3,88.2c-1.8,2-3.6,3.7-4.9,4.6v0c-1.4,0.9-3.1,1.3-5.1,1.3c-2.9,0-5.2-1.1-7.1-3.2
c-1.9-2.2-2.8-4.9-2.8-8.3s0.9-6.1,2.8-8.2c1.9-2.2,4.2-3.2,7.1-3.2c3.2,0,6.5,2,9.4,5.4l6.5-6.2l0,0c-4.2-5.5-9.7-8.1-16.1-8.1
c-5.4,0-10.1,2-13.9,5.8c-3.8,3.9-5.7,8.8-5.7,14.6s1.9,10.7,5.7,14.6c3.8,3.9,8.5,5.9,13.9,5.9c7.1,0,12.9-3.1,16.8-8.7
L477.3,88.2z"
/>
<path
id="XMLID_265_"
class="st0"
d="M517.7,68.5c-1.4-1.9-3.3-3.5-5.7-4.7c-2.3-1.1-5.1-1.7-8.1-1.7c-5.5,0-10,2-13.4,6
c-3.3,4-4.9,8.9-4.9,14.7c0,5.9,1.8,10.8,5.4,14.6c3.6,3.7,8.4,5.6,14.2,5.6c6.6,0,12.1-2.7,16.2-8l0.2-0.3l-6.4-6.2l0,0
c-0.6,0.7-1.4,1.5-2.2,2.3c-1,0.9-1.9,1.6-2.9,2.1c-1.5,0.7-3.1,1.1-5,1.1c-2.7,0-5-0.8-6.7-2.4c-1.6-1.5-2.6-3.5-2.8-5.9h26.1
l0.1-3.6c0-2.5-0.3-5-1-7.3C520.1,72.6,519.1,70.4,517.7,68.5z M496.2,77.7c0.5-1.9,1.3-3.4,2.6-4.6c1.3-1.3,3.1-2,5.2-2
c2.4,0,4.2,0.7,5.5,2c1.2,1.2,1.8,2.8,2,4.6H496.2z"
/>
<path
id="XMLID_262_"
class="st0"
d="M555.5,66L555.5,66c-3-2.5-7.1-3.8-12.3-3.8c-3.3,0-6.3,0.7-9.1,2.1
c-2.6,1.3-5.1,3.5-6.7,6.3l0.1,0.1l6.3,6c2.6-4.1,5.5-5.6,9.3-5.6c2.1,0,3.8,0.6,5.1,1.6c1.3,1.1,1.9,2.5,1.9,4.2v1.9
c-2.4-0.7-4.9-1.1-7.2-1.1c-4.9,0-8.9,1.2-11.8,3.4c-3,2.3-4.5,5.6-4.5,9.8c0,3.7,1.3,6.7,3.8,8.9c2.6,2.1,5.8,3.2,9.5,3.2
c3.7,0,7.3-1.5,10.4-4.1v3.2h9.7V77C560,72.2,558.5,68.5,555.5,66z M538,87.2c1.1-0.8,2.7-1.2,4.7-1.2c2.4,0,4.9,0.5,7.5,1.4
v3.8c-2.1,2-5,3-8.5,3c-1.7,0-3-0.4-3.9-1.1c-0.9-0.7-1.3-1.7-1.3-2.8C536.4,89,536.9,88,538,87.2z"
/>
<path
id="XMLID_261_"
class="st0"
d="M597.9,66.7c-2.7-3.1-6.6-4.6-11.5-4.6c-3.9,0-7.1,1.1-9.4,3.3V63h-9.7v39.1h9.8V80.6
c0-3,0.7-5.3,2.1-7c1.4-1.7,3.3-2.5,5.8-2.5c2.2,0,3.9,0.7,5.2,2.2c1.3,1.5,1.9,3.6,1.9,6.2v22.7h9.8V79.5
C602,74.1,600.6,69.8,597.9,66.7z"
/>
<path
id="XMLID_258_"
class="st0"
d="M355.6,66L355.6,66c-3-2.5-7.1-3.8-12.3-3.8c-3.3,0-6.3,0.7-9.1,2.1
c-2.6,1.3-5.1,3.5-6.7,6.3l0.1,0.1l6.3,6c2.6-4.1,5.5-5.6,9.3-5.6c2.1,0,3.8,0.6,5.1,1.6c1.3,1.1,1.9,2.5,1.9,4.2v1.9
c-2.4-0.7-4.9-1.1-7.2-1.1c-4.9,0-8.9,1.2-11.8,3.4c-3,2.3-4.5,5.6-4.5,9.8c0,3.7,1.3,6.7,3.8,8.9c2.6,2.1,5.8,3.2,9.5,3.2
c3.7,0,7.3-1.5,10.4-4.1v3.2h9.7V77C360.2,72.2,358.7,68.5,355.6,66z M338.2,87.2c1.1-0.8,2.7-1.2,4.7-1.2
c2.4,0,4.9,0.5,7.5,1.4v3.8c-2.1,2-5,3-8.5,3c-1.7,0-3-0.4-3.9-1.1c-0.9-0.7-1.3-1.7-1.3-2.8C336.6,89,337.1,88,338.2,87.2z"
/>
<path
id="XMLID_255_"
class="st0"
d="M413.6,103c-15.8,0-28.6-12.8-28.6-28.6s12.8-28.6,28.6-28.6s28.6,12.8,28.6,28.6
S429.4,103,413.6,103z M413.6,55.8c-10.2,0-18.5,8.3-18.5,18.5s8.3,18.5,18.5,18.5s18.5-8.3,18.5-18.5S423.8,55.8,413.6,55.8z"
/>
</g>
</g>
</g>
</g>
</svg>
)

View File

@@ -5,14 +5,7 @@ import logoSrc from '~/assets/images/chatbot-whatsapp.png?width=64&height=64&png
export default component$(() => ( export default component$(() => (
<span class="self-center ml-2 text-2xl md:text-xl font-bold text-gray-900 whitespace-nowrap dark:text-white flex items-center"> <span class="self-center ml-2 text-2xl md:text-xl font-bold text-gray-900 whitespace-nowrap dark:text-white flex items-center">
<img <img src={logoSrc} class="inline-block mr-1" width={32} height={32} alt="Qwind Logo" loading="lazy" />
src={logoSrc}
class="inline-block mr-1"
width={32}
height={32}
alt="Qwind Logo"
loading="lazy"
/>
Chatbot Chatbot
</span> </span>
)) ))

View File

@@ -1,11 +1,5 @@
export const Netlify = () => ( export const Netlify = () => (
<svg <svg xmlns="http://www.w3.org/2000/svg" width={147} height={40} role="img" fill="currentColor">
xmlns="http://www.w3.org/2000/svg"
width={147}
height={40}
role="img"
fill="currentColor"
>
<g fill-rule="evenodd"> <g fill-rule="evenodd">
<path d="M53.37 12.978l.123 2.198c1.403-1.7 3.245-2.55 5.525-2.55 3.951 0 5.962 2.268 6.032 6.804v12.568H60.79V19.676c0-1.207-.26-2.1-.78-2.681-.52-.58-1.371-.87-2.552-.87-1.719 0-3 .78-3.84 2.338v13.535h-4.262v-19.02h4.016zM77.748 32.35c-2.7 0-4.89-.852-6.567-2.557-1.678-1.705-2.517-3.976-2.517-6.812v-.527c0-1.898.365-3.595 1.096-5.089.73-1.494 1.757-2.657 3.078-3.49 1.321-.831 2.794-1.247 4.42-1.247 2.583 0 4.58.826 5.988 2.478 1.41 1.653 2.114 3.99 2.114 7.014v1.723h-12.4c.13 1.57.652 2.812 1.57 3.726.918.914 2.073 1.371 3.464 1.371 1.952 0 3.542-.79 4.77-2.373l2.297 2.198c-.76 1.136-1.774 2.018-3.042 2.645-1.269.627-2.692.94-4.27.94zm-.508-16.294c-1.17 0-2.113.41-2.832 1.23-.72.82-1.178 1.963-1.377 3.428h8.12v-.317c-.094-1.43-.474-2.51-1.14-3.243-.667-.732-1.59-1.098-2.771-1.098zm16.765-7.7v4.623h3.35v3.164h-3.35V26.76c0 .726.144 1.25.43 1.573.286.322.798.483 1.535.483a6.55 6.55 0 0 0 1.49-.176v3.305c-.97.27-1.905.404-2.806.404-3.273 0-4.91-1.81-4.91-5.431V16.142H86.62v-3.164h3.122V8.355h4.261zm11.137 23.643h-4.262v-27h4.262v27zm9.172 0h-4.262v-19.02h4.262v19.02zm-4.525-23.96c0-.655.207-1.2.622-1.634.416-.433 1.009-.65 1.78-.65.772 0 1.368.217 1.79.65.42.434.63.979.63 1.635 0 .644-.21 1.18-.63 1.608-.422.428-1.018.642-1.79.642-.771 0-1.364-.214-1.78-.642-.415-.427-.622-.964-.622-1.608zm10.663 23.96V16.142h-2.894v-3.164h2.894v-1.74c0-2.11.584-3.738 1.753-4.887 1.17-1.148 2.806-1.722 4.91-1.722.749 0 1.544.105 2.386.316l-.105 3.34a8.375 8.375 0 0 0-1.631-.14c-2.035 0-3.052 1.048-3.052 3.146v1.687h3.858v3.164h-3.858v15.856h-4.261zm17.87-6.117l3.858-12.903h4.542l-7.54 21.903c-1.158 3.199-3.122 4.799-5.893 4.799-.62 0-1.304-.106-2.052-.317v-3.305l.807.053c1.075 0 1.885-.196 2.429-.589.543-.392.973-1.051 1.289-1.977l.613-1.635-6.664-18.932h4.595l4.016 12.903z" /> <path d="M53.37 12.978l.123 2.198c1.403-1.7 3.245-2.55 5.525-2.55 3.951 0 5.962 2.268 6.032 6.804v12.568H60.79V19.676c0-1.207-.26-2.1-.78-2.681-.52-.58-1.371-.87-2.552-.87-1.719 0-3 .78-3.84 2.338v13.535h-4.262v-19.02h4.016zM77.748 32.35c-2.7 0-4.89-.852-6.567-2.557-1.678-1.705-2.517-3.976-2.517-6.812v-.527c0-1.898.365-3.595 1.096-5.089.73-1.494 1.757-2.657 3.078-3.49 1.321-.831 2.794-1.247 4.42-1.247 2.583 0 4.58.826 5.988 2.478 1.41 1.653 2.114 3.99 2.114 7.014v1.723h-12.4c.13 1.57.652 2.812 1.57 3.726.918.914 2.073 1.371 3.464 1.371 1.952 0 3.542-.79 4.77-2.373l2.297 2.198c-.76 1.136-1.774 2.018-3.042 2.645-1.269.627-2.692.94-4.27.94zm-.508-16.294c-1.17 0-2.113.41-2.832 1.23-.72.82-1.178 1.963-1.377 3.428h8.12v-.317c-.094-1.43-.474-2.51-1.14-3.243-.667-.732-1.59-1.098-2.771-1.098zm16.765-7.7v4.623h3.35v3.164h-3.35V26.76c0 .726.144 1.25.43 1.573.286.322.798.483 1.535.483a6.55 6.55 0 0 0 1.49-.176v3.305c-.97.27-1.905.404-2.806.404-3.273 0-4.91-1.81-4.91-5.431V16.142H86.62v-3.164h3.122V8.355h4.261zm11.137 23.643h-4.262v-27h4.262v27zm9.172 0h-4.262v-19.02h4.262v19.02zm-4.525-23.96c0-.655.207-1.2.622-1.634.416-.433 1.009-.65 1.78-.65.772 0 1.368.217 1.79.65.42.434.63.979.63 1.635 0 .644-.21 1.18-.63 1.608-.422.428-1.018.642-1.79.642-.771 0-1.364-.214-1.78-.642-.415-.427-.622-.964-.622-1.608zm10.663 23.96V16.142h-2.894v-3.164h2.894v-1.74c0-2.11.584-3.738 1.753-4.887 1.17-1.148 2.806-1.722 4.91-1.722.749 0 1.544.105 2.386.316l-.105 3.34a8.375 8.375 0 0 0-1.631-.14c-2.035 0-3.052 1.048-3.052 3.146v1.687h3.858v3.164h-3.858v15.856h-4.261zm17.87-6.117l3.858-12.903h4.542l-7.54 21.903c-1.158 3.199-3.122 4.799-5.893 4.799-.62 0-1.304-.106-2.052-.317v-3.305l.807.053c1.075 0 1.885-.196 2.429-.589.543-.392.973-1.051 1.289-1.977l.613-1.635-6.664-18.932h4.595l4.016 12.903z" />
<path <path

View File

@@ -13,10 +13,7 @@ export const RouterHead = component$(() => {
<title>{head.title}</title> <title>{head.title}</title>
<link rel="canonical" href={loc.href} /> <link rel="canonical" href={loc.href} />
<meta <meta name="viewport" content="width=device-width, initial-scale=1.0" />
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
{head.meta.map((m) => ( {head.meta.map((m) => (

View File

@@ -34,14 +34,8 @@ export const Social = () => {
content="https://campaign.codigoencasa.com" content="https://campaign.codigoencasa.com"
/> />
<meta property="og:site_name" content="campaign.codigoencasa.com" /> */} <meta property="og:site_name" content="campaign.codigoencasa.com" /> */}
<meta <meta property="og:image" content="https://i.imgur.com/0HpzsEm.png"></meta>
property="og:image" <meta property="og:image:secure_url" content="https://i.imgur.com/0HpzsEm.png" />
content="https://i.imgur.com/0HpzsEm.png"
></meta>
<meta
property="og:image:secure_url"
content="https://i.imgur.com/0HpzsEm.png"
/>
<meta property="og:image:type" content="image/png"></meta> <meta property="og:image:type" content="image/png"></meta>
<meta property="og:image:width" content="1200"></meta> <meta property="og:image:width" content="1200"></meta>
<meta property="og:image:height" content="630"></meta> <meta property="og:image:height" content="630"></meta>
@@ -52,10 +46,7 @@ export const Social = () => {
name="twitter:title" name="twitter:title"
content="💻 Conviértete en un Programador Backend aprendiendo todo de Cloud y Nodejs" content="💻 Conviértete en un Programador Backend aprendiendo todo de Cloud y Nodejs"
/> />
<meta <meta name="twitter:image" content="https://i.imgur.com/0HpzsEm.png" />
name="twitter:image"
content="https://i.imgur.com/0HpzsEm.png"
/>
</> </>
) )
} }

View File

@@ -27,9 +27,7 @@ export default component$((props: ItemProps) => {
// TODO: // TODO:
document.body.classList.toggle('overflow-hidden') document.body.classList.toggle('overflow-hidden')
document.getElementById('header')?.classList.toggle('h-screen') document.getElementById('header')?.classList.toggle('h-screen')
document document.querySelector('#header nav')?.classList.toggle('hidden')
.querySelector('#header nav')
?.classList.toggle('hidden')
}} }}
> >
<IconMenu class={iconClass} /> <IconMenu class={iconClass} />

View File

@@ -10,16 +10,13 @@ interface ItemProps {
export default component$((props: ItemProps) => { export default component$((props: ItemProps) => {
const { iconClass } = props const { iconClass } = props
const store = useStore({ const store = useStore({
theme: theme: (typeof window !== 'undefined' && window?.localStorage?.theme) || undefined,
(typeof window !== 'undefined' && window?.localStorage?.theme) ||
undefined,
}) })
useClientEffect$(() => { useClientEffect$(() => {
store.theme = store.theme =
window.localStorage.theme === 'dark' || window.localStorage.theme === 'dark' ||
(!('theme' in window.localStorage) && (!('theme' in window.localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)
window.matchMedia('(prefers-color-scheme: dark)').matches)
? 'dark' ? 'dark'
: 'light' : 'light'
}) })
@@ -42,11 +39,7 @@ export default component$((props: ItemProps) => {
} }
}} }}
> >
{store.theme == 'dark' ? ( {store.theme == 'dark' ? <IconMoon class={iconClass} /> : <IconSun class={iconClass} />}
<IconMoon class={iconClass} />
) : (
<IconSun class={iconClass} />
)}
</button> </button>
) )
}) })

View File

@@ -7,9 +7,7 @@ export const IconArrowDownRight = (props: ItemProps) => {
return ( return (
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
class={`icon icon-tabler icon-tabler-arrow-down-right ${ class={`icon icon-tabler icon-tabler-arrow-down-right ${className || 'w-5 h-5'}`}
className || 'w-5 h-5'
}`}
width="24" width="24"
height="24" height="24"
viewBox="0 0 24 24" viewBox="0 0 24 24"

View File

@@ -8,9 +8,7 @@ export const IconMenu = (props: ItemProps) => {
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
class={`icon icon-tabler icon-tabler-menu ${ class={`icon icon-tabler icon-tabler-menu ${className || 'w-5 h-5'}`}
className || 'w-5 h-5'
}`}
preserveAspectRatio="xMidYMid meet" preserveAspectRatio="xMidYMid meet"
viewBox="0 0 24 24" viewBox="0 0 24 24"
> >

View File

@@ -7,9 +7,7 @@ export const IconMoon = (props: ItemProps) => {
return ( return (
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
class={`icon icon-tabler icon-tabler-moon ${ class={`icon icon-tabler icon-tabler-moon ${className || 'w-5 h-5'}`}
className || 'w-5 h-5'
}`}
width="24" width="24"
height="24" height="24"
viewBox="0 0 24 24" viewBox="0 0 24 24"

View File

@@ -14,7 +14,7 @@ export default component$(
<a href={props.user.html_url} target="_blank"> <a href={props.user.html_url} target="_blank">
<img <img
class="w-16 h-16 rounded-full mx-auto object-cover" class="w-16 h-16 rounded-full mx-auto object-cover"
src={props.user.avatar_url + '&s=80'} src={props.user.avatar_url}
alt={props.user.login} alt={props.user.login}
width="80" width="80"
height="80" height="80"
@@ -23,7 +23,7 @@ export default component$(
<div class="pt-2 space-y-4 justify-center flex"> <div class="pt-2 space-y-4 justify-center flex">
<figcaption class="text-sm"> <figcaption class="text-sm">
<div class={'font-semibold'}>{props.user.login}</div> <div class={'font-semibold truncate'}>{props.user.login}</div>
</figcaption> </figcaption>
</div> </div>
</figure> </figure>

View File

@@ -32,8 +32,7 @@ export default component$((props: { users: User[] }) => {
Super estrellas Super estrellas
</h2> </h2>
<p class="max-w-3xl mx-auto sm:text-center text-xl text-gray-600 dark:text-slate-400"> <p class="max-w-3xl mx-auto sm:text-center text-xl text-gray-600 dark:text-slate-400">
Todo es posible gracias a el mayor recursos de todos, el Todo es posible gracias a el mayor recursos de todos, el recurso humano. Tu tambien puedes{' '}
recurso humano. Tu tambien puedes{' '}
<a class={'font-semibold'} href="/docs/contributing"> <a class={'font-semibold'} href="/docs/contributing">
formar parte formar parte
</a> </a>

View File

@@ -15,8 +15,8 @@ export default component$(() => {
📄 Editar esta pagina 📄 Editar esta pagina
</a> </a>
<p class={'text-xs'}> <p class={'text-xs'}>
Forma parte de esta comunidad mejorando la documentación Forma parte de esta comunidad mejorando la documentación siente libre de poder agregar o editar
siente libre de poder agregar o editar lo que quieras lo que quieras
</p> </p>
</li> </li>
</ul> </ul>

View File

@@ -56,13 +56,9 @@ export default component$(() => {
<IconArrowDownRight class="w-7 h-7 text-primary-600 inline-block" /> <IconArrowDownRight class="w-7 h-7 text-primary-600 inline-block" />
{question} {question}
</div> </div>
{answer {answer.split('\n\n').map((paragraph) => (
.split('\n\n') <p class="text-gray-700 dark:text-gray-400 mb-2">{paragraph}</p>
.map((paragraph) => ( ))}
<p class="text-gray-700 dark:text-gray-400 mb-2">
{paragraph}
</p>
))}
</div> </div>
))} ))}
</div> </div>

View File

@@ -50,13 +50,11 @@ export default component$(() => {
Caracteristicas Caracteristicas
</p> </p>
<h2 class="text-4xl md:text-5xl font-bold leading-tighter tracking-tighter mb-4 font-heading"> <h2 class="text-4xl md:text-5xl font-bold leading-tighter tracking-tighter mb-4 font-heading">
Nuestras principales{' '} Nuestras principales <span class="whitespace-nowrap">funciones</span>
<span class="whitespace-nowrap">funciones</span>
</h2> </h2>
<p class="max-w-3xl mx-auto sm:text-center text-xl text-gray-600 dark:text-slate-400"> <p class="max-w-3xl mx-auto sm:text-center text-xl text-gray-600 dark:text-slate-400">
El secreto es mantener los procesos repetitivos en El secreto es mantener los procesos repetitivos en procesos automatizados simples, por eso te
procesos automatizados simples, por eso te mostramos en mostramos en que destacamos.
que destacamos.
</p> </p>
</div> </div>
<div class="grid mx-auto space-y-6 md:grid-cols-2 md:space-y-0"> <div class="grid mx-auto space-y-6 md:grid-cols-2 md:space-y-0">
@@ -70,12 +68,8 @@ export default component$(() => {
</div> </div>
</div> </div>
<div> <div>
<h3 class="mb-3 text-xl font-bold"> <h3 class="mb-3 text-xl font-bold">{title}</h3>
{title} <p class="text-gray-600 dark:text-slate-400">{description}</p>
</h3>
<p class="text-gray-600 dark:text-slate-400">
{description}
</p>
</div> </div>
</div> </div>
))} ))}

View File

@@ -9,36 +9,24 @@ import { src as placeholder } from '~/assets/images/chatbot-whatsapp.png?width=4
export default component$(() => { export default component$(() => {
return ( return (
<section <section class={` from-white via-purple-50 to-sky-100 dark:bg-none mt-[-95px]`}>
class={` from-white via-purple-50 to-sky-100 dark:bg-none mt-[-95px]`}
>
<div class="max-w-6xl mx-auto px-4 sm:px-6 md:flex md:h-screen 2xl:h-auto pt-[72px]"> <div class="max-w-6xl mx-auto px-4 sm:px-6 md:flex md:h-screen 2xl:h-auto pt-[72px]">
<div class="py-12 md:py-12 lg:py-16 block md:flex text-center md:text-left"> <div class="py-12 md:py-12 lg:py-16 block md:flex text-center md:text-left">
<div class="pb-12 md:pb-0 md:py-0 max-w-5xl mx-auto md:pr-16 flex items-center basis-[56%]"> <div class="pb-12 md:pb-0 md:py-0 max-w-5xl mx-auto md:pr-16 flex items-center basis-[56%]">
<div> <div>
<h1 class="text-5xl md:text-[3.48rem] font-bold leading-tighter tracking-tighter mb-4 font-heading px-4 md:px-0"> <h1 class="text-5xl md:text-[3.48rem] font-bold leading-tighter tracking-tighter mb-4 font-heading px-4 md:px-0">
Crear chatbot{' '} Crear chatbot <span class="sm:whitespace-nowrap text-[#25b637]">WhatsApp</span>
<span class="sm:whitespace-nowrap text-[#25b637]"> <br class="hidden lg:block" /> <span class="lg:inline">en minutos</span>
WhatsApp
</span>
<br class="hidden lg:block" />{' '}
<span class="lg:inline">en minutos</span>
</h1> </h1>
<div class="max-w-3xl mx-auto"> <div class="max-w-3xl mx-auto">
<p class="text-xl text-gray-600 mb-8 dark:text-slate-400"> <p class="text-xl text-gray-600 mb-8 dark:text-slate-400">
<span class="font-semibold "> <span class="font-semibold ">Con esta libreria, </span>
Con esta libreria,{' '}
</span>
<span class="font-semibold "> <span class="font-semibold ">
puedes configurar respuestas puedes configurar respuestas automatizadas para preguntas frecuentes
automatizadas para preguntas frecuentes
</span>{' '} </span>{' '}
, recibir y responder mensajes de manera , recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las
automatizada, y hacer un seguimiento de las interacciones con los clientes. Además, nuestro Chatbot se integra fácilmente con
interacciones con los clientes. Además, otros sistemas y herramientas que ya esté utilizando en su negocio.
nuestro Chatbot se integra fácilmente con
otros sistemas y herramientas que ya esté
utilizando en su negocio.
</p> </p>
<div class="max-w-xs sm:max-w-md flex flex-nowrap flex-col sm:flex-col gap-4 m-auto md:m-0 justify-center md:justify-start"> <div class="max-w-xs sm:max-w-md flex flex-nowrap flex-col sm:flex-col gap-4 m-auto md:m-0 justify-center md:justify-start">
@@ -47,12 +35,16 @@ export default component$(() => {
npm create bot-whatsapp@latest npm create bot-whatsapp@latest
</code> </code>
</div> </div>
<div class="flex w-full sm:w-auto"> <div class="flex w-full sm:w-auto gap-3">
<a href="/docs" class="btn bg-gray-50 dark:bg-transparent">
Ver documentación
</a>
<a <a
href="/docs" target={'_blank'}
href="https://youtu.be/UgoS8PXxe-A"
class="btn bg-gray-50 dark:bg-transparent" class="btn bg-gray-50 dark:bg-transparent"
> >
Ver documentación Ver video
</a> </a>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,49 @@
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) => (
<div class="col-span-2 ">
{' '}
<Collaborator user={user} />
</div>
))}
</>
)
})
export default component$((props: { users: User[] }) => {
return (
<section class="relative ">
<div class={'px-4 py-16 mx-auto max-w-6xl lg:py-20'}>
<div class="mb-10 md:mx-auto sm:text-center md:mb-12 max-w-3xl">
<p class="text-base text-primary-600 dark:text-purple-200 font-semibold tracking-wide uppercase">
Premium
</p>
<h2 class="text-4xl md:text-5xl font-bold leading-tighter tracking-tighter mb-4 font-heading">
Miembros
</h2>
<p class="max-w-3xl mx-auto sm:text-center text-xl text-gray-600 dark:text-slate-400">
Conviértete en un miembro destacado y forma parte del proyecto y disfruta de manera adelantada
de las actualizaciones{' '}
<a class={'font-semibold'} target={'_blank'} href="https://opencollective.com/bot-whatsapp">
Únete
</a>
</p>
</div>
<div class="grid lg:grid-cols-12 grid-cols-1 gap-4 ">
<TaleUsers users={props.users} />
</div>
</div>
</section>
)
})

View File

@@ -5,55 +5,45 @@ import { DocumentationCtx } from '~/contexts'
/** /**
* options = [] array con la lista de opciones de la documentacion * options = [] array con la lista de opciones de la documentacion
*/ */
export default component$( export default component$(({ options = [] }: { options: DocumentationCtx[] }) => {
({ options = [] }: { options: DocumentationCtx[] }) => { return (
return ( <div>
<div> {options.map((item, i) => (
{options.map((item, i) => ( <UlCompoent key={i} title={item.title} list={item.list} />
<UlCompoent key={i} title={item.title} list={item.list} /> ))}
))} </div>
</div> )
) })
}
)
export const UlCompoent = component$( export const UlCompoent = component$((porps: { title: string; list: { link: string; name: string }[] }) => {
(porps: { title: string; list: { link: string; name: string }[] }) => { return (
return ( <ul>
<ul> <li class="mt-2 lg:mt-2">
<li class="mt-2 lg:mt-2"> <h5 class="mb-8 lg:mb-3 font-semibold text-slate-900 dark:text-slate-200">{porps.title}</h5>
<h5 class="mb-8 lg:mb-3 font-semibold text-slate-900 dark:text-slate-200"> <LiComponent list={porps.list} />
{porps.title} </li>
</h5> </ul>
<LiComponent list={porps.list} /> )
})
export const LiComponent = component$((porps: { list: { link: string; name: string }[] }) => {
const location = useLocation()
const currentPage = location.pathname
return (
<ul class="space-y-6 lg:space-y-2 border-l border-slate-100 dark:border-slate-800">
{porps.list.map((opt) => (
<li>
<Link
class={[
currentPage === `${opt.link}/` ? 'font-semibold' : '',
'block border-l pl-4 -ml-px border-transparent hover:border-slate-400 dark:hover:border-slate-500 text-slate-700 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-300 ',
]}
href={opt.link}
>
{opt.name}
</Link>
</li> </li>
</ul> ))}
) </ul>
} )
) })
export const LiComponent = component$(
(porps: { list: { link: string; name: string }[] }) => {
const location = useLocation()
const currentPage = location.pathname
return (
<ul class="space-y-6 lg:space-y-2 border-l border-slate-100 dark:border-slate-800">
{porps.list.map((opt) => (
<li>
<Link
class={[
currentPage === `${opt.link}/`
? 'font-semibold'
: '',
'block border-l pl-4 -ml-px border-transparent hover:border-slate-400 dark:hover:border-slate-500 text-slate-700 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-300 ',
]}
href={opt.link}
>
{opt.name}
</Link>
</li>
))}
</ul>
)
}
)

View File

@@ -1,74 +1,63 @@
import { component$ } from '@builder.io/qwik' import { component$ } from '@builder.io/qwik'
export const ButtonLink = component$( export const ButtonLink = component$((props: { name: string; link: string; direction: 'left' | 'right' }) => {
(props: { name: string; link: string; direction: 'left' | 'right' }) => { const ArrowRight = () => (
const ArrowRight = () => ( <svg
<svg viewBox="0 0 3 6"
viewBox="0 0 3 6" class="ml-3 w-auto h-1.5 text-slate-400 overflow-visible group-hover:text-slate-600 dark:group-hover:text-slate-300"
class="ml-3 w-auto h-1.5 text-slate-400 overflow-visible group-hover:text-slate-600 dark:group-hover:text-slate-300" >
> <path
<path d="M0 0L3 3L0 6"
d="M0 0L3 3L0 6" fill="none"
fill="none" stroke="currentColor"
stroke="currentColor" stroke-width="2"
stroke-width="2" stroke-linecap="round"
stroke-linecap="round" stroke-linejoin="round"
stroke-linejoin="round" ></path>
></path> </svg>
</svg> )
)
const ArrowLeft = () => ( const ArrowLeft = () => (
<svg <svg
viewBox="0 0 3 6" viewBox="0 0 3 6"
class="mr-3 w-auto h-1.5 text-slate-400 overflow-visible group-hover:text-slate-600 dark:group-hover:text-slate-300" class="mr-3 w-auto h-1.5 text-slate-400 overflow-visible group-hover:text-slate-600 dark:group-hover:text-slate-300"
> >
<path <path
d="M3 0L0 3L3 6" d="M3 0L0 3L3 6"
fill="none" fill="none"
stroke="currentColor" stroke="currentColor"
stroke-width="2" stroke-width="2"
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round" stroke-linejoin="round"
></path> ></path>
</svg> </svg>
) )
return ( return (
<a <a class="group flex items-center hover:text-slate-900 dark:hover:text-white" href={props.link}>
class="group flex items-center hover:text-slate-900 dark:hover:text-white" {props.direction === 'left' ? (
href={props.link} <>
> <ArrowLeft />
{props.direction === 'left' ? ( {props.name}
<> </>
<ArrowLeft /> ) : (
{props.name} <>
</> {props.name}
) : ( <ArrowRight />
<> </>
{props.name} )}
<ArrowRight /> </a>
</> )
)} })
</a>
)
}
)
export default component$( export default component$((props: { pages: ({ name: string; link: string } | null)[] }) => {
(props: { pages: ({ name: string; link: string } | null)[] }) => { const { pages } = props
const { pages } = props return (
return ( <div class="text-sm leading-6 mt-12">
<div class="text-sm leading-6 mt-12"> <div class="mb-10 text-slate-700 font-semibold flex justify-between items-center dark:text-slate-200">
<div class="mb-10 text-slate-700 font-semibold flex justify-between items-center dark:text-slate-200"> {pages[0] ? <ButtonLink direction="left" {...pages[0]} /> : null}
{pages[0] ? ( {pages[1] ? <ButtonLink direction="right" {...pages[1]} /> : null}
<ButtonLink direction="left" {...pages[0]} />
) : null}
{pages[1] ? (
<ButtonLink direction="right" {...pages[1]} />
) : null}
</div>
</div> </div>
) </div>
} )
) })

View File

@@ -0,0 +1,20 @@
import { component$ } from '@builder.io/qwik'
export const SearchModal = component$(() => {
// const state = useStore({
// open: false,
// src: '',
// })
return (
<div class={'bg-gray-100/75 fixed w-[100vw] h-[100vh] z-50'}>
<div class={'bg-red-200 w-1/3 m-auto mt-12'}>
<SingleModal />
</div>
</div>
)
})
export const SingleModal = component$(() => {
return <div class={'bg-blue-300 w-100 px-3 py-2'}>Modal singlke</div>
})

View File

@@ -7,6 +7,8 @@ import { src as qwik } from '~/assets/images/qwik.png?width=100&metadata'
import { src as leanga } from '~/assets/images/leanga.png?width=40&metadata' import { src as leanga } from '~/assets/images/leanga.png?width=40&metadata'
// @ts-ignore // @ts-ignore
import { src as netlify } from '~/assets/images/full-logo-light.png?width=100&metadata' import { src as netlify } from '~/assets/images/full-logo-light.png?width=100&metadata'
// @ts-ignore
import { src as digitalOcean } from '~/assets/images/digital-ocean.png?width=100&metadata'
/** /**
* options = [] array con la lista de opciones de la documentacion * options = [] array con la lista de opciones de la documentacion
@@ -41,7 +43,20 @@ export default component$(() => {
<img <img
src={netlify} src={netlify}
class="border border-slate-200 rounded my-2 p-1 bg-gray-50 dark:border-gray-600 dark:bg-gray-700" class="border border-slate-200 rounded my-2 p-1 bg-gray-50 dark:border-gray-600 dark:bg-gray-700"
alt="Qwind Hero Image (Cool dog)" alt="Netlify"
loading="eager"
decoding="async"
/>
</picture>
</a>
</li>
<li>
<a target={'_blank'} href="https://m.do.co/c/140291d21736">
<picture>
<img
src={digitalOcean}
class="border border-slate-200 rounded my-2 p-1 bg-gray-50 dark:border-gray-600 dark:bg-gray-700"
alt="DigitalOcean"
loading="eager" loading="eager"
decoding="async" decoding="async"
/> />

View File

@@ -5,33 +5,25 @@ export default component$(() => {
<div class="px-4 py-8 md:py-16 sm:px-6 mx-auto md:px-24 lg:px-8 lg:py-20 max-w-6xl"> <div class="px-4 py-8 md:py-16 sm:px-6 mx-auto md:px-24 lg:px-8 lg:py-20 max-w-6xl">
<div class="grid grid-cols-2 row-gap-8 md:grid-cols-4"> <div class="grid grid-cols-2 row-gap-8 md:grid-cols-4">
<div class="text-center md:border-r dark:md:border-slate-500 mb-10 md:mb-0"> <div class="text-center md:border-r dark:md:border-slate-500 mb-10 md:mb-0">
<div class="text-4xl font-bold lg:text-5xl xl:text-6xl text-[#039de1] font-heading"> <div class="text-4xl font-bold lg:text-5xl xl:text-6xl text-[#039de1] font-heading">132K</div>
132K
</div>
<p class="text-sm font-medium tracking-widest text-gray-800 dark:text-slate-400 uppercase lg:text-base"> <p class="text-sm font-medium tracking-widest text-gray-800 dark:text-slate-400 uppercase lg:text-base">
Downloads Downloads
</p> </p>
</div> </div>
<div class="text-center md:border-r dark:md:border-slate-500 mb-10 md:mb-0"> <div class="text-center md:border-r dark:md:border-slate-500 mb-10 md:mb-0">
<div class="text-4xl font-bold lg:text-5xl xl:text-6xl text-[#039de1] font-heading"> <div class="text-4xl font-bold lg:text-5xl xl:text-6xl text-[#039de1] font-heading">24.8K</div>
24.8K
</div>
<p class="text-sm font-medium tracking-widest text-gray-800 dark:text-slate-400 uppercase lg:text-base"> <p class="text-sm font-medium tracking-widest text-gray-800 dark:text-slate-400 uppercase lg:text-base">
Stars Stars
</p> </p>
</div> </div>
<div class="text-center md:border-r dark:md:border-slate-500 font-heading"> <div class="text-center md:border-r dark:md:border-slate-500 font-heading">
<div class="text-4xl font-bold lg:text-5xl xl:text-6xl text-[#039de1]"> <div class="text-4xl font-bold lg:text-5xl xl:text-6xl text-[#039de1]">10.3K</div>
10.3K
</div>
<p class="text-sm font-medium tracking-widest text-gray-800 dark:text-slate-400 uppercase lg:text-base"> <p class="text-sm font-medium tracking-widest text-gray-800 dark:text-slate-400 uppercase lg:text-base">
Forks Forks
</p> </p>
</div> </div>
<div class="text-center"> <div class="text-center">
<div class="text-4xl font-bold lg:text-5xl xl:text-6xl text-[#039de1] font-heading"> <div class="text-4xl font-bold lg:text-5xl xl:text-6xl text-[#039de1] font-heading">48.4K</div>
48.4K
</div>
<p class="text-sm font-medium tracking-widest text-gray-800 dark:text-slate-400 uppercase lg:text-base"> <p class="text-sm font-medium tracking-widest text-gray-800 dark:text-slate-400 uppercase lg:text-base">
Users Users
</p> </p>

View File

@@ -13,5 +13,4 @@ export interface User {
avatar_url: string avatar_url: string
} }
export const GlobalStore = export const GlobalStore = createContext<DocumentationCtx[]>('documentation-site')
createContext<DocumentationCtx[]>('documentation-site')

View File

@@ -1,14 +1,5 @@
import { import { component$, useContextProvider, useStore, useStyles$ } from '@builder.io/qwik'
component$, import { QwikCityProvider, RouterOutlet, ServiceWorkerRegister } from '@builder.io/qwik-city'
useContextProvider,
useStore,
useStyles$,
} from '@builder.io/qwik'
import {
QwikCityProvider,
RouterOutlet,
ServiceWorkerRegister,
} from '@builder.io/qwik-city'
import { RouterHead } from '~/components/core/RouterHead' import { RouterHead } from '~/components/core/RouterHead'
import { DarkThemeLauncher } from '~/components/core/DarkThemeLauncher' import { DarkThemeLauncher } from '~/components/core/DarkThemeLauncher'
@@ -52,16 +43,22 @@ export default component$(() => {
title: 'Avanzado', title: 'Avanzado',
list: [ list: [
{ name: 'Migración', link: '/docs/migration' }, { 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', title: 'Comunidad',
list: [ list: [
{ name: 'MasterClass', link: '/docs/masterclass' },
{ name: 'Colabores', link: '/docs/contributing' }, { name: 'Colabores', link: '/docs/contributing' },
{ name: 'Unirme al proyecto', link: '/docs/join' }, { name: 'Unirme al proyecto', link: '/docs/join' },
{ name: 'Sponsors', link: '/docs/sponsors' },
], ],
}, },
]) ])
@@ -72,10 +69,7 @@ export default component$(() => {
<QwikCityProvider> <QwikCityProvider>
<head> <head>
<meta charSet="utf-8" /> <meta charSet="utf-8" />
<meta <meta name="viewport" content="width=device-width, initial-scale=1" />
name="viewport"
content="width=device-width, initial-scale=1"
/>
<link rel="manifest" href="/manifest.json" /> <link rel="manifest" href="/manifest.json" />
<RouterHead /> <RouterHead />

View File

@@ -4,11 +4,10 @@ import Navigation from '../../../components/widgets/Navigation'
# DataBase (Base de datos) # DataBase (Base de datos)
<Alert> <Alert>
⚡ Dependiendo del tipo de conector que utlices puede que necesites pasar ⚡ Dependiendo del tipo de conector que utlices puede que necesites pasar algunas configuracion adicional como
algunas configuracion adicional como **user, host, password** para esos **user, host, password** para esos casos te recomendamos guiarte de los
casos te recomendamos guiarte de los **[starters](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** o si gustas puedes editar esta
**[starters](https://github.com/codigoencasa/bot-whatsapp/tree/dev/starters/apps)** documentación para ir agregando más info
o si gustas puedes editar esta documentación para ir agregando más info
</Alert> </Alert>
Es la pieza encargada de mantener el **"estado"** de una conversación, para mayor facilidad la libreria te proporcia diferentes conectores que se de adapten mejor a tu desarrollo Es la pieza encargada de mantener el **"estado"** de una conversación, para mayor facilidad la libreria te proporcia diferentes conectores que se de adapten mejor a tu desarrollo

View File

@@ -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

View File

@@ -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
```

View File

@@ -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)
---
<Alert>Si deseas instalar pm2 puedes ejecutar `npm install pm2 --global`</Alert>
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

Some files were not shown because too many files have changed in this diff Show More