Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev #796

Merged
merged 6 commits into from
Aug 6, 2023
Merged

Dev #796

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@bot-whatsapp/root",
"version": "0.1.28",
"version": "0.1.29",
"description": "Bot de wahtsapp open source para MVP o pequeños negocios",
"main": "app.js",
"private": true,
Expand Down
2 changes: 1 addition & 1 deletion packages/docs/src/routes/docs/install/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Cada plantilla tiene sus dependencias necesarias basadas en tu previa selección
"@bot-whatsapp/cli": "latest",
"@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest",
"@adiwajshing/baileys": "github:WhiskeySockets/Baileys",
"@whiskeysockets/baileys": "^6.4.0",
"mysql2": "^2.3.3", 👈
},
```
Expand Down
130 changes: 124 additions & 6 deletions packages/provider/src/baileys/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,19 @@ const pino = require('pino')
const rimraf = require('rimraf')
const mime = require('mime-types')
const { join } = require('path')
const { createWriteStream, readFileSync } = require('fs')
const { createWriteStream, readFileSync, existsSync } = require('fs')
const { Console } = require('console')

const { default: makeWASocket, useMultiFileAuthState, Browsers, DisconnectReason } = require('@adiwajshing/baileys')
const {
default: makeWASocket,
useMultiFileAuthState,
Browsers,
DisconnectReason,
proto,
makeInMemoryStore,
makeCacheableSignalKeyStore,
getAggregateVotesInPollMessage,
} = require('@whiskeysockets/baileys')

const { baileyGenerateImage, baileyCleanNumber, baileyIsValidNumber } = require('./utils')

Expand All @@ -25,11 +34,13 @@ const logger = new Console({
* https://github.com/whiskeysockets/Baileys
*/
class BaileysProvider extends ProviderClass {
globalVendorArgs = { name: `bot`, gifPlayback: false }
globalVendorArgs = { name: `bot`, gifPlayback: false, usePairingCode: false, phoneNumber: null }
vendor
store
saveCredsGlobal = null
constructor(args) {
super()
this.store = null
this.globalVendorArgs = { ...this.globalVendorArgs, ...args }
this.initBailey().then()
}
Expand All @@ -40,17 +51,57 @@ class BaileysProvider extends ProviderClass {
initBailey = async () => {
const NAME_DIR_SESSION = `${this.globalVendorArgs.name}_sessions`
const { state, saveCreds } = await useMultiFileAuthState(NAME_DIR_SESSION)
const loggerBaileys = pino({ level: 'fatal' })

this.saveCredsGlobal = saveCreds

this.store = makeInMemoryStore({ loggerBaileys })
this.store.readFromFile(`${NAME_DIR_SESSION}/baileys_store.json`)
setInterval(() => {
const path = `${this.NAME_DIR_SESSION}/baileys_store.json`
if (existsSync(path)) {
this.store.writeToFile(path)
}
}, 10_000)

try {
const sock = makeWASocket({
logger: loggerBaileys,
printQRInTerminal: false,
auth: state,
auth: {
creds: state.creds,
keys: makeCacheableSignalKeyStore(state.keys, loggerBaileys),
},
browser: Browsers.macOS('Desktop'),
syncFullHistory: false,
logger: pino({ level: 'fatal' }),
generateHighQualityLinkPreview: true,
getMessage: this.getMessage,
})

this.store?.bind(sock.ev)

if (this.globalVendorArgs.usePairingCode && !sock.authState.creds.registered) {
if (this.globalVendorArgs.phoneNumber) {
await sock.waitForConnectionUpdate((update) => !!update.qr)
const code = await sock.requestPairingCode(this.globalVendorArgs.phoneNumber)
this.emit('require_action', {
instructions: [
`Acepta la notificación del WhatsApp ${this.globalVendorArgs.phoneNumber} en tu celular 👌`,
`El token para la vinculación es: ${code}`,
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
],
})
} else {
this.emit('auth_failure', [
`No se ha definido el numero de telefono agregalo`,
`Reinicia el BOT`,
`Tambien puedes mirar un log que se ha creado baileys.log`,
`Necesitas ayuda: https://link.codigoencasa.com/DISCORD`,
`(Puedes abrir un ISSUE) https://github.com/codigoencasa/bot-whatsapp/issues/new/choose`,
])
}
}

