Jonell01's picture
Upload 64 files
2821330 verified
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);
}
}
}