| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- /*⚠ 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
|