feat(bot): add send image function

This commit is contained in:
Leifer Mendez
2022-12-05 13:01:32 +01:00
parent f373a3abc7
commit ce8a96b958
11 changed files with 940 additions and 534 deletions

2
GLOSSARY.md Normal file
View File

@@ -0,0 +1,2 @@
CTX: Es el objeto que representa un mensaje, con opciones, id, ref
messageInComming: Objeto entrante del provider {body, from,...}

View File

@@ -8,8 +8,8 @@
- [X] Posibilidad de en el capture meter todo un nuevo CTX de FLOW .addAnswer('Marca la opcion',{capture:true, join:CTX}) - [X] Posibilidad de en el capture meter todo un nuevo CTX de FLOW .addAnswer('Marca la opcion',{capture:true, join:CTX})
- [X] .addKeyword('1') no funciona con 1 caracter - [X] .addKeyword('1') no funciona con 1 caracter
- [X] sensitivy viene activado por defecto - [X] sensitivy viene activado por defecto
- [ ] fallback respuesta en hijo: Se puede colocar en option el ref de la answer fallback - [X] fallback respuesta en hijo: Se puede colocar en option el ref de la answer fallback
- [ ] envia imagen - [X] envia imagen
- [ ] envia nota de voz - [ ] envia nota de voz
- [ ] colocar mensaje esperando conectando whatsapp (provider) - [ ] colocar mensaje esperando conectando whatsapp (provider)
- [ ] Cuando Envian Sticket devuelve mensaje raro - [ ] Cuando Envian Sticket devuelve mensaje raro

View File

@@ -47,8 +47,9 @@ class CoreClass {
] ]
/** /**
* @private *
* @param {*} ctxMessage * @param {*} messageInComming
* @returns
*/ */
handleMsg = async (messageInComming) => { handleMsg = async (messageInComming) => {
const { body, from } = messageInComming const { body, from } = messageInComming
@@ -67,6 +68,8 @@ class CoreClass {
}) })
this.databaseClass.save(ctxByNumber) this.databaseClass.save(ctxByNumber)
} }
// 📄 [options: fallback]: esta funcion se encarga de repetir el ultimo mensaje
const fallBack = () => { const fallBack = () => {
fallBackFlag = true fallBackFlag = true
msgToSend = this.flowClass.find(refToContinue?.keyword, true) || [] msgToSend = this.flowClass.find(refToContinue?.keyword, true) || []
@@ -110,10 +113,16 @@ class CoreClass {
this.sendFlow(msgToSend, from) this.sendFlow(msgToSend, from)
} }
/**
* Enviar mensaje con contexto atraves del proveedor de whatsapp
* @param {*} numberOrId
* @param {*} ctxMessage ver más en GLOSSARY.md
* @returns
*/
sendProviderAndSave = (numberOrId, ctxMessage) => { sendProviderAndSave = (numberOrId, ctxMessage) => {
const { answer } = ctxMessage const { answer } = ctxMessage
return Promise.all([ return Promise.all([
this.providerClass.sendMessage(numberOrId, answer), this.providerClass.sendMessage(numberOrId, answer, ctxMessage),
this.databaseClass.save({ ...ctxMessage, from: numberOrId }), this.databaseClass.save({ ...ctxMessage, from: numberOrId }),
]) ])
} }

View File

@@ -3,7 +3,7 @@ const { toJson } = require('./toJson')
/** /**
* *
* @param answer string * @param answer string
* @param options {media:string, buttons:[], capture:true default false} * @param options {media:string, buttons:[{"body":"😎 Cursos"}], capture:true default false}
* @returns * @returns
*/ */
const addAnswer = const addAnswer =

View File

@@ -19,7 +19,7 @@ class ProviderClass extends EventEmitter {
* *
*/ */
sendMessage = async (userId, message) => { sendMessage = async (userId, message, sendMessage) => {
if (NODE_ENV !== 'production') if (NODE_ENV !== 'production')
console.log('[sendMessage]', { userId, message }) console.log('[sendMessage]', { userId, message })
return message return message

View File

@@ -29,10 +29,13 @@
"@types/node": "latest", "@types/node": "latest",
"@typescript-eslint/eslint-plugin": "5.43.0", "@typescript-eslint/eslint-plugin": "5.43.0",
"@typescript-eslint/parser": "5.43.0", "@typescript-eslint/parser": "5.43.0",
"autoprefixer": "10.4.11",
"eslint": "8.28.0", "eslint": "8.28.0",
"eslint-plugin-qwik": "0.14.1", "eslint-plugin-qwik": "0.14.1",
"node-fetch": "3.3.0", "node-fetch": "3.3.0",
"postcss": "^8.4.16",
"prettier": "2.7.1", "prettier": "2.7.1",
"tailwindcss": "^3.1.8",
"typescript": "4.9.3", "typescript": "4.9.3",
"vite": "3.2.4", "vite": "3.2.4",
"vite-tsconfig-paths": "3.5.0", "vite-tsconfig-paths": "3.5.0",

View File

@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

View File

@@ -63,4 +63,4 @@ code {
border-radius: 3px; border-radius: 3px;
font-size: 0.9em; font-size: 0.9em;
border-bottom: 2px solid #bfbfbf; border-bottom: 2px solid #bfbfbf;
} }

View File

@@ -0,0 +1,21 @@
/** @type {import('tailwindcss').Config} */
const defaultTheme = require("tailwindcss/defaultTheme");
const colors = require("tailwindcss/colors");
module.exports = {
content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"],
theme: {
extend: {
colors: {
primary: colors.purple,
secondary: colors.sky,
},
fontFamily: {
sans: ["'Inter'", ...defaultTheme.fontFamily.sans],
},
},
},
plugins: [],
darkMode: "class",
};

View File

@@ -1,7 +1,7 @@
const { Client, LocalAuth } = require('whatsapp-web.js') const { Client, LocalAuth, MessageMedia } = require('whatsapp-web.js')
const { ProviderClass } = require('@bot-whatsapp/bot') const { ProviderClass } = require('@bot-whatsapp/bot')
const { Console } = require('console') const { Console } = require('console')
const { createWriteStream } = require('fs') const { createWriteStream, existsSync } = require('fs')
const { cleanNumber, generateImage, isValidNumber } = require('./utils') const { cleanNumber, generateImage, isValidNumber } = require('./utils')
const logger = new Console({ const logger = new Console({
@@ -80,10 +80,22 @@ class WebWhatsappProvider extends ProviderClass {
}, },
] ]
sendMessage = async (userId, message) => { sendMedia = async (number, mediaInput = null) => {
const number = cleanNumber(userId) if (!existsSync(mediaInput))
throw new Error(`NO_SE_ENCONTRO: ${mediaInput}`)
const media = MessageMedia.fromFilePath(mediaInput)
return this.vendor.sendMessage(number, media)
}
sendText = async (number, message) => {
return this.vendor.sendMessage(number, message) return this.vendor.sendMessage(number, message)
} }
sendMessage = async (userId, message, { options }) => {
const number = cleanNumber(userId)
if (options?.media) return this.sendMedia(number, options.media)
return this.sendText(number, message)
}
} }
module.exports = WebWhatsappProvider module.exports = WebWhatsappProvider

1397
yarn.lock

File diff suppressed because it is too large Load Diff