mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-17 19:26:23 +00:00
feat(bot): ⚡ add send image function
This commit is contained in:
2
GLOSSARY.md
Normal file
2
GLOSSARY.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
CTX: Es el objeto que representa un mensaje, con opciones, id, ref
|
||||||
|
messageInComming: Objeto entrante del provider {body, from,...}
|
||||||
4
TODO.md
4
TODO.md
@@ -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
|
||||||
|
|||||||
@@ -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 }),
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
6
packages/docs/postcss.config.js
Normal file
6
packages/docs/postcss.config.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
21
packages/docs/tailwind.config.js
Normal file
21
packages/docs/tailwind.config.js
Normal 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",
|
||||||
|
};
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user