mirror of
https://github.com/FranP-code/Baileys.git
synced 2025-10-13 00:32:22 +00:00
!BREAKING_CHANGE 1. this allows all offline notifications to be combined into a batch -- to reduce the number of events being sent out 2. to enable the above, the "message.reaction" event has been made an array. Also removes the need for the "operation" field 3. have also now started processing all events under a single queue to prevent state sync problems
103 lines
3.4 KiB
TypeScript
103 lines
3.4 KiB
TypeScript
import { Boom } from '@hapi/boom'
|
|
import makeWASocket, { AnyMessageContent, delay, DisconnectReason, fetchLatestBaileysVersion, makeInMemoryStore, MessageRetryMap, useMultiFileAuthState } from '../src'
|
|
import MAIN_LOGGER from '../src/Utils/logger'
|
|
|
|
const logger = MAIN_LOGGER.child({ })
|
|
logger.level = 'trace'
|
|
|
|
const useStore = !process.argv.includes('--no-store')
|
|
const doReplies = !process.argv.includes('--no-reply')
|
|
|
|
// external map to store retry counts of messages when decryption/encryption fails
|
|
// keep this out of the socket itself, so as to prevent a message decryption/encryption loop across socket restarts
|
|
const msgRetryCounterMap: MessageRetryMap = { }
|
|
|
|
// the store maintains the data of the WA connection in memory
|
|
// can be written out to a file & read from it
|
|
const store = useStore ? makeInMemoryStore({ logger }) : undefined
|
|
store?.readFromFile('./baileys_store_multi.json')
|
|
// save every 10s
|
|
setInterval(() => {
|
|
store?.writeToFile('./baileys_store_multi.json')
|
|
}, 10_000)
|
|
|
|
// start a connection
|
|
const startSock = async() => {
|
|
const { state, saveCreds } = await useMultiFileAuthState('baileys_auth_info')
|
|
// fetch latest version of WA Web
|
|
const { version, isLatest } = await fetchLatestBaileysVersion()
|
|
console.log(`using WA v${version.join('.')}, isLatest: ${isLatest}`)
|
|
|
|
const sock = makeWASocket({
|
|
version,
|
|
logger,
|
|
printQRInTerminal: true,
|
|
auth: state,
|
|
msgRetryCounterMap,
|
|
// implement to handle retries
|
|
getMessage: async key => {
|
|
return {
|
|
conversation: 'hello'
|
|
}
|
|
}
|
|
})
|
|
|
|
store?.bind(sock.ev)
|
|
|
|
const sendMessageWTyping = async(msg: AnyMessageContent, jid: string) => {
|
|
await sock.presenceSubscribe(jid)
|
|
await delay(500)
|
|
|
|
await sock.sendPresenceUpdate('composing', jid)
|
|
await delay(2000)
|
|
|
|
await sock.sendPresenceUpdate('paused', jid)
|
|
|
|
await sock.sendMessage(jid, msg)
|
|
}
|
|
|
|
sock.ev.on('call', item => console.log('recv call event', item))
|
|
sock.ev.on('chats.set', item => console.log(`recv ${item.chats.length} chats (is latest: ${item.isLatest})`))
|
|
sock.ev.on('messages.set', item => console.log(`recv ${item.messages.length} messages (is latest: ${item.isLatest})`))
|
|
sock.ev.on('contacts.set', item => console.log(`recv ${item.contacts.length} contacts`))
|
|
|
|
sock.ev.on('messages.upsert', async m => {
|
|
console.log(JSON.stringify(m, undefined, 2))
|
|
|
|
const msg = m.messages[0]
|
|
if(!msg.key.fromMe && m.type === 'notify' && doReplies) {
|
|
console.log('replying to', m.messages[0].key.remoteJid)
|
|
await sock!.sendReadReceipt(msg.key.remoteJid, msg.key.participant, [msg.key.id])
|
|
await sendMessageWTyping({ text: 'Hello there!' }, msg.key.remoteJid)
|
|
}
|
|
|
|
})
|
|
|
|
sock.ev.on('messages.update', m => console.log(m))
|
|
sock.ev.on('message-receipt.update', m => console.log(m))
|
|
sock.ev.on('messages.reaction', m => console.log(m))
|
|
sock.ev.on('presence.update', m => console.log(m))
|
|
sock.ev.on('chats.update', m => console.log(m))
|
|
sock.ev.on('chats.delete', m => console.log(m))
|
|
sock.ev.on('contacts.upsert', m => console.log(m))
|
|
|
|
sock.ev.on('connection.update', (update) => {
|
|
const { connection, lastDisconnect } = update
|
|
if(connection === 'close') {
|
|
// reconnect if not logged out
|
|
if((lastDisconnect.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut) {
|
|
startSock()
|
|
} else {
|
|
console.log('Connection closed. You are logged out.')
|
|
}
|
|
}
|
|
|
|
console.log('connection update', update)
|
|
})
|
|
// listen for when the auth credentials is updated
|
|
sock.ev.on('creds.update', saveCreds)
|
|
|
|
return sock
|
|
}
|
|
|
|
startSock() |