UNPKG

wachan

Version:
94 lines (87 loc) 3.52 kB
const readline = require("readline"); const fs = require("fs"); const { default: makeWASocket, useMultiFileAuthState, Browsers, DisconnectReason } = require("baileys") const { queue } = require("../utils/queue"); let socket = null let finishSocketStartup; queue( "socket", null, () => new Promise((resolve) => (finishSocketStartup = resolve)) ); async function connect(options) { const authStatePath = options?.authStatePath || "./wachan/state"; const { state, saveCreds } = await useMultiFileAuthState(authStatePath); return await new Promise((resolve, reject) => { const store = options?.store || {} let requestingPhoneNumber = false let phoneNumber = null socket = makeWASocket({ auth: state, browser: Browsers.windows("Chrome"), cachedGroupMetadata: store.getGroup, getMessage: store.getMessage }); socket.ws.config.logger.level = "silent" socket.ev.on("creds.update", saveCreds); const { onReceiveHandler, onReceivePendingHandler, onConnectedHandler, onReadyHandler } = options.behaviors socket.ev.on("messages.upsert", onReceiveHandler) socket.ev.on("connection.update", async (update) => { if (update.connection == "close") { const reason = update.lastDisconnect?.error?.output?.statusCode; if (reason == "401" || reason == "405") { fs.rmSync(authStatePath, { recursive: true }); return reject(new Error("Unauthorized")); } else if (reason == DisconnectReason.restartRequired) { return resolve({requiresRestart: true}); } else return reject(new Error("Connection closed with reason: " + reason)); } if (update.qr && !requestingPhoneNumber) { requestingPhoneNumber = true const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }) while (!phoneNumber) { phoneNumber = await new Promise(resolve => { rl.question("Enter phone number (ex: 12345678901, 628123456789):", (pn) => { resolve(pn.replace(/\D/g,'')) }) }) } rl.close() const code = await socket.requestPairingCode(phoneNumber) console.log("Pairing code:", code.slice(0,4), "-", code.slice(4)); } if (update.receivedPendingNotifications === true) { finishSocketStartup() await onReceivePendingHandler() await onReadyHandler() return resolve({socket, requiresRestart: false}) } if (update.connection === "open") { await onConnectedHandler() console.log("Receiving all pending messages...") } }); }) } function getSocket() { if (!socket) console.warn("Warning: Socket is not initialized yet.") return socket } function getBotInfo() { const socket = getSocket() if (!socket) return null return { id: socket.user.id.replace(/:\d+/, ""), name: socket.user.name, } } module.exports = { connect, getSocket, getBotInfo }