Last active
January 2, 2026 23:21
-
-
Save weskerty/6a5fda1160e4a4d963603137bc6e4ff5 to your computer and use it in GitHub Desktop.
MultiAccounts on Same Server LyFeLevanter Bot
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const fs = require('fs').promises; | |
| const path = require('path'); | |
| const { bot, sleep } = require('../lib'); | |
| const { restartInstance } = require('../lib/pm2'); | |
| const T1 = "Converting, Restarting Bot, wait a moment..."; | |
| const T2 = "Session Manager"; | |
| const T3 = "Add new session:"; | |
| const T4 = "Delete session:"; | |
| const T5 = "Remember to READ the Tutorial:"; | |
| const T6 = "Get Session ID:"; | |
| const T7 = "Incorrect format"; | |
| const T8 = "Session added!"; | |
| const T9 = "Key:"; | |
| const T10 = "Session ID:"; | |
| const T11 = "THE BOT WILL RESTART NOW"; | |
| const T12 = "Session deleted"; | |
| const T13 = "not found"; | |
| const T14 = "Specify the session to delete. Example:"; | |
| const T15 = "Error:"; | |
| const defaultSessionConfig = { | |
| "PREFIX": "^[.,!/]", | |
| "SUDO": "0", | |
| "STICKER_PACKNAME": "πByLyfe", | |
| "ALWAYS_ONLINE": "false", | |
| "FORCE_LOGOUT": "false", | |
| "REJECT_CALL": "false", | |
| "AUTO_STATUS_VIEW": "false", | |
| "SEND_READ": "false", | |
| "AJOIN": "false", | |
| "PERSONAL_MESSAGE": "null", | |
| "DISABLE_START_MESSAGE": "false", | |
| "CMD_REACTION": "true" | |
| }; | |
| class SessionManager { | |
| constructor() { | |
| this.configPath = path.join(process.cwd(), 'config.json'); | |
| this.envPath = path.join(process.cwd(), 'config.env'); | |
| this.dbPath = path.join(process.cwd(), 'database.db'); | |
| } | |
| async checkAndDeleteDatabase() { | |
| try { | |
| await fs.access(this.configPath); | |
| } catch (configError) { | |
| if (configError.code === 'ENOENT') { | |
| try { | |
| await fs.access(this.dbPath); | |
| await fs.unlink(this.dbPath); | |
| console.log('Database.db eliminado'); | |
| } catch (dbError) { | |
| if (dbError.code !== 'ENOENT') { | |
| console.error('yobot-PLUGIN Error eliminando database:', dbError); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| async loadConfig() { | |
| try { | |
| const configData = await fs.readFile(this.configPath, 'utf8'); | |
| return JSON.parse(configData); | |
| } catch (error) { | |
| if (error.code === 'ENOENT') { | |
| return null; | |
| } | |
| throw error; | |
| } | |
| } | |
| async saveConfig(config) { | |
| await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), 'utf8'); | |
| } | |
| async loadEnvFile() { | |
| try { | |
| const envData = await fs.readFile(this.envPath, 'utf8'); | |
| const envVars = {}; | |
| const lines = envData.split('\n'); | |
| for (const line of lines) { | |
| const trimmedLine = line.trim(); | |
| if (!trimmedLine || trimmedLine.startsWith('#')) continue; | |
| const match = trimmedLine.match(/^([^=]+)=(.*)$/); | |
| if (match) { | |
| const key = match[1].trim(); | |
| let value = match[2].trim(); | |
| if ((value.startsWith('"') && value.endsWith('"')) || | |
| (value.startsWith("'") && value.endsWith("'"))) { | |
| value = value.slice(1, -1); | |
| } | |
| envVars[key] = value; | |
| } | |
| } | |
| return envVars; | |
| } catch (error) { | |
| console.error('Error leyendo config.env:', error); | |
| return {}; | |
| } | |
| } | |
| extractFirstSudo(sudoString) { | |
| if (!sudoString) return null; | |
| const firstNumber = sudoString.split(',')[0].trim(); | |
| return firstNumber || null; | |
| } | |
| async getEnvVars(ctx) { | |
| const firstSudo = ctx.SUDO ? this.extractFirstSudo(ctx.SUDO) : null; | |
| const stickerPackname = ctx.STICKER_PACKNAME || null; | |
| return { | |
| SUDO: firstSudo, | |
| STICKER_PACKNAME: stickerPackname | |
| }; | |
| } | |
| getNextSessionNumber(config) { | |
| const sessionKeys = Object.keys(config).filter(key => key.startsWith('session')); | |
| if (sessionKeys.length === 0) return 1; | |
| const sessionNumbers = sessionKeys.map(key => { | |
| const match = key.match(/session(\d+)/); | |
| return match ? parseInt(match[1], 10) : 0; | |
| }); | |
| return Math.max(...sessionNumbers) + 1; | |
| } | |
| async convertEnvToJson() { | |
| try { | |
| const envVars = await this.loadEnvFile(); | |
| if (Object.keys(envVars).length === 0) { | |
| return { | |
| success: false, | |
| error: 'config.env not found or empty' | |
| }; | |
| } | |
| const config = {}; | |
| const sessionKey = 'session1'; | |
| config[sessionKey] = {}; | |
| for (const [key, value] of Object.entries(envVars)) { | |
| config[sessionKey][key] = value; | |
| } | |
| for (const [key, defaultValue] of Object.entries(defaultSessionConfig)) { | |
| if (key !== 'SUDO' && key !== 'STICKER_PACKNAME' && !config[sessionKey][key]) { | |
| config[sessionKey][key] = defaultValue; | |
| } | |
| } | |
| await this.saveConfig(config); | |
| return { | |
| success: true, | |
| sessionKey, | |
| converted: true | |
| }; | |
| } catch (error) { | |
| console.error('Error en conversiΓ³n:', error); | |
| return { | |
| success: false, | |
| error: error.message | |
| }; | |
| } | |
| } | |
| async addSession(sessionId, ctx) { | |
| try { | |
| const config = await this.loadConfig(); | |
| if (!sessionId.toLowerCase().includes('levanter')) { | |
| return { | |
| success: false, | |
| error: 'INVALID_SESSION_FORMAT' | |
| }; | |
| } | |
| if (!config) { | |
| await this.checkAndDeleteDatabase(); | |
| } | |
| const currentConfig = config || {}; | |
| const nextSessionNumber = this.getNextSessionNumber(currentConfig); | |
| const sessionKey = `session${nextSessionNumber}`; | |
| const envVars = await this.getEnvVars(ctx); | |
| currentConfig[sessionKey] = { | |
| SESSION_ID: sessionId, | |
| ...defaultSessionConfig | |
| }; | |
| if (envVars.SUDO) { | |
| currentConfig[sessionKey].SUDO = envVars.SUDO; | |
| } | |
| if (envVars.STICKER_PACKNAME) { | |
| currentConfig[sessionKey].STICKER_PACKNAME = envVars.STICKER_PACKNAME; | |
| } | |
| await this.saveConfig(currentConfig); | |
| return { | |
| success: true, | |
| sessionKey, | |
| sessionNumber: nextSessionNumber, | |
| needsRestart: true | |
| }; | |
| } catch (error) { | |
| console.error(`yobot-PLUGIN Error adding session: ${error.message}`); | |
| return { | |
| success: false, | |
| error: error.message | |
| }; | |
| } | |
| } | |
| async deleteSession(sessionIdentifier) { | |
| try { | |
| const config = await this.loadConfig(); | |
| if (!config) { | |
| return { | |
| success: false, | |
| error: 'config.json not found' | |
| }; | |
| } | |
| let sessionKey = sessionIdentifier; | |
| if (/^\d+$/.test(sessionIdentifier)) { | |
| sessionKey = `session${sessionIdentifier}`; | |
| } | |
| if (config[sessionKey]) { | |
| delete config[sessionKey]; | |
| await this.saveConfig(config); | |
| return { | |
| success: true, | |
| sessionKey, | |
| needsRestart: true | |
| }; | |
| } else { | |
| return { | |
| success: false, | |
| error: `${T13}: ${sessionKey}` | |
| }; | |
| } | |
| } catch (error) { | |
| console.error(`yobot-PLUGIN Error deleting session: ${error.message}`); | |
| return { | |
| success: false, | |
| error: error.message | |
| }; | |
| } | |
| } | |
| } | |
| const sessionManager = new SessionManager(); | |
| bot( | |
| { | |
| pattern: 'yobot ?(.*)', | |
| fromMe: true, | |
| desc: 'Session Manager', | |
| type: 'config', | |
| }, | |
| async (message, match, ctx) => { | |
| const input = match.trim(); | |
| // Comando sin nada | |
| if (!input) { | |
| const config = await sessionManager.loadConfig(); | |
| // env conver | |
| if (!config) { | |
| await message.send( | |
| `βοΈ ${T1}\n\n` + | |
| `> ποΈ *${T2}*\n` + | |
| `${T3}\n\`yobot\` <sessionId>\n` + | |
| `${T4}\n\`yobot del\` <number/key>\n` + | |
| `β οΈ *${T5}*\n` + | |
| `${T6}\nlevanter-delta.vercel.app/`, | |
| { quoted: message.data } | |
| ); | |
| const result = await sessionManager.convertEnvToJson(); | |
| if (result.success) { | |
| await sleep(2000); | |
| restartInstance(); | |
| } else { | |
| await message.send(`β ${T15} ${result.error}`); | |
| } | |
| return; | |
| } | |
| await message.send( | |
| `> ποΈ *${T2}*\n` + | |
| `${T3}\n\`yobot\` <sessionId>\n` + | |
| `${T4}\n\`yobot del\` <number/key>\n` + | |
| `β οΈ *${T5}*\n` + | |
| `${T6}\nlevanter-delta.vercel.app/`, | |
| { quoted: message.data } | |
| ); | |
| return; | |
| } | |
| // eliminar sess | |
| if (input.startsWith('del ')) { | |
| const sessionIdentifier = input.substring(4).trim(); | |
| if (!sessionIdentifier) { | |
| await message.send(`${T14} \`.yobot del 3\``); | |
| return; | |
| } | |
| const result = await sessionManager.deleteSession(sessionIdentifier); | |
| if (result.success) { | |
| await message.send(`β ${T12}: *${result.sessionKey}*`); | |
| if (result.needsRestart) { | |
| await sleep(2000); | |
| restartInstance(); | |
| } | |
| } else { | |
| await message.send(`β ${T15} ${result.error}`); | |
| } | |
| return; | |
| } | |
| // add sess | |
| const sessionId = input; | |
| if (!sessionId.toLowerCase().includes('levanter')) { | |
| await message.send( | |
| `π ${T7}\n` + | |
| `β οΈ *${T5}*`, | |
| { quoted: message.data } | |
| ); | |
| return; | |
| } | |
| try { | |
| const result = await sessionManager.addSession(sessionId, ctx); | |
| if (result.success) { | |
| await message.send( | |
| `β *${T8}*\n` + | |
| `π ${T9}\n> ${result.sessionKey}\n` + | |
| `π ${T10}\n> ${sessionId}\n` + | |
| `β οΈ *${T5}*\n` + | |
| `βΌοΈ *${T11}* βΌοΈ`, | |
| { quoted: message.data } | |
| ); | |
| if (result.needsRestart) { | |
| await sleep(2000); | |
| restartInstance(); | |
| } | |
| } else { | |
| if (result.error === 'INVALID_SESSION_FORMAT') { | |
| await message.send( | |
| `π ${T7}\n` + | |
| `β οΈ *${T5}*`, | |
| { quoted: message.data } | |
| ); | |
| } else { | |
| await message.send( | |
| `β ${T15} ${result.error}`, | |
| { quoted: message.data } | |
| ); | |
| } | |
| } | |
| } catch (error) { | |
| console.error(`yobot-PLUGIN Error: ${error.message}`); | |
| await message.send( | |
| `β ${T15} ${error.message}`, | |
| { quoted: message.data } | |
| ); | |
| } | |
| } | |
| ); | |
| module.exports = { sessionManager }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment