mirror of
https://github.com/FranP-code/Baileys.git
synced 2025-10-13 00:32:22 +00:00
1. add multi file auth state since it's far more efficient than single state 2. deprecate single file auth state (please don't use it anymore)
101 lines
3.3 KiB
TypeScript
101 lines
3.3 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('presence.update', m => console.log(m))
|
|
sock.ev.on('chats.update', 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() |