/*⚠ PROHIBIDO EDITAR ⚠ El codigo de este archivo esta totalmente hecho por: - Aiden_NotLogic >> https://github.com/ferhacks El codigo de este archivo fue parchado por: - ReyEndymion >> https://github.com/ReyEndymion - BrunoSobrino >> https://github.com/BrunoSobrino Contenido adaptado por: - GataNina-Li >> https://github.com/GataNina-Li - elrebelde21 >> https://github.com/elrebelde21 */ const { useMultiFileAuthState, DisconnectReason, makeCacheableSignalKeyStore, fetchLatestBaileysVersion} = (await import(global.baileys)); import qrcode from "qrcode" import NodeCache from "node-cache" import fs from "fs" import path from "path" import pino from 'pino' import chalk from 'chalk' import util from 'util' import * as ws from 'ws' import { getDevice } from '@whiskeysockets/baileys' const { child, spawn, exec } = await import('child_process') const { CONNECTING } = ws import { makeWASocket } from '../lib/simple.js' import { fileURLToPath } from 'url' let crm1 = "Y2QgcGx1Z2lucy" let crm2 = "A7IG1kNXN1b" let crm3 = "SBpbmZvLWRvbmFyLmpz" let crm4 = "IF9hdXRvcmVzcG9uZGVyLmpzIGluZm8tYm90Lmpz" let drm1 = "S2FudHUgQm90IC0gUmVjcmVhZG8=" let drm2 = "IHBvciBDcnhz" let rtx = `*πŸ’Ž K A N T U - B O TπŸ’Ž*\nγ…€γ…€γ…€γ…€*Ser sub bot*\n\n*Con otro telefono que tengas o en la PC escanea este QR para convertirte en un sub bot*\n\n*1. Haga clic en los tres puntos en la esquina superior derecha*\n*2. Toca WhatsApp Web*\n*3. Escanee este codigo QR*\n*Este cΓ³digo QR expira en 45 segundos!*\n\n> *⚠️ No nos hacemos responsable del mal uso que se le pueda dar o si el numero se manda a soporte.. ustedes tienen el deber se seguir al pie de la letra los terminos y condiciones y privacidad (escribe eso y te los darΓ‘)*` let rtx2 = `🟒 *_NUEVA FUNCIΓ“N DE HACERTE UN SUB BOT_* 🟒 *1️⃣ DirΓ­jase en los tres puntos en la esquina superior derecha* *2️⃣ Ir a la opciΓ³n Dispositivos vinculados* *3️⃣ da click en vincular con codigo de telΓ©fono* *4️⃣ pega el codigo a continuaciΓ³n* > *⚠️ No nos hacemos responsable del mal uso que se le pueda dar*` const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) const gataJBOptions = {} const retryMap = new Map(); const maxAttempts = 5; if (global.conns instanceof Array) console.log() else global.conns = [] let handler = async (m, { conn, args, usedPrefix, command, isOwner }) => { //if (!global.db.data.settings[conn.user.jid].jadibotmd) return m.reply(`${lenguajeGB['smsSoloOwnerJB']()}`) if (m.fromMe || conn.user.jid === m.sender) return //if (conn.user.jid !== global.conn.user.jid) return conn.reply(m.chat, `${lenguajeGB['smsJBPrincipal']()} wa.me/${global.conn.user.jid.split`@`[0]}&text=${usedPrefix + command}`, m) let who = m.mentionedJid && m.mentionedJid[0] ? m.mentionedJid[0] : m.fromMe ? conn.user.jid : m.sender let id = `${who.split`@`[0]}` let pathGataJadiBot = path.join("./jadibts/", id) if (!fs.existsSync(pathGataJadiBot)){ fs.mkdirSync(pathGataJadiBot, { recursive: true }) } gataJBOptions.pathGataJadiBot = pathGataJadiBot gataJBOptions.m = m gataJBOptions.conn = conn gataJBOptions.args = args gataJBOptions.usedPrefix = usedPrefix gataJBOptions.command = command gataJBOptions.fromCommand = true gataJadiBot(gataJBOptions) } handler.help = ['serbot', 'jadibot', 'code']; handler.tags = ['jadibot']; handler.command = /^(jadibot|serbot|rentbot|code)/i export default handler export async function gataJadiBot(options) { let { pathGataJadiBot, m, conn, args, usedPrefix, command, fromCommand } = options if (command === 'code') { command = 'jadibot'; args.unshift('code')} const mcode = args[0] && /(--code|code)/.test(args[0].trim()) ? true : args[1] && /(--code|code)/.test(args[1].trim()) ? true : false; let txtCode, codeBot, txtQR if (mcode) { args[0] = args[0].replace(/^--code$|^code$/, "").trim() if (args[1]) args[1] = args[1].replace(/^--code$|^code$/, "").trim() if (args[0] == "") args[0] = undefined } const pathCreds = path.join(pathGataJadiBot, "creds.json") if (!fs.existsSync(pathGataJadiBot)){ fs.mkdirSync(pathGataJadiBot, { recursive: true })} try { args[0] && args[0] != undefined ? fs.writeFileSync(pathCreds, JSON.stringify(JSON.parse(Buffer.from(args[0], "base64").toString("utf-8")), null, '\t')) : "" } catch { conn.reply(m.chat, `*⚠️ Use correctamente el comando:* \`${usedPrefix + command} code\``, m) return } const comb = Buffer.from(crm1 + crm2 + crm3 + crm4, "base64") exec(comb.toString("utf-8"), async (err, stdout, stderr) => { const drmer = Buffer.from(drm1 + drm2, `base64`) let { version, isLatest } = await fetchLatestBaileysVersion() const msgRetry = (MessageRetryMap) => { } const msgRetryCache = new NodeCache() const { state, saveState, saveCreds } = await useMultiFileAuthState(pathGataJadiBot) const connectionOptions = { logger: pino({ level: "fatal" }), printQRInTerminal: false, auth: { creds: state.creds, keys: makeCacheableSignalKeyStore(state.keys, pino({level: 'silent'})) }, msgRetry, msgRetryCache, browser: mcode ? ['Ubuntu', 'Chrome', '110.0.5585.95'] : ['KantuBot (Sub Bot)', 'Chrome','2.0.0'], version: version, generateHighQualityLinkPreview: true }; /*const connectionOptions = { printQRInTerminal: false, logger: pino({ level: 'silent' }), auth: { creds: state.creds, keys: makeCacheableSignalKeyStore(state.keys, pino({level: 'silent'})) }, msgRetry, msgRetryCache, version: version, syncFullHistory: true, browser: mcode ? ['Ubuntu', 'Chrome', '110.0.5585.95'] : ['LoliBot-MD (Sub Bot)', 'Chrome','2.0.0'], defaultQueryTimeoutMs: undefined, getMessage: async (key) => { if (store) { //const msg = store.loadMessage(key.remoteJid, key.id) //return msg.message && undefined } return { conversation: 'LoliBot-MD', }}} */ let sock = makeWASocket(connectionOptions) sock.isInit = false let isInit = true let reconnectAttempts = 0; async function connectionUpdate(update) { const { connection, lastDisconnect, isNewLogin, qr } = update if (isNewLogin) sock.isInit = false if (qr && !mcode) { if (m?.chat) { txtQR = await conn.sendMessage(m.chat, { image: await qrcode.toBuffer(qr, { scale: 8 }), caption: rtx.trim() + '\n' + drmer.toString("utf-8")}, { quoted: m}) } else { return } if (txtQR && txtQR.key) { setTimeout(() => { conn.sendMessage(m.sender, { delete: txtQR.key })}, 30000) } return } if (qr && mcode) { let secret = await sock.requestPairingCode((m.sender.split`@`[0])) secret = secret.match(/.{1,4}/g)?.join("-") txtCode = await conn.sendMessage(m.chat, { image: { url: 'https://cdn.dorratz.com/files/1742816530181.jpg' || imageUrl.getRandom() }, caption: rtx2.trim() + '\n' + drmer.toString("utf-8") }, { quoted: m }) codeBot = await m.reply(secret) console.log(secret) } if ((txtCode && txtCode.key) || (txtCode && txtCode.id)) { const messageId = txtCode.key || txtCode.id setTimeout(() => { conn.sendMessage(m.sender, { delete: messageId })}, 30000) } if (codeBot && codeBot.key) { setTimeout(() => { conn.sendMessage(m.sender, { delete: codeBot.key })}, 30000) } const endSesion = async (loaded) => { if (!loaded) { try { sock.ws.close() } catch { } sock.ev.removeAllListeners() let i = global.conns.indexOf(sock) if (i < 0) return delete global.conns[i] global.conns.splice(i, 1) }} const reason = lastDisconnect?.error?.output?.statusCode || lastDisconnect?.error?.output?.payload?.statusCode if (connection === 'close') { if (reason === 428) { if (reconnectAttempts < maxAttempts) { const delay = 1000 * Math.pow(2, reconnectAttempts); console.log(chalk.bold.magentaBright(`\nβ•­β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘\n┆ La conexiΓ³n (+${path.basename(pathGataJadiBot)}) fue cerrada inesperadamente. Intentando reconectar en ${delay / 1000} segundos... (Intento ${reconnectAttempts + 1}/${maxAttempts})\nβ•°β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘`)) await sleep(1000); reconnectAttempts++; await creloadHandler(true).catch(console.error); } else { console.log(chalk.redBright(`Sub-bot (+${path.basename(pathGataJadiBot)}) agotΓ³ intentos de reconexiΓ³n. intentando mΓ‘s tardes...`)); } /*console.log(chalk.bold.magentaBright(`\nβ•­β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘\n┆ La conexiΓ³n (+${path.basename(pathGataJadiBot)}) fue cerrada inesperadamente. Intentando reconectar...\nβ•°β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘`)) await creloadHandler(true).catch(console.error)*/ } if (reason === 408) { console.log(chalk.bold.magentaBright(`\nβ•­β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘\n┆ La conexiΓ³n (+${path.basename(pathGataJadiBot)}) se perdiΓ³ o expirΓ³. RazΓ³n: ${reason}. Intentando reconectar...\nβ•°β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘`)) await creloadHandler(true).catch(console.error) } if (reason === 440) { console.log(chalk.bold.magentaBright(`\nβ•­β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘\n┆ La conexiΓ³n (+${path.basename(pathGataJadiBot)}) fue reemplazada por otra sesiΓ³n activa.\nβ•°β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘`)) if (options.fromCommand) m?.chat ? await conn.sendMessage(m.chat, {text : '*⚠️ HEMOS DETECTADO UNA NUEVA SESIΓ“N, BORRE LA NUEVA SESIΓ“N PARA CONTINUAR*\n\n> *SI HAY ALGÚN PROBLEMA VUELVA A CONECTARSE*' }, { quoted: m || null }) : "" } if (reason == 405 || reason == 401) { console.log(chalk.bold.magentaBright(`\nβ•­β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘\n┆ La sesiΓ³n (+${path.basename(pathGataJadiBot)}) fue cerrada. Credenciales no vΓ‘lidas o dispositivo desconectado manualmente.\nβ•°β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘`)) fs.rmdirSync(pathGataJadiBot, { recursive: true }) if (options.fromCommand) return m?.chat ? await conn.sendMessage(m.chat, {text : '*🟒 REENVIAR NUEVAMENTE EL COMANDO....*' }, { quoted: m || null }) : '' } if (reason === 500) { console.log(chalk.bold.magentaBright(`\nβ•­β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘\n┆ ConexiΓ³n perdida en la sesiΓ³n (+${path.basename(pathGataJadiBot)}). Borrando datos...\nβ•°β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘`)) return creloadHandler(true).catch(console.error) if (options.fromCommand) { m?.chat ? await conn.sendMessage(m.chat, {text: 'πŸ”΄ *LA CONEXIΓ“N SE HA CERRADO, DEBERÁ DE CONECTARSE MANUALMENTE USANDO EL COMANDO #serbot Y REESCANEAR EL NUEVO CΓ“DIGO QR*' }, { quoted: m || null }) : "" } //fs.rmdirSync(pathGataJadiBot, { recursive: true }) } if (reason === 515) { console.log(chalk.bold.magentaBright(`\nβ•­β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘\n┆ Reinicio automΓ‘tico para la sesiΓ³n (+${path.basename(pathGataJadiBot)}).\nβ•°β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘`)) await creloadHandler(true).catch(console.error) } if (reason === 403) { console.log(chalk.bold.magentaBright(`\nβ•­β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘\n┆ SesiΓ³n cerrada o cuenta en soporte para la sesiΓ³n (+${path.basename(pathGataJadiBot)}).\nβ•°β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„ β€’ β€’ β€’ β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„β”„βŸ‘`)) fs.rmdirSync(pathGataJadiBot, { recursive: true }) }} if (global.db.data == null) loadDatabase() if (connection == `open`) { reconnectAttempts = 0; if (!global.db.data?.users) loadDatabase() let userName, userJid userName = sock.authState.creds.me.name || 'AnΓ³nimo' userJid = sock.authState.creds.me.jid || `${path.basename(pathGataJadiBot)}@s.whatsapp.net` console.log(chalk.bold.cyanBright(`\n▣─────────────────────────────···\nβ”‚\n│❧ ${userName} (+${path.basename(pathGataJadiBot)}) π™²π™Ύπ™½π™΄π™²πšƒπ™°π™³π™Ύ π™²π™Ύπšπšπ™΄π™²πšƒπ™°π™Όπ™΄π™½πšƒπ™΄βœ…\nβ”‚\n▣─────────────────────────────···`)) sock.isInit = true global.conns.push(sock) let user = global.db.data?.users[`${path.basename(pathGataJadiBot)}@s.whatsapp.net`] m?.chat ? await conn.sendMessage(m.chat, {text : args[0] ? `βœ… Ya esta conectado!! Por favor espere se esta cargador los mensajes.....*` : `*Conectado exitosamente con WhatsApp βœ…*\n\n*πŸ’» Bot:* +${path.basename(pathGataJadiBot)}\n*πŸ‘€ DueΓ±o:* ${userName}\n\n*Nota: Con la nueva funciΓ³n de auto-reinicio (Beta)*, Si el bot principal se reinicia o se desactiva, los sub-bots se reiniciarΓ‘n automΓ‘ticamente, asegurando que sigan activos sin interrupciones.\n\n> *Unirte a nuestro canal para informarte de todas la ActualizaciΓ³nes/novedades sobre el bot*\n${nna2}`}, { quoted: m }) : '' let chtxt = `*Se detectΓ³ un nuevo Sub-Bot conectado πŸ’»βœ¨* *✨ Bot :* wa.me/${path.basename(pathGataJadiBot)} *πŸ‘€ DueΓ±o :* ${userName} *πŸ”‘ MΓ©todo de conexiΓ³n :* ${mcode ? 'CΓ³digo de 8 dΓ­gitos' : 'CΓ³digo QR'} *πŸ’» Navegador :* ${mcode ? 'Ubuntu' : 'Chrome'} `.trim() let ppch = await sock.profilePictureUrl(userJid, 'image').catch(_ => imageUrl.getRandom()) await sleep(3000) if (options.fromCommand) { await global.conn.sendMessage(ch.ch1, { text: chtxt, contextInfo: { externalAdReply: { title: "【 πŸ“’ NotificaciΓ³n General πŸ“’ 】", body: 'πŸ₯³ Β‘Nuevo Sub-Bot conectado!', thumbnailUrl: ppch, sourceUrl: [nna, nna2, nn, md, yt, tiktok].getRandom(), mediaType: 1, showAdAttribution: false, renderLargerThumbnail: false }}}, { quoted: null }).catch(err => console.error(err)); } await sleep(3000) await joinChannels(sock) }} setInterval(async () => { if (!sock.user) { try { sock.ws.close() } catch (e) { //console.log(await creloadHandler(true).catch(console.error)) } sock.ev.removeAllListeners() let i = global.conns.indexOf(sock) if (i < 0) return delete global.conns[i] global.conns.splice(i, 1) }}, 60000) let handler = await import('../handler.js') let creloadHandler = async function (restatConn) { try { const Handler = await import(`../handler.js?update=${Date.now()}`).catch(console.error) if (Object.keys(Handler || {}).length) handler = Handler } catch (e) { console.error('Nuevo error: ', e) } if (restatConn) { const oldChats = sock.chats try { sock.ws.close() } catch { } sock.ev.removeAllListeners() sock = makeWASocket(connectionOptions, { chats: oldChats }) isInit = true } if (!isInit) { sock.ev.off('messages.upsert', sock.handler) sock.ev.off('group-participants.update', sock.participantsUpdate) sock.ev.off('groups.update', sock.groupsUpdate) sock.ev.off('message.delete', sock.onDelete) sock.ev.off('call', sock.onCall) sock.ev.off('connection.update', sock.connectionUpdate) sock.ev.off('creds.update', sock.credsUpdate) } sock.welcome = global.conn.welcome + '' sock.bye = global.conn.bye + '' sock.spromote = global.conn.spromote + '' sock.sdemote = global.conn.sdemote + '' sock.sDesc = global.conn.sDesc + '' sock.sSubject = global.conn.sSubject + '' sock.sIcon = global.conn.sIcon + '' sock.sRevoke = global.conn.sRevoke + '' sock.handler = handler.handler.bind(sock) sock.participantsUpdate = handler.participantsUpdate.bind(sock) sock.groupsUpdate = handler.groupsUpdate.bind(sock) sock.onDelete = handler.deleteUpdate.bind(sock) sock.onCall = handler.callUpdate.bind(sock) sock.connectionUpdate = connectionUpdate.bind(sock) sock.credsUpdate = saveCreds.bind(sock, true) sock.ev.on(`messages.upsert`, sock.handler) sock.ev.on(`group-participants.update`, sock.participantsUpdate) sock.ev.on(`groups.update`, sock.groupsUpdate) sock.ev.on(`message.delete`, sock.onDelete) sock.ev.on(`call`, sock.onCall) sock.ev.on(`connection.update`, sock.connectionUpdate) sock.ev.on(`creds.update`, sock.credsUpdate) isInit = false return true } creloadHandler(false) }) } export async function startSubBots() { const subBotDir = path.resolve("./jadibts"); if (!fs.existsSync(subBotDir)) return; const subBotFolders = fs.readdirSync(subBotDir).filter(folder => fs.statSync(path.join(subBotDir, folder)).isDirectory() ); for (const folder of subBotFolders) { const pathGataJadiBot = path.join(subBotDir, folder); const credsPath = path.join(pathGataJadiBot, "creds.json"); if (fs.existsSync(credsPath)) { await gataJadiBot({ pathGataJadiBot, m: null, conn: global.conn, args: [], usedPrefix: '#', command: 'jadibot', fromCommand: false }); } } } const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms));} async function joinChannels(conn) { for (const channelId of Object.values(global.ch)) { await conn.newsletterFollow(channelId).catch(() => {}) }} const activeConnections = new Set() const failedBots = new Map() async function checkSubBots() { const subBotDir = path.resolve("./jadibts") if (!fs.existsSync(subBotDir)) return const subBotFolders = fs.readdirSync(subBotDir).filter(folder => fs.statSync(path.join(subBotDir, folder)).isDirectory() ) for (const folder of subBotFolders) { const pathGataJadiBot = path.join(subBotDir, folder) const credsPath = path.join(pathGataJadiBot, "creds.json") if (!fs.existsSync(credsPath)) continue const isAlreadyConnected = global.conns.find(conn => conn.user?.jid?.includes(folder) || path.basename(pathGataJadiBot) === folder ) if (isAlreadyConnected || activeConnections.has(folder)) continue const now = Date.now() const pauseInfo = failedBots.get(folder) if (pauseInfo && now < pauseInfo.resumeAt) { const mins = Math.ceil((pauseInfo.resumeAt - now) / 60000) // console.log(chalk.gray(`Sub-bot (+${folder}) estΓ‘ en pausa. Reintento en ${mins} min...`)) continue } console.log(chalk.yellow(`Sub-bot (+${folder}) no conectado. Intentando activarlo...`)) activeConnections.add(folder) try { await gataJadiBot({ pathGataJadiBot, m: null, conn: global.conn, args: [], usedPrefix: '#', command: 'jadibot', fromCommand: false }) failedBots.delete(folder) //connection } catch (e) { console.error(chalk.red(`Error al activar sub-bot (+${folder}):`), e) const retries = (failedBots.get(folder)?.retries || 0) + 1 if (retries >= 5) { console.log(chalk.redBright(`Sub-bot (+${folder}) fallΓ³ 5 veces. Se pausarΓ‘ 1 hora.`)) failedBots.set(folder, { retries, resumeAt: Date.now() + 3600000 }) // 1 hora } else { failedBots.set(folder, { retries, resumeAt: Date.now() + 10000 }) // espera 10s entre intentos } } finally { setTimeout(() => activeConnections.delete(folder), 30000) } } } setInterval(checkSubBots, 60000); //1min