let activeCmd = false; module.exports = function ({ api, models, Users, Threads, Currencies, ...rest }) { const stringSimilarity = require("string-similarity"); const moment = require("moment-timezone"); const logger = require("../../utils/log"); return async function ({ event, ...rest2 }) { if (activeCmd) { return; } const dateNow = Date.now(); const time = moment.tz("Asia/Manila").format("HH:MM:ss DD/MM/YYYY"); const { allowInbox, PREFIX, ADMINBOT, DeveloperMode, adminOnly } = global.config; const { userBanned, threadBanned, threadInfo, threadData, commandBanned } = global.data; const { commands, cooldowns } = global.client; var { body, senderID, threadID, messageID } = event; var senderID = String(senderID), threadID = String(threadID); const threadSetting = threadData.get(threadID) || {}; const args = (body || "").trim().split(/ +/); const commandName = args.shift()?.toLowerCase(); var command = commands.get(commandName); const replyAD = "[ MODE ] - Only bot admin can use bot"; if ( command && command.config.name.toLowerCase() === commandName.toLowerCase() && !ADMINBOT.includes(senderID) && adminOnly && senderID !== api.getCurrentUserID() ) { return api.sendMessage(replyAD, threadID, messageID); } if ( typeof body === "string" && body.startsWith(PREFIX) && !ADMINBOT.includes(senderID) && adminOnly && senderID !== api.getCurrentUserID() ) { return api.sendMessage(replyAD, threadID, messageID); } if ( userBanned.has(senderID) || threadBanned.has(threadID) || (allowInbox == ![] && senderID == threadID) ) { if (!ADMINBOT.includes(senderID.toString())) { if (userBanned.has(senderID)) { const { reason, dateAdded } = userBanned.get(senderID) || {}; return api.sendMessage( global.getText("handleCommand", "userBanned", reason, dateAdded), threadID, async (err, info) => { await new Promise((resolve) => setTimeout(resolve, 5 * 1000)); return api.unsendMessage(info.messageID); }, messageID, ); } else { if (threadBanned.has(threadID)) { const { reason, dateAdded } = threadBanned.get(threadID) || {}; return api.sendMessage( global.getText( "handleCommand", "threadBanned", reason, dateAdded, ), threadID, async (err, info) => { await new Promise((resolve) => setTimeout(resolve, 5 * 1000)); return api.unsendMessage(info.messageID); }, messageID, ); } } } } if (commandName.startsWith(PREFIX)) { if (!command) { const allCommandName = Array.from(commands.keys()); const checker = stringSimilarity.findBestMatch( commandName, allCommandName, ); if (checker.bestMatch.rating >= 0.5) { command = commands.get(checker.bestMatch.target); } else { return api.setMessageReaction("❓", event.messageID, () => {}, true); } } } if (commandBanned.get(threadID) || commandBanned.get(senderID)) { if (!ADMINBOT.includes(senderID)) { const banThreads = commandBanned.get(threadID) || [], banUsers = commandBanned.get(senderID) || []; if (banThreads.includes(command.config.name)) return api.sendMessage( global.getText( "handleCommand", "commandThreadBanned", command.config.name, ), threadID, async (err, info) => { await new Promise((resolve) => setTimeout(resolve, 5 * 1000)); return api.unsendMessage(info.messageID); }, messageID, ); if (banUsers.includes(command.config.name)) return api.sendMessage( global.getText( "handleCommand", "commandUserBanned", command.config.name, ), threadID, async (err, info) => { await new Promise((resolve) => setTimeout(resolve, 5 * 1000)); return api.unsendMessage(info.messageID); }, messageID, ); } } if (command && command.config && command.config.usePrefix !== undefined) { command.config.usePrefix = command.config.usePrefix ?? true; } if (command && command.config) { if ( command.config.usePrefix === false && commandName.toLowerCase() !== command.config.name.toLowerCase() && !command.config.allowPrefix ) { api.sendMessage( global.getText("handleCommand", "notMatched", command.config.name), event.threadID, event.messageID, ); return; } if (command.config.usePrefix === true && !body.startsWith(PREFIX)) { return; } } if (command && command.config) { if (typeof command.config.usePrefix === "undefined") { api.sendMessage( global.getText("handleCommand", "noPrefix", command.config.name), event.threadID, event.messageID, ); return; } } if ( command && command.config && command.config.commandCategory && command.config.commandCategory.toLowerCase() === "nsfw" && !global.data.threadAllowNSFW.includes(threadID) && !ADMINBOT.includes(senderID) ) return api.sendMessage( global.getText("handleCommand", "threadNotAllowNSFW"), threadID, async (err, info) => { await new Promise((resolve) => setTimeout(resolve, 5 * 1000)); return api.unsendMessage(info.messageID); }, messageID, ); var threadInfo2; if (event.isGroup == !![]) try { threadInfo2 = threadInfo.get(threadID) || (await Threads.getInfo(threadID)); if (Object.keys(threadInfo2).length == 0) throw new Error(); } catch (err) { logger.log( global.getText("handleCommand", "cantGetInfoThread", "error"), ); } var permssion = 0; var threadInfoo = threadInfo.get(threadID) || (await Threads.getInfo(threadID)); const find = threadInfoo.adminIDs.find((el) => el.id == senderID); if (ADMINBOT.includes(senderID.toString())) permssion = 2; else if (!ADMINBOT.includes(senderID) && find) permssion = 1; if ( command && command.config && command.config.hasPermssion && command.config.hasPermssion > permssion ) { return api.sendMessage( global.getText( "handleCommand", "permissionNotEnough", command.config.name, ), event.threadID, event.messageID, ); } if ( command && command.config && !client.cooldowns.has(command.config.name) ) { client.cooldowns.set(command.config.name, new Map()); } const timestamps = command && command.config ? client.cooldowns.get(command.config.name) : undefined; const expirationTime = ((command && command.config && command.config.cooldowns) || 1) * 1000; if ( timestamps && timestamps instanceof Map && timestamps.has(senderID) && dateNow < timestamps.get(senderID) + expirationTime ) { const cooldowns = ((timestamps.get(senderID) + expirationTime - dateNow) / 1000).toFixed(1); return api.sendMessage(`The command "${command.config.name}" has been cooldown in ${cooldowns} seconds before you can use it again.`, event.threadID, event.messageID); } var getText2; if ( command && command.languages && typeof command.languages === "object" && command.languages.hasOwnProperty(global.config.language) ) getText2 = (...values) => { var lang = command.languages[global.config.language][values[0]] || ""; for (var i = values.length; i > 0x2533 + 0x1105 + -0x3638; i--) { const expReg = RegExp("%" + i, "g"); lang = lang.replace(expReg, values[i]); } return lang; }; else getText2 = () => {}; try { const Obj = { ...rest, ...rest2, api: api, event: event, args: args, models: models, Users: Users, Threads: Threads, Currencies: Currencies, permssion: permssion, getText: getText2, }; if (command && typeof command.run === "function") { command.run(Obj); timestamps.set(senderID, dateNow); if (DeveloperMode == !![]) { logger.log( global.getText( "handleCommand", "executeCommand", time, commandName, senderID, threadID, args.join(" "), Date.now() - dateNow, ), "DEV MODE", ); } return; } } catch (e) { return api.sendMessage( global.getText("handleCommand", "commandError", commandName, e), threadID, ); } activeCmd = false; }; };