sock.ev.on('connection.update', async (update) => {
const { connection, lastDisconnect, qr } = update

Expand Down Expand Up @@ -79,7 +130,7 @@ class BaileysProvider extends ProviderClass {
}

/** QR Code */
if (qr) {
if (qr && !this.globalVendorArgs.usePairingCode) {
this.emit('require_action', {
instructions: [
`Debes escanear el QR Code 👌 ${this.globalVendorArgs.name}.qr.png`,
Expand Down Expand Up @@ -165,6 +216,41 @@ class BaileysProvider extends ProviderClass {
this.emit('message', payload)
},
},
{
event: 'messages.update',
func: async (message) => {
for (const { key, update } of message) {
if (update.pollUpdates) {
const pollCreation = await this.getMessage(key)
if (pollCreation) {
const pollMessage = await getAggregateVotesInPollMessage({
message: pollCreation,
pollUpdates: update.pollUpdates,
})
const [messageCtx] = message

const messageOriginalKey = messageCtx?.update?.pollUpdates[0]?.pollUpdateMessageKey
const messageOriginal = await this.store.loadMessage(
messageOriginalKey.remoteJid,
messageOriginalKey.id
)

let payload = {
...messageCtx,
body: pollMessage.find((poll) => poll.voters.length > 0)?.name || '',
from: baileyCleanNumber(key.remoteJid),
pushName: messageOriginal?.pushName,
broadcast: messageOriginal?.broadcast,
messageTimestamp: messageOriginal?.messageTimestamp,
voters: pollCreation,
type: 'poll',
}
this.emit('message', payload)
}
}
}
},
},
]

initBusEvents = (_sock) => {
Expand All @@ -176,6 +262,15 @@ class BaileysProvider extends ProviderClass {
}
}

getMessage = async (key) => {
if (this.store) {
const msg = await this.store.loadMessage(key.remoteJid, key.id)
return msg?.message || undefined
}
// only if store is present
return proto.Message.fromObject({})
}

/**
* Funcion SendRaw envia opciones directamente del proveedor
* @example await sendMessage('+XXXXXXXXXXX', 'Hello World')
Expand Down Expand Up @@ -302,6 +397,29 @@ class BaileysProvider extends ProviderClass {
return this.vendor.sendMessage(numberClean, buttonMessage)
}

/**
*
* @param {string} number
* @param {string} text
* @param {string} footer
* @param {Array} poll
* @example await sendMessage("+XXXXXXXXXXX", { poll: { "name": "You accept terms", "values": [ "Yes", "Not"], "selectableCount": 1 })
*/

sendPoll = async (numberIn, text, poll) => {
const numberClean = baileyCleanNumber(numberIn)

if (poll.options.length < 2) return false

const pollMessage = {
name: text,
values: poll.options,
selectableCount: poll?.multiselect === undefined ? 1 : poll?.multiselect ? 1 : 0,
}

return this.vendor.sendMessage(numberClean, { poll: pollMessage })
}

/**
* TODO: Necesita terminar de implementar el sendMedia y sendButton guiarse:
* https://github.com/leifermendez/bot-whatsapp/blob/4e0fcbd8347f8a430adb43351b5415098a5d10df/packages/provider/src/web-whatsapp/index.js#L165
Expand Down
3 changes: 1 addition & 2 deletions packages/provider/src/baileys/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
{
"dependencies": {
"@adiwajshing/baileys": "github:WhiskeySockets/Baileys",
"@adiwajshing/keyed-db": "^0.2.4",
"@whiskeysockets/baileys": "^6.4.0",
"wa-sticker-formatter": "4.3.2"
}
}
3 changes: 1 addition & 2 deletions starters/apps/base-baileys-json/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@
"@bot-whatsapp/provider": "latest",
"@bot-whatsapp/portal": "latest",
"mime-types": "2.1.35",
"@adiwajshing/baileys": "github:WhiskeySockets/Baileys",
"@adiwajshing/keyed-db": "^0.2.4",
"@whiskeysockets/baileys": "^6.4.0",
"wa-sticker-formatter": "4.3.2"
},
"author": "",
Expand Down
3 changes: 1 addition & 2 deletions starters/apps/base-baileys-memory/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@
"@bot-whatsapp/database": "latest",
"@bot-whatsapp/provider": "latest",
"@bot-whatsapp/portal": "latest",
"@adiwajshing/baileys": "github:WhiskeySockets/Baileys",
"@adiwajshing/keyed-db": "^0.2.4",
"@whiskeysockets/baileys": "^6.4.0",
"wa-sticker-formatter": "4.3.2"
},
"author": "",
Expand Down
3 changes: 1 addition & 2 deletions starters/apps/base-baileys-mongo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@
"@bot-whatsapp/portal": "latest",
"mime-types": "2.1.35",
"mongodb": "^4.12.1",
"@adiwajshing/baileys": "github:WhiskeySockets/Baileys",
"@adiwajshing/keyed-db": "^0.2.4",
"@whiskeysockets/baileys": "^6.4.0",
"wa-sticker-formatter": "4.3.2"
},
"author": "",
Expand Down
3 changes: 1 addition & 2 deletions starters/apps/base-baileys-mysql/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@
"@bot-whatsapp/provider": "latest",
"@bot-whatsapp/portal": "latest",
"mysql2": "^2.3.3",
"@adiwajshing/baileys": "github:WhiskeySockets/Baileys",
"@adiwajshing/keyed-db": "^0.2.4",
"@whiskeysockets/baileys": "^6.4.0",
"wa-sticker-formatter": "4.3.2"
},
"author": "",
Expand Down