| module.exports.config = { |
| name: "cmd", |
| version: "1.0.0", |
| hasPermssion: 2, |
| credits: "Mirai Team", |
| description: "Manage/Control all bot modules", |
| usePrefix: true, |
| hide: true, |
| commandCategory: "Admin", |
| usages: "[load/unload/loadAll/unloadAll/info] [name module]", |
| cooldowns: 5, |
| dependencies: { |
| "fs-extra": "", |
| "child_process": "", |
| "path": "" |
| } |
| }; |
|
|
| const loadCommand = function ({ moduleList, threadID, messageID }) { |
|
|
| const { execSync } = global.nodemodule['child_process']; |
| const { writeFileSync, unlinkSync, readFileSync } = global.nodemodule['fs-extra']; |
| const { join } = global.nodemodule['path']; |
| const { configPath, mainPath, api } = global.client; |
| const logger = require(mainPath + '/utils/log'); |
|
|
| var errorList = []; |
| delete require['resolve'][require['resolve'](configPath)]; |
| var configValue = require(configPath); |
| writeFileSync(configPath + '.temp', JSON.stringify(configValue, null, 2), 'utf8'); |
| for (const nameModule of moduleList) { |
| try { |
| const dirModule = __dirname + '/' + nameModule + '.js'; |
| delete require['cache'][require['resolve'](dirModule)]; |
| const command = require(dirModule); |
| global.client.commands.delete(nameModule); |
| if (!command.config || !command.run || !command.config.commandCategory) |
| throw new Error('Module is malformed!'); |
| global.client['eventRegistered'] = global.client['eventRegistered']['filter'](info => info != command.config.name); |
| if (command.config.dependencies && typeof command.config.dependencies == 'object') { |
| const listPackage = JSON.parse(readFileSync('./package.json')).dependencies, |
| listbuiltinModules = require('module')['builtinModules']; |
| for (const packageName in command.config.dependencies) { |
| var tryLoadCount = 0, |
| loadSuccess = ![], |
| error; |
| const moduleDir = join(global.client.mainPath, 'nodemodules', 'node_modules', packageName); |
| try { |
| if (listPackage.hasOwnProperty(packageName) || listbuiltinModules.includes(packageName)) global.nodemodule[packageName] = require(packageName); |
| else global.nodemodule[packageName] = require(moduleDir); |
| } catch { |
| logger.loader('Not found package ' + packageName + ' support for module ' + command.config.name+ 'installing...', 'warn'); |
| const insPack = {}; |
| insPack.stdio = 'inherit'; |
| insPack.env = process.env ; |
| insPack.shell = !![]; |
| insPack.cwd = join(global.client.mainPath,'nodemodules') |
| execSync('npm --package-lock false --save install ' + packageName + (command.config.dependencies[packageName] == '*' || command.config.dependencies[packageName] == '' ? '' : '@' + command.config.dependencies[packageName]), insPack); |
| for (tryLoadCount = 1; tryLoadCount <= 3; tryLoadCount++) { |
| require['cache'] = {}; |
| try { |
| if (listPackage.hasOwnProperty(packageName) || listbuiltinModules.includes(packageName)) global.nodemodule[packageName] = require(packageName); |
| else global.nodemodule[packageName] = require(moduleDir); |
| loadSuccess = !![]; |
| break; |
| } catch (erorr) { |
| error = erorr; |
| } |
| if (loadSuccess || !error) break; |
| } |
| if (!loadSuccess || error) throw 'Unable to load package ' + packageName + (' for module ') + command.config.name +', error: ' + error + ' ' + error['stack']; |
| } |
| } |
| logger.loader('Successfully downloaded the entire package for the module' + command.config.name); |
| } |
| if (command.config.envConfig && typeof command.config.envConfig == 'Object') try { |
| for (const [key, value] of Object['entries'](command.config.envConfig)) { |
| if (typeof global.configModule[command.config.name] == undefined) |
| global.configModule[command.config.name] = {}; |
| if (typeof configValue[command.config.name] == undefined) |
| configValue[command.config.name] = {}; |
| if (typeof configValue[command.config.name][key] !== undefined) |
| global.configModule[command.config.name][key] = configValue[command.config.name][key]; |
| else global.configModule[command.config.name][key] = value || ''; |
| if (typeof configValue[command.config.name][key] == undefined) |
| configValue[command.config.name][key] = value || ''; |
| } |
| logger.loader('Loaded config' + ' ' + command.config.name); |
| } catch (error) { |
| throw new Error('Failed to load config module, error: ' + JSON.stringify(error)); |
| } |
| if (command['onLoad']) try { |
| const onLoads = {}; |
| onLoads['configValue'] = configValue; |
| command['onLoad'](onLoads); |
| } catch (error) { |
| throw new Error('Unable to onLoad module, error: ' + JSON.stringify(error), 'error'); |
| } |
| if (command.handleEvent) global.client.eventRegistered.push(command.config.name); |
| (global.config.commandDisabled.includes(nameModule + '.js') || configValue.commandDisabled.includes(nameModule + '.js')) |
| && (configValue.commandDisabled.splice(configValue.commandDisabled.indexOf(nameModule + '.js'), 1), |
| global.config.commandDisabled.splice(global.config.commandDisabled.indexOf(nameModule + '.js'), 1)) |
| global.client.commands.set(command.config.name, command) |
| logger.loader('Loaded command ' + command.config.name + '!'); |
| } catch (error) { |
| errorList.push('- ' + nameModule + ' reason:' + error + ' at ' + error['stack']); |
| }; |
| } |
| if (errorList.length != 0) api.sendMessage('Modules that had problems loading: ' + errorList.join(' '), threadID, messageID); |
| api.sendMessage('Loaded ' + (moduleList.length - errorList.length) + ' module(s)', threadID, messageID) |
| writeFileSync(configPath, JSON.stringify(configValue, null, 4), 'utf8') |
| unlinkSync(configPath + '.temp'); |
| return; |
| } |
|
|
| const unloadModule = function ({ moduleList, threadID, messageID }) { |
| const { writeFileSync, unlinkSync } = global.nodemodule["fs-extra"]; |
| const { configPath, mainPath, api } = global.client; |
| const logger = require(mainPath + "/utils/log"); |
|
|
| delete require.cache[require.resolve(configPath)]; |
| var configValue = require(configPath); |
| writeFileSync(configPath + ".temp", JSON.stringify(configValue, null, 4), 'utf8'); |
|
|
| for (const nameModule of moduleList) { |
| global.client.commands.delete(nameModule); |
| global.client.eventRegistered = global.client.eventRegistered.filter(item => item !== nameModule); |
| configValue["commandDisabled"].push(`${nameModule}.js`); |
| global.config["commandDisabled"].push(`${nameModule}.js`); |
| logger.loader(`Unloaded command ${nameModule}!`); |
| } |
|
|
| writeFileSync(configPath, JSON.stringify(configValue, null, 4), 'utf8'); |
| unlinkSync(configPath + ".temp"); |
|
|
| return api.sendMessage(`Unloaded ${moduleList.length} module(s)`, threadID, messageID); |
| } |
|
|
| module.exports.run = function ({ event, args, api }) { |
| const { readdirSync } = global.nodemodule["fs-extra"]; |
| const { threadID, messageID } = event; |
|
|
| var moduleList = args.splice(1, args.length); |
|
|
| switch (args[0]) { |
| case "load": { |
| if (moduleList.length == 0) return api.sendMessage("Module name cannot be empty!", threadID, messageID); |
| else return loadCommand({ moduleList, threadID, messageID }); |
| } |
| case "unload": { |
| if (moduleList.length == 0) return api.sendMessage("Module name cannot be empty!", threadID, messageID); |
| else return unloadModule({ moduleList, threadID, messageID }); |
| } |
| case "loadAll": { |
| moduleList = readdirSync(__dirname).filter((file) => file.endsWith(".js") && !file.includes('example')); |
| moduleList = moduleList.map(item => item.replace(/\.js/g, "")); |
| return loadCommand({ moduleList, threadID, messageID }); |
| } |
| case "unloadAll": { |
| moduleList = readdirSync(__dirname).filter((file) => file.endsWith(".js") && !file.includes('example') && !file.includes("command")); |
| moduleList = moduleList.map(item => item.replace(/\.js/g, "")); |
| return unloadModule({ moduleList, threadID, messageID }); |
| } |
| case "info": { |
| const command = global.client.commands.get(moduleList.join("") || ""); |
|
|
| if (!command) return api.sendMessage("The module you entered does not exist!", threadID, messageID); |
|
|
| const { name, version, hasPermssion, credits, cooldowns, dependencies } = command.config; |
|
|
| return api.sendMessage( |
| "=== " + name.toUpperCase() + " ===\n" + |
| "- Coded by: " + credits + "\n" + |
| "- Version: " + version + "\n" + |
| "- Request permission: " + ((hasPermssion == 0) ? "User" : (hasPermssion == 1) ? "Admin" : "Bot operator" ) + "\n" + |
| "- Timeout: " + cooldowns + " seconds(s)\n" + |
| `- Required packages: ${(Object.keys(dependencies || {})).join(", ") || "None"}`, |
| threadID, messageID |
| ); |
| } |
| default: { |
| return global.utils.throwError(this.config.name, threadID, messageID); |
| } |
| } |
| } |