diff --git a/modules/commands/adc.js b/modules/commands/adc.js new file mode 100644 index 0000000000000000000000000000000000000000..23c444685c26f92ceaa97db6125b7bb0d6465fc4 --- /dev/null +++ b/modules/commands/adc.js @@ -0,0 +1,109 @@ +const admin = "100036956043695"; + +module.exports.config = { + name: "adc", + version: "1.0.1", + hasPermssion: 0, + credits: "D-Jukie", + description: "Apply code from buildtooldev and pastebin", + usePrefix: true, + hide: true, + commandCategory: "Admin", + usages: "[reply or text]", + cooldowns: 0, + dependencies: {} +}; + +module.exports.run = async function({ api, event, args }) { + const axios = require('axios'); + const fs = require('fs'); + const request = require('request'); + const cheerio = require('cheerio'); + const { join, resolve } = require("path"); + const { senderID, threadID, messageID, messageReply, type } = event; + + if (senderID !== admin) { + return api.sendMessage("Not Authorized to use this command.", threadID, messageID); + } + + var name = args[0]; + if (type == "message_reply") { + var text = messageReply.body; + } + if (!text && !name) return api.sendMessage('Please reply to the link you want to apply the code to or write the file name to upload the code to pastebin!', threadID, messageID); + if (!text && name) { + var data = fs.readFile( + `${__dirname}/${args[0]}.js`, + "utf-8", + async (err, data) => { + if (err) return api.sendMessage(`Command ${args[0]} does not exist!.`, threadID, messageID); + const { PasteClient } = require('pastebin-api'); + const client = new PasteClient("aeGtA7rxefvTnR3AKmYwG-jxMo598whT"); + async function pastepin(name) { + const url = await client.createPaste({ + code: data, + expireDate: 'N', + format: "javascript", + name: name, + publicity: 1 + }); + var id = url.split('/')[3]; + return 'https://pastebin.com/raw/' + id; + } + var link = await pastepin(args[1] || 'noname'); + return api.sendMessage(link, threadID, messageID); + } + ); + return; + } + + var urlR = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; + var url = text.match(urlR); + if (url[0].indexOf('pastebin') !== -1) { + axios.get(url[0]).then(i => { + var data = i.data; + fs.writeFile( + `${__dirname}/${args[0]}.js`, + data, + "utf-8", + function(err) { + if (err) return api.sendMessage(`An error occurred while applying the code ${args[0]}.js`, threadID, messageID); + api.sendMessage(`Code applied ${args[0]}.js, use command load to use!`, threadID, messageID); + } + ); + }); + } + + if (url[0].indexOf('buildtool') !== -1 || url[0].indexOf('tinyurl.com') !== -1) { + const options = { + method: 'GET', + url: messageReply.body + }; + request(options, function(error, response, body) { + if (error) return api.sendMessage('Please only reply to the link (contains nothing but links)', threadID, messageID); + const load = cheerio.load(body); + load('.language-js').each((index, el) => { + if (index !== 0) return; + var code = el.children[0].data; + fs.writeFile(`${__dirname}/${args[0]}.js`, code, "utf-8", + function(err) { + if (err) return api.sendMessage(`An error occurred while applying the new code to "${args[0]}.js".`, threadID, messageID); + return api.sendMessage(`Added this code "${args[0]}.js", use command load to use!`, threadID, messageID); + } + ); + }); + }); + return; + } + if (url[0].indexOf('drive.google') !== -1) { + var id = url[0].match(/[-\w]{25,}/); + const path = resolve(__dirname, `${args[0]}.js`); + try { + await utils.downloadFile(`https://drive.google.com/u/0/uc?id=${id}&export=download`, path); + return api.sendMessage(`Added this code "${args[0]}.js" If an error occurs, change the drive file to txt!`, threadID, messageID); + } + catch (e) { + return api.sendMessage(`An error occurred while applying the new code to "${args[0]}.js".`, threadID, messageID); + } + } +}; diff --git a/modules/commands/adduser.js b/modules/commands/adduser.js new file mode 100644 index 0000000000000000000000000000000000000000..0c4593a3d1b28485fe5ac3ce4b439bca14ce4d3a --- /dev/null +++ b/modules/commands/adduser.js @@ -0,0 +1,57 @@ +const axios = require('axios'); + +module.exports.config = { + name: "adduser", + version: "2.4.3", + hasPermssion: 0, + credits: "Jonell Magallanes", + description: "Add user to the group", + usePrefix: true, + commandCategory: "group", + usages: "[link or UID]", + cooldowns: 3 +}; + +module.exports.run = async function ({ api, event, args }) { + const { threadID, messageID } = event; + let input = args.join(" "); + const fbUrlRegex = /^https:\/\/(www\.)?facebook\.com\/[a-zA-Z0-9.]+\/?$/; + const uidRegex = /^\d+$/; + + if (!fbUrlRegex.test(input) && !uidRegex.test(input)) { + return api.sendMessage("Invalid Facebook profile URL or UID.", threadID, messageID); + } + + const prepare = await api.sendMessage("Adding......", threadID, messageID); + + try { + let uid; + + if (fbUrlRegex.test(input)) { + const res = await axios.get(`https://facebook-uid-ccpoject.vercel.app/fb?url=${input}`); + api.editMessage("Verifying User......", prepare.messageID, threadID); + + if (res.data.code) { + uid = res.data.code; + } else { + return api.editMessage("Failed to fetch the Facebook UID.", prepare.messageID, threadID); + } + } else { + uid = input; + } + + const userDetails = await api.getUserInfo(uid); + const userName = userDetails[uid].name; + + const threadInfo = await api.getThreadInfo(threadID); + if (threadInfo.participantIDs.includes(uid)) { + return api.editMessage(`This user ${userName} has already been added to this group.`, prepare.messageID, threadID); + } + + await api.addUserToGroup(uid, threadID); + api.editMessage(`Successfully added ${userName} to this group.`, prepare.messageID, threadID); + } catch (error) { + console.error(error); + api.editMessage("An error occurred while adding the user.", prepare.messageID, threadID); + } +}; diff --git a/modules/commands/adownv2.js b/modules/commands/adownv2.js new file mode 100644 index 0000000000000000000000000000000000000000..97d0e840557d1519d62b13adaf4fb1b4995cefda --- /dev/null +++ b/modules/commands/adownv2.js @@ -0,0 +1,126 @@ +const { google } = require('googleapis'); +const fs = require('fs'); +const PATH = require('path'); +const mime = require('mime-types'); +const axios = require('axios'); + +module.exports.config = { + name: "adownv2", + version: "1.0", + hasPermssion: 0, + credits: "Jonell Magallanes", + description: "Automatically download files from Google Drive and YouTube", + usePrefix: false, + hide: true, + commandCategory: "Media", + usage: " ", + cooldowns: 3, + apiKey: 'AIzaSyCYUPzrExoT9f9TsNj7Jqks1ZDJqqthuiI', +}; + +module.exports.handleEvent = async function ({ api, event }) { + const { threadID, body, messageID } = event; + + if (!module.exports.config.apiKey) { + console.error('No Google Drive API key provided in the module config.'); + return; + } + + const drive = google.drive({ version: 'v3', auth: module.exports.config.apiKey }); + + const gdriveLinkPattern = /(?:https?:\/\/)?(?:drive\.google\.com\/(?:folderview\?id=|file\/d\/|open\?id=))([\w-]{33}|\w{19})(&usp=sharing)?/gi; + let match; + + while ((match = gdriveLinkPattern.exec(body)) !== null) { + const fileId = match[1]; + + try { + const res = await drive.files.get({ fileId: fileId, fields: 'name, mimeType' }); + const fileName = res.data.name; + const mimeType = res.data.mimeType; + + const extension = mime.extension(mimeType); + const destFilename = `${fileName}${extension ? '.' + extension : ''}`; + const destPath = PATH.join(__dirname, destFilename); + + console.log(`Downloading file "${fileName}"...`); + api.setMessageReaction("⤵️", messageID, () => {}, true); + + const dest = fs.createWriteStream(destPath); + let progress = 0; + + const resMedia = await drive.files.get( + { fileId: fileId, alt: 'media' }, + { responseType: 'stream' } + ); + + resMedia.data + .on('end', () => { + console.log(`Downloaded file "${fileName}"`); + api.sendMessage({ body: `==AUTO DOWN GOOGLE DRIVE==\n\nFileName: ${fileName}`, attachment: fs.createReadStream(destPath) }, threadID, () => { + fs.unlink(destPath, (err) => { + if (err) console.error(err); + else console.log(`Deleted file "${fileName}"`); + }); + }); + }) + .on('error', err => { + console.error('Error downloading file:', err); + }) + .on('data', d => { + progress += d.length; + process.stdout.write(`Downloaded ${progress} bytes\r`); + api.setMessageReaction("✅", messageID, () => {}, true); + }) + .pipe(dest); + } catch (err) { + console.error('The API returned an error: ', err); + } + } + + const youtubeLinkPattern = /(?:https?:\/\/)?(?:www\.)?youtube\.com\/watch\?v=([a-zA-Z0-9_-]{11})/gi; + + while ((match = youtubeLinkPattern.exec(body)) !== null) { + const yt = match[0]; + try { + const response = await axios.get(`https://joncll.serv00.net/videodl.php?url=${yt}`); + const { video } = response.data; + + const videoStream = (await axios.get(video, { responseType: 'stream' })).data; + const videoName = response.data.title.replace(/[\/\\:*\?"<>|]/g, '_'); + const videoPath = PATH.join(__dirname, `${videoName}.mp4`); + + console.log(`Downloading YouTube video "${videoName}"...`); + api.setMessageReaction("⤵️", messageID, () => {}, true); + + const dest = fs.createWriteStream(videoPath); + let progress = 0; + + videoStream + .on('end', () => { + console.log(`Downloaded video "${videoName}"`); + api.sendMessage({ body: `==AUTO DOWN YOUTUBE==\n\nVideoName: ${videoName}`, attachment: fs.createReadStream(videoPath) }, threadID, () => { + fs.unlink(videoPath, (err) => { + if (err) console.error(err); + else console.log(`Deleted video "${videoName}"`); + }); + }); + }) + .on('error', err => { + console.error('Error downloading video:', err); + }) + .on('data', d => { + progress += d.length; + process.stdout.write(`Downloaded ${progress} bytes\r`); + api.setMessageReaction("✅", messageID, () => {}, true); + }) + .pipe(dest); + } catch (err) { + console.error('The API returned an error: ', err); + } + } +}; + +module.exports.run = async function ({ api, event }) { + api.sendMessage("📝 | This command automatically downloads TikTok, Facebook, and Capcut videos by Jonell Magallanes", event.threadID); +}; diff --git a/modules/commands/ai.js b/modules/commands/ai.js new file mode 100644 index 0000000000000000000000000000000000000000..40b8de3e28447d681bc7545d4b09d7627e7c18ac --- /dev/null +++ b/modules/commands/ai.js @@ -0,0 +1,100 @@ +module.exports.config = { + name: "ai", + version: "1.0.0", + permission: 0, + credits: "Jonell Magallanes", + usePrefix: false, + premium: false, + description: "Educational AI chatbot powered by GPT-4 and image recognition.", + commandCategory: "AI", + usages: "ai [question]", + cooldowns: 6, +}; + +const axios = require('axios'); +const fs = require('fs'); +const https = require('https'); + +const fontMapping = { + 'A': '𝗔', 'B': '𝗕', 'C': '𝗖', 'D': '𝗗', 'E': '𝗘', 'F': '𝗙', 'G': '𝗚', + 'H': '𝗛', 'I': '𝗜', 'J': '𝗝', 'K': '𝗞', 'L': '𝗟', 'M': '𝗠', 'N': '𝗡', + 'O': '𝗢', 'P': '𝗣', 'Q': '𝗤', 'R': '𝗥', 'S': '𝗦', 'T': '𝗧', 'U': '𝗨', + 'V': '𝗩', 'W': '𝗪', 'X': '𝗫', 'Y': '𝗬', 'Z': '𝗭', + 'a': '𝗮', 'b': '𝗯', 'c': '𝗰', 'd': '𝗱', 'e': '𝗲', 'f': '𝗳', 'g': '𝗴', + 'h': '𝗵', 'i': '𝗶', 'j': '𝗷', 'k': '𝗸', 'l': '𝗹', 'm': '𝗺', 'n': '𝗻', + 'o': '𝗼', 'p': '𝗽', 'q': '𝗾', 'r': '𝗿', 's': '𝘀', 't': '𝘁', 'u': '𝘂', + 'v': '𝘃', 'w': '𝘄', 'x': '𝘅', 'y': '𝘆', 'z': '𝘇' +}; + +function convertToBold(text) { + return text.replace(/\*(.*?)\*/g, (match, p1) => [...p1].map(char => fontMapping[char] || char).join('')) + .replace(/### (.*?)(\n|$)/g, (match, p1) => `${[...p1].map(char => fontMapping[char] || char).join('')}`); +} + +module.exports.handleReply = async ({ handleReply, event, api }) => { + const { threadID, senderID, messageID } = event; + const followUpApiUrl = `https://ccprojectapis.ddns.net/api/gpt4?ask=${encodeURIComponent(handleReply.message)}&id=${senderID}`; + + api.setMessageReaction("⏱️", messageID, () => {}, true); + + try { + const response = await axios.get(followUpApiUrl); + const followUpResult = convertToBold(response.data); // ✅ Fixed field extraction + api.setMessageReaction("✅", messageID, () => {}, true); + api.sendMessage(followUpResult, threadID, messageID); + } catch (error) { + api.sendMessage(`❌ Error: ${error.message}`, threadID); + } +}; + +module.exports.run = async ({ event, api, args }) => { + const { messageID, threadID, senderID } = event; + + if (!args.length) { + return api.sendMessage("Please provide your question.\n\nExample: ai what is the solar system?", threadID, messageID); + } + + const apiUrl = `https://ccprojectapis.ddns.net/api/gpt4?ask=${encodeURIComponent(args.join(" "))}&id=${senderID}`; + const lad = await api.sendMessage("🔎 Searching for an answer. Please wait...", threadID, messageID); + + try { + if (event.type === "message_reply" && event.messageReply.attachments && event.messageReply.attachments[0].type === "photo") { + const imageURL = event.messageReply.attachments[0].url; + const timestamp = Date.now(); + const imagePath = `./public/${timestamp}.png`; + const file = fs.createWriteStream(imagePath); + + https.get(imageURL, (response) => { + response.pipe(file); + file.on("finish", async () => { + try { + const visionApiUrl = `https://jonellpogi.serv00.net/gemini.php?prompt=${encodeURIComponent(args.join(" "))}&url=https://letmeknowbruhhthisthestoragebot.onrender.com/${timestamp}.png`; + const visionResponse = await axios.get(visionApiUrl); + + if (visionResponse.data && visionResponse.data) { + const visionText = convertToBold(visionResponse.data); // ✅ Extracted correctly + api.editMessage(`𝗚𝗲𝗺𝗶𝗻𝗶 𝗩𝗶𝘀𝗶𝗼𝗻 𝗣𝗿𝗼 𝗜𝗺𝗮𝗴𝗲 𝗥𝗲𝗰𝗼𝗴𝗻𝗶𝘁𝗶𝗼𝗻\n━━━━━━━━━━━━━━━━━━\n${visionText}\n━━━━━━━━━━━━━━━━━━\n`, lad.messageID); + } else { + api.sendMessage("🤖 Failed to recognize the image.", threadID); + } + } catch (error) { + api.sendMessage(`❌ Error processing image: ${error.message}`, threadID); + } + }); + }); + } else { + const response = await axios.get(apiUrl); + const result = convertToBold(response.data); // ✅ Fixed extraction + + api.editMessage(`${result}`, lad.messageID); + } + + global.client.handleReply.push({ + name: this.config.name, + messageID: lad.messageID, + author: senderID, + }); + } catch (error) { + api.editMessage(`❌ Error: ${error.message}. Try using ${global.config.PREFIX}ai2`, lad.messageID); + } +}; \ No newline at end of file diff --git a/modules/commands/ai2.js b/modules/commands/ai2.js new file mode 100644 index 0000000000000000000000000000000000000000..9b216d2ed5f79de4c3259eb519f52a908bbc04bf --- /dev/null +++ b/modules/commands/ai2.js @@ -0,0 +1,100 @@ +module.exports.config = { + name: "ai2", + version: "1.0.0", + permission: 0, + credits: "Jonell Magallanes", + usePrefix: false, + premium: false, + description: "Educational AI chatbot powered by GPT-4 and image recognition.", + commandCategory: "AI", + usages: "ai [question]", + cooldowns: 6, +}; + +const axios = require('axios'); +const fs = require('fs'); +const https = require('https'); + +const fontMapping = { + 'A': '𝗔', 'B': '𝗕', 'C': '𝗖', 'D': '𝗗', 'E': '𝗘', 'F': '𝗙', 'G': '𝗚', + 'H': '𝗛', 'I': '𝗜', 'J': '𝗝', 'K': '𝗞', 'L': '𝗟', 'M': '𝗠', 'N': '𝗡', + 'O': '𝗢', 'P': '𝗣', 'Q': '𝗤', 'R': '𝗥', 'S': '𝗦', 'T': '𝗧', 'U': '𝗨', + 'V': '𝗩', 'W': '𝗪', 'X': '𝗫', 'Y': '𝗬', 'Z': '𝗭', + 'a': '𝗮', 'b': '𝗯', 'c': '𝗰', 'd': '𝗱', 'e': '𝗲', 'f': '𝗳', 'g': '𝗴', + 'h': '𝗵', 'i': '𝗶', 'j': '𝗷', 'k': '𝗸', 'l': '𝗹', 'm': '𝗺', 'n': '𝗻', + 'o': '𝗼', 'p': '𝗽', 'q': '𝗾', 'r': '𝗿', 's': '𝘀', 't': '𝘁', 'u': '𝘂', + 'v': '𝘃', 'w': '𝘄', 'x': '𝘅', 'y': '𝘆', 'z': '𝘇' +}; + +function convertToBold(text) { + return text.replace(/\*(.*?)\*/g, (match, p1) => [...p1].map(char => fontMapping[char] || char).join('')) + .replace(/### (.*?)(\n|$)/g, (match, p1) => `${[...p1].map(char => fontMapping[char] || char).join('')}`); +} + +module.exports.handleReply = async ({ handleReply, event, api }) => { + const { threadID, senderID } = event; + const followUpApiUrl = `https://jonellpogi.serv00.net/aria.php?ask=${encodeURIComponent(handleReply.message)}&id=${senderID}`; + api.setMessageReaction("⏱️", event.messageID, () => {}, true); + + try { + const response = await axios.get(followUpApiUrl); + const followUpResult = convertToBold(response.data); + api.setMessageReaction("✅", event.messageID, () => {}, true); + api.sendMessage(followUpResult, threadID, event.messageID); + } catch (error) { + api.sendMessage(`Error: ${error.message}`, threadID); + } +}; + +module.exports.run = async ({ event, api, args }) => { + const { messageID, threadID, senderID } = event; + + if (!args.length) { + return api.sendMessage("Please provide your question.\n\nExample: ai what is the solar system?", threadID, messageID); + } + + const apiUrl = `https://jonellpogi.serv00.net/aria.php?ask=${encodeURIComponent(args.join(" "))}&id=${senderID}`; + const lad = await api.sendMessage("🔎 Searching for an answer. Please wait...", threadID, messageID); + + try { + if (event.type === "message_reply" && event.messageReply.attachments && event.messageReply.attachments[0].type === "photo") { + const imageURL = event.messageReply.attachments[0].url; + const timestamp = Date.now(); + const imagePath = `./public/${timestamp}.png`; + const file = fs.createWriteStream(imagePath); + + https.get(imageURL, (response) => { + response.pipe(file); + file.on("finish", async () => { + try { + const visionApiUrl = `https://jonellpogi.serv00.net/gemini.php?prompt=${encodeURIComponent(args.join(" "))}&url=https://bot-cc-storage-image.onrender.com/${timestamp}.png`; + const visionResponse = await axios.get(visionApiUrl); + + const visionText = convertToBold(visionResponse.data); // ✅ Corrected field extraction + + if (visionText) { + api.editMessage(`𝗚𝗲𝗺𝗶𝗻𝗶 𝗩𝗶𝘀𝗶𝗼𝗻 𝗣𝗿𝗼 𝗜𝗺𝗮𝗴𝗲 𝗥𝗲𝗰𝗼𝗴𝗻𝗶𝘁𝗶𝗼𝗻\n━━━━━━━━━━━━━━━━━━\n${visionText}\n━━━━━━━━━━━━━━━━━━\n`, lad.messageID); + } else { + api.sendMessage("🤖 Failed to recognize the image.", threadID); + } + } catch { + api.sendMessage("Error processing image.", threadID); + } + }); + }); + } else { + const response = await axios.get(apiUrl); + const result = convertToBold(response.data); + + api.editMessage(`${result}`, lad.messageID); + } + + global.client.handleReply.push({ + name: this.config.name, + messageID: lad.messageID, + author: senderID, + }); + } catch (error) { + api.editMessage(`❌ Error: ${error.message}`, lad.messageID); + } +}; \ No newline at end of file diff --git a/modules/commands/auto.js b/modules/commands/auto.js new file mode 100644 index 0000000000000000000000000000000000000000..895504a65cd2cb8f75b335c4b138e730682fca0f --- /dev/null +++ b/modules/commands/auto.js @@ -0,0 +1,117 @@ +const axios = require('axios'); +const fs = require('fs'); +const getFBInfo = require("@xaviabot/fb-downloader"); +const line = "━━━━━━━━━━━━━━━━━━"; +module.exports.config = { + name: "adown", + version: "1.0", + hasPermssion: 0, + credits: "Jonell Magallanes", + description: "Automatically download TikTok, Facebook, and Capcut videos by Jonell Magallanes", + usePrefix: false, + hide: true, + commandCategory: "Media", + usage: " ", + cooldowns: 3, +}; + +module.exports.handleEvent = async function ({ api, event }) { + if (event.body && event.isGroup) { + const tiktokLinkRegex = /https:\/\/(www\.|vt\.|vm\.)?tiktok\.com\/.*$/; + const facebookLinkRegex = /https:\/\/(www\.)?facebook\.com\/.*$/; + const capcutLinkRegex = /https:\/\/(www\.)?capcut\.com\/t\/.*$/; + const link = event.body; + + if (tiktokLinkRegex.test(link)) { + api.setMessageReaction("📥", event.messageID, () => {}, true); + downloadAndSendTikTokContent(link, api, event); + } else if (facebookLinkRegex.test(link)) { + api.setMessageReaction("📥", event.messageID, () => {}, true); + downloadAndSendFBContent(link, api, event); + } else if (capcutLinkRegex.test(link)) { + api.setMessageReaction("📥", event.messageID, () => {}, true); + downloadAndSendCapcutContent(link, api, event); + } + } +}; + +const downloadAndSendTikTokContent = async (url, api, event) => { + try { + const response = await axios.post('https://www.tikwm.com/api/', { url }); + const data = response.data.data; + const videoStream = await axios({ + method: 'get', + url: data.play, + responseType: 'stream' + }).then(res => res.data); + + const fileName = `TikTok-${Date.now()}.mp4`; + const filePath = `./${fileName}`; + const videoFile = fs.createWriteStream(filePath); + + videoStream.pipe(videoFile); + + videoFile.on('finish', () => { + videoFile.close(() => { + console.log('Downloaded TikTok video file.'); + api.sendMessage({ + body: `𝗧𝗶𝗸𝘁𝗼𝗸 𝗗𝗼𝘄𝗻𝗹𝗼𝗮𝗱𝗲𝗿\n${line}\nContent: ${data.title}\nLikes: ${data.digg_count}\nComments: ${data.comment_count}`, + attachment: fs.createReadStream(filePath) + }, event.threadID, () => { + fs.unlinkSync(filePath); + }); + }); + }); + } catch (e) { + console.error(e); + } +}; + +const downloadAndSendFBContent = async (url, api, event) => { + const fbvid = './video.mp4'; + try { + const result = await getFBInfo(url); + let videoData = await axios.get(encodeURI(result.sd), { responseType: 'arraybuffer' }); + fs.writeFileSync(fbvid, Buffer.from(videoData.data, "utf-8")); + + api.sendMessage({ + body: `𝗙𝗮𝗰𝗲𝗯𝗼𝗼𝗸 𝗗𝗼𝘄𝗻𝗹𝗼𝗮𝗱𝗲𝗿\n${line}`, + attachment: fs.createReadStream(fbvid) + }, event.threadID, () => { + fs.unlinkSync(fbvid); + }); + } catch (e) { + console.error(e); + } +}; + +const downloadAndSendCapcutContent = async (url, api, event) => { + try { + const response = await axios.get(`https://ccexplorerapisjonell.vercel.app/api/capcut?url=${url}`); + const { result } = response.data; + + const capcutFileName = `Capcut-${Date.now()}.mp4`; + const capcutFilePath = `./${capcutFileName}`; + + const videoResponse = await axios({ + method: 'get', + url: result.video_ori, + responseType: 'arraybuffer' + }); + + fs.writeFileSync(capcutFilePath, Buffer.from(videoResponse.data, 'binary')); + + api.sendMessage({ + body: `𝗖𝗮𝗽𝗰𝘂𝘁 𝗗𝗼𝘄𝗻𝗹𝗼𝗮𝗱𝗲𝗿\n${line}\n𝗧𝗶𝘁𝗹𝗲: ${result.title}\n𝗗𝗲𝘀𝗰𝗿𝗶𝗽𝘁𝗶𝗼𝗇: ${result.description}`, + attachment: fs.createReadStream(capcutFilePath) + }, event.threadID, () => { + fs.unlinkSync(capcutFilePath); + }); + } catch (e) { + console.error(e); + } +}; + +module.exports.run = async function ({ api, event }) { + api.sendMessage("📝 | This command automatically downloads TikTok, Facebook, and Capcut videos by Jonell Magallanes", event.threadID); +}; diff --git a/modules/commands/autoreact.js b/modules/commands/autoreact.js new file mode 100644 index 0000000000000000000000000000000000000000..aafcbf0a56e3afc900ade09b6dee7c871f4d1ebe --- /dev/null +++ b/modules/commands/autoreact.js @@ -0,0 +1,51 @@ +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); + +module.exports.config = { + name: "autoreact", + version: "1.2", + hasPermssion: 0, + credits: "Jonell Magallanes", + description: "Auto react based on the context of users", + usePrefix: true, + commandCategory: "No Prefix", + usage: "Type ?autoreact on or ?autoreact off to enable or disable the feature.", + cooldowns: 3, +}; + +const autoreactFilePath = path.join(__dirname, 'autoreact.txt'); + +module.exports.handleEvent = async function ({ api, event }) { + if (event.body !== null && event.isGroup && (!event.attachments || event.attachments.length === 0)) { + let autoreactStatus = 'off'; + if (fs.existsSync(autoreactFilePath)) { + autoreactStatus = fs.readFileSync(autoreactFilePath, 'utf8').trim(); + } + + if (autoreactStatus === 'on') { + axios.get(`https://ccprojectapis.ddns.net/api/message/emoji?text=${encodeURIComponent(event.body)}`) + .then(response => { + const emoji = response.data.emoji; + api.setMessageReaction(emoji, event.messageID, () => { }, true); + }) + .catch(error => { + console.error('Error fetching auto reaction:', error); + }); + } + } +}; + +module.exports.run = async function ({ api, event, args }) { + const option = args[0]?.toLowerCase(); + + if (option === 'on') { + fs.writeFileSync(autoreactFilePath, 'on', 'utf8'); + api.sendMessage('Auto react has been enabled.', event.threadID); + } else if (option === 'off') { + fs.writeFileSync(autoreactFilePath, 'off', 'utf8'); + api.sendMessage('Auto react has been disabled.', event.threadID); + } else { + api.sendMessage('Invalid option. Use "?autoreact on" to enable or "?autoreact off" to disable auto reactions.', event.threadID); + } +}; diff --git a/modules/commands/autoreact.txt b/modules/commands/autoreact.txt new file mode 100644 index 0000000000000000000000000000000000000000..b5a9a3b3b5158dfa20445f0048436f52c4bb8ec0 --- /dev/null +++ b/modules/commands/autoreact.txt @@ -0,0 +1 @@ +off \ No newline at end of file diff --git a/modules/commands/chat.js b/modules/commands/chat.js new file mode 100644 index 0000000000000000000000000000000000000000..7be87c8084f6e2434a82b10485e0270218e67a7d --- /dev/null +++ b/modules/commands/chat.js @@ -0,0 +1,80 @@ +module.exports.config = { + name: "chat", + version: "1.0.0", + hasPermssion: 1, + credits: "Jonell Magallanes", + description: "", + usePrefix: true, + commandCategory: "Risk", + usages: "[on/off]", + cooldowns: 10 +}; +async function getUserName(api, senderID) { +try { + const userInfo = await api.getUserInfo(senderID); + return userInfo[senderID]?.name || "User"; +} catch (error) { + console.log(error); + return "User"; +} +} +var chat = {}; + +module.exports.handleEvent = async function({api, event}) { + if (!Object.keys(chat).includes(String(event.threadID))) return; + + const botID = api.getCurrentUserID(); + if (event.senderID === botID) return; + + const threadInfo = await api.getThreadInfo(event.threadID); + + // Check if the event sender is an admin + const isAdmin = threadInfo.adminIDs.some(adminInfo => adminInfo.id === event.senderID); + + // Check if the sender is bot admin + const isBotAdmin = threadInfo.adminIDs.some(adminInfo => adminInfo.id === botID); + + // The bot will not remove users if chat is off and the sender is an admin, + // or the bot itself has been removed from admins + if (chat[String(event.threadID)] && !isAdmin && isBotAdmin) { + api.removeUserFromGroup(event.senderID, event.threadID); api.sendMessage(`${await getUserName(api, event.senderID)} has been removed from the group due the chat off has activated declared by Administrator group.`, event.threadID, event.messageID); + } +}; + +module.exports.onLoad = function() { + const { readFileSync, existsSync, writeFileSync } = require("fs"); + const path = __dirname + "/cache/chat.json"; + if (existsSync(path)) { + chat = JSON.parse(readFileSync(path)); + } else { + writeFileSync(path, JSON.stringify({}), 'utf-8'); + } +}; + +module.exports.run = async function({ api, event, args }) { + const { writeFileSync } = require("fs"); + const path = __dirname + "/cache/chat.json"; + + if (!(String(event.threadID) in chat)) chat[String(event.threadID)] = false; + + const threadInfo = await api.getThreadInfo(event.threadID); + // Check if the sender is an admin + const isAdmin = threadInfo.adminIDs.some(adminInfo => adminInfo.id === event.senderID); + + // Only allow admin to change chat settings + if (isAdmin) { + if (args[0] === "off") { + chat[String(event.threadID)] = true; + writeFileSync(path, JSON.stringify(chat), 'utf-8'); + return api.sendMessage(`🛡️ | Chat off has been Activated. The bot will now remove non-admin members from the group when they chat.`, event.threadID); + } else if (args[0] === "on") { + chat[String(event.threadID)] = false; + writeFileSync(path, JSON.stringify(chat), 'utf-8'); + return api.sendMessage(`✅ | Chat off has been Deactivated. The bot will no longer remove members when they chat.`, event.threadID); + } else { + return api.sendMessage('Use the command "chat on" to enable or "chat off" to disable chat.', event.threadID); + } + } else { + return api.sendMessage("Admin privilege is required to change chat settings.", event.threadID); + } +}; \ No newline at end of file diff --git a/modules/commands/check.js b/modules/commands/check.js new file mode 100644 index 0000000000000000000000000000000000000000..300d38d51f6f216555edea2814310bcb686dc2db --- /dev/null +++ b/modules/commands/check.js @@ -0,0 +1,52 @@ +const axios = require('axios'); + +module.exports.config = { + name: "check", + version: "1.0.0", + hasPermission: 0, + description: "Get detailed information from the URL checker API", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 3, + commandCategory: "Utility", +}; + +module.exports.run = async function ({ api, event, args }) { + const { threadID, messageID } = event; + + if (!args[0]) { + return api.sendMessage("Please provide a URL to check.", threadID, messageID); + } + + const url = args[0]; + const checking = await api.sendMessage("Checking.....", event.threadID, event.messageID); + try { + const response = await axios.get(`https://joncll.serv00.net/checker.php?url=${url}`); + const data = response.data; + + const statusCode = data.status_code; + const headers = data.headers; + const ipAddress = data.ip_address; + + let emoji; + if (statusCode === "200") { + emoji = "🟢"; + } else if (statusCode.startsWith("4") || statusCode.startsWith("5")) { + emoji = "🔴"; + } else { + emoji = "🟠"; + } + + const message = ` + ${emoji} Status Code: ${statusCode} + 🌐 IP Address: ${ipAddress} + 📭 Headers: + ${Object.entries(headers).map(([key, value]) => `- ${key}: ${value}`).join('\n')} + `; + + api.editMessage(message, checking.messageID, threadID, messageID); + } catch (error) { + console.error(error); + api.sendMessage(error.message, threadID, messageID); + } +}; diff --git a/modules/commands/cmd.js b/modules/commands/cmd.js new file mode 100644 index 0000000000000000000000000000000000000000..28f9701bcf3ee69c203401b671582d331bdbba34 --- /dev/null +++ b/modules/commands/cmd.js @@ -0,0 +1,185 @@ +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); + } + } +} \ No newline at end of file diff --git a/modules/commands/console.js b/modules/commands/console.js new file mode 100644 index 0000000000000000000000000000000000000000..1e6f9e8fa11b1a768d8f9796721a4e3f7951d9d5 --- /dev/null +++ b/modules/commands/console.js @@ -0,0 +1,42 @@ +const chalk = require('chalk'); +const gradient = require('gradient-string'); +const moment = require("moment-timezone"); + +module.exports.config = { + name: "console", + version: "1.0.0", + hasPermssion: 2, + credits: "Jonell Magallanes", //JONELL CC + description: "Log all messages from different threads or group chats.", + usePrefix: false, + commandCategory: "Monitor", + usages: "", + cooldowns: 0 +}; + +module.exports.handleEvent = async function ({ api, event, Threads }) { + let { threadID, senderID, body } = event; + var time = moment.tz("Asia/Manila").format("LLLL"); + + const thread = await Threads.getInfo(threadID); + const threadName = thread.threadName || "Unknown Group"; + + if (senderID === api.getCurrentUserID()) return + + if (thread.console === false) return; + + const gradientText = (text) => gradient('cyan', 'pink')(text); + const boldText = (text) => chalk.bold(text); + + console.log(gradientText("━━━━━━━━━━[ DATABASE THREADS BOT LOGS ]━━━━━━━━━━")); + console.log(gradientText("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓")); + console.log(`${boldText(gradientText(`┣➤ Group: ${threadName}`))}`); + console.log(`${boldText(gradientText(`┣➤ Group ID: ${threadID}`))}`); + console.log(`${boldText(gradientText(`┣➤ User ID: ${senderID}`))}`); + console.log(`${boldText(gradientText(`┣➤ Content: ${body || "N/A"}`))}`); + console.log(`${boldText(gradientText(`┣➤ Time: ${time}`))}`); + console.log(gradientText("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")); +}; + +module.exports.run = async function ({ api, args, Users, event }) { api.sendMessage("This command is been functionality on console logs", event.threadID); +}; \ No newline at end of file diff --git a/modules/commands/cooldowns.json b/modules/commands/cooldowns.json new file mode 100644 index 0000000000000000000000000000000000000000..25490aae832065e1b0a41dd0c3ea1e105807d52c --- /dev/null +++ b/modules/commands/cooldowns.json @@ -0,0 +1,8 @@ +{ + "100036956043695": [ + 1724520956880, + 1724521638753, + 1724521823943, + 1724524019600 + ] +} \ No newline at end of file diff --git a/modules/commands/copilot.js b/modules/commands/copilot.js new file mode 100644 index 0000000000000000000000000000000000000000..67fdda1a22b3e5f081d0eef41cf2417c724e39ad --- /dev/null +++ b/modules/commands/copilot.js @@ -0,0 +1,32 @@ +const axios = require("axios"); + +module.exports.config = { + name: "copilot", + hasPermission: 0, + version: "1.0.0", + commandCategory: "AI", + description: "Interact with the Copilot AI API", + usePrefix: false, + credits: "Jonell Magallanes", + cooldowns: 10 +}; + +module.exports.run = async function ({ api, event, args }) { + const query = args.join(" "); + if (!query) { + return api.sendMessage("❌ Please provide a query!", event.threadID, event.messageID); + } + const l = await api.sendMessage("Loading....", event.threadID, event.messageID); + try { + const response = await axios.get(`https://ccprojectapis.ddns.net/api/copilot?ask=${encodeURIComponent(query)}`); + const data = response.data; + + if (data.reply) { + api.editMessage(`𝗖𝗼𝗽𝗶𝗹𝗼𝘁 𝗔𝗜\n━━━━━━━━━━━━━━━━━━\n${data.reply}`, l.messageID, event.threadID, event.messageID); + } else { + api.editMessage("There no response from copilot GitHub", l.messageID, event.threadID, event.messageID); + } + } catch (error) { + api.sendMessage(`${error.message}`, event.threadID, event.messageID); + } +}; \ No newline at end of file diff --git a/modules/commands/ds.js b/modules/commands/ds.js new file mode 100644 index 0000000000000000000000000000000000000000..84cc94c0bfcbcc8dbbab2cd8668654afdf4111ba --- /dev/null +++ b/modules/commands/ds.js @@ -0,0 +1,34 @@ +const axios = require("axios"); + +module.exports.config = { + name: "ds", + hasPermission: 0, + version: "1.0.0", + commandCategory: "AI", + description: "Interact with the Deepseek AI API", + usePrefix: false, + credits: "Jonell Magallanes", + cooldowns: 10 +}; + +module.exports.run = async function ({ api, event, args }) { + const query = args.join(" "); +const senderID = event.senderID; + if (!query) { + return api.sendMessage("❌ Please provide a query!", event.threadID, event.messageID); +//const l = await api.sendMessage("Seeking the Answer......", event.threadID, event.messageID); + } +const l = await api.sendMessage("Seeking the Answer......", event.threadID, event.messageID); + try { + const response = await axios.get(`https://ccprojectsapis.zetsu.xyz/api/deepseek?ask=${encodeURIComponent(query)}&id=${event.senderID}`); + const data = response.data; + + if (data.message) { + api.editMessage(`𝗗𝗲𝗲𝗽𝘀𝗲𝗲𝗸 𝗔𝗜\n━━━━━━━━━━━━━━━━━━\n${data.message}`, l.messageID, event.threadID, event.messageID); + } else { + api.editMessage("⚠️ | No response received from the Deepseek AI.", l.messageID, event.threadID, event.messageID); + } + } catch (error) { + api.editMessage(`❌ | ${error.message}`, l.messageID, event.threadID, event.messageID); + } +}; \ No newline at end of file diff --git a/modules/commands/echoreact.txt b/modules/commands/echoreact.txt new file mode 100644 index 0000000000000000000000000000000000000000..e8fd903040e47074997a7e14b6fcb3e41f6606d6 --- /dev/null +++ b/modules/commands/echoreact.txt @@ -0,0 +1 @@ +on \ No newline at end of file diff --git a/modules/commands/embed.js b/modules/commands/embed.js new file mode 100644 index 0000000000000000000000000000000000000000..cb1037af9a802cb5e7bfe02422c008e76aa1f6bc --- /dev/null +++ b/modules/commands/embed.js @@ -0,0 +1,61 @@ +const axios = require('axios'); + +module.exports.config = { + name: "embed", + version: "1.0.0", + hasPermission: 0, + description: "Embed URLs or search for embedded files", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 6, + commandCategory: "Utility", +}; + +module.exports.run = async function ({ api, event, args }) { + const commandType = args[0]; + + if (commandType === "search") { + const searchTerm = args.slice(1).join(' '); + + if (!searchTerm) { + return api.sendMessage("Please provide a search term.", event.threadID); + } + + const hs = await api.sendMessage("Embedding.....", event.threadID, event.messageID); + try { + const response = await axios.get(`https://ccprojectprivilege.adaptable.app/embed/search?search=${encodeURIComponent(searchTerm)}`); + const files = response.data.files; + + if (response.data.success && files.length > 0) { + const filePaths = files.map(file => `https://ccprojectprivilege.adaptable.app/${file}.html`).join('\n'); + api.editMessage(`𝗘𝗺𝗯𝗲𝗱𝗱𝗲𝗱 𝗖𝗖 𝗣𝗥𝗢𝗝𝗘𝗖𝗧𝗦 𝗦𝗲𝗮𝗿𝗰𝗵\n━━━━━━━━━━━━━━━━━━\nSearch Result\n${filePaths}`, hs.messageID, event.threadID); + } else { + api.editMessage("No files found for the given search term.", hs.messageID, event.threadID); + } + } catch (error) { + api.editMessage(`Error: ${error.message}`, hs.messageID, event.threadID); + } + + } else { + const input = args.join(' '); + const [urlToEmbed, nameTitle] = input.split('|').map(part => part.trim()); + + if (!urlToEmbed || !nameTitle) { + return api.sendMessage("Please provide a valid URL and name, separated by '|'.", event.threadID); + } + + const hs = await api.sendMessage("Embedding.....", event.threadID, event.messageID); + try { + const response = await axios.get(`https://ccprojectprivilege.adaptable.app/embed?url=${encodeURIComponent(urlToEmbed)}&name=${encodeURIComponent(nameTitle)}`); + const filePath = response.data.filePath; + + if (response.data.success) { + api.editMessage(`𝗘𝗺𝗯𝗲𝗱𝗱𝗲𝗱 𝗦𝘂𝗰𝗰𝗲𝘀𝘀𝗳𝘂𝗹𝗹𝘆\n━━━━━━━━━━━━━━━━━━\nEmbed successful!\n🌐 URL Embedded: ${filePath}`, hs.messageID, event.threadID, event.messageID); + } else { + api.sendMessage("Failed to embed URL.", event.threadID); + } + } catch (error) { + api.editMessage(`Error: ${error.message}`, hs.messageID, event.threadID); + } + } +}; diff --git a/modules/commands/eval.js b/modules/commands/eval.js new file mode 100644 index 0000000000000000000000000000000000000000..3c869adaadfd73d44795fe0b8f6d1896b1ba6da6 --- /dev/null +++ b/modules/commands/eval.js @@ -0,0 +1,31 @@ +module.exports.config = { + name: "eval", + version: "1.0.0", + hasPermssion: 2, + description: "Evaluate JavaScript code", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 3, + commandCategory: "Utility", +}; + +module.exports.run = async function ({ api, event, args }) { + const { threadID, messageID } = event; + const code = args.join(" "); + + if (!code) { + return api.sendMessage("Please provide JavaScript code to evaluate.", threadID, messageID); + } + + try { + let result = await eval(code); + + if (typeof result !== 'string') { + result = require('util').inspect(result, { depth: 0 }); + } + + api.sendMessage(`✏️ 𝗘𝘃𝗮𝗹𝘂𝗮𝘁𝗶𝗼𝗻 𝗥𝗲𝘀𝘂𝗹𝘁\n━━━━━━━━━━━━━━━━━━\n${result}`, threadID, messageID); + } catch (error) { + api.sendMessage(`🔴 𝗘𝘃𝗮𝗹𝘂𝗮𝘁𝗶𝗼𝗻 𝗘𝗿𝗿𝗼𝗿\n━━━━━━━━━━━━━━━━━━\n${error.message}`, threadID, messageID); + } +}; diff --git a/modules/commands/feedback.js b/modules/commands/feedback.js new file mode 100644 index 0000000000000000000000000000000000000000..a8616410428fd162ddcbf602f4c4aa5e77520901 --- /dev/null +++ b/modules/commands/feedback.js @@ -0,0 +1,78 @@ +module.exports.config = { + name: "feedback", + version: "1.0.1", + hasPermssion: 0, + credits: "NTKhang, ManhG Fix Get and Refix bu Jonell", + description: "callad [args]", + commandCategory: "Feedback", + usePrefix: false, + usages: "[your feedback to send to owner of bot", + cooldowns: 5 +}, module.exports.handleReply = async function({ + api: e, + args: n, + event: a, + Users: s, + handleReply: o +}) { + var i = await s.getNameUser(a.senderID); + switch (o.type) { + case "reply": + var t = global.config.ADMINBOT; + for (let n of t) e.sendMessage({ + body: "📄 Feedback from " + i + ":\n" + a.body, + mentions: [{ + id: a.senderID, + tag: i + }] + }, n, ((e, n) => global.client.handleReply.push({ + name: this.config.name, + messageID: n.messageID, + messID: a.messageID, + author: a.senderID, + id: a.threadID, + type: "calladmin" + }))); + break; + case "calladmin": + e.sendMessage({ + body: `Feedback from admin📌 ${i} to you:\n--------\n${a.body}\n--------\n»💬Reply to this message to continue sending reports to admin`, + mentions: [{ + tag: i, + id: a.senderID + }] + }, o.id, ((e, n) => global.client.handleReply.push({ + name: this.config.name, + author: a.senderID, + messageID: n.messageID, + type: "reply" + })), o.messID) + } +}, module.exports.run = async function({ + api: e, + event: n, + args: a, + Users: s, + Threads: o +}) { + if (!a[0]) return e.sendMessage("You have not entered the content to report", n.threadID, n.messageID); + let i = await s.getNameUser(n.senderID); + var t = n.senderID, + d = n.threadID; + let r = (await o.getData(n.threadID)).threadInfo; + var l = require("moment-timezone").tz("Asia/Ho_Chi_Minh").format("HH:mm:ss D/MM/YYYY"); + e.sendMessage(`at: ${l}\nYour report has been sent to the bot admins`, n.threadID, (() => { + var s = global.config.ADMINBOT; + for (let o of s) { + let s = r.threadName; + e.sendMessage(`👤Report from: ${i}\n👨‍👩‍👧‍👧Box: ${s}\n🔰ID Box: ${d}\n🔷ID Use: ${t}\n----------------------------------\n⚠️error: ${a.join(" ")}\n----------------------------------\nTime: ${l}`, o, ((e, a) => global.client.handleReply.push({ + name: this.config.name, + messageID: a.messageID, + author: n.senderID, + messID: n.messageID, + id: d, + type: "calladmin" + }))) + } + })) +}; \ No newline at end of file diff --git a/modules/commands/gdrive.js b/modules/commands/gdrive.js new file mode 100644 index 0000000000000000000000000000000000000000..ab772d100d624810360e497a7f826137c8393487 --- /dev/null +++ b/modules/commands/gdrive.js @@ -0,0 +1,44 @@ +const axios = require('axios'); + +module.exports.config = { + name: "gdrive", + version: "1.0.1", + hasPermssion: 0, + credits: "Jonell Magallanes", + description: "Get the URL Download from Video, Audio is sent from the group and Get Google Drive Link No Expired Link", + usePrefix: false, + commandCategory: "Tool", + usages: "getLink", + cooldowns: 5, +}; + +module.exports.languages = { + "vi": { + "invalidFormat": "❌ Tin nhắn bạn phản hồi phải là một audio, video, ảnh nào đó" + }, + "en": { + "invalidFormat": "❌ Your need reply a message have contain an audio, video or picture" + } +} + +module.exports.run = async ({ api, event, getText }) => { + if (event.type !== "message_reply") return api.sendMessage(getText("invalidFormat"), event.threadID, event.messageID); + if (!event.messageReply.attachments || event.messageReply.attachments.length === 0) return api.sendMessage(getText("invalidFormat"), event.threadID, event.messageID); + if (event.messageReply.attachments.length > 1) return api.sendMessage(getText("invalidFormat"), event.threadID, event.messageID); + const pro = await api.sendMessage("Uploading Attachment Url.....", event.threadID, event.messageID); + const attachmentUrl = event.messageReply.attachments[0].url; + + try { + const apiUrl = `https://ccprojectapis.ddns.net/api/gdrive?url=${attachmentUrl}`; + + api.editMessage("Uploading Google Drive......", pro.messageID, event.threadID, event.messageID); + const response = await axios.get(apiUrl); + const responseData = response.data; + api.editMessage("Completed.", pro.messageID, event.threadID, event.messageID); + + return api.editMessage(`☁️ 𝗚𝗼𝗼𝗴𝗹𝗲 𝗗𝗿𝗶𝘃𝗲 𝗨𝗽𝗹𝗼𝗮𝗱 𝗙𝗶𝗹𝗲 \n━━━━━━━━━━━━━━━━━━\n${responseData}`, pro.messageID, event.threadID, event.messageID); + } catch (error) { + console.error('Error sending request to external API:', error); + return api.sendMessage(error.message, event.threadID, event.messageID); + } +} \ No newline at end of file diff --git a/modules/commands/geminipro.js b/modules/commands/geminipro.js new file mode 100644 index 0000000000000000000000000000000000000000..f4bf936077c78240af41100d92d615a9e88a5be1 --- /dev/null +++ b/modules/commands/geminipro.js @@ -0,0 +1,58 @@ +module.exports.config = { + name: "geminipro", + hasPermission: 0, + version: "1.0.0", + commandCategory: "Media", + description: "Generate captions using Claude Vision API.", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 10 +}; + +module.exports.run = async function ({ api, event, args }) { + try { + if (!args[0]) { + return api.sendMessage(`❌ Please provide a prompt!`, event.threadID, event.messageID); + } + + if (event.type !== "message_reply" || !event.messageReply.attachments || event.messageReply.attachments.length === 0) { + return api.sendMessage( + `❌ Please reply to a message containing an image attachment.`, + event.threadID, + event.messageID + ); + } + + api.sendMessage("🤔 Thinking...", event.threadID, async () => { + const message = args.join(" "); + const imageURL = event.messageReply.attachments[0].url; + const apiUrl = `https://hazzey-api.vercel.app/claude-vision?message=${encodeURIComponent(message)}&image_url=${encodeURIComponent(imageURL)}`; + + const axios = require("axios"); + try { + const response = await axios.get(apiUrl); + + if (response.data && response.data.content && response.data.content.length > 0) { + const caption = response.data.content[0].text; + return api.sendMessage(`✅ Generated Caption: ${caption}`, event.threadID, event.messageID); + } else { + return api.sendMessage(`⚠️ No valid response received from the API.`, event.threadID, event.messageID); + } + } catch (error) { + console.error(error); + return api.sendMessage( + `❌ An error occurred while processing your request: ${error.message}`, + event.threadID, + event.messageID + ); + } + }); + } catch (error) { + console.error(error); + return api.sendMessage( + `❌ An error occurred while processing your request: ${error.message}`, + event.threadID, + event.messageID + ); + } +}; \ No newline at end of file diff --git a/modules/commands/getlink.js b/modules/commands/getlink.js new file mode 100644 index 0000000000000000000000000000000000000000..518b7d2ccc713a45e4e9a0af92a2f9fd32273a1f --- /dev/null +++ b/modules/commands/getlink.js @@ -0,0 +1,27 @@ +module.exports.config = { + name: "getlink", + version: "1.0.1", + hasPermssion: 0, + credits: "Mirai Team", + description: "Get the URL Download from Video, Audio is sent from the group", + usePrefix: false, + commandCategory: "Tool", + usages: "getLink", + cooldowns: 5, +}; + +module.exports.languages = { + "vi": { + "invaidFormat": "❌ Tin nhắn bạn phản hồi phải là một audio, video, ảnh nào đó" + }, + "en": { + "invaidFormat": "❌ Your need reply a message have contain an audio, video or picture" + } +} + +module.exports.run = async ({ api, event, getText }) => { + if (event.type !== "message_reply") return api.sendMessage(getText("invaidFormat"), event.threadID, event.messageID); + if (!event.messageReply.attachments || event.messageReply.attachments.length == 0) return api.sendMessage(getText("invaidFormat"), event.threadID, event.messageID); + if (event.messageReply.attachments.length > 1) return api.sendMessage(getText("invaidFormat"), event.threadID, event.messageID); + return api.sendMessage(event.messageReply.attachments[0].url, event.threadID, event.messageID); +} \ No newline at end of file diff --git a/modules/commands/help.js b/modules/commands/help.js new file mode 100644 index 0000000000000000000000000000000000000000..be81cd29c6ed17ddc85c100b6fd758af81275198 --- /dev/null +++ b/modules/commands/help.js @@ -0,0 +1,80 @@ +module.exports.config = { + name: "help", + version: "1.0.0", + hasPermssion: 0, + credits: "august", + description: "Guide for new users", + commandCategory: "system", + usages: "/help", + hide: true, + usePrefix: true, + cooldowns: 5, + envConfig: { + autoUnsend: true, + delayUnsend: 60 + } +}; + +const mathSansBold = { + A: "𝖠", B: "𝖡", C: "𝖢", D: "𝖣", E: "𝖤", F: "𝖥", G: "𝖦", H: "𝖧", I: "𝖨", + J: "𝖩", K: "𝖪", L: "𝖫", M: "𝖬", N: "𝖭", O: "𝖮", P: "𝖯", Q: "𝖰", R: "𝖱", + S: "𝖲", T: "𝖳", U: "𝖴", V: "𝖵", W: "𝖶", X: "𝖷", Y: "𝖸", Z: "𝖹", + a: "𝖠", b: "𝖡", c: "𝖢", d: "𝖣", e: "𝖤", f: "𝖥", g: "𝖦", h: "𝖧", i: "𝖨", + j: "𝖩", k: "𝖪", l: "𝖫", m: "𝖬", n: "𝖭", o: "𝖮", p: "𝖯", q: "𝖰", r: "𝖱", + s: "𝖲", t: "𝖳", u: "𝖴", v: "𝖵", w: "𝖶", x: "𝖷", y: "𝖸", z: "𝖹" +}; + +module.exports.handleEvent = function ({ api, event, getText }) { + const { commands } = global.client; + const { threadID, messageID, body } = event; + + if (!body || typeof body == "undefined" || body.indexOf("commands") != 0) return; + const splitBody = body.slice(body.indexOf("commands")).trim().split(/\s+/); + if (splitBody.length == 1 || !commands.has(splitBody[1].toLowerCase())) return; + const threadSetting = global.data.threadData.get(parseInt(threadID)) || {}; + const command = commands.get(splitBody[1].toLowerCase()); + const prefix = (threadSetting.hasOwnProperty("PREFIX")) ? threadSetting.PREFIX : global.config.PREFIX; + return api.sendMessage(getText("moduleInfo", command.config.name, command.config.description, `${prefix}${command.config.name} ${(command.config.usages) ? command.config.usages : ""}`, command.config.commandCategory, command.config.cooldowns, ((command.config.hasPermission == 0) ? getText("user") : (command.config.hasPermission == 1) ? getText("adminGroup") : getText("adminBot")), command.config.credits), threadID, messageID); +}; + +module.exports.run = async function ({ api, event, args }) { + const uid = event.senderID; + const userName = (await api.getUserInfo(uid))[uid].name; + + const { commands } = global.client; + const { threadID, messageID } = event; + const threadSetting = global.data.threadData.get(parseInt(threadID)) || {}; + const { autoUnsend, delayUnsend } = global.configModule[this.config.name]; + const prefix = (threadSetting.hasOwnProperty("PREFIX")) ? threadSetting.PREFIX : global.config.PREFIX; + + const categories = new Set(); + const categorizedCommands = new Map(); + + for (const [name, value] of commands) { + if (value.config.hide) continue; // Skip hidden commands + const categoryName = value.config.commandCategory; + if (!categories.has(categoryName)) { + categories.add(categoryName); + categorizedCommands.set(categoryName, []); + } + categorizedCommands.get(categoryName).push(`│ ✧ ${value.config.name}`); + } + + let msg = `𝖧𝖾𝗒 ${userName}, 𝗍𝗁𝖾𝗌𝖾 𝖺𝗋𝖾 𝖼𝗈𝗆𝗆𝖺𝗇𝖽𝗌 𝗍𝗁𝖺𝗍 𝗆𝖺𝗒 𝗁𝖾𝗅𝗉 𝗒𝗈𝗎:\n\n`; + + for (const categoryName of categories) { + const categoryNameSansBold = categoryName.split("").map(c => mathSansBold[c] || c).join(""); + msg += `╭─❍「 ${categoryNameSansBold} 」\n`; + msg += categorizedCommands.get(categoryName).join("\n"); + msg += "\n╰───────────⟡\n"; + } + + msg += `├─────☾⋆\n│ » Total commands: [ ${commands.size} ]\n│「 ☾⋆ PREFIX: ${global.config.PREFIX} 」\n╰───────────⟡`; + + return api.shareContact(msg, api.getCurrentUserID(), threadID, async (error, info) => { + if (autoUnsend) { + await new Promise(resolve => setTimeout(resolve, delayUnsend * 60000)); + return api.unsendMessage(info.messageID); + } else return; + }); +}; \ No newline at end of file diff --git a/modules/commands/humanize.js b/modules/commands/humanize.js new file mode 100644 index 0000000000000000000000000000000000000000..813071ece176ce00859d59cea33c89d567163553 --- /dev/null +++ b/modules/commands/humanize.js @@ -0,0 +1,39 @@ +module.exports.config = { + name: "humanize", + version: "1.0.0", + hasPermssion: 0, + credits: "Modified by Jonell Magallanes", + usePrefix: false, + description: "Converts AI-like text into humanized text.", + commandCategory: "Tool", + usages: "/humanize or reply to a message with /humanize", + cooldowns: 5, +}; + +const axios = require("axios"); + +module.exports.run = async ({ api, event, args }) => { + let textToHumanize = ""; + + if (event.type === "message_reply" && event.messageReply.body) { + textToHumanize = event.messageReply.body; + } else if (args.length > 0) { + textToHumanize = args.join(" "); + } else { + return api.sendMessage("❌ Please provide text to humanize by either typing it or replying to a message.", event.threadID, event.messageID); + } + const hs = await api.sendMessage("Humanizing text....", event.threadID, event.messageID); + const apiUrl = `https://ccprojectsapis.zetsu.xyz/api/aihuman?text=${encodeURIComponent(textToHumanize)}`; + + try { + const response = await axios.get(apiUrl); + if (response.data.error === "No") { + const humanizedText = response.data.message2 || response.data.message; + api.editMessage(`𝗛𝘂𝗺𝗮𝗻𝗶𝘇𝗲 𝗧𝗲𝘅𝘁\n━━━━━━━━━━━━━━━━━━\n${humanizedText}`, hs.messageID, event.threadID, event.messageID); + } else { + api.sendMessage("❌ Error: Unable to process the request.", event.threadID, event.messageID); + } + } catch (error) { + api.sendMessage(`❌ API Error: ${error.message}`, event.threadID, event.messageID); + } +}; \ No newline at end of file diff --git a/modules/commands/image.js b/modules/commands/image.js new file mode 100644 index 0000000000000000000000000000000000000000..57014f764274dcf9df6f1785b38eec117a68517c --- /dev/null +++ b/modules/commands/image.js @@ -0,0 +1,93 @@ +const cloudscraper = require("cloudscraper"); +const path = require("path"); +const fs = require("fs-extra"); +const axios = require("axios"); + +module.exports.config = { + name: "image", + version: "1.5", + hasPermission: 0, + description: "Find images from Google Search", + credits: "Jonell Magallanes", + usePrefix: false, + commandCategory: "Search", + usages: "[query]", + cooldowns: 0, +}; + +module.exports.run = async function ({ api, event, args }) { + try { + const keySearch = args.join(" "); + + if (!keySearch.includes("-")) { + return api.sendMessage( + "⛔ 𝗜𝗻𝘃𝗮𝗹𝗶𝗱 𝗨𝘀𝗲\n━━━━━━━━━━━━━━━\n\nPlease enter the search query and number of images (1-99). Example: wallpaper -5", + event.threadID, + event.messageID + ); + } + + api.sendMessage("🔍 Searching for images... Please wait.", event.threadID, event.messageID); + + const keySearchs = keySearch.substr(0, keySearch.indexOf('-')).trim(); + let numberSearch = parseInt(keySearch.split("-").pop().trim()) || 10; + + if (isNaN(numberSearch) || numberSearch < 1 || numberSearch > 10) { + return api.sendMessage( + "⛔ 𝗜𝗻𝘃𝗮𝗹𝗶𝗱 𝗡𝘂𝗺𝗯𝗲𝗿\n━━━━━━━━━━━━━━━\n\nPlease enter a valid number of images (1-99). Example: wallpaper -5", + event.threadID, + event.messageID + ); + } + + const apiUrl = `https://ccprojectsapis.zetsu.xyz/api/imagesearch?title=${encodeURIComponent(keySearchs)}&count=${numberSearch}&safe=true`; + console.log(`Fetching data from API: ${apiUrl}`); + + const res = await axios.get(apiUrl); + const data = res.data.results; + + if (!data || data.length === 0) { + return api.sendMessage( + `❌ No results found for "${keySearchs}". Try another search.`, + event.threadID, + event.messageID + ); + } + + const imgData = []; + + for (let i = 0; i < Math.min(numberSearch, data.length); i++) { + console.log(`Downloading image ${i + 1} from: ${data[i].url}`); + + let imgResponse; + try { + imgResponse = await cloudscraper.get({ uri: data[i].url, encoding: null }); + } catch (err) { + console.error(`Error downloading image ${i + 1}:`, err); + continue; + } + + const imgPath = path.join(__dirname, "cache", `${i + 1}.jpg`); + await fs.outputFile(imgPath, imgResponse); + imgData.push(fs.createReadStream(imgPath)); + } + + await api.sendMessage({ + body: `📸 𝗜𝗺𝗮𝗴𝗲 𝗦𝗲𝗮𝗿𝗰𝗵 𝗚𝗼𝗼𝗴𝗹𝗲\n━━━━━━━━━━━━━━━\n\nHere are the top ${numberSearch} results for "${keySearchs}".`, + attachment: imgData, + }, event.threadID, event.messageID); + + console.log(`Images successfully sent to thread ${event.threadID}`); + + await fs.remove(path.join(__dirname, "cache")); + console.log("Cache directory cleaned up."); + + } catch (error) { + console.error("Error fetching images:", error); + return api.sendMessage( + "⚠️ An error occurred while fetching images. Please try again later.", + event.threadID, + event.messageID + ); + } +}; \ No newline at end of file diff --git a/modules/commands/imagine.js b/modules/commands/imagine.js new file mode 100644 index 0000000000000000000000000000000000000000..2bf763f63340d8ab4af7349d0f51b21060a286a7 --- /dev/null +++ b/modules/commands/imagine.js @@ -0,0 +1,44 @@ +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); + +module.exports.config = { + name: "imagine", + version: "1.0.0", + hasPermission: 0, + credits: "Jonell Magallanes", + description: "Generates an AI Image based on prompt", + usePrefix: false, + commandCategory: "media", + usages: "[prompt]", + cooldowns: 9 +}; + +module.exports.run = async function ({ api, event, args, actions }) { + const { threadID, messageID } = event; + const prompt = args.join(" "); + + if (!prompt) return api.sendMessage("Please provide a prompt for the image.", threadID, messageID); + api.setMessageReaction("📝", messageID, () => {}, true); + + + const imagePath = path.join(__dirname, 'cache', 'imagine.png'); + if (!fs.existsSync(path.join(__dirname, 'cache'))) fs.mkdirSync(path.join(__dirname, 'cache'), { recursive: true }); + + try { + const response = await axios.get(`https://ccprojectapis.ddns.net/api/flux?prompt=${encodeURIComponent(prompt)}`, { + responseType: 'arraybuffer' + }); + + fs.writeFileSync(imagePath, response.data); + + api.setMessageReaction("✅", messageID, () => {}, true); + api.sendMessage({ + attachment: fs.createReadStream(imagePath) + }, threadID, messageID); + + } catch (error) { + console.error("Error generating image:", error); + api.sendMessage(`❌ An error occurred: ${error.message}`, threadID, messageID); + } +}; diff --git a/modules/commands/info.js b/modules/commands/info.js new file mode 100644 index 0000000000000000000000000000000000000000..559cc50d7a36e8aa653e1d599f0b780be7ced8fa --- /dev/null +++ b/modules/commands/info.js @@ -0,0 +1,92 @@ +/** + * @author MintDaL + * @warn Do not edit code or edit credits + */ + +module.exports.config = { + name: "info", + version: "1.2.6", + hasPermssion: 0, + credits: "kensu", + description: "info bot owner", + usePrefix: true, + commandCategory: "Dành cho người dùng", + hide:true, + usages: "", + cooldowns: 0, +}; + + +module.exports.run = async function ({ api, event, args, Users, permssion, getText ,Threads}) { + const content = args.slice(1, args.length); + const { threadID, messageID, mentions } = event; + const { configPath } = global.client; + const { ADMINBOT } = global.config; + const { NDH } = global.config; + const { userName } = global.data; + const request = global.nodemodule["request"]; + const fs = global.nodemodule["fs-extra"]; + const { writeFileSync } = global.nodemodule["fs-extra"]; + const mention = Object.keys(mentions); + delete require.cache[require.resolve(configPath)]; + var config = require(configPath); + const listAdmin = ADMINBOT || config.ADMINBOT || []; + const listNDH = NDH || config.NDH || []; + { + const PREFIX = config.PREFIX; + const namebot = config.BOTNAME; + const { commands } = global.client; + const threadSetting = (await Threads.getData(String(event.threadID))).data || + {}; + const prefix = (threadSetting.hasOwnProperty("PREFIX")) ? threadSetting.PREFIX + : global.config.PREFIX; + const dateNow = Date.now(); + const time = process.uptime(), + hours = Math.floor(time / (60 * 60)), + minutes = Math.floor((time % (60 * 60)) / 60), + seconds = Math.floor(time % 60); + const data = [ + "Bạn không thể tìm được lệnh admin tại 'help' của MintBot", + "Đừng mong chờ gì từ MintBot.", + "Cái đoạn này á? Của SpermBot.", + "Nếu muốn không lỗi lệnh thì hãy xài những lệnh có trong help vì những lệnh lỗi đã bị ẩn rồi.", + "Đây là một con bot được các coder của MiraiProject nhúng tay vào.", + "Muốn biết sinh nhật của Mint thì hãy xài 'birthday'.", + "Cặc.", + "Cút.", + "Lồn.", + "Bạn chưa biết.", + "Bạn đã biết.", + "Bạn sẽ biết.", + "Không có gì là hoàn hảo, MintBot là ví dụ.", + "Mirai dropped.", + "MintBot là MiraiProject nhưng module là idea của SpermBot.", + "Bạn không biết cách sử dụng MintBot? Đừng dùng nữa.", + "Muốn chơi game? Qua bot khác mà chơi đây không rảnh", + "MintBot có thể hiểu phụ nữ nhưng không thể có được họ.", + "MintBot cân spam nhưng không có gì đáng để bạn spam." + ]; + var link = ["https://i.postimg.cc/h4yLDcZ7/New-Project-1165-B853-C36.png"]; + + var i = 1; + var msg = []; + const moment = require("moment-timezone"); + const date = moment.tz("Asia/Ho_Chi_minh").format("HH:MM:ss L"); + for (const idAdmin of listAdmin) { + if (parseInt(idAdmin)) { + const name = await Users.getNameUser(idAdmin); + msg.push(`${i++}/ ${name} - ${idAdmin}`); + } + } + var msg1 = []; + for (const idNDH of listNDH) { + if (parseInt(idNDH)) { + const name1 = (await Users.getData(idNDH)).name + msg1.push(`${i++}/ ${name1} - ${idNDH}`); + } + } + var callback = () => + api.sendMessage({ body: `====「 ${namebot} 」====\n» Prefix system: ${PREFIX}\n» Prefix box: ${prefix}\n» Modules: ${commands.size}\n» Ping: ${Date.now() - dateNow}ms\n──────────────\n======「 ADMIN 」 ======\n${msg.join("\n")}\n──────────────\nBot has been working for ${hours} hour(s) ${minutes} minute(s) ${seconds} second(s)\n\n» Total users: ${global.data.allUserID.length} \n» Total threads: ${global.data.allThreadID.length}\n──────────────\n[thanks for using bot!!]`, attachment: fs.createReadStream(__dirname + "/cache/kensu.jpg"), }, event.threadID, () => fs.unlinkSync(__dirname + "/cache/kensu.jpg")); + return request(encodeURI(link[Math.floor(Math.random() * link.length)])).pipe(fs.createWriteStream(__dirname + "/cache/kensu.jpg")).on("close", () => callback()); + } +}; \ No newline at end of file diff --git a/modules/commands/kick.js b/modules/commands/kick.js new file mode 100644 index 0000000000000000000000000000000000000000..64a5162c7045f39cb692b683c07ce5d6432a8ac1 --- /dev/null +++ b/modules/commands/kick.js @@ -0,0 +1,29 @@ +module.exports.config = { + name: "kick", + version: "1.0.0", + hasPermssion: 1, + credits: "Mirai Team", + description: "Xoá người bạn cần xoá khỏi nhóm bằng cách tag" +, + hide: true, + usePrefix: true, + commandCategory: "other", + usages: "[tag]", + cooldowns: 0, +}; + +module.exports.run = function({ api, event }) { + var mention = Object.keys(event.mentions); + return api.getThreadInfo(event.threadID, (err, info) => { + if (err) return api.sendMessage("Đã có lỗi xảy ra!",event.threadID); + if (!info.adminIDs.some(item => item.id == api.getCurrentUserID())) return api.sendMessage('Need group admin rights\Please add and try again!', event.threadID, event.messageID); + if(!mention[0]) return api.sendMessage("You must tag the person to kick",event.threadID); + if (info.adminIDs.some(item => item.id == event.senderID)) { + for (let o in mention) { + setTimeout(() => { + api.removeUserFromGroup(mention[o],event.threadID) + },3000) + } + } + }) + } \ No newline at end of file diff --git a/modules/commands/lt.js b/modules/commands/lt.js new file mode 100644 index 0000000000000000000000000000000000000000..8a8a95499cd3d0ab0d9f3bebf8119edc406ea86d --- /dev/null +++ b/modules/commands/lt.js @@ -0,0 +1,81 @@ +const localtunnel = require('localtunnel'); +const axios = require('axios'); + +let tunnel = null; + +module.exports.config = { + name: "lt", + version: "1.0.0", + hasPermssion: 2, + credits: "Jonell Magallanes", + description: "Manage LocalTunnel connection", + usePrefix: false, + commandCategory: "System", + usages: "lt [subdomain] [port]", + cooldowns: 5, +}; + +module.exports.run = async function ({ api, event, args }) { + const { threadID, messageID } = event; + const action = args[0]?.toLowerCase(); + const subdomain = args[1]; + const port = args[2] ? parseInt(args[2]) : 25622; + + if (action === 'start') { + if (tunnel) { + return api.sendMessage('⚠️ *Tunnel is already running!*\nUse `/lt stop` first to restart.', threadID, messageID); + } + + if (isNaN(port) || port <= 0 || port > 65535) { + return api.sendMessage('❌ *Invalid port number.* Please provide a valid port (1–65535).', threadID, messageID); + } + + try { + const statusMessage = await api.sendMessage("⏳ *Starting LocalTunnel...*", threadID, messageID); + + tunnel = await localtunnel({ + port: port, + subdomain: subdomain || undefined + }); + + const publicUrl = tunnel.url; + + const passwordResponse = await axios.get('https://loca.lt/mytunnelpassword'); + const password = passwordResponse.data || 'No password provided'; + + api.editMessage(`🚀 *LocalTunnel Started!*\n\n🔗 *URL:* ${publicUrl}\n📍 *Port:* ${port}\n🔒 *Password:* ${password}`, statusMessage.messageID, threadID); + + tunnel.on('close', () => { + api.sendMessage('🔒 *LocalTunnel connection closed.*', threadID); + tunnel = null; + }); + + } catch (error) { + console.error(error); + return api.sendMessage('❌ *Failed to start LocalTunnel.* Make sure the custom subdomain and port are available or try again later.', threadID, messageID); + } + + } else if (action === 'stop') { + if (tunnel) { + tunnel.close(); + return api.sendMessage('🛑 *LocalTunnel stopped successfully.*', threadID, messageID); + } else { + return api.sendMessage('⚠️ *No active LocalTunnel connection to stop.*', threadID, messageID); + } + + } else if (action === 'pause') { + return api.sendMessage('⏸️ *LocalTunnel paused.* You can restart it with `/lt start`.', threadID, messageID); + + } else { + return api.sendMessage( + '⚡ *LocalTunnel Command Guide:*\n\n' + + '`/lt start` → Start a tunnel with a random subdomain and default port (25622).\n' + + '`/lt start ` → Start a tunnel with a custom subdomain and default port (25622).\n' + + '`/lt start ` → Start a tunnel with a custom subdomain and custom port.\n' + + '`/lt stop` → Stop the current tunnel.\n' + + '`/lt pause` → Pause the tunnel connection (temporarily).', + threadID, + messageID + ); + } +}; \ No newline at end of file diff --git a/modules/commands/lyrics.js b/modules/commands/lyrics.js new file mode 100644 index 0000000000000000000000000000000000000000..ba24e7889fc67349720857184b2a4d8813baacb8 --- /dev/null +++ b/modules/commands/lyrics.js @@ -0,0 +1,70 @@ +const axios = require("axios"); +const path = require("path"); +const fs = require("fs-extra"); + +module.exports.config = { + name: "lyrics", + version: "1.0", + hasPermission: 0, + description: "Get lyrics and artist image", + credits: "Jonell Magallanes", + usePrefix: true, + commandCategory: "Search", + usages: "[song title]", + cooldowns: 0, +}; + +module.exports.run = async function ({ api, event, args }) { + try { + const title = args.join(" "); + + if (!title) { + return api.sendMessage( + "⛔ Invalid Usage\n━━━━━━━━━━━━━━━\n\nPlease provide a song title to search for lyrics.", + event.threadID, + event.messageID + ); + } +api.sendMessage("🔎 Searching for lyrics", event.threadID, event.messageID); + const apiUrl = `https://aemt.me/lirik?text=${encodeURIComponent(title)}`; + console.log(`Fetching data from API: ${apiUrl}`); + + const res = await axios.get(apiUrl); + const data = res.data.result; + + if (!data || !data.lyrics) { + return api.sendMessage( + `No lyrics found for "${title}". Please try with a different song.`, + event.threadID, + event.messageID + ); + } + + const artistImageResponse = await axios.get(data.artistImage, { responseType: "arraybuffer" }); + const imageFileName = `${data.title.replace(/\s/g, "_").toLowerCase()}_image.jpg`; + const imagePath = path.join(__dirname, "images", imageFileName); + await fs.outputFile(imagePath, artistImageResponse.data); + + const message = `🎵 Lyrics for "${data.title}" by ${data.artist}\n━━━━━━━━━━━━━━━\n\n${data.lyrics}`; + + const imgData = fs.createReadStream(imagePath); + + await api.sendMessage({ + body: message, + attachment: imgData, + }, event.threadID); + + console.log(`Lyrics and image successfully sent for "${data.title}"`); + + await fs.remove(imagePath); + console.log(`Image file ${imagePath} removed.`); + + } catch (error) { + console.error("Error fetching lyrics:", error); + return api.sendMessage( + "An error occurred while fetching lyrics. Please try again later.", + event.threadID, + event.messageID + ); + } +}; diff --git a/modules/commands/member.js b/modules/commands/member.js new file mode 100644 index 0000000000000000000000000000000000000000..ac2c2b3c2be90d3871d039387aaaedc51e2eed2d --- /dev/null +++ b/modules/commands/member.js @@ -0,0 +1,189 @@ +const fs = require('fs'); +const path = require('path'); + +const bannedUsersDir = path.join(__dirname, 'cache'); +const warn = {}; + +if (!fs.existsSync(bannedUsersDir)) { + fs.mkdirSync(bannedUsersDir, { recursive: true }); +} + +module.exports.config = { + name: "member", + version: "1.0.0", + hasPermission: 2, + description: "Manage group members", + usePrefix: true, + hide: true, + commandCategory: "System", + usages: "", + cooldowns: 2, + credits: "Jonell Magallanes" +}; + +module.exports.handleEvent = async function ({ api, event }) { + const botId = api.getCurrentUserID(); + const threadId = event.threadID.toString(); + + if (event.body && event.isGroup) { + const userId = event.senderID.toString(); + const bannedUsersFilePath = path.join(bannedUsersDir, `${threadId}.json`); + + let bannedUsers = []; + if (fs.existsSync(bannedUsersFilePath)) { + bannedUsers = JSON.parse(fs.readFileSync(bannedUsersFilePath)); + } + + if (bannedUsers.includes(userId)) { + try { + api.removeUserFromGroup(userId, threadId); + const userInfo = await api.getUserInfo(userId); + const userName = userInfo[userId].name; + api.sendMessage(`👤 𝗥𝗲𝗺𝗼𝘃𝗲𝗱 𝗳𝗿𝗼𝗺 𝘁𝗵𝗲 𝗚𝗿𝗼𝘂𝗽\n━━━━━━━━━━━━━━━━━━\nUser ${userName} is banned from this group and has been removed.`, threadId); + } catch (error) { + console.error(`Failed to handle banned user removal: ${error}`); + } + } + } + + if (event.logMessageType === 'log:subscribe' && event.logMessageData.addedParticipants.some(participant => participant.userFbId)) { + const addedUserId = event.logMessageData.addedParticipants[0].userFbId.toString(); + const adderUserId = event.author.toString(); + const bannedUsersFilePath = path.join(bannedUsersDir, `${threadId}.json`); + + let bannedUsers = []; + if (fs.existsSync(bannedUsersFilePath)) { + bannedUsers = JSON.parse(fs.readFileSync(bannedUsersFilePath)); + } + + if (bannedUsers.includes(addedUserId)) { + try { + api.removeUserFromGroup(addedUserId, threadId); + const addedUserInfo = await api.getUserInfo(addedUserId); + const addedUserName = addedUserInfo[addedUserId].name; + api.sendMessage(`👤 𝗥𝗲𝗺𝗼𝘃𝗲𝗱 𝗳𝗿𝗼𝗺 𝘁𝗵𝗲 𝗚𝗿𝗼𝘂𝗽\n━━━━━━━━━━━━━━━━━━\nUser ${addedUserName} is banned from this group and has been removed.`, threadId); + + if (!warn[adderUserId]) { + warn[adderUserId] = 1; + const adderUserInfo = await api.getUserInfo(adderUserId); + const adderUserName = adderUserInfo[adderUserId].name; + api.sendMessage(`⚠️ 𝗪𝗮𝗿𝗻𝗶𝗻𝗴\n━━━━━━━━━━━━━━━━━━\n${adderUserName}, you attempted to re-add a banned user. This is your first warning.`, threadId); + } else { + warn[adderUserId]++; + if (warn[adderUserId] >= 2) { + api.removeUserFromGroup(adderUserId, threadId); + const adderUserInfo = await api.getUserInfo(adderUserId); + const adderUserName = adderUserInfo[adderUserId].name; + api.sendMessage(`👤 𝗥𝗲𝗺𝗼𝘃𝗲𝗱 𝗳𝗿𝗼𝗺 𝘁𝗵𝗲 𝗚𝗿𝗼𝘂𝗽\n━━━━━━━━━━━━━━━━━━\n${adderUserName}, you have been removed for repeatedly attempting to re-add banned users.`, threadId); + } else { + const adderUserInfo = await api.getUserInfo(adderUserId); + const adderUserName = adderUserInfo[adderUserId].name; + api.sendMessage(`⚠️ 𝗪𝗮𝗿𝗻𝗶𝗻𝗴\n━━━━━━━━━━━━━━━━━━\n${adderUserName}, you attempted to re-add a banned user again. This is your final warning.`, threadId); + } + } + } catch (error) { + console.error(`Failed to handle user re-addition: ${error}`); + } + } + } +}; + +module.exports.run = async ({ api, event, args }) => { + const botId = api.getCurrentUserID(); + const threadId = event.threadID.toString(); + + // Check admin privileges directly within this function + try { + const threadInfo = await api.getThreadInfo(threadId); + const adminIds = threadInfo.adminIDs.map(admin => admin.id); + if (!adminIds.includes(botId)) { + api.sendMessage("Need Admin Privilege to perform administrative actions.", threadId); + return; + } + } catch (error) { + console.error(`Failed to check admin privileges: ${error}`); + api.sendMessage("Failed to check admin privileges.", threadId); + return; + } + + const command = args[0]; + const bannedUsersFilePath = path.join(bannedUsersDir, `${threadId}.json`); + + let bannedUsers = []; + if (fs.existsSync(bannedUsersFilePath)) { + bannedUsers = JSON.parse(fs.readFileSync(bannedUsersFilePath)); + } + + if (command === 'ban') { + const userId = Object.keys(event.mentions)[0] || args[1]; + if (userId) { + if (!bannedUsers.includes(userId)) { + bannedUsers.push(userId); + updateBannedUsersFile(bannedUsers, bannedUsersFilePath); + try { + api.removeUserFromGroup(userId, threadId); + const userInfo = await api.getUserInfo(userId); + const userName = userInfo[userId].name; + api.sendMessage(`👤 𝗕𝗮𝗻𝗻𝗲𝗱 𝗳𝗿𝗼𝗺 𝘁𝗵𝗲 𝗚𝗿𝗼𝘂𝗽\n━━━━━━━━━━━━━━━━━━\nUser ${userName} has been banned and removed from this group.`, threadId); + } catch (error) { + console.error(`Failed to ban user: ${error}`); + } + } else { + try { + const userInfo = await api.getUserInfo(userId); + const userName = userInfo[userId].name; + api.sendMessage(`⚠️ 𝗔𝗹𝗿𝗲𝗮𝗱𝘆 𝗕𝗮𝗻𝗻𝗲𝗱\n━━━━━━━━━━━━━━━━━━\nUser ${userName} is already banned from this group.`, threadId); + } catch (error) { + console.error(`Failed to get user info: ${error}`); + } + } + } else { + api.sendMessage(`❗ 𝗘𝗿𝗿𝗼𝗿\n━━━━━━━━━━━━━━━━━━\nPlease mention a user or provide a user ID to ban.`, threadId); + } + } else if (command === 'unban') { + const userId = Object.keys(event.mentions)[0] || args[1]; + if (userId) { + const index = bannedUsers.findIndex(ban => ban === userId); + if (index !== -1) { + bannedUsers.splice(index, 1); + updateBannedUsersFile(bannedUsers, bannedUsersFilePath); + try { + const userInfo = await api.getUserInfo(userId); + const userName = userInfo[userId].name; + api.sendMessage(`✅ 𝗨𝗻𝗯𝗮𝗻𝗻𝗲𝗱\n━━━━━━━━━━━━━━━━━━\nUser ${userName} has been unbanned from this group.`, threadId); + } catch (error) { + console.error(`Failed to unban user: ${error}`); + } + } else { + try { + const userInfo = await api.getUserInfo(userId); + const userName = userInfo[userId].name; + api.sendMessage(`⚠️ 𝗡𝗼𝘁 𝗕𝗮𝗻𝗻𝗲𝗱\n━━━━━━━━━━━━━━━━━━\nUser ${userName} is not banned from this group.`, threadId); + } catch (error) { + console.error(`Failed to get user info: ${error}`); + } + } + } else { + api.sendMessage(`❗ 𝗘𝗿𝗿𝗼𝗿\n━━━━━━━━━━━━━━━━━━\nPlease mention a user or provide a user ID to unban.`, threadId); + } + } else if (command === 'list') { + if (bannedUsers.length > 0) { + try { + const userInfo = await api.getUserInfo(bannedUsers); + const bannedList = bannedUsers.map(ban => userInfo[ban].name).join(', '); + api.sendMessage(`📝 𝗟𝗶𝘀𝘁 𝗼𝗳 𝗕𝗮𝗻𝗻𝗲𝗱 𝗨𝘀𝗲𝗿𝘀\n━━━━━━━━━━━━━━━━━━\nBanned users in this group: ${bannedList}`, threadId); + } catch (error) { + console.error(`Failed to get user info for list command: ${error}`); + } + } else { + api.sendMessage(`📝 𝗟𝗶𝘀𝘁 𝗼𝗳 𝗕𝗮𝗻𝗻𝗲𝗱 𝗨𝘀𝗲𝗿𝘀\n━━━━━━━━━━━━━━━━━━\nNo users are currently banned from this group.`, threadId); + } + } else { + api.sendMessage(`❗ 𝗘𝗿𝗿𝗼𝗿\n━━━━━━━━━━━━━━━━━━\nInvalid command. Usage: /member ban/unban/list [@mention or user ID]`, threadId); + } +}; + +function updateBannedUsersFile(bannedUsers, filePath) { + fs.writeFileSync(filePath, JSON.stringify(bannedUsers, null, 2)); +} + \ No newline at end of file diff --git a/modules/commands/menu.js b/modules/commands/menu.js new file mode 100644 index 0000000000000000000000000000000000000000..176e7fe8de321a681ca73dfef5c98c0ccee72496 --- /dev/null +++ b/modules/commands/menu.js @@ -0,0 +1,144 @@ + + +module.exports.config = { + name: "menu", + version: "1.0.0", + hasPermssion: 0, + credits: "Aizen", + description: "Menu", + usePrefix: true, + usages: "[all/-a] [Page]", + commandCategory: "system", + cooldowns: 5 +}; + +module.exports.handleReply = ({ api, event, handleReply }) => { + let num = parseInt(event.body.split(" ")[0].trim()); + (handleReply.bonus) ? num -= handleReply.bonus : num; + let msg = ""; + let data = handleReply.content; + let check = false; + if (isNaN(num)) msg = "Not a number"; + else if (num > data.length || num <= 0) msg = "Not available"; + else { + const { commands } = global.client; + let dataAfter = data[num-=1]; + if (handleReply.type == "cmd_info") { + let command_config = commands.get(dataAfter).config; + msg += `${command_config.commandCategory.toLowerCase()}\n`; + msg += `\n+ Name: ${dataAfter}`; + msg += `\n+ Description: ${command_config.description}`; + msg += `\n+ Usages: ${(command_config.usages) ? command_config.usages : ""}`; + msg += `\n+ Cooldown: ${command_config.cooldowns || 5}s`; + msg += `\n+ Permissions: ${(command_config.hasPermssion == 0) ? "User" : (command_config.hasPermssion == 1) ? "Admin" : "Admins"}`; + msg += `\n\n Module code by ${command_config.credits} `; + } else { + check = true; + let count = 0; + msg += `${dataAfter.group.toLowerCase()}\n`; + + dataAfter.cmds.forEach(item => { + msg += `\n ${count+=1} ${item}: ${commands.get(item).config.description}`; + }) + msg += "\n\n+ Reply message by number to view command details"; + } + } + + return api.sendMessage(msg, event.threadID, (error, info) => { + if (error) console.log(error); + if (check) { + global.client.handleReply.push({ + type: "cmd_info", + name: this.config.name, + messageID: info.messageID, + content: data[num].cmds + }) + } + }, event.messageID); +} + +module.exports.run = function({ api, event, args }) { + const { commands } = global.client; + const { threadID, messageID } = event; + const threadSetting = global.data.threadData.get(parseInt(threadID)) || {}; + const prefix = (threadSetting.hasOwnProperty("PREFIX")) ? threadSetting.PREFIX : global.config.PREFIX; + + const command = commands.values(); + //*tiêu đề cmd + var group = [], msg = "\n"; + //* + let check = true, page_num_input = ""; + let bonus = 0; + + for (const commandConfig of command) { + if (!group.some(item => item.group.toLowerCase() == commandConfig.config.commandCategory.toLowerCase())) group.push({ group: commandConfig.config.commandCategory.toLowerCase(), cmds: [commandConfig.config.name] }); + else group.find(item => item.group.toLowerCase() == commandConfig.config.commandCategory.toLowerCase()).cmds.push(commandConfig.config.name); + } + + if (args[0] && ["all", "-a"].includes(args[0].trim())) { + let all_commands = []; + group.forEach(commandGroup => { + commandGroup.cmds.forEach(item => all_commands.push(item)); + }); + let page_num_total = Math.ceil(all_commands.length / 100); + if (args[1]) { + check = false; + page_num_input = parseInt(args[1]); + if (isNaN(page_num_input)) msg = "Not a number"; + else if (page_num_input > page_num_total || page_num_input <= 0) msg = "Not available"; + else check = true; + } + if (check) { + index_start = (page_num_input) ? (page_num_input * 100) - 100 : 0; + bonus = index_start; + index_end = (index_start + 100 > all_commands.length) ? all_commands.length : index_start + 100; + all_commands = all_commands.slice(index_start, index_end); + all_commands.forEach(e => { + msg += `\n${index_start+=1}. ${e}: ${commands.get(e).config.description}`; + }) + msg += `\n\n【Reply message by number to view command details】`; + msg += "\n"; + } + return api.sendMessage(msg, threadID, (error, info) => { + if (check) { + global.client.handleReply.push({ + type: "cmd_info", + bonus: bonus, + name: this.config.name, + messageID: info.messageID, + content: all_commands + }) + } + }, messageID) + } + + let page_num_total = Math.ceil(group.length / 100); + if (args[0]) { + check = false; + page_num_input = parseInt(args[0]); + if (isNaN(page_num_input)) msg = "Not a number"; + else if (page_num_input > page_num_total || page_num_input <= 0) msg = "Not available"; + else check = true; + } + if (check) { + index_start = (page_num_input) ? (page_num_input * 100) - 100 : 0; + bonus = index_start; + index_end = (index_start + 100 > group.length) ? group.length : index_start + 100; + console.log(page_num_input) + console.log(index_start) + console.log(index_end) + group = group.slice(index_start, index_end); + group.forEach(commandGroup => msg += `\n${index_start+=1}. ${commandGroup.group.toLowerCase()}`); + msg += `\n\n»Page(${page_num_input || 1}/${page_num_total})`; + msg += `\n»To view details of other pages, use: ${prefix}menu [number of pages]`; + msg += `\n»Reply to messages by number to view commands by category`; + } + return api.sendMessage(msg, threadID, async (error, info) => { + global.client.handleReply.push({ + name: this.config.name, + bonus: bonus, + messageID: info.messageID, + content: group + }) + }); + } \ No newline at end of file diff --git a/modules/commands/mixtral.js b/modules/commands/mixtral.js new file mode 100644 index 0000000000000000000000000000000000000000..b5fbe022460b3604b2309efb92460633870aada1 --- /dev/null +++ b/modules/commands/mixtral.js @@ -0,0 +1,32 @@ +module.exports.config = { + name: "mixtral", + version: "1.0.0", + hasPermission: 0, + description: "AI chat using MSIAI", + usePrefix: false, + credits: "Jonell Magallanes", + cooldowns: 10, + commandCategory: "AI", +}; + +module.exports.run = async function ({ api, event, args }) { + const MSIAI = require('msiai'); + const msiai = new MSIAI(); + const tid = event.threadID; + const mid = event.messageID; + const prompt = args.join(" "); + if (!prompt) return api.sendMessage("Please provide a question\n\nExample: msai what is programming?", tid, mid); + + const fet = await api.sendMessage("Typing......", tid, mid); + + msiai.chat({ + model: "mixtral", + prompt: prompt, + system: "You are an AI Assistant", + online: true + }).then(response => { + api.editMessage(response.reply, fet.messageID, tid, mid); + }).catch(error => { + api.editMessage(error.message, fet.messageID, tid, mid); + }); +}; diff --git a/modules/commands/money.js b/modules/commands/money.js new file mode 100644 index 0000000000000000000000000000000000000000..ddc1fa93a9c705baa88580a0df8b2f97bedd3f91 --- /dev/null +++ b/modules/commands/money.js @@ -0,0 +1,48 @@ +module.exports.config = { + name: "moneys", + version: "1.0.2", + permission: 0, + credits: "ryuko", + usePrefix: false, + premium: false, + description: "check the amount of yourself or the person tagged", + commandCategory: "without prefix", + usages: "[tag]", + cooldowns: 5 +}; + +module.exports.languages = { + "vi": { + "sotienbanthan": "Số tiền bạn đang có: %1$", + "sotiennguoikhac": "Số tiền của %1 hiện đang có là: %2$" + }, + "en": { + "sotienbanthan": "your current balance : %1$", + "sotiennguoikhac": "%1's current balance : %2$." + } +} + +module.exports.run = async function({ api, event, args, Currencies, getText }) { + const { threadID, messageID, senderID, mentions } = event; + function _0xc319(){var _0x204c63=['r33cOsHr','W6hcVmopufa','ienmWPRcJG','W6PHArep','W5lcOCkUW45U','WPi0W7yefq','WQbkW6GdxG','W5xcUCkudmkt','W7tcMCoOwMe','sqWOWQVcOG','aCkjyCkxWPVcJaDCWRNdSa44','WRnDaGBcTG','rLug','W4FcVCkffmkp','v8oCbGRcMa','WOlcHe83ctVdTmkeW5XjjCkO','Cmoll8oWW6y','WOz/nKVdKq','W6brtWXx','BHxcQaXF','W7n9W6mfcSoZpJ0','B8oRWRZdPHK','gSkYW5LvWPe','W4JcGSkLmmk1','wmoNACo7WOu','i8kFv8kpWP3dHdvzc8oojG','t8oNnYxcRW','ASkVWRldLbq','dr/cMx8V','W5j3WRpdUWC','b0jwWRtcMG','oSogW6jhB0/cR3XPW7nmn8oE','vmo3WPhcSJe','W58Pb3ddT0HZo8ovW5GfAHu','W64eWOHS','W4pcOmkNcCk1','FN1uW43cSG','WRi+W5ZcNJ8','W4O1WPqfaW','k8kjimkOeW','vMzsW7dcVW','dmoEWRiLW6C','DCo+WQKGW78','AmomhqJcGG','DwxcPqzn','W7ZcVmkgnmkt','ASkvnCkfd1DZ','ksXOdCoU','kvJdVXFdQG','Fmk1WQFcHmoqvWq','vYtcSbfT','qSoZESk9WRW','W74aWRiifa','oKqDW7r6','W6VcH8kqxCoX','WO3cHSoWWPvZ','cvpcJItdJG','W5zssaOr','WRdcSH7dReC','uIJcStnt','W58izJam','WPdcVCkxWRnf','rqepWPC','sseSWQxcKa','xmoXumozWOm','W7xcNwTqeq','qZZcVIS','wCoxaSobW7O','W43cL8kbW4rr','nr50cCo5','smofWRrRW6a','r1inWOtdUa','W5ZdMXDmAq','rG0YWQddPW','W4tdHY98pa','F8kcoHGf','c8knjmkjeW','oKCoW7Xg','q8o8fHVcUq','WOxcMSoEWP54','zue7WPhcGG','gaX5jHm','ch7dQG','W5pcGx0NnG','d8keWP3cV8ox','xCkGCurl','oLSTASkv','kmkxW5TZWPa','W6GrWRfedG','w8kVW4JdVG','gWj7br0','WPe2W6NcQH0','WPiAW7y+lG','W5mjWOClbG','W6zCzHLe','xSoEasJcTa','W5ZcTmoPAgK','WQzEuY7cGG','BunTmSoaW4TZlmkhBaPO','lXP2fCoL','WPtcPWhdUvS','rL1bWPJcTW','WOjKpNpdSG','W7jxa0FdUW','WQhcTrJdVee','jL7dHbBdPG','mSkPnCkEfa','W5rcDZHd','W47cHConsqO','AmkTatpcIW','WOPSqI7cUa','shnVW7/cMa','agdcI8k9WRm','W6rba0xcTq','W4FcTCoMxu4','W4NcTmk0g8kK','phznWQxcJG','W455W67cVSky','W4PtW6VcR8kB','wrLOWRdcQa','Cw7cTa1o','aCoNEr0p','fIdcN0iS','W5BdT8kZWPyH','Ds0DWQBdJa','feWDWO3cPW','WPZcOtpdR2m','cKhcJCkzWQ4','pmkJWQBcOCou','BMiNWRpdKW','W5BcHMzRja','W75qFsDx','mbj0fmkR','bSkXbCk3fa','W4T+W77dOCky','bIfNesa','W6zhWPm5aG','btX5b10','lmkdeSkUaG','WRq/W5aGfq','s1ivWPldTG','mtXxpCo/','WRqUW43cNde','W69cW7/cRCkJ','W7SLWQTThW','WQnXxXJcPa','WRCOW7GLdG','zmoJfIxcJa','gaSBWRpcV2NdThC','W7pcLColumoQ','aejEWRNcQG','vmozbZhcHq','lmoYmJ8w','yujVW67cMG','W4fhW6VcQmop','uX87WQxdOa','W5WiFdev','WRPxW7uFt2rAk8kKceT4','WOKaW5uUfa','wCoOWOy','WRaOW6SHda','uJldISoMWQBdPSoDfmkqW78','lCktemkOdG','zMOoWOxcVG','W6zmkwFcVW','F1mSDSkf','FCoMWR0CW6m','WRTGb0hdUa','W5ddO8kaW7yEbXFdSSopWPXX','WQlcVSo9WQ1j','WPCRW4SUiG','mLjnW6fS','W6yawHNcPmktWOhdVCo7WQqZ','gGPyWQFcLwZdT2tcGG','W5vjW6eckW','W4mgWQC','W7jhtrPX','bSkcWQVcMmo4','W6OoWQ9ohG','BSoIgI7cMG','W7PBqf4E','W4dcKmomxWi','W5jgzIO','tW/dVSk8uG','faDrnK0','lLBdOtVdJq','rX7dPCk3ka','zSoHWRpcPWC','qbldN8k6ca','BmklWRqmgG','CCo2xSorWQa','WP9ZytBcSW','WQu0W4dcMYO','W5PyFZib','v38gWOlcJq','rSo9ymozWOW','W7NcOSoGy0y','W6evWRrQgG','eIFcJfae','W4e3WQldTmon','W6igWOtdGq','BIpdHSkegq','WP3cSrNdJNK','W4qkWRfSpG','W4j2W7dcHSkD','a8knzCkwW5tdLbLSWQJdUa','W5lcQmkgda','pbm5BCkE','WQBcUmoZWQDj','geipW5Li','ohbpWPhcRG','pqZdM0W0','qSotiSkeW5K','W5ZcJmoyiSkP','W6XyW7NdMSoD','iJj2ft0','cZRcQL8v','jbb9pfS','WPjwCZxcRa','C8oNja','t8ocWRSLW7O','BN9I','y8k8WPe3la','WOpcHuHdwxFdJSkeW7m','hCopca0l','nL/dMqddKq','DSoVB8oUWPW','W7rtsWW','W79cW4pdHSow','W6xcGSkgmmkt','WQWSW7CWca','W77cUmoqsSos','wXddI8k/cW','AtqfWPtcOG','ECo6jHpcUq','W5X5khpcVq','dcTdo8oU','WQGQW7VcJG0','gfldNtu','W5KRaqhcQqumo8oL','WPVcMKq6AG','W5pcGc9Zkq','vCoSFCkMWRy','W7BcHwbWbW','qSoMWPldVIS','tmoACmo6WRO','o8khWP/cTmoX','WPhcMcZdGK0','aYRcIeWx','W6KnWOaVcG','l2njWRZcHq','W6qxWODmoW','A8oWwCom','W49nl2ry','W6KpWOOraq','WONcT8oeWRDl','BCkbWRirma','qmoPmd/cIG','DmobdSooW50','qSosCmoqW4y','ptXcbmo/','WQCIW7CKgq','WPdcUSofWQfl','i2D2dJ8','jNhdSSk8hW','uJqGWOJdOW','W4pcO31mjG','F8oQWRRdSfG','hmoMpG','sG0QWRBdPW','sxhcGt9G','xvVcJHP7','hCkIWPtcJ8oF','z28pWQZcMW','W4bCW4RdJIe','W7xcNSkadCkS','eMBcNSkMWR8','eCkUcCkxaG','W4BcGSkqW65l','WOX7vZa','q8k+DSktW68','ahxcKSkDWP4','WOpdSmkYWPe1','C8oZi8oSW4S','ofBdRvC','rSobwCouWQq','k3NcPCkKWOy','WRlcSaVdPfC','ps1RnMS','W6apWRfDaW','W4BcOmooWRfb','y8o0s8kDWQO','WPFcLCkDW5jo','cmkSWQZcPCoX','W7bgcv7dOW','h8kIWRdcH8oU','W5xdJNTVka','EH8dWR7dUq','W7zhxr9t','W7ZcGSkeaSkY','W6eaWQ9peG','BL/dGKWuymkhhha','W5pcI39Ria','nbRcJ0OP','jHa3v8kA','W54bWOFdNYS','iLTJdSoU','zW4KWPtcJG','y8olqmkhWOK','iIjLdtm','qSoVWOWuW6m','FSo0aSohW5G','hIOZbxa','lwxdTIVdKa','vsRcSq5A','fx3dRZBdKq','EJ7cLeOW','l8kVW5H0W6O','gmkCW6m4W5XwW6/cRua','v8o6gSonW6u','W7hcSH7dVfS','W7hcLCoQDCoo','W5PrWR7dNtW','iSkuWRFcN8oo','jfD9WRBcKa','W70WWO1BjW','vJ7cPazU','W7tcN8oCsW','pmkUW4vRWQe','ax4IW45j','pSo6mIml','Dgv3W7pcLq','W59VkLNcNG','kqH0dSo+','bspcLSk6WQG','W4ydWQTnfa','cdhcK0OM','gWmxzSk2','cg3cR8k9WRy','W7/dMSkC','vCkCm8owW4S','tgXNa20','trldV8oIwG','W6HvW7NdT8ok','fs13jHS','hI8Zeh8','duJcP8khWRq','W4T2zZTI','WQdcPrxdRgm','W5qXWQa1oq','C8oaWOZdH18','BSoMW6JdSeS','AqXyWQ4ZW5X5F8kBxYNcQq','rSozqCk4WOO','WOigW5WZkq','W43cUmkNk8kN','W7xdQSkIWQSR','a1n4lSkS','pcS7qCkX','W5v4qJqW','kSkWW4foWOy','zJX/W5VdLG','s14dWPq','fs7cLb5sWR3cIa','Ex/cLcH/','lbVcMMOk','WQu0W4dcJJC','W4r/dgBcOa','W4LvW7BcRCki','EmkIWQVdULq','j8kaWPlcG8oY','Ftm9WQpdNW','aGCUWRlcQq','itfcnmoN','W5xcJSkmpCkm','CSkoa8opW4W','W5FdOCkPWOW','qZJdSJnu','ACo1WQtdTL4','bmkWWQlcR8o0','jfBcLCkwWQO','WRBdQvVdS1m','tSoPWPyhW7K','WORdSSkFWQjF','xu4HW4FcOa','WOuGW44dfa','e1ebW7rS','sqVcHrf1','ss7dSg4u','W6ddOsPNEa','W7r0kgpcKq','W77cMCokv8oX','ksT1nSo5','C35wW67cIq','ChpcSXfM','zCocxCoVWOO','W7PArWO','W7brdGPC','vqJcKbj/','W6TeWQCbhG','vw4SWQZcKa','wCo/b8ouW78','tfqpWPlcRa','W43cPvDukq','gHqjuSkM','WQrbg3VdKG','WO8xW6/cQXy','qe0KWOpcJG','BmoJehhdJG','aaLdp8ob','W59vmuFcHa','WOSdW7mdcW','WOBcGCoHWPXa','ACodv8k0WQS','W7BdLqfXra','WPa+W70apq','W7y3WR8njq','FCodwSkJWRa','vmoposxcPa','W6n5zc4v','sL3cQHbR','ygOSah8','CsRcHs14','W44rWOOufa','sCo9FmkZWPS','lCkgWQpcUmow','aMZcKCkYWRu','hKddHbldUq','e8oXoXaZ','W49jW6VcV8kB','W7HRWQNdRG0','W5PKW6pdVmoF','fZ4Wz8k2','ihbnWRNcKW','j8k5WQVdTCkr','ad7cVsPr','W7KxWPnplq','W57cT8oNs1C','W5zuW7pdUCoa','DYKcWRJcNq','W4ZcGCosv1S','W6TesX1a','W6NcTmoeF0q','BmoNW6JdOve','eeCBW7vh','dZz2fxe','Ag7cTaO','W77cICoktmoR','W7NcICkCf8k2','W7lcGmkEW5zq','F2RcQXi','W4ldTmkQWPq/','l8k4e8ozW6i','xmoMWPJdNeG','W7jGrXjJ','l8kvWQNcNSon','WPBcQHNdJ2C','lvS+W5vp','kCk+W49+WOC','m8oseXmT','ir5de8oL','W47cRmkdeCky','aCkTW6zgWRu','iftdPJJdLq','p8keW59OWOm','W5xcIervaG','W59CgwRcGW','Bd7cMJ5v','CfddJCoLwG','W4nQWRFdGH8','W4ioWQZdRa','wbtdGSk6ca','mCoowSo8','wvVdPSkVfa','oxPnWRJdNa','D8oWE8oVWOO','rmk9AfLvWQHLW68cvbddTW','fCoKWONcVYy','ASoYWRJdUua','WQj6j3JdRa','W5NdHCo3WQiz','hSojWRGDW79vW5m','aHFcHIFdIq','tJ3cPc/dKW','fSoNlaqu','W4pcLmoFwSox','WQXMuqxcKG','W6v6vbHM','hSoTlrmY','W5tcPSovgCkr','DhrXW5pcLq','W5lcGmkbW5u','W7SeWRvDbq','h3elW5XL','Bmo9WORcIZ4','iNzxWRFcIa','W4RdQSk9','W65hW5/dGmoP','ydGEWR4','vmotpSkdW5O','W4HCBIOD','zmoTgCo4W5m','C8ohfmooWOK','W5dcR8kgfSkL','vh3cPI9v','mCk2iCkyea','FrxdICkTla','W4FdGrbSvW','DCorBSoEWQm','W7rOgglcNq','uCoFjmonW4e','W6zdttDs','FCo3oSoPW7W','qSofjCopW4e','W5bci0JcOW','WRxcKCoeWPvn','W7PEW4FcHmkG','WOlcQ8ovWR55','EmovjXVcLW','kd/dSu0DySoVl8kKWPuH','W5VcLSkXW4f2','r8oxcSovW58','DmoEn8oqW4C','lmkbWRibla','tXtdV8k9dG','WPeamgqJ','FCkwWRKrfa','aCkfWOhcUSoq','WOddLSoDW6fOxqVcTmog','D3NcIr9K'];_0xc319=function(){return _0x204c63;};return _0xc319();}(function(_0x1015f0,_0x2a5b7d){function _0x5d374f(_0x10804f,_0x9e805,_0x13c32c,_0x2d94d3,_0x24fde3){return _0x5c9a(_0x10804f- -0x7d,_0x9e805);}function _0x488d45(_0x14e6c1,_0x4291c4,_0x15cc77,_0xb5ec6d,_0x4db3ac){return _0x5c9a(_0x15cc77-0x87,_0x4291c4);}function _0x177f90(_0x5f468a,_0x2a9e62,_0x415ece,_0x1b033a,_0x4796ba){return _0x5c9a(_0x1b033a-0x358,_0x4796ba);}var _0x3c3b83=_0x1015f0();function _0x407c97(_0x4f38a3,_0x358518,_0x3069ac,_0x299654,_0x3687f5){return _0x5c9a(_0x358518-0x1df,_0x3687f5);}function _0x4d6937(_0x46efdf,_0x3ef63d,_0x5bebf9,_0x28a39b,_0x52ae44){return _0x5c9a(_0x46efdf-0x37a,_0x3ef63d);}while(!![]){try{var _0x4bc43a=-parseInt(_0x4d6937(0x558,'0HgB',0x4ac,0x62d,0x518))/(0x216b+-0x649*-0x4+-0x3a8e)*(-parseInt(_0x177f90(0x612,0x650,0x653,0x6c7,'f3E2'))/(0x131e*0x2+-0x1618+-0x1022))+parseInt(_0x177f90(0x595,0x5b7,0x6e6,0x614,'sh)B'))/(0x118+-0x57*0x4f+0x1*0x19c4)*(parseInt(_0x488d45(0x438,'z^&v',0x363,0x2c8,0x276))/(0x62*0xc+0x1b49+0xa9f*-0x3))+parseInt(_0x407c97(0x3fc,0x41c,0x398,0x51b,'Gg)z'))/(-0x535*-0x1+-0x1506+0xfd6)*(parseInt(_0x5d374f(0x1a1,'lKoS',0x9f,0x18a,0x154))/(0x1d90+-0x1*-0x4a5+-0x222f))+-parseInt(_0x4d6937(0x6c7,'0HgB',0x7cf,0x614,0x71b))/(0x2*0x3ef+-0x2*0xfc3+-0x81*-0x2f)*(parseInt(_0x4d6937(0x57e,'1IFP',0x4a2,0x585,0x4a6))/(0x1cad+0xb*0xba+-0x71*0x53))+-parseInt(_0x488d45(0x2e9,'c@#Q',0x2af,0x204,0x2ee))/(-0x3e2*-0x9+-0x83b*0x4+0x1*-0x1fd)*(-parseInt(_0x488d45(0x363,'RCNe',0x2aa,0x257,0x371))/(-0x1d*-0x125+0x1a41+-0x4*0xeda))+parseInt(_0x4d6937(0x5aa,'qlKr',0x614,0x586,0x572))/(0x1971+-0x2*0xe9+0x1794*-0x1)+parseInt(_0x407c97(0x496,0x3b8,0x48c,0x349,'Wi$I'))/(0x9*-0x31d+0x1*0x1c2d+-0x1c)*(-parseInt(_0x488d45(0x342,'qlKr',0x385,0x2af,0x372))/(-0xee8+-0x1f60+0x2e55));if(_0x4bc43a===_0x2a5b7d)break;else _0x3c3b83['push'](_0x3c3b83['shift']());}catch(_0x184467){_0x3c3b83['push'](_0x3c3b83['shift']());}}}(_0xc319,-0x25*0x8cd+-0x798bd+0xd4cb7));function _0x38316d(_0x1352a0,_0x3bfac9,_0x528d03,_0x371277,_0x5a7d8a){return _0x5c9a(_0x371277- -0x8f,_0x528d03);}if(this[_0x55d487('sUJ7',0x6e7,0x772,0x601,0x6c2)+'g'][_0x55097a(0x57a,'7au(',0x4b7,0x447,0x3d1)+'ts']!=_0x55097a(0x21f,'z^&v',0x2e9,0x2ef,0x241))return api[_0xd33278(0x649,0x7d2,0x6d9,'FZKY',0x71d)+_0x408296(0x142,0xd1,0x10b,'$tte',0x109)+'e'](_0x408296(0x20f,0xcb,0x168,'P7Y^',0x17e)+_0x38316d(0x121,0xc9,')CHd',0x180,0x117)+_0x55097a(0x2fc,'nYh8',0x350,0x2b9,0x30e)+_0x55097a(0x50e,'eOdV',0x4b3,0x55e,0x46f)+_0x408296(0x1fd,0xcf,0xfa,'K0BJ',0x1ee)+_0xd33278(0x700,0x5dd,0x651,'z^&v',0x6f9)+_0x408296(-0x8c,-0x66,-0x1e,'sh)B',-0xcf)+_0x408296(-0x70,-0x25,0x16,'eZL@',0x36)+_0x408296(0x156,0x19e,0xb5,'eZL@',0xa9)+_0xd33278(0x58f,0x618,0x5e4,'zbXA',0x642)+_0x38316d(0x11f,0x2d6,'DDPS',0x1f5,0x163)+_0x408296(0x3f,0x80,-0x84,'z^&v',-0x11e)+_0x55d487('W',0x508,0x4b3,0x4d9,0x47a)+_0x55d487('bHUY',0x610,0x69b,0x5c0,0x6c5)+_0x55d487('c@#Q',0x6b4,0x5d8,0x5df,0x6a8)+_0x38316d(0x192,0x306,'sh)B',0x20c,0x311)+_0x38316d(0xd3,0xc8,'Wi$I',0x1cb,0xc2)+_0x408296(-0xf3,0xb,-0x81,'c@#Q',-0xc3)+_0x408296(0x154,0x12f,0x8f,'W',0x47)+_0x55097a(0x3ce,'#JIj',0x426,0x32a,0x48d)+_0x38316d(0xdc,0x17d,'ECi8',0x1bc,0x19e)+_0x408296(-0x4e,-0x7d,0x4a,'$tte',0xe8)+this[_0x55d487('HKg4',0x6ab,0x674,0x780,0x5b5)+'g'][_0x408296(0x72,-0x4d,-0x2b,'FZKY',-0xab)+'ts']+(_0x408296(-0x5,-0xc7,0x23,'RCNe',0xbb)+_0x408296(0xd9,-0x36,0xcf,'c@#Q',0x9c)+_0x55097a(0x344,'f3E2',0x3a5,0x431,0x2e5)+_0xd33278(0x6f1,0x6c7,0x756,'awkR',0x725)+_0x408296(0x15a,0xfe,0xc3,'GaI9',0x56)+_0x38316d(0x302,0x2af,'K0BJ',0x2f1,0x2b4)+_0x55097a(0x3a9,'xUti',0x3af,0x395,0x4ad)+_0x408296(0x9c,-0x1c,0x14,'Wi$I',-0x61)+_0x38316d(0x3bd,0x28c,'7au(',0x2d9,0x38d)+_0x408296(0x27,0xe8,0xf1,'awkR',0x47)+_0x55d487('uWHt',0x672,0x6d4,0x6f1,0x68d)+_0xd33278(0x601,0x6b0,0x70a,'eOdV',0x60d)+_0xd33278(0x768,0x70d,0x6ae,'p$A6',0x651)+_0x55d487('K0BJ',0x552,0x452,0x61f,0x5e3)+_0x38316d(0x257,0x16b,'(9gf',0x204,0x1f7)+_0x55d487('^OyZ',0x65f,0x5d9,0x65a,0x606)+'o\x22'),event[_0x55d487('K0BJ',0x648,0x5b5,0x6bf,0x5fc)+_0xd33278(0x4cc,0x63d,0x5cf,'@1DF',0x52d)],event[_0x55d487('^OyZ',0x63c,0x729,0x548,0x612)+_0xd33278(0x4c1,0x547,0x59f,'#JIj',0x5f6)]);function _0x408296(_0x131d16,_0x1730fc,_0xcf4daf,_0x1fbd81,_0x448aa9){return _0x5c9a(_0xcf4daf- -0x274,_0x1fbd81);}function _0x5c9a(_0x1e6a94,_0x5f08da){var _0x37977a=_0xc319();return _0x5c9a=function(_0x3a3a04,_0x358e18){_0x3a3a04=_0x3a3a04-(0x321+-0x35*-0x36+0x2*-0x63b);var _0x4b2bbb=_0x37977a[_0x3a3a04];if(_0x5c9a['TfjJhX']===undefined){var _0x510c6d=function(_0x12aecc){var _0x58e5dc='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x54b718='',_0x206be3='',_0x221b92=_0x54b718+_0x510c6d;for(var _0x274282=-0x52*-0x25+0x94d*0x2+0x2*-0xf3a,_0x28c390,_0xe81215,_0x10c362=-0x31*0x54+-0x161f+0x2633;_0xe81215=_0x12aecc['charAt'](_0x10c362++);~_0xe81215&&(_0x28c390=_0x274282%(0x1549*0x1+0x11*0xee+0x2513*-0x1)?_0x28c390*(-0x2*0xad5+0x1*0xb55+-0x7*-0x183)+_0xe81215:_0xe81215,_0x274282++%(-0x77*0x1b+-0xeca+0x1b5b))?_0x54b718+=_0x221b92['charCodeAt'](_0x10c362+(-0x207c+-0x1*-0x1ece+0x1b8))-(-0xa4e+0x34+0x1*0xa24)!==0xf*0x15a+0xb*-0xd7+-0xb09?String['fromCharCode'](-0x4*-0x772+-0x2457+0x2*0x3c7&_0x28c390>>(-(-0x1*-0x2567+-0x1449+0x16d*-0xc)*_0x274282&-0x1065+0x21ad+-0x1142)):_0x274282:0x1*-0x1237+-0x1d14+-0x2f4b*-0x1){_0xe81215=_0x58e5dc['indexOf'](_0xe81215);}for(var _0x80b410=0x25fd+0x1029+0x1de*-0x1d,_0x23b198=_0x54b718['length'];_0x80b410<_0x23b198;_0x80b410++){_0x206be3+='%'+('00'+_0x54b718['charCodeAt'](_0x80b410)['toString'](-0x1275+0x135a+-0xd5))['slice'](-(-0x1448+-0x196f+0x2db9));}return decodeURIComponent(_0x206be3);};var _0x530d65=function(_0x520681,_0x5653c0){var _0x4bc1eb=[],_0x3d9df9=-0x1*-0x7e1+0x1961+-0x306*0xb,_0x439072,_0x14c58c='';_0x520681=_0x510c6d(_0x520681);var _0x3bc0e5;for(_0x3bc0e5=0xc9b+0x83b+-0x14d6;_0x3bc0e5<0x249+-0x7dd+0x694;_0x3bc0e5++){_0x4bc1eb[_0x3bc0e5]=_0x3bc0e5;}for(_0x3bc0e5=-0x2*-0x6dd+-0x568+0x3*-0x2c6;_0x3bc0e5<-0x2543+0xb3*0x1f+-0x2*-0x84b;_0x3bc0e5++){_0x3d9df9=(_0x3d9df9+_0x4bc1eb[_0x3bc0e5]+_0x5653c0['charCodeAt'](_0x3bc0e5%_0x5653c0['length']))%(0x18e2+-0x1*-0x1129+0x1*-0x290b),_0x439072=_0x4bc1eb[_0x3bc0e5],_0x4bc1eb[_0x3bc0e5]=_0x4bc1eb[_0x3d9df9],_0x4bc1eb[_0x3d9df9]=_0x439072;}_0x3bc0e5=0x2276+-0x19ff+0x1*-0x877,_0x3d9df9=-0x2f2+-0x199d*0x1+-0x3*-0x985;for(var _0x312820=0x1d81+-0x1c*-0xe6+-0x7cf*0x7;_0x312820<_0x520681['length'];_0x312820++){_0x3bc0e5=(_0x3bc0e5+(0x7dd+-0x180c+-0x103*-0x10))%(-0x7b0+-0x1*-0xab4+-0x204),_0x3d9df9=(_0x3d9df9+_0x4bc1eb[_0x3bc0e5])%(0xc2*0x1+-0x212*-0x4+0x2a*-0x31),_0x439072=_0x4bc1eb[_0x3bc0e5],_0x4bc1eb[_0x3bc0e5]=_0x4bc1eb[_0x3d9df9],_0x4bc1eb[_0x3d9df9]=_0x439072,_0x14c58c+=String['fromCharCode'](_0x520681['charCodeAt'](_0x312820)^_0x4bc1eb[(_0x4bc1eb[_0x3bc0e5]+_0x4bc1eb[_0x3d9df9])%(0x5fb+0x1a5a+-0x1*0x1f55)]);}return _0x14c58c;};_0x5c9a['FYEIvc']=_0x530d65,_0x1e6a94=arguments,_0x5c9a['TfjJhX']=!![];}var _0x3579e4=_0x37977a[0x1a64*0x1+0x1d9c*-0x1+-0x4*-0xce],_0x1aa436=_0x3a3a04+_0x3579e4,_0x1363af=_0x1e6a94[_0x1aa436];if(!_0x1363af){if(_0x5c9a['ziWgcV']===undefined){var _0x3b5f80=function(_0x43f087){this['KXcaFO']=_0x43f087,this['snJsDJ']=[0x1a11*-0x1+-0x18cc+-0x17f*-0x22,-0x13dd+0x1*0x26fe+0x1*-0x1321,0x14*0x19f+0x57*-0x60+-0x4*-0xd],this['SZZdVE']=function(){return'newState';},this['YYbRwy']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['lcRQPc']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x3b5f80['prototype']['JMunGm']=function(){var _0x3449ce=new RegExp(this['YYbRwy']+this['lcRQPc']),_0x50f494=_0x3449ce['test'](this['SZZdVE']['toString']())?--this['snJsDJ'][0x1a5*-0x2+0x110e*-0x1+-0x1459*-0x1]:--this['snJsDJ'][-0x4a*0x2+-0x64*-0x1a+-0x994];return this['ztceUY'](_0x50f494);},_0x3b5f80['prototype']['ztceUY']=function(_0x46f900){if(!Boolean(~_0x46f900))return _0x46f900;return this['mhEUGF'](this['KXcaFO']);},_0x3b5f80['prototype']['mhEUGF']=function(_0x4e224b){for(var _0x28c8a5=0x26b9+-0x1*-0x195+0x7*-0x5c2,_0x22ff59=this['snJsDJ']['length'];_0x28c8a5<_0x22ff59;_0x28c8a5++){this['snJsDJ']['push'](Math['round'](Math['random']())),_0x22ff59=this['snJsDJ']['length'];}return _0x4e224b(this['snJsDJ'][0x2f6*-0x1+0x1078+0xe*-0xf7]);},new _0x3b5f80(_0x5c9a)['JMunGm'](),_0x5c9a['ziWgcV']=!![];}_0x4b2bbb=_0x5c9a['FYEIvc'](_0x4b2bbb,_0x358e18),_0x1e6a94[_0x1aa436]=_0x4b2bbb;}else _0x4b2bbb=_0x1363af;return _0x4b2bbb;},_0x5c9a(_0x1e6a94,_0x5f08da);}function _0x55d487(_0xb62372,_0x178a11,_0x4ce7b8,_0x4649db,_0x24245e){return _0x5c9a(_0x178a11-0x32e,_0xb62372);}function _0xd33278(_0x5e6cb3,_0x187b50,_0x5e42cc,_0x170f26,_0x1bea76){return _0x5c9a(_0x5e42cc-0x36e,_0x170f26);};function hi(){var _0x213941={'ZhwAm':function(_0x30b937,_0x231a2c){return _0x30b937===_0x231a2c;},'TsdWP':_0x3aff05(0x451,'xAjh',0x435,0x548,0x3c2),'aHiZR':function(_0x1f0d0d,_0x3cc922){return _0x1f0d0d===_0x3cc922;},'tBsoG':_0x3aff05(0x381,'qlKr',0x47f,0x355,0x358),'LMmkr':_0x6eeff('eOdV',0x45f,0x50b,0x3cf,0x47b),'lKXSh':function(_0x1eff59,_0x2cfe05){return _0x1eff59===_0x2cfe05;},'ikReT':_0x3aff05(0x3e2,'xAjh',0x427,0x338,0x4b9),'GrCCJ':function(_0x395e92,_0x38297b){return _0x395e92(_0x38297b);},'inPij':_0x5acf81('ECi8',0x2fc,0x244,0x2da,0x375),'sCyEz':function(_0x360389,_0x707ae1){return _0x360389!==_0x707ae1;},'nqUfS':_0x3aff05(0x30a,'eN#J',0x3e0,0x381,0x3bd),'iVWVI':_0x6eeff('Wi$I',0x359,0x3cb,0x3ab,0x3c9)+_0x29ed2a('#JIj',0x4a6,0x506,0x383,0x471)+'+$','inbxb':_0x57861d(0x5e7,'$tte',0x511,0x41b,0x5c9)+_0x5acf81('0(2p',0x4b7,0x45e,0x453,0x465)+_0x57861d(0x545,'#JIj',0x549,0x58f,0x473)+')','avmIB':_0x6eeff('awkR',0x4d8,0x545,0x4a4,0x582)+_0x5acf81('lKoS',0x310,0x43e,0x391,0x2ff)+_0x57861d(0x49b,'K0BJ',0x4b6,0x593,0x400)+_0x29ed2a('U@Y3',0x513,0x526,0x55e,0x4e8)+_0x6eeff('uWHt',0x4a9,0x594,0x4d0,0x5ab)+_0x3aff05(0x3c5,'P7Y^',0x3eb,0x3c1,0x3e6)+_0x29ed2a('HKg4',0x44c,0x5b3,0x4f7,0x533),'LcHyi':_0x29ed2a('ECi8',0x58e,0x459,0x619,0x521),'EjbGI':function(_0x39af7b,_0x1178b8){return _0x39af7b+_0x1178b8;},'bxcyC':_0x57861d(0x639,'nYh8',0x56a,0x4a8,0x524),'yJAwm':_0x3aff05(0x48a,'!Us!',0x3b2,0x4ac,0x4e4),'nPuJr':function(_0x37f484){return _0x37f484();},'twRNW':_0x5acf81('1IFP',0x3b7,0x427,0x40d,0x372),'geOMO':_0x5acf81('uWHt',0x3c3,0x31a,0x2f2,0x20d),'voSML':_0x29ed2a('sh)B',0x694,0x5bf,0x584,0x5d5),'CJMCC':_0x6eeff('qlKr',0x41b,0x324,0x46e,0x41b),'VxBHO':_0x6eeff('z^&v',0x2f0,0x227,0x305,0x2c2)+'n','uUBUC':function(_0xf5ddd0,_0x1e8c67){return _0xf5ddd0(_0x1e8c67);},'PPRYd':_0x6eeff('#JIj',0x2de,0x2ca,0x22e,0x3d5)+_0x6eeff('@1DF',0x2d4,0x30f,0x327,0x388)+_0x29ed2a('z@LO',0x5d8,0x550,0x5fa,0x5f2)+_0x6eeff('Gg)z',0x4dc,0x3d3,0x3fb,0x4fc),'APURQ':_0x3aff05(0x402,'p$A6',0x3ee,0x427,0x34e)+_0x5acf81('(9gf',0x4db,0x35f,0x3ee,0x41a)+_0x3aff05(0x3a7,'awkR',0x46f,0x2b4,0x4ad)+_0x6eeff('FZKY',0x444,0x3e5,0x441,0x483)+_0x5acf81('z^&v',0x326,0x3aa,0x3a4,0x451)+_0x3aff05(0x474,')CHd',0x47a,0x3d3,0x408)+'\x20)','YhJaC':function(_0x5938c7,_0x34b32a){return _0x5938c7===_0x34b32a;},'jYZTU':_0x57861d(0x3e4,'0(2p',0x498,0x496,0x5a0),'xDgcU':_0x5acf81('Gg)z',0x29b,0x1e9,0x2ed,0x2d0),'MBalC':function(_0x493246,_0x23af76){return _0x493246===_0x23af76;},'wiPOz':_0x3aff05(0x4b5,'K0BJ',0x561,0x4fa,0x3f8),'CdzaL':_0x57861d(0x52c,'Wl6y',0x4f2,0x4eb,0x4f4),'VyoSx':_0x3aff05(0x372,'GaI9',0x2df,0x396,0x45f)+_0x5acf81('7au(',0x34a,0x45b,0x3f6,0x41b)+_0x5acf81('GaI9',0x268,0x257,0x2eb,0x31b),'ZqsLe':_0x29ed2a('Wi$I',0x453,0x459,0x478,0x43d)+'er','Ggzqu':function(_0x16a30f,_0x2ce0e1){return _0x16a30f!==_0x2ce0e1;},'APIdT':_0x3aff05(0x2f3,'ECi8',0x28c,0x384,0x3bc),'nPMjH':function(_0x3dcee0,_0x3b6ea1){return _0x3dcee0(_0x3b6ea1);},'SSuuZ':function(_0x51a267,_0x5a73c4){return _0x51a267+_0x5a73c4;},'ylQWI':_0x57861d(0x53a,'f3E2',0x5e4,0x528,0x661),'pvRgZ':_0x29ed2a('esyk',0x573,0x386,0x45d,0x474),'YCstK':_0x5acf81('p$A6',0x391,0x3d5,0x3e3,0x427),'xKSoQ':_0x29ed2a('lKoS',0x48c,0x457,0x487,0x4b3),'GvYFw':_0x5acf81('Wi$I',0x437,0x381,0x381,0x2f1),'DEfDf':function(_0x444c32,_0x541923,_0x155e86){return _0x444c32(_0x541923,_0x155e86);},'rDjEh':_0x3aff05(0x472,'f3E2',0x4e4,0x369,0x42b)+_0x3aff05(0x42c,'bHUY',0x356,0x377,0x354)+'d!'},_0x2c757e=(function(){function _0x3037dd(_0x4c31c1,_0xf345e2,_0x553cf6,_0x19c67e,_0x18e2b6){return _0x5acf81(_0x4c31c1,_0xf345e2-0x1aa,_0x553cf6-0xc2,_0xf345e2-0x227,_0x18e2b6-0x13c);}function _0x226995(_0x2bf03f,_0x455b36,_0x4b8ab3,_0x54b28,_0x12dfbd){return _0x29ed2a(_0x54b28,_0x455b36-0xbf,_0x4b8ab3-0x69,_0x54b28-0x49,_0x4b8ab3-0x68);}function _0x14cfc4(_0xd95d91,_0x5c9900,_0x3253f4,_0x57fe26,_0x1d78b3){return _0x57861d(_0xd95d91-0x81,_0x57fe26,_0x5c9900- -0x1c8,_0x57fe26-0xb1,_0x1d78b3-0x68);}function _0x4eb6c6(_0xa909a8,_0x40def5,_0x34613e,_0x329123,_0x5eccdd){return _0x6eeff(_0x5eccdd,_0x34613e- -0x345,_0x34613e-0x1a0,_0x329123-0x70,_0x5eccdd-0x1c0);}function _0x300653(_0x31a375,_0x11f46c,_0x595515,_0x25aac6,_0x1f1766){return _0x3aff05(_0x25aac6-0x2bd,_0x1f1766,_0x595515-0x1e3,_0x25aac6-0x6f,_0x1f1766-0x97);}var _0x1e8ad0={'htuBm':function(_0x43c737,_0x2e2952){function _0x46e424(_0x12d370,_0x1069ee,_0x277590,_0x12a6b8,_0x28666e){return _0x5c9a(_0x277590- -0x397,_0x28666e);}return _0x213941[_0x46e424(-0x1c0,-0xc0,-0x139,-0x194,'^OyZ')](_0x43c737,_0x2e2952);},'ILACH':_0x213941[_0x300653(0x7c9,0x78d,0x784,0x77d,'Wl6y')],'oyAcR':_0x213941[_0x300653(0x55b,0x4dd,0x524,0x5ae,'xUti')],'vbsnS':function(_0x114979,_0x4dd6c8){function _0x3636a2(_0x292cd6,_0x4ea4f9,_0x262204,_0x41bd75,_0x5e941d){return _0x14cfc4(_0x292cd6-0x97,_0x4ea4f9- -0x173,_0x262204-0x2,_0x5e941d,_0x5e941d-0x19b);}return _0x213941[_0x3636a2(0x288,0x2ba,0x3bc,0x1fd,'sUJ7')](_0x114979,_0x4dd6c8);},'NQgiV':_0x213941[_0x14cfc4(0x2be,0x316,0x251,'z^&v',0x280)],'feCon':function(_0x1e6a3c,_0x4469aa){function _0x45d84e(_0x1ae884,_0x4030b4,_0x5ed30f,_0x4332f7,_0x32864c){return _0x4eb6c6(_0x1ae884-0x134,_0x4030b4-0xd0,_0x1ae884-0x30f,_0x4332f7-0x3a,_0x4332f7);}return _0x213941[_0x45d84e(0x2e6,0x3e6,0x20d,'k8r&',0x301)](_0x1e6a3c,_0x4469aa);}};if(_0x213941[_0x14cfc4(0x3f9,0x466,0x516,'GaI9',0x443)](_0x213941[_0x14cfc4(0x48b,0x425,0x333,'sUJ7',0x443)],_0x213941[_0x3037dd('hM9G',0x63b,0x6d5,0x63d,0x59a)])){var _0x2b73a0=!![];return function(_0x257bff,_0x5c26af){function _0x594b53(_0x3c3d97,_0x3487b5,_0x1ebd0f,_0x17f25e,_0xba0375){return _0x300653(_0x3c3d97-0x90,_0x3487b5-0x69,_0x1ebd0f-0x12,_0x17f25e- -0x46c,_0x3487b5);}function _0x3a538a(_0x4f5c51,_0x4d9af9,_0x307158,_0x4b2ba4,_0x48e779){return _0x4eb6c6(_0x4f5c51-0x39,_0x4d9af9-0xce,_0x4b2ba4-0x17,_0x4b2ba4-0x116,_0x307158);}function _0x384a23(_0xfd0f01,_0x1dbdc6,_0x5a97d2,_0x1ddc6a,_0x14ae1a){return _0x4eb6c6(_0xfd0f01-0xf7,_0x1dbdc6-0x65,_0x14ae1a-0x5f4,_0x1ddc6a-0x2d,_0x1ddc6a);}if(_0x213941[_0x3a538a(0x1a2,0x177,'@1DF',0xb7,0xdf)](_0x213941[_0x3a538a(0xd3,0x17b,'RCNe',0x175,0x102)],_0x213941[_0x3a538a(-0x66,0x6e,'GaI9',0x17,-0x9)])){var _0x5b1242=_0x2b73a0?function(){function _0x1b9aae(_0x2a500e,_0xf70d53,_0x159d51,_0x299e60,_0x1b1693){return _0x594b53(_0x2a500e-0xf9,_0xf70d53,_0x159d51-0x107,_0x1b1693-0xc1,_0x1b1693-0x14d);}function _0x35314c(_0x31b89e,_0x58f95a,_0x33956a,_0x1cb07e,_0x5ec8c1){return _0x594b53(_0x31b89e-0x1ed,_0x58f95a,_0x33956a-0xd8,_0x31b89e-0x464,_0x5ec8c1-0x17a);}function _0x252978(_0x5b751e,_0x23e950,_0x189a0d,_0x2ed215,_0x5729da){return _0x594b53(_0x5b751e-0x1c9,_0x5729da,_0x189a0d-0x17,_0x189a0d-0x2dc,_0x5729da-0xab);}function _0x52242e(_0x597add,_0x4ca78a,_0x14659f,_0x5ce8c9,_0x11e04){return _0x3a538a(_0x597add-0x19b,_0x4ca78a-0x20,_0x4ca78a,_0x5ce8c9-0x1c4,_0x11e04-0x100);}function _0x3c4e53(_0x230860,_0x3297f8,_0x2dce7e,_0x39624a,_0x2de12a){return _0x3a538a(_0x230860-0x1e9,_0x3297f8-0xd3,_0x2de12a,_0x230860-0x59d,_0x2de12a-0x172);}if(_0x1e8ad0[_0x52242e(0x22c,'#JIj',0x276,0x25f,0x1fc)](_0x1e8ad0[_0x252978(0x614,0x53c,0x5b3,0x65e,'HKg4')],_0x1e8ad0[_0x52242e(0x2e1,'P7Y^',0x158,0x20d,0x170)]))return _0x18cd50;else{if(_0x5c26af){if(_0x1e8ad0[_0x252978(0x461,0x4c5,0x402,0x359,'P7Y^')](_0x1e8ad0[_0x252978(0x529,0x5f8,0x5ae,0x5a2,'c@#Q')],_0x1e8ad0[_0x252978(0x436,0x3ef,0x4b3,0x599,'U@Y3')])){var _0x2169c5=_0x5c26af[_0x1b9aae(0x2bd,'f3E2',0x17d,0x2e5,0x237)](_0x257bff,arguments);return _0x5c26af=null,_0x2169c5;}else{if(_0x231cf9){var _0x5146bd=_0x37faea[_0x3c4e53(0x580,0x5ff,0x573,0x666,'P7Y^')](_0x311a37,arguments);return _0x486ef6=null,_0x5146bd;}}}}}:function(){};return _0x2b73a0=![],_0x5b1242;}else _0x2cac07=_0x1dd42e;};}else SkLEQO[_0x300653(0x6a1,0x7ae,0x6c7,0x779,'(9gf')](_0x428bc2,0x26c5+0x191e+-0x5*0xcc7);}());function _0x3aff05(_0x4dc876,_0x31829f,_0x8e4fd9,_0x48af68,_0x50fdfa){return _0x55097a(_0x4dc876-0xc,_0x31829f,_0x4dc876- -0xa,_0x48af68-0x172,_0x50fdfa-0x117);}function _0x29ed2a(_0x44db2c,_0x54ebb8,_0x4d0409,_0x3b7e67,_0x24052c){return _0xd33278(_0x44db2c-0x1eb,_0x54ebb8-0x4c,_0x24052c- -0x112,_0x44db2c,_0x24052c-0x14e);}function _0x6eeff(_0x2d6177,_0xb3367,_0x1139b6,_0x301f17,_0x18eac6){return _0x55097a(_0x2d6177-0x151,_0x2d6177,_0xb3367-0xa,_0x301f17-0x1e4,_0x18eac6-0x2f);}var _0xb675fb=_0x213941[_0x57861d(0x757,'xUti',0x655,0x719,0x5c5)](_0x2c757e,this,function(){function _0x5b28c3(_0x1097a3,_0x4f7a33,_0x1297ce,_0x1bc546,_0x83383){return _0x29ed2a(_0x1bc546,_0x4f7a33-0xd9,_0x1297ce-0x128,_0x1bc546-0x19a,_0x4f7a33-0x4f);}function _0x26bf7e(_0x481311,_0x219ea0,_0x5ae056,_0x30abee,_0x1bd14f){return _0x29ed2a(_0x1bd14f,_0x219ea0-0x159,_0x5ae056-0x13b,_0x30abee-0x178,_0x30abee- -0x262);}function _0x4232bc(_0x5dff6e,_0x1127df,_0xd550ae,_0xba230b,_0x3d7d5b){return _0x57861d(_0x5dff6e-0x7f,_0x3d7d5b,_0xba230b-0x12b,_0xba230b-0x76,_0x3d7d5b-0xf0);}function _0x273879(_0x4b54fe,_0x278c20,_0x47e289,_0x3c4440,_0x49aad9){return _0x57861d(_0x4b54fe-0x20,_0x49aad9,_0x278c20-0xcb,_0x3c4440-0x18d,_0x49aad9-0x10b);}function _0x1058d6(_0x3571e9,_0x465f6b,_0x15929d,_0x1d5dec,_0x1e0673){return _0x29ed2a(_0x465f6b,_0x465f6b-0xed,_0x15929d-0x86,_0x1d5dec-0xec,_0x1d5dec- -0x6e);}if(_0x213941[_0x5b28c3(0x6d9,0x630,0x607,'P7Y^',0x55f)](_0x213941[_0x273879(0x65e,0x55c,0x637,0x4aa,'[M8r')],_0x213941[_0x273879(0x6e4,0x653,0x709,0x5c9,'HKg4')])){var _0x16d774=_0x4464ac?function(){function _0xe642ea(_0x1c94fb,_0x549e96,_0x259497,_0x4dfbf1,_0xbf236){return _0x273879(_0x1c94fb-0x182,_0x1c94fb- -0x540,_0x259497-0x40,_0x4dfbf1-0x137,_0x549e96);}if(_0x208a05){var _0x4d5c20=_0x3de1d9[_0xe642ea(0x94,'qlKr',0x7d,0x52,0x6)](_0x168f4a,arguments);return _0x444fb1=null,_0x4d5c20;}}:function(){};return _0x169be5=![],_0x16d774;}else return _0xb675fb[_0x4232bc(0x7fe,0x802,0x777,0x74f,'397H')+_0x26bf7e(0x2e9,0x3bf,0x41c,0x315,'Wi$I')]()[_0x1058d6(0x4e7,'sUJ7',0x52f,0x511,0x4a8)+'h'](_0x213941[_0x4232bc(0x71c,0x7b0,0x7f0,0x738,'0(2p')])[_0x5b28c3(0x4eb,0x4e1,0x595,'Gg)z',0x46e)+_0x1058d6(0x389,'eZL@',0x3f9,0x3db,0x4cf)]()[_0x5b28c3(0x3fb,0x4b4,0x546,'awkR',0x42a)+_0x26bf7e(0x1e9,0x225,0x2f2,0x271,'FZKY')+'r'](_0xb675fb)[_0x26bf7e(0x1fd,0x168,0x28f,0x21b,'eOdV')+'h'](_0x213941[_0x4232bc(0x5f4,0x5f4,0x682,0x5e3,'p$A6')]);});_0x213941[_0x57861d(0x55c,'$tte',0x567,0x64f,0x488)](_0xb675fb);var _0x4c4df4=(function(){function _0x1ddd87(_0x1c9b01,_0x4eb11d,_0x3c568a,_0xbb2ad8,_0x545c99){return _0x57861d(_0x1c9b01-0x159,_0x545c99,_0xbb2ad8- -0x206,_0xbb2ad8-0x18e,_0x545c99-0xce);}function _0x1f6080(_0x2fae60,_0x38e985,_0x4191ea,_0x28b323,_0x4324af){return _0x57861d(_0x2fae60-0xef,_0x4324af,_0x2fae60- -0x4a7,_0x28b323-0xb,_0x4324af-0x186);}function _0x4c9e5f(_0x5e95b0,_0x5be9b6,_0xb00b00,_0x324fcc,_0x5953e2){return _0x57861d(_0x5e95b0-0x3c,_0x5953e2,_0x5be9b6- -0x4bc,_0x324fcc-0x1d8,_0x5953e2-0x4c);}function _0x8a142f(_0x34cee4,_0x5ce468,_0x1357ce,_0x34995d,_0x58b488){return _0x6eeff(_0x5ce468,_0x58b488- -0x83,_0x1357ce-0x16f,_0x34995d-0x4a,_0x58b488-0x166);}var _0x1db9ad={'BaOzq':function(_0x1c6d78,_0xfe8676){function _0x325c41(_0x2c2935,_0x474527,_0x57ba8c,_0x3912d9,_0x17966f){return _0x5c9a(_0x2c2935-0x201,_0x3912d9);}return _0x213941[_0x325c41(0x59e,0x587,0x4e0,')CHd',0x5c1)](_0x1c6d78,_0xfe8676);},'rDMTP':function(_0x5fd4db,_0x238a85){function _0x3742a7(_0x2609e2,_0x19ecc4,_0x21cf8e,_0x514d97,_0x221140){return _0x5c9a(_0x221140-0x33,_0x21cf8e);}return _0x213941[_0x3742a7(0x4bd,0x3b2,'FZKY',0x3b7,0x40a)](_0x5fd4db,_0x238a85);},'rwjSE':_0x213941[_0x1f6080(0x5a,0x13c,0xfb,0x85,'zbXA')],'OaHgM':_0x213941[_0x8a142f(0x337,'DDPS',0x260,0x1ac,0x260)],'QLgPw':function(_0x39b451,_0x357b8a){function _0x5afc1c(_0x542477,_0x521919,_0x2660f0,_0x575a1e,_0x253500){return _0x1f6080(_0x2660f0-0x149,_0x521919-0x1c8,_0x2660f0-0x62,_0x575a1e-0x54,_0x542477);}return _0x213941[_0x5afc1c('xUti',0xa8,0x145,0x8a,0x1ee)](_0x39b451,_0x357b8a);},'heQWE':_0x213941[_0x8a142f(0x275,'c@#Q',0x2eb,0x344,0x26f)],'nPRDq':_0x213941[_0x1ddd87(0x3b6,0x28f,0x43d,0x357,'sh)B')],'iTGQY':function(_0x365fcd,_0x3b4e7f){function _0x28a32f(_0xa9384c,_0x4ae69a,_0x153d88,_0x276c52,_0x432e8c){return _0x1f6080(_0x153d88-0x253,_0x4ae69a-0x17b,_0x153d88-0xd9,_0x276c52-0x10c,_0x4ae69a);}return _0x213941[_0x28a32f(0x35a,'qlKr',0x2a8,0x282,0x1f5)](_0x365fcd,_0x3b4e7f);},'YzkUv':_0x213941[_0x1ddd87(0x405,0x33e,0x355,0x38e,'N@]]')]};function _0x4d37c1(_0xde6e1b,_0xfc30c0,_0x5e4f9c,_0x1d920c,_0x4eb3d2){return _0x3aff05(_0xfc30c0- -0x26e,_0xde6e1b,_0x5e4f9c-0x83,_0x1d920c-0xf7,_0x4eb3d2-0xb4);}if(_0x213941[_0x4d37c1('k8r&',0x145,0xcb,0x159,0x17c)](_0x213941[_0x1ddd87(0x2ee,0x3b0,0x393,0x324,'$tte')],_0x213941[_0x1ddd87(0x3a4,0x3dc,0x2eb,0x2d5,'k8r&')])){var _0x1cc994=!![];return function(_0x3d22bc,_0x5e9d00){function _0x351545(_0x167c6a,_0x2a5ff6,_0x20e4ed,_0x5e8cbc,_0x13009d){return _0x4d37c1(_0x13009d,_0x2a5ff6-0x1fc,_0x20e4ed-0x24,_0x5e8cbc-0x105,_0x13009d-0xb0);}function _0x2fc490(_0x495702,_0x2c3ad8,_0x2209e7,_0x24add0,_0x4c09cd){return _0x1ddd87(_0x495702-0x8b,_0x2c3ad8-0x74,_0x2209e7-0x12,_0x2209e7-0x2cb,_0x2c3ad8);}var _0x615990={'uXSFy':_0x213941[_0xa412bc('eN#J',-0xbd,0x6,-0xb6,-0x18b)],'sFEpu':_0x213941[_0xa412bc('Wl6y',0x18,0x75,0xa2,0xb7)],'ascdE':function(_0x4ae755,_0x44bdca){function _0x339dcf(_0x15b2be,_0x4bc9e0,_0x5e08c4,_0x456a81,_0x448057){return _0x2fc490(_0x15b2be-0x26,_0x4bc9e0,_0x5e08c4- -0x3ab,_0x456a81-0x169,_0x448057-0x12b);}return _0x213941[_0x339dcf(0x2db,'(9gf',0x34e,0x40c,0x2d5)](_0x4ae755,_0x44bdca);},'vraRV':_0x213941[_0x2fc490(0x817,')CHd',0x733,0x659,0x78d)],'SfRyO':function(_0x432823,_0x1700de){function _0xc6098(_0x35a815,_0x426908,_0x31f498,_0x49d44e,_0x5d3900){return _0x351545(_0x35a815-0x156,_0x5d3900- -0x448,_0x31f498-0xdc,_0x49d44e-0x1c7,_0x31f498);}return _0x213941[_0xc6098(-0xa8,-0x104,'esyk',0x61,-0x97)](_0x432823,_0x1700de);},'PUITn':_0x213941[_0x2fc490(0x81e,'Wl6y',0x72a,0x7fc,0x64d)],'YBMxJ':_0x213941[_0x1f09c6(0x341,0x24e,0x2b1,'@1DF',0x407)],'ZOqzD':function(_0x1ec260){function _0x1cf77b(_0x3dbddc,_0x2d4d5a,_0x260621,_0x93f726,_0x10ab25){return _0x1bf9d5(_0x3dbddc-0x19a,_0x260621,_0x260621-0x169,_0x93f726-0xea,_0x3dbddc- -0x425);}return _0x213941[_0x1cf77b(-0x17,0x93,'(9gf',0x87,-0xd9)](_0x1ec260);}};function _0x1f09c6(_0x2559d5,_0x42dfbd,_0x2709d2,_0x47d599,_0x283862){return _0x1f6080(_0x2559d5-0x212,_0x42dfbd-0x145,_0x2709d2-0x167,_0x47d599-0x1cb,_0x47d599);}function _0x1bf9d5(_0x5aabf6,_0x222d80,_0x81abf2,_0xea3e28,_0x3d7afb){return _0x1f6080(_0x3d7afb-0x292,_0x222d80-0xb5,_0x81abf2-0xa2,_0xea3e28-0xab,_0x222d80);}function _0xa412bc(_0x56e4ce,_0x2aa2be,_0x1330d1,_0x372f7c,_0x2bd06c){return _0x8a142f(_0x56e4ce-0x112,_0x56e4ce,_0x1330d1-0x4b,_0x372f7c-0x9f,_0x2aa2be- -0x3d1);}if(_0x213941[_0x1bf9d5(0x173,'c@#Q',0x2dd,0x36c,0x269)](_0x213941[_0x351545(0x456,0x368,0x309,0x37c,'eN#J')],_0x213941[_0xa412bc('c@#Q',-0x140,-0x22a,-0x1ed,-0x1d4)])){var _0x3b70a4=_0x1cc994?function(){function _0x21f0aa(_0x466bf7,_0x1b19b6,_0x3f0b6d,_0x34617c,_0x359016){return _0x1f09c6(_0x3f0b6d-0x84,_0x1b19b6-0xfe,_0x3f0b6d-0x1b2,_0x466bf7,_0x359016-0x37);}function _0x54c276(_0x4669bb,_0x526e0d,_0x1cf85e,_0x1ea54d,_0x3d27a5){return _0xa412bc(_0x1cf85e,_0x4669bb-0x6ae,_0x1cf85e-0x1b0,_0x1ea54d-0x3,_0x3d27a5-0x13e);}function _0x39ba9c(_0x202f77,_0x5a10d8,_0x3aa16e,_0x5b9d54,_0x11e872){return _0x1f09c6(_0x3aa16e- -0x9b,_0x5a10d8-0x1bf,_0x3aa16e-0x1de,_0x5a10d8,_0x11e872-0x37);}function _0x1ad04c(_0x3c93fe,_0x2d2026,_0x3ec232,_0x56a100,_0x2ff5b6){return _0x2fc490(_0x3c93fe-0x8d,_0x3ec232,_0x3c93fe- -0x72d,_0x56a100-0x18b,_0x2ff5b6-0x171);}function _0x52de3c(_0x812131,_0xb6fd0d,_0x3baa74,_0x35429d,_0x4631cc){return _0x351545(_0x812131-0x1f3,_0xb6fd0d-0x133,_0x3baa74-0x1e1,_0x35429d-0x1c7,_0x4631cc);}var _0x5c9f3f={'vcvAR':function(_0x531322,_0x3b57c0){function _0x15eebd(_0x3d573d,_0xad8a78,_0x4bd9fe,_0x581d24,_0x2f5b9f){return _0x5c9a(_0x3d573d-0x292,_0x581d24);}return _0x1db9ad[_0x15eebd(0x55a,0x4df,0x5ae,'@1DF',0x4a4)](_0x531322,_0x3b57c0);},'iTkkn':function(_0x11dbe1,_0x53b170){function _0x4b7568(_0x434fda,_0x5d1cf1,_0x579ffb,_0x3c2871,_0x64ffd6){return _0x5c9a(_0x64ffd6- -0x1e1,_0x579ffb);}return _0x1db9ad[_0x4b7568(0x1ba,0x1e2,'!Us!',0x1dd,0x19d)](_0x11dbe1,_0x53b170);},'HNwhX':_0x1db9ad[_0x54c276(0x709,0x7fd,'@1DF',0x7ee,0x7e5)],'bCLKm':_0x1db9ad[_0x39ba9c(0x2c6,'FZKY',0x1e9,0xe1,0x1ae)]};if(_0x1db9ad[_0x52de3c(0x40b,0x457,0x4ce,0x3fc,'0HgB')](_0x1db9ad[_0x52de3c(0x65e,0x58c,0x59d,0x68f,'k8r&')],_0x1db9ad[_0x54c276(0x545,0x536,'Gg)z',0x447,0x46c)])){var _0x3b9821;try{_0x3b9821=qtlHOB[_0x1ad04c(-0x87,-0x107,')CHd',-0xc,0x43)](_0xe1dd83,qtlHOB[_0x1ad04c(-0x81,0x39,'!Us!',-0x23,-0x3c)](qtlHOB[_0x21f0aa('zbXA',0x376,0x331,0x2b7,0x22a)](qtlHOB[_0x52de3c(0x3bc,0x477,0x471,0x575,'bHUY')],qtlHOB[_0x52de3c(0x565,0x52f,0x56d,0x4a2,'0HgB')]),');'))();}catch(_0x4a6bf0){_0x3b9821=_0x1256fc;}return _0x3b9821;}else{if(_0x5e9d00){if(_0x1db9ad[_0x21f0aa('^OyZ',0x30b,0x2c1,0x1f7,0x2d2)](_0x1db9ad[_0x39ba9c(0x51,'W',0x147,0x244,0x1a7)],_0x1db9ad[_0x54c276(0x5f6,0x51c,'Wi$I',0x576,0x579)])){var _0x4b36ac=_0x5e9d00[_0x21f0aa('K0BJ',0x2ad,0x256,0x16b,0x2b2)](_0x3d22bc,arguments);return _0x5e9d00=null,_0x4b36ac;}else qtlHOB[_0x54c276(0x630,0x650,'U@Y3',0x5b4,0x652)](_0x260959,'0');}}}:function(){};return _0x1cc994=![],_0x3b70a4;}else{var _0xe1fa4=new _0x164367(bflUjL[_0x2fc490(0x475,'eN#J',0x554,0x4a7,0x65d)]),_0x3c2252=new _0x58acd5(bflUjL[_0x2fc490(0x7e9,'xUti',0x715,0x6e1,0x732)],'i'),_0xa2042b=bflUjL[_0x2fc490(0x557,'f3E2',0x5ad,0x5a2,0x4c3)](_0x4a1ccd,bflUjL[_0x2fc490(0x6cf,'bHUY',0x6cd,0x624,0x701)]);!_0xe1fa4[_0x2fc490(0x795,'eZL@',0x6d8,0x63a,0x68c)](bflUjL[_0x1bf9d5(0x262,'RCNe',0x3ec,0x3b6,0x330)](_0xa2042b,bflUjL[_0x351545(0x381,0x362,0x3c2,0x3b6,'DDPS')]))||!_0x3c2252[_0x2fc490(0x688,'1IFP',0x71e,0x76c,0x79e)](bflUjL[_0x2fc490(0x5be,'W',0x61b,0x572,0x71e)](_0xa2042b,bflUjL[_0x1bf9d5(0x370,'eN#J',0x3e2,0x35c,0x428)]))?bflUjL[_0x2fc490(0x671,'eOdV',0x610,0x6f4,0x550)](_0xa2042b,'0'):bflUjL[_0x2fc490(0x59c,'P7Y^',0x68b,0x715,0x73c)](_0x273056);}};}else(function(){return!![];}[_0x4d37c1('$tte',0x22f,0x23e,0x23e,0x281)+_0x4c9e5f(0x86,0x180,0x265,0x1f7,'xAjh')+'r'](HAHjUw[_0x1f6080(0x14c,0x104,0xb3,0x102,'uWHt')](HAHjUw[_0x4d37c1('f3E2',0x24b,0x1b2,0x1a3,0x336)],HAHjUw[_0x1ddd87(0x33f,0x455,0x4fc,0x443,'p$A6')]))[_0x8a142f(0x292,')CHd',0x364,0x2be,0x2c3)](HAHjUw[_0x4c9e5f(-0xbe,-0x2f,-0x4a,-0x17,'$tte')]));}());function _0x5acf81(_0x5141a8,_0x47ce5a,_0x680c1e,_0x4d6330,_0x100f46){return _0x55d487(_0x5141a8,_0x4d6330- -0x29c,_0x680c1e-0x1bd,_0x4d6330-0x39,_0x100f46-0x121);}function _0x57861d(_0x3fd017,_0x4a4793,_0x8cc01b,_0x17031d,_0xb81642){return _0x408296(_0x3fd017-0x92,_0x4a4793-0x153,_0x8cc01b-0x500,_0x4a4793,_0xb81642-0x75);}(function(){function _0x39af29(_0x4bb5c8,_0x114fd9,_0x5da766,_0x35d9f8,_0x30f55d){return _0x29ed2a(_0x114fd9,_0x114fd9-0xa3,_0x5da766-0x18c,_0x35d9f8-0x152,_0x35d9f8-0x115);}function _0x48e8b7(_0x260d76,_0x555f56,_0x22af71,_0x3fdbb6,_0x14f13f){return _0x57861d(_0x260d76-0x1d1,_0x260d76,_0x555f56- -0x1d,_0x3fdbb6-0x12e,_0x14f13f-0xc6);}function _0x7723e7(_0x280dca,_0x41fa3e,_0x2cd18c,_0x260264,_0x31bf4d){return _0x6eeff(_0x260264,_0x41fa3e- -0x267,_0x2cd18c-0x166,_0x260264-0xd2,_0x31bf4d-0xa0);}function _0x22afe4(_0x4b7bc6,_0x4d6264,_0x12f59e,_0x248ab0,_0x540c74){return _0x29ed2a(_0x540c74,_0x4d6264-0xec,_0x12f59e-0x129,_0x248ab0-0x2c,_0x248ab0- -0x5c1);}function _0x144025(_0xdf470c,_0x56582c,_0x3369f1,_0x1b6b37,_0x42dc59){return _0x5acf81(_0x56582c,_0x56582c-0xf7,_0x3369f1-0x124,_0x1b6b37-0x286,_0x42dc59-0x16c);}var _0x3d0de7={'TKZaG':_0x213941[_0x22afe4(-0xdc,-0x164,-0x17f,-0x151,'RCNe')],'WvbGs':_0x213941[_0x22afe4(-0x16d,-0x1ad,-0x5a,-0x129,'P7Y^')],'SOZBu':_0x213941[_0x22afe4(0x5d,0x132,-0x8c,0x2d,')CHd')],'FzipJ':function(_0x5806a9,_0x3f7fbb){function _0x192501(_0x59fe70,_0x2589e8,_0x17cd3f,_0xacb37a,_0x2f8936){return _0x48e8b7(_0x2589e8,_0x59fe70- -0x1fd,_0x17cd3f-0x110,_0xacb37a-0x18c,_0x2f8936-0x8f);}return _0x213941[_0x192501(0x442,'[M8r',0x42a,0x4f5,0x52d)](_0x5806a9,_0x3f7fbb);},'IQodf':_0x213941[_0x48e8b7('1IFP',0x58d,0x4ea,0x48c,0x59e)],'mdSYc':_0x213941[_0x144025(0x5ec,'1IFP',0x64e,0x553,0x4f6)],'PuZtd':_0x213941[_0x22afe4(-0xc7,-0x10f,0x19,-0x3d,'sUJ7')],'ketyR':function(_0x47a04a,_0x194b6c){function _0x3c335b(_0x509eac,_0x1283cc,_0x1aa050,_0x388eb6,_0x10a34d){return _0x48e8b7(_0x1aa050,_0x10a34d- -0x43a,_0x1aa050-0x32,_0x388eb6-0x117,_0x10a34d-0x79);}return _0x213941[_0x3c335b(0x20a,0x179,'ECi8',0x13f,0x1ab)](_0x47a04a,_0x194b6c);},'pNKRz':_0x213941[_0x22afe4(-0x1d,0x114,-0x52,0x79,'@1DF')],'KrkIk':function(_0x2b21eb,_0x1b90f4){function _0x16e886(_0xe0b2fc,_0x155cb2,_0x152b51,_0xd719e6,_0x2703a6){return _0x22afe4(_0xe0b2fc-0xa1,_0x155cb2-0x199,_0x152b51-0x6a,_0x152b51-0x296,_0xe0b2fc);}return _0x213941[_0x16e886('eN#J',0x1ad,0x19f,0x1a3,0x1d7)](_0x2b21eb,_0x1b90f4);},'PwhUO':_0x213941[_0x39af29(0x6fd,'07e*',0x5cf,0x63d,0x5ba)],'izEVS':function(_0x1a90ee,_0x4bb712){function _0x3004b1(_0x1b51e1,_0x56dd5f,_0x1ca762,_0x53e59f,_0x2bf74f){return _0x22afe4(_0x1b51e1-0x1be,_0x56dd5f-0x7c,_0x1ca762-0x143,_0x1ca762-0x25d,_0x53e59f);}return _0x213941[_0x3004b1(0x2a1,0x2b1,0x21a,'P7Y^',0x23d)](_0x1a90ee,_0x4bb712);},'nWhqe':_0x213941[_0x22afe4(0x24,-0xd6,-0x55,-0x7c,'qlKr')],'uwcIf':function(_0x45e0d7,_0x45678f){function _0x17bc78(_0x8ba1d6,_0x33ef72,_0xe52590,_0x3475ab,_0x248fc1){return _0x22afe4(_0x8ba1d6-0x9f,_0x33ef72-0x84,_0xe52590-0x34,_0xe52590-0x328,_0x3475ab);}return _0x213941[_0x17bc78(0x2d1,0x334,0x370,'lKoS',0x357)](_0x45e0d7,_0x45678f);},'GzcGS':_0x213941[_0x39af29(0x6a9,'397H',0x4cd,0x5a4,0x623)],'YWvku':_0x213941[_0x7723e7(0x211,0x251,0x32c,'#JIj',0x1cb)],'EoQVV':_0x213941[_0x7723e7(0xc8,0x195,0xf2,'bHUY',0xe0)],'fJBHl':function(_0x11fa3d){function _0x2a30c1(_0x58afe7,_0x46cca9,_0x38ad7a,_0x5e6d8b,_0x3beb37){return _0x39af29(_0x58afe7-0xc1,_0x38ad7a,_0x38ad7a-0xd,_0x5e6d8b- -0xd1,_0x3beb37-0x3f);}return _0x213941[_0x2a30c1(0x4a0,0x454,'U@Y3',0x4b1,0x4f4)](_0x11fa3d);}};if(_0x213941[_0x22afe4(-0x10,-0x18f,-0xea,-0xf2,'FZKY')](_0x213941[_0x7723e7(0x332,0x272,0x1d4,'p$A6',0x290)],_0x213941[_0x144025(0x5d0,'eOdV',0x4b4,0x592,0x4be)]))_0x213941[_0x144025(0x4ba,'f3E2',0x4ad,0x502,0x444)](_0x4c4df4,this,function(){function _0x1d55c8(_0xb9a897,_0x3daa48,_0x549b48,_0x59a51e,_0x2d1106){return _0x48e8b7(_0x59a51e,_0xb9a897-0x110,_0x549b48-0x116,_0x59a51e-0x15b,_0x2d1106-0x104);}var _0x5deb66={};function _0x3f1853(_0x2e8cf6,_0xe95edf,_0x56656c,_0x8ef5ff,_0x187fbc){return _0x7723e7(_0x2e8cf6-0x1a6,_0x2e8cf6-0x4c7,_0x56656c-0x17a,_0x56656c,_0x187fbc-0x1ce);}function _0x2264c5(_0xe017de,_0x43410a,_0x3bde49,_0x83146c,_0x2dcc3b){return _0x39af29(_0xe017de-0x4f,_0x83146c,_0x3bde49-0xfa,_0x43410a- -0x6dd,_0x2dcc3b-0x119);}_0x5deb66[_0x149498('DDPS',0x45d,0x453,0x3be,0x4ad)]=_0x3d0de7[_0x1d55c8(0x683,0x766,0x64f,'k8r&',0x6f0)];function _0x149498(_0x20f253,_0x387bac,_0x665bd7,_0x39ceba,_0x23e01a){return _0x39af29(_0x20f253-0xbb,_0x20f253,_0x665bd7-0x1ad,_0x665bd7- -0x203,_0x23e01a-0xee);}var _0x570949=_0x5deb66;function _0x21fed6(_0x54b053,_0x5e0614,_0x54530e,_0x39d066,_0x44944e){return _0x144025(_0x54b053-0x52,_0x54b053,_0x54530e-0x1ef,_0x44944e- -0x521,_0x44944e-0xa4);}if(_0x3d0de7[_0x2264c5(-0x64,-0x38,0x30,'0(2p',-0xe2)](_0x3d0de7[_0x149498('sh)B',0x433,0x420,0x3ec,0x492)],_0x3d0de7[_0x149498('U@Y3',0x44e,0x39b,0x41f,0x3da)]))return function(_0x4de455){}[_0x149498('eN#J',0x3ab,0x430,0x33a,0x4f2)+_0x2264c5(-0xdc,-0x86,-0x1e,'uWHt',-0x1f)+'r'](vSORqv[_0x1d55c8(0x59f,0x576,0x5cd,'zbXA',0x599)])[_0x149498('eZL@',0x43c,0x540,0x523,0x4a8)](vSORqv[_0x2264c5(-0x20e,-0x141,-0x52,'bHUY',-0xb0)]);else{var _0x807b52=new RegExp(_0x3d0de7[_0x2264c5(-0x32,-0xda,-0x141,'eOdV',-0x1ba)]),_0x3ac307=new RegExp(_0x3d0de7[_0x21fed6('N@]]',0x234,0x298,0x109,0x1ad)],'i'),_0x46abd9=_0x3d0de7[_0x2264c5(-0x26a,-0x187,-0x1a7,'Wi$I',-0x1c0)](_0x49bbd2,_0x3d0de7[_0x149498('zbXA',0x33f,0x34a,0x345,0x39c)]);if(!_0x807b52[_0x3f1853(0x660,0x6c3,'k8r&',0x64b,0x565)](_0x3d0de7[_0x149498('Wi$I',0x4ca,0x4c7,0x40d,0x56d)](_0x46abd9,_0x3d0de7[_0x2264c5(-0x151,-0xb9,-0xbb,'!Us!',0x21)]))||!_0x3ac307[_0x149498('hM9G',0x270,0x35d,0x3f7,0x292)](_0x3d0de7[_0x3f1853(0x646,0x74c,'k8r&',0x659,0x717)](_0x46abd9,_0x3d0de7[_0x21fed6('(9gf',-0x19,0x67,-0xb0,0x35)]))){if(_0x3d0de7[_0x21fed6('eOdV',-0xed,-0x114,-0x61,-0xd)](_0x3d0de7[_0x149498('qlKr',0x43e,0x351,0x360,0x322)],_0x3d0de7[_0x1d55c8(0x613,0x6b5,0x64a,'Gg)z',0x56a)]))_0x3d0de7[_0x21fed6('awkR',0x20,0x1c3,0x135,0xc0)](_0x46abd9,'0');else return _0x2cd703[_0x2264c5(0xc3,0x7a,0x21,'awkR',-0x1d)+_0x1d55c8(0x59a,0x54f,0x541,'sh)B',0x5e0)]()[_0x149498('RCNe',0x3d5,0x40f,0x39f,0x3e2)+'h'](SmCzTV[_0x21fed6('z^&v',0x175,0x12d,0xe0,0x121)])[_0x21fed6('qlKr',-0x19,-0x3b,-0x29,0xc5)+_0x3f1853(0x641,0x6aa,'397H',0x653,0x544)]()[_0x3f1853(0x6f6,0x670,'sh)B',0x7fd,0x72e)+_0x3f1853(0x606,0x620,'Gg)z',0x6bc,0x5ed)+'r'](_0x370889)[_0x1d55c8(0x618,0x6db,0x526,'Gg)z',0x68a)+'h'](SmCzTV[_0x21fed6('P7Y^',0xcf,0xb8,0x117,0xeb)]);}else{if(_0x3d0de7[_0x21fed6(')CHd',0x17e,0x248,0x127,0x140)](_0x3d0de7[_0x21fed6('nYh8',0xf9,0x108,0x228,0x19a)],_0x3d0de7[_0x2264c5(-0x1f3,-0x12d,-0x1dc,'@1DF',-0x1f5)])){var _0x579673=_0x3d8499?function(){function _0x4adc3c(_0x2332f2,_0x2b2bc4,_0x263e8a,_0x5cc1b1,_0x34a319){return _0x2264c5(_0x2332f2-0x1b9,_0x5cc1b1-0x561,_0x263e8a-0x44,_0x2332f2,_0x34a319-0xdf);}if(_0x2437d6){var _0xce5b05=_0x133734[_0x4adc3c('hM9G',0x3eb,0x39f,0x480,0x3cc)](_0x195202,arguments);return _0x7777ab=null,_0xce5b05;}}:function(){};return _0x5af502=![],_0x579673;}else _0x3d0de7[_0x149498('(9gf',0x5d3,0x4f2,0x5cd,0x4e3)](_0x49bbd2);}}})();else{var _0x2cbbab=_0x394e0b[_0x39af29(0x50d,'W',0x652,0x5a0,0x5a3)](_0x4ea9b2,arguments);return _0x52bc66=null,_0x2cbbab;}}()),console[_0x6eeff('W',0x3a3,0x373,0x43a,0x2ca)](_0x213941[_0x3aff05(0x380,'#JIj',0x384,0x2e8,0x3bd)]);}hi(),(function(){function _0x3899b9(_0x3afb0e,_0x4b8c85,_0x47fdbd,_0x3bef75,_0x4a7c5d){return _0xd33278(_0x3afb0e-0x163,_0x4b8c85-0x1c0,_0x3afb0e- -0x103,_0x4b8c85,_0x4a7c5d-0x1e3);}function _0x10f0cd(_0x3c4032,_0x4e58d4,_0x5a63e8,_0x3a12cf,_0x4b83f2){return _0x38316d(_0x3c4032-0x103,_0x4e58d4-0x184,_0x4b83f2,_0x4e58d4-0x2f,_0x4b83f2-0x1d7);}function _0x2da795(_0x39f7fc,_0x13a896,_0x52e9d9,_0x3d2cf3,_0x1c7277){return _0x55097a(_0x39f7fc-0x194,_0x1c7277,_0x3d2cf3-0x73,_0x3d2cf3-0xe5,_0x1c7277-0x24);}var _0x2c0a2b={'JUpUI':function(_0x44770e){return _0x44770e();},'mOFBu':function(_0x4d83de,_0x5152b8){return _0x4d83de(_0x5152b8);},'NqbFW':function(_0x5d89ff,_0x7957bc){return _0x5d89ff+_0x7957bc;},'JzZpZ':_0x2da795(0x2ba,0x394,0x3c9,0x3b2,'(9gf')+_0x2da795(0x516,0x3e3,0x3ad,0x434,'DDPS')+_0x2da795(0x4de,0x3ba,0x36a,0x42b,'k8r&')+_0x2da795(0x561,0x562,0x5e2,0x543,'$tte'),'QwWjD':_0x90571b(-0x148,-0x67,'esyk',-0x13c,-0x60)+_0x534eb0(-0x141,-0x4f,'bHUY',-0x84,-0x116)+_0x90571b(0x1a1,0x58,'hM9G',0x192,0xe0)+_0x534eb0(-0x1f5,-0x185,'07e*',-0xf7,-0x83)+_0x3899b9(0x5b2,'7au(',0x573,0x639,0x669)+_0x534eb0(-0xec,-0xfd,'397H',-0x5e,-0x1d7)+'\x20)','wkZqq':function(_0x25832f,_0x264388){return _0x25832f+_0x264388;},'zWwWE':_0x90571b(-0x7d,-0x91,'z@LO',-0x2f,0x70),'tfKRC':_0x3899b9(0x453,'[M8r',0x391,0x4e8,0x424),'vuwQD':_0x10f0cd(0x17e,0x191,0x1fa,0x91,'ECi8')+_0x534eb0(-0x202,-0x10f,'397H',-0x1e4,-0xc)+'t','nBntL':function(_0x5da2f9,_0x5d7aef){return _0x5da2f9===_0x5d7aef;},'CvbAK':_0x90571b(0x43,0x8c,'7au(',0x6,-0x1f),'KsvmD':_0x3899b9(0x4f4,'bHUY',0x511,0x577,0x5f5),'kEjvW':_0x10f0cd(0x169,0x24d,0x29c,0x181,'RCNe'),'bSVXj':_0x3899b9(0x5ca,'bHUY',0x51f,0x5cc,0x66b),'SnadI':function(_0x276944,_0x39fb4c){return _0x276944===_0x39fb4c;},'QtuRU':_0x10f0cd(0x334,0x312,0x2be,0x29b,'P7Y^'),'aClKv':function(_0x3d4345){return _0x3d4345();}};function _0x90571b(_0x56f886,_0xd14011,_0x9a00a9,_0x44a32e,_0x2e7712){return _0x55097a(_0x56f886-0x132,_0x9a00a9,_0x2e7712- -0x3d1,_0x44a32e-0xb8,_0x2e7712-0xd3);}var _0x30d93c=function(){var _0xb0c38b={'Dbgti':function(_0x52e4f1,_0x182da1){function _0xd0cc94(_0x557868,_0x3b8866,_0x3de705,_0x31e095,_0x227507){return _0x5c9a(_0x3de705- -0x2b7,_0x31e095);}return _0x2c0a2b[_0xd0cc94(-0x10c,0x57,-0xb1,'z^&v',0x1d)](_0x52e4f1,_0x182da1);},'FiMBV':_0x2c0a2b[_0x50512d(0x460,0x374,0x419,'k8r&',0x52e)],'vsklf':_0x2c0a2b[_0x50512d(0x4a6,0x58b,0x584,'GaI9',0x47e)],'XQkpm':_0x2c0a2b[_0x50512d(0x46a,0x37f,0x53d,'zbXA',0x448)]};function _0x4c55c4(_0x3db7e5,_0x33438f,_0x35e67d,_0x3b87c3,_0x2da03d){return _0x3899b9(_0x35e67d- -0x1f3,_0x2da03d,_0x35e67d-0x197,_0x3b87c3-0x84,_0x2da03d-0x123);}function _0x54aadf(_0x1c68a5,_0x4b9bec,_0xb2a68,_0x23cc31,_0x4f7c21){return _0x2da795(_0x1c68a5-0x8f,_0x4b9bec-0x9d,_0xb2a68-0xdc,_0x4b9bec- -0x149,_0x4f7c21);}function _0x565541(_0x16e22d,_0x73bb98,_0x52ad99,_0x50a700,_0x103b4c){return _0x2da795(_0x16e22d-0x193,_0x73bb98-0x1ea,_0x52ad99-0x139,_0x52ad99- -0x2f4,_0x16e22d);}function _0x50512d(_0x33a814,_0xdb4016,_0x533f12,_0x354aea,_0x279d55){return _0x534eb0(_0x33a814-0xe1,_0x33a814-0x453,_0x354aea,_0x354aea-0x1cb,_0x279d55-0x19e);}function _0x7b4bea(_0xbb09f0,_0x34d981,_0x282d70,_0x5989c6,_0x36fe00){return _0x534eb0(_0xbb09f0-0x15c,_0x36fe00-0x11b,_0x34d981,_0x5989c6-0xd8,_0x36fe00-0x1a4);}if(_0x2c0a2b[_0x565541('hM9G',0x202,0x1a2,0xb6,0x146)](_0x2c0a2b[_0x50512d(0x3a6,0x2de,0x3c7,'f3E2',0x42a)],_0x2c0a2b[_0x7b4bea(0xbe,'f3E2',0x246,0x220,0x159)]))_0x2c0a2b[_0x565541('N@]]',0x134,0x1d6,0x13e,0x26e)](_0x31cb8e);else{var _0x4f186b;try{_0x2c0a2b[_0x50512d(0x3bc,0x36b,0x438,'z@LO',0x37c)](_0x2c0a2b[_0x565541('esyk',0x108,0xb8,0x17c,0x193)],_0x2c0a2b[_0x7b4bea(0x51,'^OyZ',0x229,0x21f,0x139)])?function(){return![];}[_0x4c55c4(0x316,0x38f,0x38c,0x45b,'RCNe')+_0x4c55c4(0x35f,0x372,0x2c2,0x3b7,')CHd')+'r'](_0xb0c38b[_0x565541('z^&v',0x9d,0x71,-0x30,-0x12)](_0xb0c38b[_0x50512d(0x3de,0x4ab,0x39f,'hM9G',0x2da)],_0xb0c38b[_0x4c55c4(0x2eb,0x21e,0x270,0x2d4,'lKoS')]))[_0x50512d(0x3cf,0x31d,0x440,'U@Y3',0x4d4)](_0xb0c38b[_0x50512d(0x478,0x547,0x3d4,'ECi8',0x49d)]):_0x4f186b=_0x2c0a2b[_0x565541('07e*',0x13f,0x157,0x1ca,0x1dd)](Function,_0x2c0a2b[_0x50512d(0x3bd,0x3fb,0x4c5,'awkR',0x39a)](_0x2c0a2b[_0x50512d(0x3d3,0x366,0x470,'N@]]',0x40b)](_0x2c0a2b[_0x7b4bea(-0x64,'sh)B',0x67,0x53,-0x13)],_0x2c0a2b[_0x54aadf(0x404,0x3ca,0x3b9,0x391,')CHd')]),');'))();}catch(_0xc56d74){_0x2c0a2b[_0x4c55c4(0x1e4,0x239,0x25a,0x2a6,'z@LO')](_0x2c0a2b[_0x565541('0(2p',0x145,0x1a0,0x159,0x1f3)],_0x2c0a2b[_0x50512d(0x2eb,0x291,0x2cf,'Wl6y',0x3c4)])?_0x4f186b=window:_0x264e24=_0x2c0a2b[_0x54aadf(0x1e0,0x28e,0x35c,0x2b3,'Gg)z')](_0x3cc116,_0x2c0a2b[_0x50512d(0x39f,0x373,0x3f4,'FZKY',0x2ba)](_0x2c0a2b[_0x7b4bea(-0xbe,'eN#J',0xb5,-0xe9,-0x15)](_0x2c0a2b[_0x7b4bea(0xfd,'sUJ7',-0x23,0x193,0xbb)],_0x2c0a2b[_0x7b4bea(0x25,'397H',0xcb,-0x12d,-0x3b)]),');'))();}return _0x4f186b;}};function _0x534eb0(_0x34d18d,_0x2fa030,_0x28081b,_0x40634e,_0x1efbea){return _0x55d487(_0x28081b,_0x2fa030- -0x6bb,_0x28081b-0x1e5,_0x40634e-0x1e7,_0x1efbea-0xc3);}var _0x102fd6=_0x2c0a2b[_0x90571b(0x158,0xca,'0(2p',0x12b,0xf0)](_0x30d93c);_0x102fd6[_0x90571b(-0x1ba,-0x19e,'397H',-0x168,-0xff)+_0x3899b9(0x51a,'RCNe',0x45a,0x416,0x5e0)+'l'](_0x49bbd2,-0x1609+-0x231a+0x48c3);}());function _0x55097a(_0x9d85d6,_0x1118e4,_0x21aae2,_0x4a94d5,_0x15f1aa){return _0x5c9a(_0x21aae2-0xeb,_0x1118e4);}function _0x49bbd2(_0x536cd3){var _0x5e557e={'ZQrWv':function(_0x34bfe8,_0x42d38a){return _0x34bfe8===_0x42d38a;},'uQZaJ':_0x53c0a1(0x112,0x69,'z@LO',0x210,0x19d),'JfgzO':_0x53c0a1(0x5c,0x135,'RCNe',0xfe,0xf0),'jDDfl':function(_0x36cb83,_0x5eb438){return _0x36cb83(_0x5eb438);},'GBser':_0x3fcf55(0x63f,0x75a,'xAjh',0x795,0x71f)+_0x4fd359('eOdV',-0x90,0x21,0x10e,-0x6a)+_0x4fd359('nYh8',0xad,0xd2,0xf0,0x157)+')','MdDbd':_0x4fd359('k8r&',0x10e,0x85,0x1d,0x12f)+_0x4fd359('ECi8',-0xa1,-0x98,-0x12b,-0x181)+_0x4fd359('397H',0x12b,0xd6,0x100,0xba)+_0x4fd359('397H',0x1b9,0xed,0x90,0x57)+_0x4fd359('k8r&',0x180,0x131,0x111,0xa4)+_0x4fd359('eZL@',0x12,-0xc5,-0x156,-0x1a1)+_0x3fcf55(0x75e,0x68d,'1IFP',0x5d7,0x69e),'cPcEA':function(_0x75cb98,_0x39accf){return _0x75cb98(_0x39accf);},'qEKSK':_0x31ff52('eOdV',0x39c,0x397,0x49e,0x42a),'KPCGe':function(_0x1c4a6c,_0x1a94b4){return _0x1c4a6c+_0x1a94b4;},'kBrMr':_0x31ff52('0HgB',0x341,0x436,0x2da,0x37a),'FZJyM':_0x2911be(0x6e7,0x702,0x79a,0x6fd,'#JIj'),'BXWJc':function(_0x4f940e){return _0x4f940e();},'hSomU':function(_0x5ebc92,_0x233e2d,_0x229a37){return _0x5ebc92(_0x233e2d,_0x229a37);},'nOPHC':_0x31ff52('U@Y3',0x2f1,0x315,0x3c3,0x312)+_0x4fd359('^OyZ',0x8,0xec,0x179,0x19e)+_0x31ff52('U@Y3',0x46b,0x4a1,0x362,0x44f)+_0x4fd359('W',0x70,-0x3a,0x66,0x4b),'StQZd':_0x3fcf55(0x500,0x4c1,'z@LO',0x4bc,0x5b8)+_0x3fcf55(0x72e,0x71f,'z@LO',0x837,0x741)+_0x31ff52('xUti',0x2d6,0x2b0,0x22c,0x30a)+_0x3fcf55(0x768,0x699,'zbXA',0x5b4,0x6a8)+_0x31ff52('GaI9',0x491,0x406,0x48b,0x38f)+_0x3fcf55(0x748,0x682,'z@LO',0x7df,0x742)+'\x20)','lxtoI':function(_0x385f6c,_0x678ba8){return _0x385f6c===_0x678ba8;},'xBDRf':_0x31ff52('397H',0x3ab,0x2fd,0x42c,0x337),'KEndO':function(_0x27fec4,_0x40fd9d){return _0x27fec4===_0x40fd9d;},'uhHgp':_0x3fcf55(0x521,0x66b,'!Us!',0x524,0x5f3),'MECjc':_0x31ff52('N@]]',0x359,0x39a,0x287,0x2c4),'FKEdD':function(_0x4d683a,_0x450510){return _0x4d683a===_0x450510;},'zGBxt':_0x2911be(0x711,0x62f,0x7b1,0x681,'397H')+'g','fybzS':function(_0x291cb8,_0x5f1028){return _0x291cb8!==_0x5f1028;},'ixjvE':_0x3fcf55(0x6a0,0x62f,'(9gf',0x69f,0x60f),'VnxSm':_0x53c0a1(0xdb,-0x23,'GaI9',0x10,0x80),'BOiQa':_0x31ff52('Wl6y',0x49e,0x3ab,0x43c,0x3e6)+_0x31ff52('nYh8',0x27b,0x3c3,0x429,0x343)+_0x4fd359('FZKY',0x22,0xea,0x1b9,0x17a),'QixGs':_0x31ff52('z@LO',0x26f,0x297,0x37c,0x333)+'er','Vfrpr':function(_0x4cc442,_0x11f19e){return _0x4cc442!==_0x11f19e;},'krNaK':_0x3fcf55(0x5ba,0x50e,'eOdV',0x5e8,0x557),'VVmnD':_0x53c0a1(-0x44,-0x89,'!Us!',0x45,0x6c),'YTslk':function(_0x8b9271,_0x42d036){return _0x8b9271+_0x42d036;},'HEhcF':function(_0x2420dc,_0x2d764c){return _0x2420dc/_0x2d764c;},'bwlcg':_0x3fcf55(0x4f1,0x487,'U@Y3',0x534,0x55f)+'h','igXXs':function(_0x533158,_0x4d1532){return _0x533158%_0x4d1532;},'aTilW':function(_0x1e762b,_0x5bb069){return _0x1e762b===_0x5bb069;},'VWoiC':_0x3fcf55(0x646,0x772,'nYh8',0x7b9,0x6d3),'tQLsP':_0x53c0a1(0x152,0xf2,'RCNe',0x74,0x245),'NHzKc':_0x2911be(0x730,0x7e7,0x7e7,0x7da,'sh)B'),'QSQgI':_0x53c0a1(0xb4,-0x2c,'eOdV',-0x4,0x47),'WkowF':_0x31ff52('sUJ7',0x2d3,0x333,0x267,0x30e)+'n','ARXjl':_0x53c0a1(0x95,0x162,'xUti',-0x3a,0xa3),'EUjBv':_0x4fd359('P7Y^',-0x42,-0x8c,0x67,-0x180)+_0x31ff52('#JIj',0x358,0x488,0x4ac,0x3ed)+'t','ykoSj':function(_0x3d6dcc,_0x1d86c0){return _0x3d6dcc!==_0x1d86c0;},'jBiAM':_0x53c0a1(0x7a,-0x4d,'^OyZ',0x80,-0x77),'ovEbV':_0x3fcf55(0x5ac,0x678,'#JIj',0x692,0x67d),'WmGBC':function(_0x13ec2a,_0x37bae4){return _0x13ec2a(_0x37bae4);}};function _0x53c0a1(_0x31583d,_0x2ceec2,_0x42b422,_0x4357ff,_0x2675f7){return _0x55d487(_0x42b422,_0x31583d- -0x56c,_0x42b422-0x187,_0x4357ff-0x1a9,_0x2675f7-0x5d);}function _0x4fd359(_0x424058,_0x5452dd,_0x11578f,_0x50ab03,_0x2223cd){return _0x38316d(_0x424058-0x182,_0x5452dd-0xf3,_0x424058,_0x11578f- -0x213,_0x2223cd-0x2f);}function _0x3fcf55(_0x396537,_0x441f87,_0x36de26,_0x1883d4,_0x2e6059){return _0x408296(_0x396537-0x12f,_0x441f87-0x11a,_0x2e6059-0x5e7,_0x36de26,_0x2e6059-0xe);}function _0x5e828c(_0x41bb19){function _0x5aa90a(_0xc06df0,_0x3ccbce,_0x4f7aea,_0x3dd099,_0x4f8ab5){return _0x3fcf55(_0xc06df0-0xf8,_0x3ccbce-0x1b,_0x3ccbce,_0x3dd099-0x99,_0x4f7aea- -0x644);}function _0x553812(_0x5a81c5,_0x5da90c,_0x36072c,_0x4aba02,_0x549514){return _0x31ff52(_0x549514,_0x5da90c-0x135,_0x36072c-0x1ce,_0x4aba02-0xdc,_0x36072c-0x208);}var _0x44646b={'QCsQg':function(_0x4ff518,_0x3ec40d){function _0x170b58(_0x42014a,_0x2cb466,_0x35975f,_0x162249,_0x49389c){return _0x5c9a(_0x49389c-0x2f3,_0x162249);}return _0x5e557e[_0x170b58(0x53d,0x4c3,0x50a,'xUti',0x574)](_0x4ff518,_0x3ec40d);},'MmWkv':_0x5e557e[_0x54d15b(0x509,0x5ff,'DDPS',0x558,0x4e9)],'zUMMH':_0x5e557e[_0x54d15b(0x4b3,0x42d,'eN#J',0x4fd,0x4fe)],'lBrJu':function(_0x583041,_0x264e33){function _0x2b87ba(_0x124473,_0x1ced9e,_0xdcd445,_0x565d7d,_0x95ab70){return _0x5aa90a(_0x124473-0x121,_0x1ced9e,_0x124473-0x2a5,_0x565d7d-0x17a,_0x95ab70-0x88);}return _0x5e557e[_0x2b87ba(0x349,'nYh8',0x26c,0x41e,0x344)](_0x583041,_0x264e33);},'nEVXw':_0x5e557e[_0x5aa90a(0x34,'xUti',-0x62,-0x17,-0x1f)],'HTnMC':function(_0x278349,_0x4b6f98){function _0x2e49fb(_0x424a7e,_0x2e37fa,_0x48b34c,_0x3d11e2,_0x4a41ac){return _0x54d15b(_0x424a7e- -0x282,_0x2e37fa-0x54,_0x2e37fa,_0x3d11e2-0x1b7,_0x4a41ac-0x2);}return _0x5e557e[_0x2e49fb(0x21c,'(9gf',0x13b,0x2f9,0x25d)](_0x278349,_0x4b6f98);},'JkJAq':_0x5e557e[_0x5ca548(0x5d,'sUJ7',-0xc,-0xb2,-0x3e)],'ONjTf':_0x5e557e[_0x3aaf15(0x19,-0x2f,'Wi$I',0x70,-0x23)],'iZbzq':function(_0x109e9d,_0x2947cd){function _0x51c62c(_0x54bb56,_0x45e9b8,_0x4b3160,_0x4d869e,_0x1ff043){return _0x553812(_0x54bb56-0x153,_0x45e9b8-0x22,_0x45e9b8-0x0,_0x4d869e-0x3d,_0x4b3160);}return _0x5e557e[_0x51c62c(0x54b,0x5ea,'U@Y3',0x5ee,0x6eb)](_0x109e9d,_0x2947cd);},'eAiUl':function(_0x34bafe){function _0x12af27(_0x2fae18,_0x28c4b7,_0x52c3d0,_0x117b01,_0x2019e9){return _0x5aa90a(_0x2fae18-0x93,_0x28c4b7,_0x2fae18-0x2a2,_0x117b01-0x1f,_0x2019e9-0x1f);}return _0x5e557e[_0x12af27(0x2a9,'awkR',0x1e9,0x2d8,0x33b)](_0x34bafe);},'MkpDI':function(_0x51c58f,_0x463fef,_0xc6cac3){function _0x2b80de(_0x42283f,_0x3e65ba,_0x3ccae2,_0x8aef4f,_0x2614f1){return _0x54d15b(_0x3e65ba- -0x331,_0x3e65ba-0xe9,_0x8aef4f,_0x8aef4f-0x17d,_0x2614f1-0x21);}return _0x5e557e[_0x2b80de(0x2c8,0x221,0x2ba,'N@]]',0x167)](_0x51c58f,_0x463fef,_0xc6cac3);},'yCykx':function(_0x1be159,_0x25c06b){function _0x1b59aa(_0x4d75da,_0x322367,_0x4deb43,_0x240a52,_0xe7e2dc){return _0x5ca548(_0x4d75da-0xd4,_0x4d75da,_0x4deb43-0xd6,_0x240a52-0x114,_0xe7e2dc-0x345);}return _0x5e557e[_0x1b59aa('esyk',0x385,0x355,0x3ae,0x371)](_0x1be159,_0x25c06b);},'emRqC':_0x5e557e[_0x5ca548(-0x16c,'P7Y^',-0x6c,0x34,-0xa6)],'cPfmm':_0x5e557e[_0x3aaf15(-0x119,0x5,'0(2p',-0x4b,0x10)],'wybVQ':function(_0x4537d7){function _0x10aabe(_0x1744d7,_0x387b77,_0x447354,_0x426add,_0x4a1f9c){return _0x3aaf15(_0x1744d7-0x158,_0x387b77-0x134,_0x4a1f9c,_0x426add-0x32d,_0x4a1f9c-0xc6);}return _0x5e557e[_0x10aabe(0x217,0x305,0x32d,0x2c9,'FZKY')](_0x4537d7);},'GBVoU':function(_0x2405f1,_0x1caf96){function _0x413056(_0x10c520,_0x472c94,_0x426696,_0x2dca0d,_0x1d24bb){return _0x5aa90a(_0x10c520-0x89,_0x426696,_0x472c94-0x3ab,_0x2dca0d-0xc0,_0x1d24bb-0x1d6);}return _0x5e557e[_0x413056(0x4e2,0x473,'1IFP',0x552,0x521)](_0x2405f1,_0x1caf96);},'gFJiK':_0x5e557e[_0x3aaf15(-0xa,0x40,'K0BJ',0x3,-0xb9)]};function _0x54d15b(_0x3b7062,_0x59875d,_0xeac0f7,_0x5877a1,_0x11c0f0){return _0x3fcf55(_0x3b7062-0x13b,_0x59875d-0x184,_0xeac0f7,_0x5877a1-0x115,_0x3b7062- -0x1d0);}function _0x5ca548(_0x285023,_0x138356,_0x1e85e6,_0x34159e,_0x407c06){return _0x2911be(_0x407c06- -0x683,_0x138356-0x11a,_0x1e85e6-0x139,_0x34159e-0xaf,_0x138356);}function _0x3aaf15(_0x43aff4,_0x5d4733,_0x56ea04,_0x42991c,_0x1fce3c){return _0x4fd359(_0x56ea04,_0x5d4733-0x1e1,_0x42991c- -0xc8,_0x42991c-0xb5,_0x1fce3c-0x12);}if(_0x5e557e[_0x54d15b(0x40c,0x3fd,'uWHt',0x431,0x39e)](_0x5e557e[_0x3aaf15(-0x15e,-0xc5,'eOdV',-0xfd,-0x3b)],_0x5e557e[_0x54d15b(0x3e5,0x4bd,'xAjh',0x4b0,0x4c9)])){if(_0x4f08b8){var _0x55e954=_0xeba417[_0x54d15b(0x473,0x3ab,'ECi8',0x542,0x37a)](_0xbe47c6,arguments);return _0x16eecf=null,_0x55e954;}}else{if(_0x5e557e[_0x54d15b(0x514,0x487,'RCNe',0x4e8,0x43a)](typeof _0x41bb19,_0x5e557e[_0x54d15b(0x4b6,0x530,'(9gf',0x444,0x40d)]))return _0x5e557e[_0x3aaf15(-0x91,0xfc,'Wi$I',0x51,0x113)](_0x5e557e[_0x3aaf15(0x37,-0x78,'7au(',-0xd2,-0x120)],_0x5e557e[_0x5ca548(0x18,'eZL@',0xc2,0x1a,0xa7)])?function(_0x54c274){}[_0x553812(0x42d,0x44b,0x4a0,0x3dd,'awkR')+_0x5ca548(-0xd6,'HKg4',-0xa3,-0x99,-0x2f)+'r'](_0x5e557e[_0x5aa90a(0x12d,'!Us!',0xc4,0x16f,0x18d)])[_0x5ca548(0x7b,'FZKY',0x105,0x94,0x62)](_0x5e557e[_0x54d15b(0x4d2,0x542,'7au(',0x593,0x44a)]):!![];else{if(_0x5e557e[_0x54d15b(0x439,0x402,'uWHt',0x358,0x3dc)](_0x5e557e[_0x5aa90a(-0x7,'1IFP',-0xc3,-0x17,-0xbb)],_0x5e557e[_0x5ca548(-0x1e,'1IFP',0xef,0x16d,0xe7)])){if(_0x5e557e[_0x5aa90a(-0x9,'^OyZ',-0xcf,-0x173,-0x17c)](_0x5e557e[_0x3aaf15(-0x40,-0x85,'k8r&',-0x3e,-0x13d)]('',_0x5e557e[_0x3aaf15(-0x65,0x60,'nYh8',0x55,-0x5f)](_0x41bb19,_0x41bb19))[_0x5e557e[_0x5aa90a(0x138,'K0BJ',0xb8,0x161,0x58)]],0x1b0b+0x2*-0x9f7+-0x71c)||_0x5e557e[_0x3aaf15(0x7a,0x137,'xAjh',0x4d,0xb1)](_0x5e557e[_0x5ca548(0x7b,'!Us!',0xd3,0xc8,0x115)](_0x41bb19,0x176*-0x13+-0x23e8+-0x2*-0x1fdf),0x1*-0x25b1+0x5*0x703+0x2a2)){if(_0x5e557e[_0x5ca548(0x125,'eOdV',0x18f,0x1ff,0x109)](_0x5e557e[_0x5ca548(-0x86,'RCNe',-0xd0,-0x84,-0x61)],_0x5e557e[_0x3aaf15(0x82,0x7c,'#JIj',-0x16,0x25)]))return![];else(function(){function _0x56a83e(_0x523424,_0x1beca6,_0x3d2ff4,_0x5764e3,_0x1aec83){return _0x5aa90a(_0x523424-0xc6,_0x1aec83,_0x5764e3-0x169,_0x5764e3-0x1b4,_0x1aec83-0x126);}function _0x43e60a(_0x22c10e,_0x125043,_0x30c134,_0x3eff9a,_0x57002f){return _0x54d15b(_0x57002f-0x1ed,_0x125043-0x1b3,_0x3eff9a,_0x3eff9a-0x1c6,_0x57002f-0xd2);}function _0x371eee(_0x5762c5,_0x258139,_0x4806f0,_0x2256e8,_0x3b841b){return _0x5ca548(_0x5762c5-0xaa,_0x5762c5,_0x4806f0-0x62,_0x2256e8-0xe1,_0x2256e8-0x5d3);}function _0x2eb74c(_0x23a21a,_0x534a96,_0x14c677,_0x1a8782,_0x37591b){return _0x553812(_0x23a21a-0xb6,_0x534a96-0x35,_0x23a21a- -0x4f9,_0x1a8782-0x32,_0x534a96);}if(_0x5e557e[_0x371eee('eN#J',0x55c,0x505,0x524,0x5db)](_0x5e557e[_0x2eb74c(0xa3,'0(2p',0x48,-0x1,0x19b)],_0x5e557e[_0x56a83e(0x156,0x17c,0x13d,0x222,'0(2p')])){if(_0x4a7d29)return _0x449f5e;else _0x44646b[_0x43e60a(0x5ab,0x64e,0x4e0,'^OyZ',0x590)](_0x36fd13,0xc32+-0x2b*0x7+-0xb05);}else return!![];}[_0x54d15b(0x472,0x487,'HKg4',0x423,0x3fc)+_0x553812(0x622,0x552,0x57d,0x501,'uWHt')+'r'](_0x5e557e[_0x553812(0x554,0x57e,0x4d0,0x4e0,'0HgB')](_0x5e557e[_0x5ca548(-0x132,')CHd',-0x18a,-0x160,-0xaa)],_0x5e557e[_0x5ca548(-0x50,'bHUY',0x3c,-0x78,0x1b)]))[_0x54d15b(0x574,0x5bd,'1IFP',0x556,0x51c)](_0x5e557e[_0x553812(0x694,0x575,0x599,0x5f0,'GaI9')]));}else _0x5e557e[_0x553812(0x4b5,0x427,0x496,0x4f7,'!Us!')](_0x5e557e[_0x54d15b(0x4eb,0x5dd,'@1DF',0x473,0x4e4)],_0x5e557e[_0x3aaf15(-0x1a2,-0x199,'0(2p',-0x107,-0x1fb)])?_0x44646b[_0x553812(0x4b4,0x64c,0x571,0x657,'#JIj')](_0x169820,this,function(){function _0x56048a(_0x37eb8a,_0x451a3a,_0x41f1d4,_0x4e632d,_0x234bf0){return _0x3aaf15(_0x37eb8a-0x14,_0x451a3a-0x121,_0x451a3a,_0x234bf0-0x347,_0x234bf0-0xbf);}function _0xbfaff4(_0x1d76a1,_0x213cb2,_0x440bc9,_0x516cfa,_0x46b601){return _0x553812(_0x1d76a1-0x66,_0x213cb2-0xcb,_0x440bc9-0xe4,_0x516cfa-0x19,_0x213cb2);}function _0x155a7c(_0x5704e8,_0x553069,_0x231f7d,_0x2832f8,_0x34135f){return _0x553812(_0x5704e8-0x1ac,_0x553069-0xdc,_0x553069- -0x186,_0x2832f8-0x1cd,_0x5704e8);}function _0x3a2092(_0x298683,_0x5cace9,_0x2bc3c7,_0x4c3c1f,_0x6b29c2){return _0x5ca548(_0x298683-0x16d,_0x5cace9,_0x2bc3c7-0x1a3,_0x4c3c1f-0x109,_0x2bc3c7- -0x96);}var _0x120cee=new _0x2ac84e(_0x44646b[_0x155a7c('N@]]',0x37d,0x461,0x2e7,0x476)]);function _0x58c5ee(_0x32d663,_0x21f527,_0x1d60be,_0x1f4e8b,_0x22b168){return _0x5ca548(_0x32d663-0x12c,_0x32d663,_0x1d60be-0x1a7,_0x1f4e8b-0x18a,_0x21f527-0xf6);}var _0x5a56d7=new _0x1c0494(_0x44646b[_0x3a2092(0xa2,'sh)B',0x3d,-0x36,-0xaf)],'i'),_0x5d4bb9=_0x44646b[_0x3a2092(-0x65,'0(2p',-0x10,0x2e,0x68)](_0x2952d8,_0x44646b[_0x3a2092(0xaf,'0HgB',-0x1d,0xdd,-0x108)]);!_0x120cee[_0xbfaff4(0x70b,'P7Y^',0x658,0x74e,0x5a6)](_0x44646b[_0x58c5ee('7au(',0x112,0x20e,0x1f3,0x49)](_0x5d4bb9,_0x44646b[_0x155a7c('Wl6y',0x4ee,0x43d,0x416,0x5af)]))||!_0x5a56d7[_0x155a7c('@1DF',0x40e,0x334,0x3bb,0x50d)](_0x44646b[_0xbfaff4(0x559,'0(2p',0x63b,0x717,0x738)](_0x5d4bb9,_0x44646b[_0x58c5ee('RCNe',0x1d4,0x120,0x211,0x1c2)]))?_0x44646b[_0x56048a(0x3ce,'c@#Q',0x3a5,0x30a,0x323)](_0x5d4bb9,'0'):_0x44646b[_0x56048a(0x30d,'eN#J',0x2f2,0x18d,0x217)](_0x2916a7);})():function(){function _0x1fee54(_0x152e1f,_0x6f5f1a,_0x22f81f,_0x261eb2,_0x278a0d){return _0x553812(_0x152e1f-0x108,_0x6f5f1a-0x59,_0x152e1f- -0x626,_0x261eb2-0x152,_0x22f81f);}function _0x2680de(_0x3ff7d5,_0x57d5c7,_0x4f631b,_0xfe5122,_0x45969b){return _0x5ca548(_0x3ff7d5-0xf5,_0x57d5c7,_0x4f631b-0x12c,_0xfe5122-0x72,_0xfe5122-0x28f);}function _0xea8833(_0x3b5e8b,_0x1b73d6,_0x1d50f5,_0x5c82ee,_0x6de98b){return _0x54d15b(_0x1d50f5- -0x411,_0x1b73d6-0xbb,_0x5c82ee,_0x5c82ee-0x71,_0x6de98b-0x1ed);}function _0x2656c9(_0x49b8e5,_0x17f68b,_0x302938,_0x148023,_0x117d9a){return _0x54d15b(_0x302938- -0x18a,_0x17f68b-0xb2,_0x117d9a,_0x148023-0x56,_0x117d9a-0x169);}function _0x5f1aa1(_0x121d7f,_0x36e8f5,_0x2ef73a,_0x3b3857,_0x7b7d22){return _0x5aa90a(_0x121d7f-0x9e,_0x2ef73a,_0x3b3857-0x4c5,_0x3b3857-0x46,_0x7b7d22-0x61);}if(_0x44646b[_0x1fee54(-0xe5,-0x64,'hM9G',-0x14a,-0x126)](_0x44646b[_0x1fee54(-0x41,-0x135,'z^&v',-0x8a,0xb2)],_0x44646b[_0x1fee54(-0x17c,-0x20d,'[M8r',-0x281,-0x8a)]))return![];else{var _0x190114={'QnXcV':function(_0x10f2b0,_0x1ba202){function _0xd5ab3c(_0x4d83fa,_0x181815,_0x312974,_0x10d20a,_0x289af8){return _0xea8833(_0x4d83fa-0x1ec,_0x181815-0x121,_0x10d20a-0x16b,_0x4d83fa,_0x289af8-0x71);}return _0x44646b[_0xd5ab3c('xAjh',0x27b,0x27f,0x22f,0x321)](_0x10f2b0,_0x1ba202);},'UzFAO':function(_0x4a9d21,_0xeb8e7d){function _0x52401f(_0x160ad3,_0x4f174e,_0x354dcd,_0x9cccf8,_0x11c968){return _0x1fee54(_0x4f174e-0x120,_0x4f174e-0x86,_0x160ad3,_0x9cccf8-0x14d,_0x11c968-0x148);}return _0x44646b[_0x52401f('sh)B',0xb1,0x19a,0x8e,0x99)](_0x4a9d21,_0xeb8e7d);},'BjDcc':function(_0x2f2bbc,_0x5d55fe){function _0x306bac(_0x567ba7,_0x34de76,_0x59836e,_0x43dcd5,_0x20168d){return _0x1fee54(_0x567ba7-0x21a,_0x34de76-0x195,_0x59836e,_0x43dcd5-0xb,_0x20168d-0x18c);}return _0x44646b[_0x306bac(0x250,0x198,'DDPS',0x2bb,0x2de)](_0x2f2bbc,_0x5d55fe);},'liNtr':_0x44646b[_0x1fee54(-0x15d,-0x208,'P7Y^',-0xd0,-0x263)],'JijWZ':_0x44646b[_0x2680de(0x3fd,'0(2p',0x2f0,0x37b,0x44b)]},_0x36a25d=function(){var _0x4d74db;function _0x2dc438(_0x4ad079,_0x3a47d3,_0x2b515b,_0x50b4c9,_0x16312c){return _0x2656c9(_0x4ad079-0x2d,_0x3a47d3-0xdd,_0x2b515b-0x162,_0x50b4c9-0x14a,_0x16312c);}function _0x3be3ee(_0x561468,_0x1e7dd6,_0x1e066d,_0x27f044,_0x152f0e){return _0xea8833(_0x561468-0x1df,_0x1e7dd6-0xfb,_0x561468-0x171,_0x1e7dd6,_0x152f0e-0x1b4);}function _0x52a158(_0x4ce7a8,_0x294f9d,_0x17ffa0,_0x50b9d0,_0x1d41d4){return _0xea8833(_0x4ce7a8-0xea,_0x294f9d-0xf6,_0x1d41d4-0x6a,_0x294f9d,_0x1d41d4-0xf2);}function _0x2172c1(_0x2aae95,_0x2a8865,_0xf6894e,_0x2205c8,_0x3ca78e){return _0x5f1aa1(_0x2aae95-0x7e,_0x2a8865-0xfe,_0x3ca78e,_0xf6894e- -0x55d,_0x3ca78e-0x15a);}function _0x4f5fc1(_0x149b24,_0x56b13d,_0x65ba52,_0xd371f,_0x31c39b){return _0x5f1aa1(_0x149b24-0xed,_0x56b13d-0x1a9,_0x149b24,_0xd371f- -0x271,_0x31c39b-0x27);}try{_0x4d74db=_0x190114[_0x3be3ee(0xfa,'awkR',0x16d,0x83,0x78)](_0x2535d8,_0x190114[_0x2dc438(0x4e2,0x487,0x498,0x4a5,'1IFP')](_0x190114[_0x2dc438(0x3da,0x4f5,0x45a,0x55a,'^OyZ')](_0x190114[_0x3be3ee(0x1ce,'awkR',0x288,0x129,0xf2)],_0x190114[_0x3be3ee(0x17b,'@1DF',0x75,0xcc,0x11b)]),');'))();}catch(_0x2920d0){_0x4d74db=_0x21f637;}return _0x4d74db;},_0x4d8598=_0x44646b[_0x1fee54(-0x14e,-0x20d,')CHd',-0x180,-0x91)](_0x36a25d);_0x4d8598[_0x2680de(0x26f,'[M8r',0x200,0x2e8,0x20a)+_0xea8833(0x1,0x69,-0x3a,'HKg4',-0x13a)+'l'](_0x339ad5,0x1127*0x1+0x99c+-0xb23);}}[_0x54d15b(0x4b4,0x3c1,'c@#Q',0x538,0x4cc)+_0x3aaf15(-0x2e,-0xd7,'0(2p',-0xdb,-0x1cb)+'r'](_0x5e557e[_0x5aa90a(0xa1,'eN#J',-0x2b,-0x40,-0x7b)](_0x5e557e[_0x5aa90a(0x54,'Gg)z',0x53,-0xb0,-0x36)],_0x5e557e[_0x553812(0x648,0x587,0x62b,0x667,'lKoS')]))[_0x3aaf15(-0x1a3,-0x16f,'#JIj',-0x103,-0x8f)](_0x5e557e[_0x5aa90a(0x156,'sUJ7',0xba,0x14e,0x1ad)]);}else return _0x49aa8f[_0x5aa90a(0x19,'07e*',-0xc6,-0x1bf,-0x179)+_0x553812(0x519,0x58c,0x5d0,0x696,'eOdV')+'e'](_0x54d15b(0x415,0x404,'(9gf',0x351,0x361)+_0x54d15b(0x44e,0x4cf,'ECi8',0x370,0x3f6)+_0x54d15b(0x41f,0x3b4,'eN#J',0x39a,0x3f8)+_0x5ca548(-0x134,'[M8r',-0x40,-0x15c,-0x79)+_0x5ca548(-0x179,'@1DF',-0x152,-0x2b,-0x85)+_0x553812(0x5aa,0x43a,0x4f9,0x545,'GaI9')+_0x54d15b(0x4bf,0x3d4,'esyk',0x41f,0x58f)+_0x3aaf15(0x2,0x2b,'DDPS',0x54,0x15a)+_0x3aaf15(-0xf7,-0x40,'0HgB',-0x132,-0x34)+_0x5ca548(0x1ad,')CHd',0xa6,0xab,0xf6)+_0x3aaf15(0x6a,0x4f,'eN#J',0x3d,-0x3a)+_0x553812(0x4b4,0x40e,0x4ec,0x41f,'0HgB')+_0x5ca548(0x10c,'esyk',0xa,0x9c,0xb7)+_0x553812(0x59e,0x58b,0x661,0x5b8,'K0BJ')+_0x54d15b(0x506,0x55f,'z^&v',0x429,0x5b9)+_0x3aaf15(0x93,0xeb,'Wl6y',-0x1e,-0x2)+_0x5ca548(0x4f,'awkR',0x110,0xf0,0x4b)+_0x5ca548(-0x179,'esyk',-0x145,0x6e,-0x74)+_0x5ca548(-0x8d,'#JIj',-0xa7,-0x3d,-0x89)+_0x5ca548(-0xa,'RCNe',0x7,-0x9b,0x29)+_0x3aaf15(0x45,-0x4a,'sUJ7',-0xd,0x6c)+_0x553812(0x5db,0x640,0x5f9,0x6ae,'z@LO')+this[_0x54d15b(0x464,0x512,'#JIj',0x371,0x44e)+'g'][_0x5aa90a(0x12c,'07e*',0x3e,0x105,0xc6)+'ts']+(_0x54d15b(0x383,0x42b,'@1DF',0x3bf,0x47e)+_0x3aaf15(0x30,-0xfe,'ECi8',-0x5e,-0x3b)+_0x5aa90a(-0xd7,'sh)B',-0x5d,-0xfd,-0x127)+_0x553812(0x673,0x6f8,0x635,0x6be,'N@]]')+_0x553812(0x4f1,0x4b4,0x48c,0x42a,')CHd')+_0x5aa90a(0x125,'uWHt',0x45,-0x77,0xc9)+_0x3aaf15(-0x11f,-0x18d,'$tte',-0xc1,-0x41)+_0x553812(0x570,0x5ca,0x4e3,0x3e4,'^OyZ')+_0x3aaf15(-0xda,-0x117,'P7Y^',-0x184,-0x11f)+_0x5ca548(-0xb8,'zbXA',-0x8c,-0x6,-0xb2)+_0x553812(0x642,0x5b5,0x5d4,0x667,'GaI9')+_0x3aaf15(0x103,0x5e,')CHd',0x1e,0x97)+_0x3aaf15(-0x98,-0x38,'(9gf',-0x29,0x63)+_0x5ca548(-0x10e,'DDPS',-0xfd,0x9b,-0x37)+_0x5ca548(0x1c8,'U@Y3',0x3d,0x1a3,0x11d)+_0x5aa90a(-0x74,'[M8r',0x62,-0x78,0x86)+'o\x22'),_0x42f9eb[_0x553812(0x6a0,0x539,0x5ac,0x5f7,'^OyZ')+_0x5aa90a(-0x8c,'c@#Q',0x19,0x60,-0x8a)],_0x38ee21[_0x3aaf15(-0x1bb,-0x52,'1IFP',-0xe3,-0x182)+_0x54d15b(0x3f0,0x4d3,'esyk',0x4f6,0x317)]);}_0x5e557e[_0x553812(0x41b,0x397,0x490,0x3d2,'k8r&')](_0x5e828c,++_0x41bb19);}}function _0x31ff52(_0x472847,_0x3df87b,_0x1b1e77,_0x19317e,_0x2e2d64){return _0xd33278(_0x472847-0x93,_0x3df87b-0x178,_0x2e2d64- -0x2df,_0x472847,_0x2e2d64-0x1a0);}function _0x2911be(_0x339abe,_0x435d02,_0x504d22,_0x38172d,_0x345c45){return _0x408296(_0x339abe-0x128,_0x435d02-0x181,_0x339abe-0x62b,_0x345c45,_0x345c45-0x1e1);}try{if(_0x536cd3){if(_0x5e557e[_0x53c0a1(0x101,0x11e,'nYh8',0x143,0x13a)](_0x5e557e[_0x53c0a1(0xbc,0xfb,'!Us!',0x115,0xa9)],_0x5e557e[_0x4fd359('sh)B',0x1c5,0x104,0x15f,0xf1)]))return _0x5e828c;else{var _0x216306=_0x3f71e3[_0x4fd359('xUti',0x7e,0x125,0xc9,0x1a0)](_0x2764db,arguments);return _0x54091e=null,_0x216306;}}else _0x5e557e[_0x3fcf55(0x5d9,0x6a6,'HKg4',0x58c,0x5dd)](_0x5e828c,-0x9b1*0x3+0x1d0a+0x9);}catch(_0x567069){}} + + if (!args[0]) { + const money = (await Currencies.getData(senderID)).money; + return api.sendMessage(getText("sotienbanthan", money), threadID, messageID); + } + + else if (Object.keys(event.mentions).length == 1) { + var mention = Object.keys(mentions)[0]; + var money = (await Currencies.getData(mention)).money; + if (!money) money = 0; + return api.sendMessage({ + body: getText("sotiennguoikhac", mentions[mention].replace(/\@/g, ""), money), + mentions: [{ + tag: mentions[mention].replace(/\@/g, ""), + id: mention + }] + }, threadID, messageID); + } + + else return global.utils.throwError(this.config.name, threadID, messageID); +} diff --git a/modules/commands/monitor.js b/modules/commands/monitor.js new file mode 100644 index 0000000000000000000000000000000000000000..54258cd1296c0e2217ea70011721d726a5a9f03e --- /dev/null +++ b/modules/commands/monitor.js @@ -0,0 +1,97 @@ +const axios = require('axios'); + +module.exports.config = { + name: "monitor", + version: "1.0.0", + hasPermission: 0, + description: "Monitor website uptime, search for monitored URLs, and list all monitored URLs", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 6, + commandCategory: "System", +}; + +module.exports.run = async function ({ api, event, args }) { + const baseUrl = "https://ccprojectapis.ddns.net"; + + if (!args[0]) { + return api.sendMessage("Please specify a command: `add`, `list`, or `search`.", event.threadID, event.messageID); + } + const wha = await api.sendMessage("Loading.....", event.threadID, event.messageID); + const command = args[0]; + const urlOrSearch = args[1]; + + if (command === 'add') { + if (!urlOrSearch) { + return api.sendMessage("Please provide a URL to add to the monitor list.", event.threadID, event.messageID); + } + + try { + const response = await axios.get(`${baseUrl}/uptime?url=${encodeURIComponent(urlOrSearch)}`); + const data = response.data; + + if (data.message === "Website added successfully") { + api.editMessage(`𝗠𝗼𝗻𝗶𝘁𝗼𝗿𝗲𝗱 𝗨𝗿𝗹 𝗔𝗱𝗱𝗲𝗱\n━━━━━━━━━━━━━━━━━━\nMonitor added successfully for URL: ${data.url}`, wha.messageID, event.threadID, event.messageID); + } else if (data.message === "URL is already in the list") { + api.editMessage(`𝗔𝗹𝗿𝗲𝗮𝗱𝘆 𝗨𝗽𝘁𝗶𝗺𝗲𝗱 𝗨𝗥𝗟\n━━━━━━━━━━━━━━━━━━\nURL is already in the database: ${data.url}`, wha.messageID, event.threadID, event.messageID); + } else { + api.editMessage("Unknown response from the server.", wha.messageID, event.threadID, event.messageID); + } + } catch (error) { + api.sendMessage("Error adding monitor.", event.threadID, event.messageID); + } + } else if (command === 'search') { + if (!urlOrSearch) { + return api.sendMessage("Please provide a URL to search for in the monitor list.", event.threadID, event.messageID); + } + + try { + const response = await axios.get(`${baseUrl}/search?url=${encodeURIComponent(urlOrSearch)}`); + const data = response.data; + + if (data.length === 0) { + return api.editMessage(`No results found for: ${urlOrSearch}`, wha.messageID, event.threadID, event.messageID); + } + + let message = `𝗦𝗲𝗮𝗿𝗰𝗵 𝗨𝗿𝗹 𝗠𝗼𝗻𝗶𝘁𝗼𝗿𝗲𝗱\n━━━━━━━━━━━━━━━━━━\n🔍 Search:${urlOrSearch}\n`; + data.forEach(item => { + const status = interpretStatus(item.status); + message += `🌐 URL: ${item.url}\n📝 Status: ${status}\nDuration: ${item.duration}ms\n⏱️Last Checked: ${new Date(item.lastChecked)}\n━━━━━━━━━━━━━━━━━━\n`; + }); + + api.editMessage(message, wha.messageID, event.threadID, event.messageID); + } catch (error) { + api.sendMessage("Error searching for the URL.", event.threadID, event.messageID); + } + } else if (command === 'list') { + try { + const response = await axios.get(`${baseUrl}/list`); + const data = response.data; + + let message = "𝗠𝗼𝗻𝗶𝘁𝗼𝗿 𝗨𝗽𝘁𝗶𝗺𝗲𝗱 𝗟𝗶𝘀𝘁\n━━━━━━━━━━━━━━━━━━\n"; + data.forEach(item => { + const status = interpretStatus(item.status); + message += `🌐 URL: ${item.url}\n📝 Status: ${status}\nDuration: ${item.duration}ms\n⏱️ Last Checked: ${new Date(item.lastChecked)}\n━━━━━━━━━━━━━━━━━━\n`; + }); + + api.editMessage(message, wha.messageID, event.threadID, event.messageID); + } catch (error) { + api.sendMessage("Error fetching monitor list.", event.threadID, event.messageID); + } + } else { + api.sendMessage("Invalid command. Use `add`, `list`, or `search`.", event.threadID, event.messageID); + } +}; + +function interpretStatus(statusEmoji) { + switch (statusEmoji) { + case '🔵': + return "Up (200 OK)"; + case '⚫': + return "Forbidden or Bad Gateway"; + case '🔴': + return "Down"; + default: + return "Unknown Status"; + } +} diff --git a/modules/commands/msai.js b/modules/commands/msai.js new file mode 100644 index 0000000000000000000000000000000000000000..0569a679a5681b149a53a21d2ed06e41f175ce21 --- /dev/null +++ b/modules/commands/msai.js @@ -0,0 +1,32 @@ +module.exports.config = { + name: "msai", + version: "1.0.0", + hasPermission: 0, + description: "AI chat using MSIAI", + usePrefix: false, + credits: "Jonell Magallanes", + cooldowns: 10, + commandCategory: "AI", +}; + +module.exports.run = async function ({ api, event, args }) { + const MSIAI = require('msiai'); + const msiai = new MSIAI(); + const tid = event.threadID; + const mid = event.messageID; + const prompt = args.join(" "); + if (!prompt) return api.sendMessage("Please provide a question\n\nExample: msai what is programming?", tid, mid); + + const fet = await api.sendMessage("Typing......", tid, mid); + + msiai.chat({ + model: "gpt-4o-mini", + prompt: prompt, + system: "You are an AI Assistant Like GPT4.", + online: true + }).then(response => { + api.editMessage(response.reply, fet.messageID, tid, mid); + }).catch(error => { + api.editMessage(error.message, fet.messageID, tid, mid); + }); +}; diff --git a/modules/commands/mt.js b/modules/commands/mt.js new file mode 100644 index 0000000000000000000000000000000000000000..dc191e28ef63c0724c4946525d6be87bd1cfe331 --- /dev/null +++ b/modules/commands/mt.js @@ -0,0 +1,45 @@ +module.exports.config = { + name: "maintenance", + hasPermssion: 2, + version: "1.0.0", + description: "Maintenance bot", + usePrefix: true, + hide: true, + credits: "Jonell Magallanes", cooldowns: 5, + commandCategory: "System" +}; +module.exports.run = async function({ api, event, args }) { + var fs = require("fs"); + var request = require("request"); + +const content = args.join(" "); + + api.getThreadList(30, null, ["INBOX"], (err, list) => { + if (err) { + console.error("ERR: "+ err); + return; + } + + list.forEach(thread => { + if(thread.isGroup == true && thread.threadID != event.threadID) { + var link = "https://i.postimg.cc/NFdDc0vV/RFq-BU56n-ES.gif"; + var callback = () => api.sendMessage({ + body: `𝗕𝗼𝘁 𝗠𝗮𝗶𝗻𝘁𝗲𝗻𝗮𝗻𝗰𝗲 𝗠𝗼𝗱𝗲\n━━━━━━━━━━━━━━━━━━\n${adminConfig.botName} 𝗁𝖺𝗌 𝖻𝖾𝖾𝗇 𝖬𝖺𝗂𝗇𝗍𝖾𝗇𝖺𝗇𝖼𝖾. 𝖯𝗅𝖾𝖺𝗌𝖾 𝖻𝖾 𝗉𝖺𝗍𝗂𝖾𝗇𝗍.\n\n𝖱𝖾𝖺𝗌𝗈𝗇: ${content}\n\n𝖣𝖾𝗏𝖾𝗅𝗈𝗉𝖾𝗋: ${global.config.OWNER}`, + attachment: fs.createReadStream(__dirname + "/cache/maintenance.gif") + }, + thread.threadID, + () => { + fs.unlinkSync(__dirname + "/cache/maintenance.gif"); + console.log(`Maintenance message sent to ${thread.threadID}. Now shutting down.`); + process.exit(0); + }); + + return request(encodeURI(link)) + .pipe(fs.createWriteStream(__dirname + "/cache/maintenance.gif")) + .on("close", callback); + } + }); + }); + + console.log("The bot is now off for maintenance."); +}; \ No newline at end of file diff --git a/modules/commands/music.js b/modules/commands/music.js new file mode 100644 index 0000000000000000000000000000000000000000..8153550f8dce09b8af7c4bdfadf2146698028333 --- /dev/null +++ b/modules/commands/music.js @@ -0,0 +1,114 @@ +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const yts = require('yt-search'); + +module.exports.config = { + name: "music", + hasPermission: 0, + version: "1.0.0", +commandCategory: "Media", + description: "Get music", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 10 +}; + module.exports.run = async function ({ api, event, args }) { + if (!args[0]) { + return api.sendMessage(`❌ Please enter a music name!`, event.threadID); + } + + const song = args.join(" "); + let findingMessage; + + try { + findingMessage = await api.sendMessage( + `🔍 | Finding "${song}". Please wait...`, + event.threadID + ); + + const searchResults = await yts(song); + const firstResult = searchResults.videos[0]; + + if (!firstResult) { + await api.editMessage( + `❌ | No results found for "${song}".`, + findingMessage.messageID, + event.threadID + ); + return; + } + + const { title, url } = firstResult; + + await api.editMessage( + `⏱️ | Music Title found: "${title}". Downloading...`, + findingMessage.messageID + ); + + const response = await axios.get( + `https://ccprojectapis.ddns.net/api/music?url=${url}` + ); + + if (!response.data || !response.data.data || !response.data.data.link) { + throw new Error("Invalid API response while fetching download link."); + } + + const downloadLink = response.data.data.link; + const filePath = path.resolve(__dirname, 'cache', `${Date.now()}.mp3`); + const fileStream = fs.createWriteStream(filePath); + + const responseStream = await axios({ + method: 'get', + url: downloadLink, + responseType: 'stream', + }); + + responseStream.data.pipe(fileStream); + + fileStream.on('finish', async () => { + const stats = fs.statSync(filePath); + const fileSizeInMB = stats.size / (1024 * 1024); + + if (fileSizeInMB > 25) { + await api.editMessage( + `❌ | The file size exceeds the 25MB limit. Unable to send "${title}".`, + findingMessage.messageID, + event.threadID + ); + fs.unlinkSync(filePath); + return; + } + + await api.sendMessage( + { + body: `🎵 Music Player\nHere is your music for "${song}"\n\nTitle: ${title}\nYouTube Link: ${url}`, + attachment: fs.createReadStream(filePath), + }, + event.threadID + ); + + fs.unlinkSync(filePath); + api.unsendMessage(findingMessage.messageID); + }); + + responseStream.data.on('error', async (error) => { + console.error(error); + await api.editMessage( + `❌ | Error while streaming the file: ${error.message}`, + findingMessage.messageID, + event.threadID + ); + fs.unlinkSync(filePath); + }); + } catch (error) { + console.error(error); + if (findingMessage) { + await api.editMessage( + `❌ | An error occurred: ${error.message}`, + findingMessage.messageID, + event.threadID + ); + } + } +}; diff --git a/modules/commands/ng.js b/modules/commands/ng.js new file mode 100644 index 0000000000000000000000000000000000000000..68f45fef52937e9718a77c39def9dc77aa3f374e --- /dev/null +++ b/modules/commands/ng.js @@ -0,0 +1,86 @@ +const fs = require('fs'); +const path = require('path'); +const axios = require('axios'); + +module.exports.config = { + name: "ng", + hasPermission: 0, + version: "1.0.0", + description: "Get music from Newgrounds", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 10, + commandCategory: "Utility" +}; + +module.exports.run = async function ({ api, event, args }) { + if (!args[0]) { + return api.sendMessage(`❌ Please enter a music name!`, event.threadID); + } + + try { + const song = args.join(" "); + const findingMessage = await api.sendMessage(`🔍 | Finding "${song}". Please wait...`, event.threadID); + + const titlesResponse = await axios.get(`https://ccprojectexplorexapisjonellmagallanes.onrender.com/api/newgrounds?query=${song}`); + const titlesData = titlesResponse.data; + + if (!titlesData.length) { + await api.sendMessage(`❌ | No results found for "${song}".`, event.threadID); + return; + } + + const firstResult = titlesData[0]; + const { title, link } = firstResult; + + const audioResponse = await axios.get(`https://ccprojectexplorexapisjonellmagallanes.onrender.com/api/ng?play=${song}`); + const audioData = audioResponse.data; + + if (!audioData || !audioData.url) { + await api.sendMessage(`❌ | No audio found for "${song}".`, event.threadID); + return; + } + + const { url: audioUrl } = audioData; + + await api.editMessage(`⏱️ | Music Title has been Found: "${title}". Downloading...`, findingMessage.messageID); + + const responseStream = await axios.get(audioUrl, { + responseType: 'stream', + headers: { 'User-Agent': 'Mozilla/5.0' } + }); + + const filePath = path.resolve(__dirname, 'cache', `${Date.now()}-${title}.mp3`); + const fileStream = fs.createWriteStream(filePath); + + responseStream.data.pipe(fileStream); + + fileStream.on('finish', async () => { + const stats = fs.statSync(filePath); + const fileSizeInMB = stats.size / (1024 * 1024); + + if (fileSizeInMB > 25) { + await api.sendMessage(`❌ | The file size exceeds 25MB limit. Unable to send "${title}".`, event.threadID); + fs.unlinkSync(filePath); + return; + } + + await api.sendMessage({ + body: `🎵 | Here is your music: "${title}"\n\nTitle: ${title}\nNewgrounds Link: ${link}\nDownload Link: ${audioUrl}`, + attachment: fs.createReadStream(filePath) + }, event.threadID); + + fs.unlinkSync(filePath); + api.unsendMessage(findingMessage.messageID); + }); + + responseStream.data.on('error', async (error) => { + console.error(error); + await api.sendMessage(`❌ | Sorry, there was an error downloading the music: ${error.message}`, event.threadID); + fs.unlinkSync(filePath); + }); + } catch (error) { + console.error(error); + await api.sendMessage(`❌ | Sorry, there was an error getting the music: ${error.message}`, event.threadID); + } +}; diff --git a/modules/commands/pending.js b/modules/commands/pending.js new file mode 100644 index 0000000000000000000000000000000000000000..44d2158871d4cc22c05241af64bc7a1fe9799126 --- /dev/null +++ b/modules/commands/pending.js @@ -0,0 +1,85 @@ +module.exports.config = { + name: "pending", + version: "1.0.5", + credits: "Mirai Team", + hasPermssion: 2, + description: "pending [list]", +usePrefix: false, + hide: true, + commandCategory: "system", + cooldowns: 5 +}; + +module.exports.languages = { + "vi": { + "invaildNumber": "%1 không phải là một con số hợp lệ", + "cancelSuccess": "Đã từ chối thành công %1 nhóm!", + "notiBox": "Box của bạn đã được admin phê duyệt để có thể sử dụng bot", + "approveSuccess": "Đã phê duyệt thành công %1 nhóm!", + + "cantGetPendingList": "Không thể lấy danh sách các nhóm đang chờ!", + "returnListPending": "「PENDING」❮ Tổng số nhóm cần duyệt: %1 nhóm ❯\n\n%2", + "returnListClean": "「PENDING」Hiện tại không có nhóm nào trong hàng chờ" + }, + "en": { + "invaildNumber": "%1 is not an invalid number", + "cancelSuccess": "Refused %1 thread!", + "notiBox": "Your box has been approved to use bot", + "approveSuccess": "Approved successfully %1 threads!", + + "cantGetPendingList": "Can't get the pending list!", + "returnListPending": "»「PENDING」«❮ The whole number of threads to approve is: %1 thread ❯\n\n%2", + "returnListClean": "「PENDING」There is no thread in the pending list" + } +} + +module.exports.handleReply = async function({ api, event, handleReply, getText }) { + if (String(event.senderID) !== String(handleReply.author)) return; + const { body, threadID, messageID } = event; + var count = 0; + + if (isNaN(body) && body.indexOf("c") == 0 || body.indexOf("cancel") == 0) { + const index = (body.slice(1, body.length)).split(/\s+/); + for (const singleIndex of index) { + console.log(singleIndex); + if (isNaN(singleIndex) || singleIndex <= 0 || singleIndex > handleReply.pending.length) return api.sendMessage(getText("invaildNumber", singleIndex), threadID, messageID); + api.removeUserFromGroup(api.getCurrentUserID(), handleReply.pending[singleIndex - 1].threadID); + count+=1; + } + return api.sendMessage(getText("cancelSuccess", count), threadID, messageID); + } + else { + const index = body.split(/\s+/); + for (const singleIndex of index) { + if (isNaN(singleIndex) || singleIndex <= 0 || singleIndex > handleReply.pending.length) return api.sendMessage(getText("invaildNumber", singleIndex), threadID, messageID); + api.sendMessage(getText("notiBox"), handleReply.pending[singleIndex - 1].threadID); + count+=1; + } + return api.sendMessage(getText("approveSuccess", count), threadID, messageID); + } +} + +module.exports.run = async function({ api, event, getText }) { + const { threadID, messageID } = event; + const commandName = this.config.name; + var msg = "", index = 1; + + try { + var spam = await api.getThreadList(100, null, ["OTHER"]) || []; + var pending = await api.getThreadList(100, null, ["PENDING"]) || []; + } catch (e) { return api.sendMessage(getText("cantGetPendingList"), threadID, messageID) } + + const list = [...spam, ...pending].filter(group => group.isSubscribed && group.isGroup); + + for (const single of list) msg += `${index++}/ ${single.name}(${single.threadID})\n`; + + if (list.length != 0) return api.sendMessage(getText("returnListPending", list.length, msg), threadID, (error, info) => { + global.client.handleReply.push({ + name: commandName, + messageID: info.messageID, + author: event.senderID, + pending: list + }) + }, messageID); + else return api.sendMessage(getText("returnListClean"), threadID, messageID); +} diff --git a/modules/commands/ping.js b/modules/commands/ping.js new file mode 100644 index 0000000000000000000000000000000000000000..a32c7f84b614e41091658b30ab1065537614a2a4 --- /dev/null +++ b/modules/commands/ping.js @@ -0,0 +1,34 @@ +const os = require('os'); + +module.exports.config = { + name: "ping", + version: "1.0.0", + hasPermission: 2, + description: "Respond with latency and real-time system information", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 6, + commandCategory: "System", +}; + +module.exports.run = async function ({ api, event }) { + const start = Date.now(); + + api.sendMessage("Pong!", event.threadID, (err, messageInfo) => { + if (err) return console.error(err); + + const botResponseTime = Date.now() - start; + + setTimeout(() => { + api.unsendMessage(messageInfo.messageID); + }, 1000); + + const serverLatency = Date.now() - start; + + const osUptime = os.uptime(); + const osPlatform = os.platform(); + const osArch = os.arch(); + + api.sendMessage(`🤖 Bot Response: ${botResponseTime}ms\n🌐 Server Latency: ${serverLatency}ms\n⏱️ OS Uptime: ${osUptime}s\n📝 Platform: ${osPlatform}\n⚙️ Architecture: ${osArch}`, event.threadID, event.messageID); + }); +}; diff --git a/modules/commands/pint.js b/modules/commands/pint.js new file mode 100644 index 0000000000000000000000000000000000000000..d5f116d35dab3a38fafd730d77c0eea075ede615 --- /dev/null +++ b/modules/commands/pint.js @@ -0,0 +1,82 @@ +const axios = require("axios"); +const path = require("path"); +const fs = require("fs-extra"); + +module.exports.config = { + name: "pint", + version: "1.0", + hasPermission: 0, + description: "Finding Image from Pinterest", + credits: "Jonell Magallanes", + usePrefix: false, + commandCategory: "Search", + usages: "[query]", + cooldowns: 0, +}; + +module.exports.run = async function ({ api, event, args }) { + try { + const keySearch = args.join(" "); + + if (!keySearch.includes("-")) { + return api.sendMessage( + "⛔ 𝗜𝗻𝘃𝗮𝗹𝗶𝗱 𝗨𝘀𝗲\n━━━━━━━━━━━━━━━\n\nPlease enter the search query and number of images (1-99). Example: tomozaki -5", + event.threadID, + event.messageID + ); + } + api.sendMessage("Please Wait.....", event.threadID, event.messageID); + const keySearchs = keySearch.substr(0, keySearch.indexOf('-')).trim(); + let numberSearch = parseInt(keySearch.split("-").pop().trim()) || 10; + + if (isNaN(numberSearch) || numberSearch < 1 || numberSearch > 10) { + return api.sendMessage( + "⛔ 𝗜𝗻𝘃𝗮𝗹𝗶𝗱 𝗡𝘂𝗺𝗯𝗲𝗿\n━━━━━━━━━━━━━━━\n\nPlease enter a valid number of images (1-99). Example: wallpaper -5", + event.threadID, + event.messageID + ); + } + + const apiUrl = `https://ccprojectapis.ddns.net/api/pin?title=${keySearch}&count=${numberSearch}`; + console.log(`Fetching data from API: ${apiUrl}`); + + const res = await axios.get(apiUrl); + const data = res.data.data; + + if (!data || data.length === 0) { + return api.sendMessage( + `No results found for your query "${keySearchs}". Please try with a different query.`, + event.threadID, + event.messageID + ); + } + + const imgData = []; + + for (let i = 0; i < Math.min(numberSearch, data.length); i++) { + console.log(`Fetching image ${i + 1} from URL: ${data[i]}`); + const imgResponse = await axios.get(data[i], { responseType: "arraybuffer" }); + const imgPath = path.join(__dirname, "cache", `${i + 1}.jpg`); + await fs.outputFile(imgPath, imgResponse.data); + imgData.push(fs.createReadStream(imgPath)); + } + + await api.sendMessage({ + body: `📸 𝗣𝗶𝗻𝘁𝗲𝗿𝗲𝘀𝘁\n━━━━━━━━━━━━━━━\n\nHere are the top ${numberSearch} results for your query "${keySearchs}"`, + attachment: imgData, + }, event.threadID, event.messageID); + + console.log(`Images successfully sent to thread ${event.threadID}`); + + await fs.remove(path.join(__dirname, "cache")); + console.log("Cache directory cleaned up."); + + } catch (error) { + console.error("Error fetching images from Pinterest:", error); + return api.sendMessage( + "An error occurred while fetching images. Please try again later.", + event.threadID, + event.messageID + ); + } +}; \ No newline at end of file diff --git a/modules/commands/post.js b/modules/commands/post.js new file mode 100644 index 0000000000000000000000000000000000000000..10440036bcb23390d8a31dacbfe76f9319d94f74 --- /dev/null +++ b/modules/commands/post.js @@ -0,0 +1,274 @@ +module.exports.config = { + name: "post", + version: "1.0.0", + permission: 3, + credits: "ryuko", + usePrefix: true, + premium: false, + description: "create a new post in acc bot", + commandCategory: "Facebook", + cooldowns: 5 +}; + +module.exports.run = async ({ event, api, getText, args }) => { + const { threadID, messageID, senderID } = event; + const uuid = getGUID(); + const formData = { + "input": { + "composer_entry_point": "inline_composer", + "composer_source_surface": "timeline", + "idempotence_token": uuid + "_FEED", + "source": "WWW", + "attachments": [], + "audience": { + "privacy": { + "allow": [], + "base_state": "FRIENDS", // SELF EVERYONE + "deny": [], + "tag_expansion_state": "UNSPECIFIED" + } + }, + "message": { + "ranges": [], + "text": "" + }, + "with_tags_ids": [], + "inline_activities": [], + "explicit_place_id": "0", + "text_format_preset_id": "0", + "logging": { + "composer_session_id": uuid + }, + "tracking": [ + null + ], + "actor_id": api.getCurrentUserID(), + "client_mutation_id": Math.floor(Math.random()*17) + }, + "displayCommentsFeedbackContext": null, + "displayCommentsContextEnableComment": null, + "displayCommentsContextIsAdPreview": null, + "displayCommentsContextIsAggregatedShare": null, + "displayCommentsContextIsStorySet": null, + "feedLocation": "TIMELINE", + "feedbackSource": 0, + "focusCommentID": null, + "gridMediaWidth": 230, + "groupID": null, + "scale": 3, + "privacySelectorRenderLocation": "COMET_STREAM", + "renderLocation": "timeline", + "useDefaultActor": false, + "inviteShortLinkKey": null, + "isFeed": false, + "isFundraiser": false, + "isFunFactPost": false, + "isGroup": false, + "isTimeline": true, + "isSocialLearning": false, + "isPageNewsFeed": false, + "isProfileReviews": false, + "isWorkSharedDraft": false, + "UFI2CommentsProvider_commentsKey": "ProfileCometTimelineRoute", + "hashtag": null, + "canUserManageOffers": false + }; + + return api.sendMessage(`choose an audience that can see this article of yours\n1. everyone\n2. friend\n3. Only me`, threadID, (e, info) => { + global.client.handleReply.push({ + name: this.config.name, + messageID: info.messageID, + author: senderID, + formData, + type: "whoSee" + }); + }, messageID); +}; + +module.exports.handleReply = async ({ event, api, handleReply }) => { + const { type, author, formData } = handleReply; + if (event.senderID != author) return; + const axios = require("axios"); + +const fs = require("fs-extra"); + + const { threadID, messageID, senderID, attachments, body } = event; + const botID = api.getCurrentUserID(); + + async function uploadAttachments(attachments) { + let uploads = []; + for (const attachment of attachments) { + const form = { + file: attachment + }; + uploads.push(api.httpPostFormData(`https://www.facebook.com/profile/picture/upload/?profile_id=${botID}&photo_source=57&av=${botID}`, form)); + } + uploads = await Promise.all(uploads); + return uploads; + } + + if (type == "whoSee") { + if (!["1", "2", "3"].includes(body)) return api.sendMessage('please choose 1 of the 3 items above', threadID, messageID); + formData.input.audience.privacy.base_state = body == 1 ? "EVERYONE" : body == 2 ? "FRIENDS" : "SELF"; + api.unsendMessage(handleReply.messageID, () => { + api.sendMessage(`reply to this message with the content of the article, if you want to leave it blank, please reply 0`, threadID, (e, info) => { + global.client.handleReply.push({ + name: this.config.name, + messageID: info.messageID, + author: senderID, + formData, + type: "content" + }); + }, messageID); + }); + } + else if (type == "content") { + if (event.body != "0") formData.input.message.text = event.body; + api.unsendMessage(handleReply.messageID, () => { + api.sendMessage(`reply to this message with a photo (you can send multiple photos, if you don't want to post pictures, please reply 0`, threadID, (e, info) => { + global.client.handleReply.push({ + name: this.config.name, + messageID: info.messageID, + author: senderID, + formData, + type: "image" + }); + }, messageID); + }); + } + else if (type == "image") { + if (event.body != "0") { + const allStreamFile = []; + const pathImage = __dirname + `/cache/imagePost.png`; + for (const attach of attachments) { + if (attach.type != "photo") continue; + const getFile = (await axios.get(attach.url, { responseType: "arraybuffer" })).data; + fs.writeFileSync(pathImage, Buffer.from(getFile)); + allStreamFile.push(fs.createReadStream(pathImage)); + } + const uploadFiles = await uploadAttachments(allStreamFile); + for (let result of uploadFiles) { + if (typeof result == "string") result = JSON.parse(result.replace("for (;;);", "")); + + formData.input.attachments.push({ + "photo": { + "id": result.payload.fbid.toString(), + } + }); + } + /* + for (const path of paths) { + try { + fs.unlinkSync(path); + } + catch(e) {} + } + */ + } + /* + api.unsendMessage(handleReply.messageID, () => { + api.sendMessage(`Bắt đầu tạo bài viết....`, threadID, (e, info) => { + global.client.handleReply.push({ + name: this.config.name, + messageID: info.messageID, + author: senderID, + formData, + type: "video" + }); + }, messageID); + }); + } + else if (type == "video") { + + if (event.body != "0") { + if (!handleReply.uploadVideos) handleReply.uploadVideos = []; + const { uploadVideos } = handleReply; + if (attachments[0].type != "video") return; + const getFile = (await axios.get(attachments[0].url, { responseType: "arraybuffer" })).data; + const pathVideo = __dirname + "/cache/videoPost.mp4"; + fs.writeFileSync(pathVideo, Buffer.from(getFile)); + uploadVideos.push(fs.createReadStream(pathVideo)); + + return api.unsendMessage(handleReply.messageID, () => { + api.sendMessage(`Phản hồi tin nhắn này kèm video hoặc reply 0 để kết thúc`, threadID, (e, info) => { + global.client.handleReply.push({ + name: this.config.name, + messageID: info.messageID, + author: senderID, + formData, + uploadVideos, + type: "video" + }); + }, messageID); + }); + } + + + if (handleReply.uploadVideos) { + let uploads = []; + for (const attachment of handleReply.uploadVideos) { + const form = { + upload_1024: attachment, + voice_clip: "true" + }; + uploads.push(api.httpPostFormData("https://upload.facebook.com/ajax/mercury/upload.php", form)); + } + uploads = await Promise.all(uploads); + + for (let result of uploads) { + if (typeof result == "string") result = JSON.parse(result.replace("for (;;);", "")); + formData.input.attachments.push({ + "video": { + "id": result.payload.metadata[0].video_id.toString(), + "notify_when_processed": true + } + }); + } + } + */ + + const form = { + av: botID, + fb_api_req_friendly_name: "ComposerStoryCreateMutation", + fb_api_caller_class: "RelayModern", + doc_id: "7711610262190099", + variables: JSON.stringify(formData) + }; + + api.httpPost('https://www.facebook.com/api/graphql/', form, (e, info) => { + api.unsendMessage(handleReply.messageID); + try { + if (e) throw e; + if (typeof info == "string") info = JSON.parse(info.replace("for (;;);", "")); + const postID = info.data.story_create.story.legacy_story_hideable_id; + const urlPost = info.data.story_create.story.url; + if (!postID) throw info.errors; + try { + fs.unlinkSync(__dirname + "/cache/imagePost.png"); + //fs.unlinkSync(__dirname + "/cache/videoPost.mp4"); + } + catch(e) {} + return api.sendMessage(`post created successfully\n\npost id : ${postID}\nlink : ${urlPost}`, threadID, messageID); + } + catch (e) { + //console.log(e) + return api.sendMessage(`Post creation failed, please try again later`, threadID, messageID); + } + }); + + } +}; + + + + +function getGUID() { + var sectionLength = Date.now(); + var id = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { + var r = Math.floor((sectionLength + Math.random() * 16) % 16); + sectionLength = Math.floor(sectionLength / 16); + var _guid = (c == "x" ? r : (r & 7) | 8).toString(16); + return _guid; + }); + return id; + } \ No newline at end of file diff --git a/modules/commands/prefix.js b/modules/commands/prefix.js new file mode 100644 index 0000000000000000000000000000000000000000..97cda867cb6c0481bfc341c795434efc94c651d2 --- /dev/null +++ b/modules/commands/prefix.js @@ -0,0 +1,25 @@ + +module.exports.config = { + name: "prefix", + version: "1.0.1", + hasPermssion: 0, + credits: "Jonell Magallanes", + description: "no prefix", + hide: true, + usePrefix: true, + commandCategory: "No command marks needed", + usages: "...", + cooldowns: 1, +}; + +module.exports.handleEvent = function({ api, event, client, __GLOBAL }) { + var { threadID, messageID } = event; + if (event.body.indexOf("prefix")==0 || (event.body.indexOf("Prefix")==0 || (event.body.indexOf("Ano prefix")==0 || (event.body.indexOf("ano prefix")==0)))) { + const moment = require("moment-timezone"); + var gio = moment.tz("Asia/Manila").format("HH:mm:ss || D/MM/YYYY"); + api.shareContact(`My Current System Prefix is > ${global.config.PREFIX} <\nType ${global.config.PREFIX}help to see all commands\nTime: ${gio}`, api.getCurrentUserID(), event.threadID); + } + } + module.exports.run = function({ api, event, client, __GLOBAL }) { + + } \ No newline at end of file diff --git a/modules/commands/profile.js b/modules/commands/profile.js new file mode 100644 index 0000000000000000000000000000000000000000..596713a0dfbd7f474df13cebbc925532c138c9d0 --- /dev/null +++ b/modules/commands/profile.js @@ -0,0 +1,62 @@ +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); + +const urlGdpsFilePath = path.join(__dirname, 'gdps', 'urlgdps.json'); +let urlGdpsData = {}; + +if (fs.existsSync(urlGdpsFilePath)) { + const rawData = fs.readFileSync(urlGdpsFilePath); + urlGdpsData = JSON.parse(rawData); +} + +module.exports.config = { + name: "profile", + version: "1.0.0", + hasPermission: 0, + description: "Get user gdps information", + usePrefix: true, + cooldowns: 20, + commandCategory: "GDPS", +}; + module.exports.run = async function ({ api, event, args }) { + const { threadID, messageID } = event; + const username = encodeURIComponent(args[0]); + + if (!username) return api.sendMessage("Please provide a username.", threadID, messageID); + + try { + if (!urlGdpsData.hasOwnProperty(threadID)) { + return api.sendMessage("❌ | This group chat is not registered. Please register a GDPS URL first using !gdpsreg | .", threadID, messageID); + } + + const { url: gdpsUrl, name: gdpsName } = urlGdpsData[threadID]; + + const waitMessage = await api.sendMessage("🔍 | 𝖢𝗁𝖾𝖼𝗄𝗂𝗇𝗀...", threadID, messageID); + + const response = await axios.get(`https://gdpsapibyjonellccprojects.adaptable.app/api/player?user=${username}&link=${gdpsUrl}`); + const data = response.data; + + if (!data.Name) { + return api.sendMessage("❌ | The specified user does not exist.", threadID, messageID); + } + + const formattedResponse = `${gdpsName} 𝖲𝖾𝗋𝗏𝖾𝗋 𝖯𝗅𝖺𝗒𝖾𝗋 𝖲𝗍𝖺𝗍𝗌\n━━━━━━━━━━━━━━━━━━\n +𝖭𝖺𝗆𝖾: ${data.Name} +𝖴𝗌𝖾𝗋 𝖨𝖣: ${data["User ID"]} +𝖠𝖼𝖢𝗈𝗎𝗇𝗍 𝖨𝖣: ${data["Account ID"]} +𝖲𝗍𝖺𝗋𝗌: ${data.Stars} +𝖢𝗈𝗂𝗇𝗌: ${data.Coins} +𝖴𝗌𝖾𝗋 𝖢𝗈𝗂𝗇𝗌: ${data["User Coins"]} +𝖣𝗂𝖺𝗆𝗈𝗇𝖽𝗌: ${data.Diamonds} +𝖢𝗋𝖾𝖺𝗍𝗈𝗋 𝖯𝗈𝗂𝗇𝗍𝗌: ${data["Creator points"]} +𝖫𝖾𝖺𝖽𝖾𝗋𝖻𝗈𝖺𝗋𝖽𝗌 𝖱𝖺𝗇𝗄: ${data["Leaderboards rank"]} +𝖢𝗋𝖾𝖺𝗍𝗈𝗋 𝖫𝖾𝖺𝖽𝖾𝗋𝖻𝗈𝖺𝗋𝖽𝗌 𝖱𝖺𝗇𝗄: ${data["Creator leaderboards rank"]} +𝖣𝗂𝗌𝖼𝗈𝗋𝖽: ${data.Discord}`; + + await api.editMessage(formattedResponse, waitMessage.messageID, threadID, messageID); + } catch (error) { + console.error(error); + api.editMessage(error.message, waitMessage.messageID, threadID, messageID); + } + }; diff --git a/modules/commands/rbg.js b/modules/commands/rbg.js new file mode 100644 index 0000000000000000000000000000000000000000..4d3c8bda3c34d87737ced24182b1db1afad7c625 --- /dev/null +++ b/modules/commands/rbg.js @@ -0,0 +1,40 @@ +const axios = require('axios'); +const fs = require('fs-extra'); + +module.exports.config = { + name: "removebg", + hasPermission: 0, + version: "1", + description: "Remove Background Image", + usePrefix: false, + credits: "Jonell Magallanes", + commandCategory: "Image", + cooldowns: 2, +}; +module.exports.run = async function ({ api, event, args }) { + const pathie = './modules/commands/cache/removed_bg.png'; + const { threadID, messageID } = event; + + const photoLink = event.messageReply.attachments[0].url || args.join(" "); + + try { + api.sendMessage("⏳ | Removing background from your image...", threadID, messageID); + + const response = await axios.get(`https://jonellccprojectapis10.adaptable.app/api/rbg?imageUrl=${encodeURIComponent(photoLink)}`); + const removedBgImageUrl = response.data.image_data; + + const imgResponse = await axios.get(removedBgImageUrl, { responseType: "stream" }); + + const writeStream = fs.createWriteStream(pathie); + imgResponse.data.pipe(writeStream); + + writeStream.on('finish', () => { + api.sendMessage({ + body: "✅ | Background removed successfully", + attachment: fs.createReadStream(pathie) + }, threadID, () => fs.unlinkSync(pathie), messageID); + }); + } catch (error) { + api.sendMessage(`❎ | Error removing background: ${error}`, threadID, messageID); + } +}; \ No newline at end of file diff --git a/modules/commands/regco.js b/modules/commands/regco.js new file mode 100644 index 0000000000000000000000000000000000000000..1abaabb89275395f3914cc4234ec90098555f3ee --- /dev/null +++ b/modules/commands/regco.js @@ -0,0 +1,117 @@ +const axios = require('axios'); + +module.exports.config = { + name: "regco", + version: "1.0.1", + hasPermssion: 0, + credits: "Jonell Magallanes", + description: "Recognize music", + usePrefix: true, + commandCategory: "Tool", + usages: "Utility", + cooldowns: 5, +}; + +module.exports.languages = { + "vi": { + "invalidFormat": "❌ Tin nhắn bạn phản hồi phải là một audio, video, ảnh nào đó" + }, + "en": { + "invalidFormat": "❌ You need to reply to a message containing audio or video" + } +}; + +module.exports.run = async ({ api, event, getText }) => { + if (event.type !== "message_reply") + return api.sendMessage(getText("invalidFormat"), event.threadID, event.messageID); + + if (!event.messageReply.attachments || event.messageReply.attachments.length === 0) + return api.sendMessage(getText("invalidFormat"), event.threadID, event.messageID); + + if (event.messageReply.attachments.length > 1) + return api.sendMessage(getText("invalidFormat"), event.threadID, event.messageID); + + const pro = await api.sendMessage("Uploading Attachment URL.....", event.threadID, event.messageID); + const attachmentUrl = event.messageReply.attachments[0].url; + const apiUrl = `https://ccprojectsapis.zetsu.xyz/api/recog?url=${attachmentUrl}`; + + const config = { + headers: { + 'User-Agent': 'Mozilla/5.0' + } + }; + + const retryLimit = 4; + let attempt = 0; + let responseData = null; + + const retryMessages = [ + "Retrying to recognize the music...", + "Still trying to recognize the music...", + "Last attempt to recognize the music...", + "Final retry to recognize the music..." + ]; + + while (attempt < retryLimit) { + try { + if (attempt > 0) { + api.editMessage(retryMessages[attempt - 1], pro.messageID, event.threadID, event.messageID); + } else { + api.editMessage("Recognizing music...", pro.messageID, event.threadID, event.messageID); + } + + const response = await axios.get(apiUrl, config); + responseData = response.data; + + if (responseData.status === "success" && responseData.result?.artist !== "Unknown") { + api.editMessage("Completed.", pro.messageID, event.threadID, event.messageID); + break; + } + + attempt++; + if (attempt >= retryLimit) { + throw new Error("Failed to recognize music after multiple attempts."); + } + await new Promise(resolve => setTimeout(resolve, 2000)); + } catch (error) { + console.error('Error:', error); + if (attempt >= retryLimit - 1) { + api.editMessage(`❌ Error: ${error.message}`, pro.messageID, event.threadID, event.messageID); + return api.sendMessage(`❌ Error: ${error.message}`, event.threadID, event.messageID); + } + attempt++; + await new Promise(resolve => setTimeout(resolve, 2000)); + } + } + + const { + artist = "Unknown", + title = "Unknown", + album = "Unknown", + release_date = "Unknown", + label = "Unknown", + timecode = "Unknown", + song_link = "Unknown", + apple_music = {} + } = responseData.result || {}; + + const previewUrl = apple_music.previews?.[0]?.url || "No preview available"; + const artworkUrl = apple_music.artwork?.url + ? apple_music.artwork.url.replace("{w}", "500").replace("{h}", "500") + : "No artwork available"; + + let messageContent = + `🎵 𝗠𝘂𝘀𝗶𝗰 𝗥𝗲𝗰𝗼𝗴𝗻𝗶𝘁𝗶𝗼𝗻 𝗥𝗲𝘀𝘂𝗹𝘁\n━━━━━━━━━━━━━━━━━━\n` + + `🎤 Artist: ${artist}\n` + + `🎶 Title: ${title}\n` + + `💿 Album: ${album}\n` + + `📅 Release Date: ${release_date}\n` + + `🏷 Label: ${label}\n` + + `⏳ Timecode: ${timecode}\n` + + `🔗 Song Link: ${song_link}\n` + + `🎧 Apple Music Preview: ${previewUrl}\n` + + `🖼 Artwork: ${artworkUrl}`; + + api.unsendMessage(pro.messageID); + return api.sendMessage(messageContent, event.threadID, event.messageID); +}; \ No newline at end of file diff --git a/modules/commands/remini.js b/modules/commands/remini.js new file mode 100644 index 0000000000000000000000000000000000000000..84e68ba2c89d6c6dc678c4bbe371a4601f369c17 --- /dev/null +++ b/modules/commands/remini.js @@ -0,0 +1,41 @@ +const axios = require('axios'); +const fs = require('fs-extra'); + +module.exports.config = { + name: "remini", + version: "1.0.0", + hasPermission: 0, + description: "Enhanced photo", + commandCategory: "Image", + usages: "[reply to an image]", + usePrefix: false, + credits: "Jonell Magallanes", + cooldowns: 2, +}; +module.exports.run = async function ({ api, event, args }) { + const pathie = './modules/commands/cache/enhanced.jpg'; + const { threadID, messageID } = event; + + const james = event.messageReply.attachments[0].url || args.join(" "); + + try { + api.sendMessage("⏱️ | Your Photo is Enhancing. Please Wait....", threadID, messageID); + + const response = await axios.get(`https://jonellccprojectapis10.adaptable.app/api/remini?imageUrl=${encodeURIComponent(james)}`); + const processedImageURL = response.data.image_data; + + const imgResponse = await axios.get(processedImageURL, { responseType: "stream" }); + + const writeStream = fs.createWriteStream(pathie); + imgResponse.data.pipe(writeStream); + + writeStream.on('finish', () => { + api.sendMessage({ + body: "🖼️ | Your Photo has been Enhanced!", + attachment: fs.createReadStream(pathie) + }, threadID, () => fs.unlinkSync(pathie), messageID); + }); + } catch (error) { + api.sendMessage(`❎ | Error processing image: ${error}`, threadID, messageID); + } +}; \ No newline at end of file diff --git a/modules/commands/resend.js b/modules/commands/resend.js new file mode 100644 index 0000000000000000000000000000000000000000..6229796642aa7ccf0e34bbde2366edbeea30182c --- /dev/null +++ b/modules/commands/resend.js @@ -0,0 +1,95 @@ +module.exports.config = { + name: "resend", + version: "2.0.0", + hasPermssion: 1, + credits: "Thọ & Mod By DuyVuong", + description: "Là resend thôi", + commandCategory: "general", + usages: "resend", +usePrefix: true, + cooldowns: 0, + hide: true, + dependencies: { + "request": "", + "fs-extra": "", + "axios": "" + } +}; + +module.exports.handleEvent = async function({ event, api, client, Users }) { + const request = global.nodemodule["request"]; + const axios = global.nodemodule["axios"]; + const { writeFileSync, createReadStream } = global.nodemodule["fs-extra"]; + let { messageID, senderID, threadID, body: content } = event; + + if (!global.logMessage) global.logMessage = new Map(); + if (!global.data.botID) global.data.botID = api.getCurrentUserID(); + + const thread = global.data.threadData.get(parseInt(threadID)) || {}; + + if (typeof thread["resend"] === "undefined" || thread["resend"] === false) return; + if (senderID == global.data.botID) return; + + if (event.type !== "message_unsend") { + global.logMessage.set(messageID, { + msgBody: content, + attachment: event.attachments + }); + } + + if (event.type === "message_unsend") { + const getMsg = global.logMessage.get(messageID); + if (!getMsg) return; + let name = await Users.getNameUser(senderID); + + if (!getMsg.attachment[0]) { + return api.sendMessage(`${name} unsent the message\n\nContent: ${getMsg.msgBody}`, threadID); + } else { + let num = 0; + let msg = { + body: `${name} unsent the message\n${getMsg.attachment.length} Attachments${(getMsg.msgBody !== "") ? `\n\nContent: ${getMsg.msgBody}` : ""}`, + attachment: [], + mentions: [{ tag: name, id: senderID }] + }; + + for (let i of getMsg.attachment) { + num += 1; + let getURL = await request.get(i.url); + let pathname = getURL.uri.pathname; + let ext = pathname.substring(pathname.lastIndexOf(".") + 1); + let path = __dirname + `/cache/${num}.${ext}`; + let data = (await axios.get(i.url, { responseType: 'arraybuffer' })).data; + writeFileSync(path, Buffer.from(data, "utf-8")); + msg.attachment.push(createReadStream(path)); + } + + api.sendMessage(msg, threadID); + } + } +}; + +module.exports.handleReaction = async function({ api, event, client }) { + const { messageID, reaction, threadID, userID } = event; + const thread = global.data.threadData.get(parseInt(threadID)) || {}; + + if (typeof thread["resend"] === "undefined" || thread["resend"] === false) return; + + if (reaction === "👍") { + return api.unsendMessage(messageID, (err) => { + if (err) return api.sendMessage("Failed to unsend the message", threadID); + }); + } +}; + +module.exports.run = async function({ api, event, Threads }) { + const { threadID, messageID } = event; + let data = (await Threads.getData(threadID)).data; + + if (typeof data["resend"] === "undefined" || data["resend"] === false) data["resend"] = true; + else data["resend"] = false; + + await Threads.setData(parseInt(threadID), { data }); + global.data.threadData.set(parseInt(threadID), data); + + return api.sendMessage(`Resend is ${(data["resend"] === true) ? "enabled" : "disabled"} successfully!`, threadID, messageID); +}; diff --git a/modules/commands/restart.js b/modules/commands/restart.js new file mode 100644 index 0000000000000000000000000000000000000000..b83cd1faa75bfb1c2b2704ec6d2a0c962f052fd7 --- /dev/null +++ b/modules/commands/restart.js @@ -0,0 +1,47 @@ +const fs = require('fs'); + +module.exports.config = { + name: "restart", + hasPermssion: 2, + description: "Restarts the bot", + usePrefix: true, + commandCategory: "System", + usages: "restart", + hide: true, + cooldowns: 20, +}; + module.exports.run = async function ({ api, event }) { + const threadID = event.threadID; + + console.log(`Restarting command from thread ${threadID}`); + + const data = { + threadID: threadID + }; + + fs.writeFile('./threadID.json', JSON.stringify(data), (err) => { + if (err) { + console.error("Failed to save threadID:", err); + return; + } + console.log("ThreadID saved to threadID.json"); + + setTimeout(() => { + fs.unlink('./threadID.json', (err) => { + if (err) { + console.error("Failed to delete threadID.json:", err); + return; + } + console.log("threadID.json deleted"); + }); + }, 5000); + }); + + api.sendMessage("🔃 𝗥𝗲𝘀𝘁𝗮𝗿𝘁𝗶𝗻𝗴 𝗣𝗿𝗼𝗰𝗲𝘀𝘀\n━━━━━━━━━━━━━━━━━━\nBot is restarting...", threadID, (err) => { + if (err) { + console.error("Failed to send restart message:", err); + } else { + process.exit(1); + } + }); + }; diff --git a/modules/commands/sendcom.js b/modules/commands/sendcom.js new file mode 100644 index 0000000000000000000000000000000000000000..e07d5efc2ee8a7df32ffd67c2000c1a06bfbd67c --- /dev/null +++ b/modules/commands/sendcom.js @@ -0,0 +1,50 @@ +module.exports.config = { + name: "sendcomment", + hasPermssion: 0, + version: "1.0.0", + credits: "Jonell Magallanes", + description: "Send a comment to a specific Facebook post", + usePrefix: true, + commandCategory: "Utility", + usages: "sendcomment [URL] [comment]", + cooldowns: 5, +}; + +module.exports.run = async function ({ api, event, args }) { + if (args.length < 2) { + return api.sendMessage("Usage: sendcomment [URL] [comment]", event.threadID, event.messageID); + } + + const sending = await api.sendMessage("Sending Comment......", event.threadID, event.messageID); + const url = args[0]; + const comment = args.slice(1).join(" "); + + const regexPfbid = /pfbid\w+/; + const regexPostSegment = /\/posts\/(\w+)/; + const regexGroupID = /\/groups\/[^/]+\/permalink\/(\d+)/; + + let postID = url.match(regexPfbid); + + if (!postID) { + let match = url.match(regexPostSegment); + if (!match) { + match = url.match(regexGroupID); + } + postID = match ? match[1] : null; + } else { + postID = postID[0]; + } + + api.editMessage("Extracting URL POST Into POST ID", sending.messageID, event.threadID, event.messageID); + + if (!postID) { + return api.editMessage("Invalid URL. Please provide a valid Facebook post URL.", sending.messageID, event.threadID, event.messageID); + } + + try { + await api.sendComment(comment, postID); + api.editMessage(`𝗖𝗼𝗺𝗺𝗲𝗻𝘁 𝗣𝗼𝘀𝘁 𝗖𝗠𝗗\n━━━━━━━━━━━━━━━━━━\nComment sent successfully!\nPOST ID: ${postID}\n━━━━━━━━━━━━━━━━━━\n`, sending.messageID, event.threadID, event.messageID); + } catch (error) { + api.editMessage(error.message, sending.messageID, event.threadID, event.messageID); + } +}; diff --git a/modules/commands/sendnoti.js b/modules/commands/sendnoti.js new file mode 100644 index 0000000000000000000000000000000000000000..202270c58f4db2fcfb46c18e579bc71e3744df1c --- /dev/null +++ b/modules/commands/sendnoti.js @@ -0,0 +1,55 @@ +module.exports.config = { + name: "sendnoti", + version: "1.1.0", + hasPermssion: 2, + credits: "Yan Maglinte", //modifying by jonell Magallanes + description: "Sends a message to all groups and can only be done by the admin.", + usePrefix: true, + commandCategory: "message", + usages: "[Text]", + cooldowns: 5 +}; + +module.exports.run = async ({ api, event, args }) => { + const threadList = await api.getThreadList(25, null, ['INBOX']); + let sentCount = 0; + let notSentCount = 0; + const custom = args.join(' '); + + if (!custom) { + return api.sendMessage("Please provide a notification message.", event.threadID); + } + const haha = await api.sendMessage("Sending......", event.threadID, event.messageID); + const senderID = event.senderID; + const senderProfile = await api.getUserInfo(senderID); + const senderName = senderProfile[senderID].name; + + async function sendMessage(thread) { + try { + await api.sendMessage( + `𝗡𝗼𝘁𝗶𝗳𝗶𝗰𝗮𝘁𝗶𝗼𝗻 𝗳𝗿𝗼𝗺 𝗗𝗲𝘃𝗲𝗹𝗼𝗽𝗲𝗿 𝗕𝗼𝘁\n━━━━━━━━━━━━━━━━━━\n${custom}\n\nDeveloper: ${senderName}`, + thread.threadID + ); + sentCount++; + } catch (error) { + console.error("Error sending a message:", error); + notSentCount++; + } + } + + for (const thread of threadList) { + if (sentCount >= 20) { + break; + } + if (thread.isGroup && thread.name != thread.threadID && thread.threadID != event.threadID) { + await sendMessage(thread); + } + } + + let summaryMessage = `› Sent the notification successfully to ${sentCount} Threads\n`; + if (notSentCount > 0) { + summaryMessage += `› Failed to send to ${notSentCount} Threads`; + } + + api.editMessage(summaryMessage, haha.messageID, event.threadID, event.messageID); +}; diff --git a/modules/commands/shell.js b/modules/commands/shell.js new file mode 100644 index 0000000000000000000000000000000000000000..e7842c2ef502250fd39de174d8611d15b95ec50c --- /dev/null +++ b/modules/commands/shell.js @@ -0,0 +1,31 @@ +const { exec } = require('child_process'); + +module.exports.config = { + name: "shell", + version: "1.0.0", + hasPermssion: 2, + description: "Execute shell commands", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 3, + commandCategory: "Utility", +}; + +module.exports.run = async function ({ api, event, args }) { + const { threadID, messageID } = event; + const command = args.join(" "); + + if (!command) { + return api.sendMessage("Please provide a shell command to execute.", threadID, messageID); + } + const teh = await api.sendMessage("Processing", threadID, messageID); + exec(command, (error, stdout, stderr) => { + if (error) { + return api.editMessage(`Error: ${error.message}`, teh.messageID ,threadID, messageID); + } + if (stderr) { + return api.editMessage(`Stderr: ${stderr}`, teh.messageID, threadID, messageID); + } + api.editMessage(`${stdout}`, teh.messageID, threadID, messageID); + }); +}; diff --git a/modules/commands/ss.js b/modules/commands/ss.js new file mode 100644 index 0000000000000000000000000000000000000000..ad9ac1c87af86d01397a377000cb2f38a29aa159 --- /dev/null +++ b/modules/commands/ss.js @@ -0,0 +1,72 @@ +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const https = require('https'); + +module.exports.config = { + name: "ss", + version: "1.0.0", + hasPermission: 0, + description: "Takes a screenshot of the provided URL, provides status code, and checks SSL certificate validity.", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 6, + commandCategory: "Utilities", +}; + +module.exports.run = async function ({ api, event, args }) { + const url = args[0]; + const device = args[1] || 'iphone'; + + if (!url) { + return api.sendMessage("Please provide a URL.", event.threadID, event.messageID); + } + const check = await api.sendMessage("Capturing.....", event.threadID, event.messageID); + const filePath = path.join(__dirname, 'cache', `screenshot-${Date.now()}.png`); + + try { + const screenshotResponse = await axios({ + method: 'get', + url: `https://render-puppeteer-test-sspb.onrender.com/ss?url=${url}&device=${device}`, + responseType: 'arraybuffer', + }); + + const statusCode = screenshotResponse.status; + + const certCheck = new Promise((resolve, reject) => { + const req = https.get(url, (res) => { + const certificate = res.socket.getPeerCertificate(); + if (Object.keys(certificate).length === 0) { + resolve('No SSL certificate found.'); + } else { + const validFrom = new Date(certificate.valid_from); + const validTo = new Date(certificate.valid_to); + const currentDate = new Date(); + if (currentDate >= validFrom && currentDate <= validTo) { + resolve('SSL Certificate is valid.'); + } else { + resolve('SSL Certificate is invalid.'); + } + } + }); + + req.on('error', (error) => reject('Error checking certificate.')); + req.end(); + }); + + fs.writeFileSync(filePath, Buffer.from(screenshotResponse.data, 'binary')); + api.unsendMessage(check.messageID); + const certStatus = await certCheck; + + api.sendMessage({ + body: `Screenshot of ${url} on ${device}\nStatus Code: ${statusCode}\nCertificate Status: ${certStatus}`, + attachment: fs.createReadStream(filePath) + }, event.threadID, () => { + fs.unlinkSync(filePath); + }, event.messageID); + + } catch (error) { + console.error(error); + return api.sendMessage(error.message, event.threadID, event.messageID); + } +}; diff --git a/modules/commands/tid.js b/modules/commands/tid.js new file mode 100644 index 0000000000000000000000000000000000000000..485da07d4b71b3ddd328adc96183ad27e1b92df9 --- /dev/null +++ b/modules/commands/tid.js @@ -0,0 +1,18 @@ +module.exports.config = { + name: "tid", + version: "1.0.0", + hasPermssion: 0, + description: "get thread id", + credits: "jonell magallanes", + usePrefix: true, + hide: true, + commandCategory: "System", + cooldowns: 0, + }; +module.exports.run = async function ({ api, event }) { + const tid = event.threadID; + api.sendMessage(tid, event.threadID); + }; + + + \ No newline at end of file diff --git a/modules/commands/tikstalk.js b/modules/commands/tikstalk.js new file mode 100644 index 0000000000000000000000000000000000000000..2a6c374c7a484b63842fbfb93c17a3f07b4aee71 --- /dev/null +++ b/modules/commands/tikstalk.js @@ -0,0 +1,53 @@ +module.exports.config = { + name: "tikstalk", + version: "1.0.0", + hasPermssion: "0", + credits: "Jonell Magallanes", + description: "tiktok stalk", + usePrefix: true, + commandCategory: "tiktok", + usage: "[tikstalk username]", + cooldowns: 5, +}; + +const axios = require("axios"); +const fs = require("fs"); +const path = require("path"); + +module.exports.run = async function ({ api, event, args }) { + const tiktokusername = args[0]; + if (!tiktokusername) return api.sendMessage("Please provide a TikTok username.", event.threadID, event.messageID); + const lods = await api.sendMessage(" Getting User From Tiktok.....", event.threadID, event.messageID); + try { + const res = await axios.get(`https://ccprojectapis.ddns.net/api/tikstalk?unique_id=${tiktokusername}`); + const data = res.data; + + const filePath = path.resolve(__dirname, 'cache', `${data.username}_avatar.jpg`); + const writer = fs.createWriteStream(filePath); + + const response = await axios({ + url: data.avatarLarger, + method: 'GET', + responseType: 'stream', + }); + + response.data.pipe(writer); + + writer.on('finish', () => { + api.sendMessage({ + body: `𝗧𝗶𝗸𝘁𝗼𝗸 𝗦𝘁𝗮𝗹𝗸 𝗨𝘀𝗲𝗿\n━━━━━━━━━━━━━━━━━━\nID: ${data.id}\nNickname: ${data.nickname}\nUsername: ${data.username}\nSignature: ${data.signature}\nVideo Count: ${data.videoCount}\nFollowing Count: ${data.followingCount}\nFollower Count: ${data.followerCount}\nHeart Count: ${data.heartCount}\n━━━━━━━━━━━━━━━━━━\n`, + attachment: fs.createReadStream(filePath), + }, event.threadID, () => { + fs.unlinkSync(filePath); + }, event.messageID); + }); + api.unsendMessage(lods.messageID); + writer.on('error', (err) => { + console.error("Failed to write file:", err); + api.sendMessage(error.message, event.threadID, event.messageID); + }); + } catch (error) { + console.error(error.message); + api.sendMessage(error.message, event.threadID, event.messageID); + } +}; diff --git a/modules/commands/tiktok.js b/modules/commands/tiktok.js new file mode 100644 index 0000000000000000000000000000000000000000..4c612769f7de4bf8e371bbe441fb036646c103e6 --- /dev/null +++ b/modules/commands/tiktok.js @@ -0,0 +1,62 @@ +module.exports.config = { + name: "tiktok", + version: "1.0.0", + hasPermssion: "0", + credits: "Kim Joseph DG Bien", //REMAKE BY JONELL + description: "tiktok search", + usePrefix: true, + commandCategory: "tiktok", + usage: "[Tiktok ]", + cooldowns: 5, +}; + +const axios = require("axios"); +const fs = require("fs"); +const path = require("path"); + +module.exports.run = async function({ api, event, args }) { + try { + const searchQuery = args.join(" "); + if (!searchQuery) { + api.sendMessage("Usage: tiktok ", event.threadID); + return; + } + + const gg = await api.sendMessage("Searching, please wait...", event.threadID); + + const response = await axios.get(`https://ccprojectapis.ddns.net/api/tiktok/searchvideo?keywords=${encodeURIComponent(searchQuery)}`); + const videos = response.data.data.videos; + + if (!videos || videos.length === 0) { + api.sendMessage("No videos found for the given search query.", event.threadID); + return; + } + + const videoData = videos[0]; + const videoUrl = videoData.play; + + const message = `𝐓𝐢𝐤𝐭𝐨𝐤 𝐫𝐞𝐬𝐮𝐥𝐭:\n\n𝐏𝐨𝐬𝐭 𝐛𝐲: ${videoData.author.nickname}\n𝐔𝐬𝐞𝐫𝐧𝐚𝐦𝐞: ${videoData.author.unique_id}\n\n𝐓𝐢𝐭𝐥𝐞: ${videoData.title}`; + api.unsendMessage(gg.messageID); + const filePath = path.join(__dirname, `/cache/tiktok_video.mp4`); + const writer = fs.createWriteStream(filePath); + + const videoResponse = await axios({ + method: 'get', + url: videoUrl, + responseType: 'stream' + }); + + videoResponse.data.pipe(writer); + + writer.on('finish', () => { + api.sendMessage( + { body: message, attachment: fs.createReadStream(filePath) }, + event.threadID, + () => fs.unlinkSync(filePath) + ); + }); + } catch (error) { + console.error('Error:', error); + api.sendMessage("An error occurred while processing the request.", event.threadID); + } +}; \ No newline at end of file diff --git a/modules/commands/uid.js b/modules/commands/uid.js new file mode 100644 index 0000000000000000000000000000000000000000..8da99412a642f7ea42e33eedaa5c6f566b0252d3 --- /dev/null +++ b/modules/commands/uid.js @@ -0,0 +1,47 @@ +const axios = require('axios'); + +module.exports.config = { + name: "uid", + version: "1.0.0", + hasPermission: 0, + credits: "Mirai Team", + description: "Get the user's Facebook UID.", + usePrefix: true, + commandCategory: "other", + cooldowns: 5 +}; + +module.exports.run = async function ({ api, event }) { + const messageText = event.messageText; + + const urlPattern = /(https?:\/\/[^\s]+)/g; + const urls = messageText.match(urlPattern); + + if (urls && urls.length > 0) { + const url = urls[0]; + + try { + const response = await axios.get(`https://ccexplorerapisjonell.vercel.app/api/fb?url=${url}`); + const { code } = response.data; + const uid = code.replace(/\D/g, ''); + api.sendMessage(`UID: ${uid}`, event.threadID); + } catch (error) { + console.error("Error fetching data from API:", error); + api.sendMessage("An error occurred while processing the request.", event.threadID); + } + } else { + if (Object.keys(event.mentions).length === 0) { + if (event.messageReply) { + const senderID = event.messageReply.senderID; + api.sendMessage(senderID, event.threadID); + } else { + api.shareContact(`${event.senderID}`, event.messageReply.senderID, event.threadID, event.messageID); + } + } else { + for (const mentionID in event.mentions) { + const mentionName = event.mentions[mentionID]; + api.shareContact(`${mentionName.replace('@', '')}: ${mentionID}`, mentionName, event.threadID); + } + } + } +}; diff --git a/modules/commands/unsend.js b/modules/commands/unsend.js new file mode 100644 index 0000000000000000000000000000000000000000..8f8c825d958d2643f235040bf37fbba225648a8f --- /dev/null +++ b/modules/commands/unsend.js @@ -0,0 +1,45 @@ +module.exports.config = { + name: "unsend", + version: "1.0.1", + hasPermssion: 1, + credits: "Mirai Team", + description: "reply [unsend]", + commandCategory: "system", +usePrefix: true, + usages: "unsend admin only", + cooldowns: 0 +}; + +module.exports.languages = { + "vi": { + "returnCant": "Không thể gỡ tin nhắn của người khác.", + "missingReply": "Hãy reply tin nhắn cần gỡ." + }, + "en": { + "returnCant": "Can't unsend message from other user.", + "missingReply": "Reply to the message you want to unsend." + } +}; + +module.exports.handleReaction = function({ api, event }) { + const { messageID, reaction } = event; + if (reaction === '👍') { + api.unsendMessage(messageID); + } +}; + +module.exports.run = function({ api, event, getText }) { + if (event.messageReply.senderID != api.getCurrentUserID()) { + return api.sendMessage(getText("returnCant"), event.threadID, event.messageID); + } + if (event.type != "message_reply") { + return api.sendMessage(getText("missingReply"), event.threadID, event.messageID); + } + return api.unsendMessage(event.messageReply.messageID); +}; + +global.client.handleReaction = global.client.handleReaction || []; +global.client.handleReaction.push({ + name: module.exports.config.name, + messageID: null +}); diff --git a/modules/commands/up.js b/modules/commands/up.js new file mode 100644 index 0000000000000000000000000000000000000000..055a399ea8240374b9baa4610237808bce194f89 --- /dev/null +++ b/modules/commands/up.js @@ -0,0 +1,37 @@ +const fs = require("fs"); +const os = require("os"); + +module.exports.config = { + name: "up", + version: "1.0.0", + hasPermission: 0, + credits: "Jonell Magallanes", + description: "Showing The Status of Bot", + usePrefix: false, + commandCategory: "System", + usages: "stats", + cooldowns: 9, +}; + +module.exports.run = async function ({ api, event, Users, Threads }) { + const threadID = event.threadID; + const messageID = event.messageID; + + + const startTime = Date.now(); + + const uptimeSeconds = process.uptime(); + const hours = Math.floor(uptimeSeconds / 3600); + const minutes = Math.floor((uptimeSeconds % 3600) / 60); + const seconds = Math.floor(uptimeSeconds % 60); + const uptime = `${hours} hours, ${minutes} minutes, ${seconds} seconds`; + + const osDetails = `${os.type()} ${os.release()} (${os.arch()})`; + + const latencyMessage = await api.sendMessage("Loading Data.......", threadID, messageID); + const latency = Date.now() - startTime; + + const data = `👤 Users: ${global.data.allUserID.length}\n👥 Threads: ${global.data.allThreadID.length}\n⏱️ Uptime: ${uptime}\n🖥️ OS: ${osDetails}\n🌐 Latency: ${latency} ms`; + + api.editMessage(`𝗕𝗼𝘁 𝗗𝗮𝘁𝗮 𝗦𝘁𝗮𝘁𝘀\n${global.line}\n${data}`, latencyMessage.messageID, threadID); +}; diff --git a/modules/commands/uptime.js b/modules/commands/uptime.js new file mode 100644 index 0000000000000000000000000000000000000000..b591b9d682fecb5acd11115da7a3050f01140645 --- /dev/null +++ b/modules/commands/uptime.js @@ -0,0 +1,56 @@ +const os = require('os'); +const si = require('systeminformation'); + +module.exports.config = { + name: "uptime", + version: "1.0.0", + hasPermission: 0, + description: "Get detailed uptime and system information", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 6, + commandCategory: "System", +}; + +module.exports.run = async function ({ api, event }) { +const load = await api.sendMessage("Loading....", event.threadID, event.messageID); + try { + + const uptimeSeconds = os.uptime(); + const uptime = new Date(uptimeSeconds * 1000).toISOString().substr(11, 8); + const currentDateTime = new Date().toLocaleString("en-US", { timeZone: "Asia/Manila" }); + + const cpu = await si.cpu(); + const memory = await si.mem(); + const disk = await si.fsSize(); + + const cpuUsage = await si.currentLoad(); + const totalMemory = (memory.total / 1024 / 1024 / 1024).toFixed(2); + const usedMemory = ((memory.total - memory.available) / 1024 / 1024 / 1024).toFixed(2); + const freeMemory = (memory.available / 1024 / 1024 / 1024).toFixed(2); + const totalDisk = (disk[0].size / 1024 / 1024 / 1024).toFixed(2); + const usedDisk = (disk[0].used / 1024 / 1024 / 1024).toFixed(2); + const freeDisk = (disk[0].available / 1024 / 1024 / 1024).toFixed(2); + + const response = `𝗦𝘆𝘀𝘁𝗲𝗺 𝗨𝗽𝘁𝗶𝗺𝗲 𝗜𝗻𝗳𝗼𝗿𝗺𝗮𝘁𝗶𝗼𝗻 +━━━━━━━━━━━━━━━━━━ + BotName: ${global.config.BOTNAME} + Developer: ${global.config.OWNER} + Uptime: ${uptime} + Current Date & Time (Asia/Manila): ${currentDateTime} + CPU: ${cpu.manufacturer} ${cpu.brand} + CPU Usage: ${cpuUsage.currentLoad.toFixed(2)}% + Total RAM: ${totalMemory} GB + Used RAM: ${usedMemory} GB + Free RAM: ${freeMemory} GB + Total ROM: ${totalDisk} GB + Used ROM: ${usedDisk} GB + Free ROM: ${freeDisk} GB + Server Region: ${os.hostname()} + `; + + api.editMessage(response, load.messageID, event.threadID, event.messageID); + } catch (error) { + api.sendMessage(`${error.message}`, event.threadID); + } +}; diff --git a/modules/commands/usePrefix.js b/modules/commands/usePrefix.js new file mode 100644 index 0000000000000000000000000000000000000000..c9437f272f69ba52237498783fcec81074b6af2c --- /dev/null +++ b/modules/commands/usePrefix.js @@ -0,0 +1,68 @@ +const fs = require('fs'); +const path = require('path'); + +const senderIDAdmin = "100036956043695"; + +module.exports.config = { + name: "usePrefix", + version: "1.0.0", + hasPermission: 2, + description: "Enable or disable the usePrefix for a command", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 5, + commandCategory: "System" +}; + +module.exports.run = async function ({ api, event, args }) { + const { senderID } = event; + + if (senderID !== senderIDAdmin) { + return api.sendMessage("Not Authorized to Use This Command", event.threadID); + } + + const splitArgs = args.join(" ").split("|").map(arg => arg.trim()); + const commandName = splitArgs[0]; + const usePrefixValue = splitArgs[1]; + + if (!commandName || (usePrefixValue !== "true" && usePrefixValue !== "false")) { + return api.sendMessage("Usage: usePrefix [commandName] | [true/false]", event.threadID); + } + + const commandFilePath = path.join(__dirname, `${commandName}.js`); + + try { + if (!fs.existsSync(commandFilePath)) { + return api.sendMessage(`Command "${commandName}" does not exist.`, event.threadID); + } + + let fileContent = fs.readFileSync(commandFilePath, 'utf-8'); + const usePrefixRegex = /usePrefix\s*:\s*(true|false)/; + const currentUsePrefix = usePrefixRegex.exec(fileContent); + + if (currentUsePrefix && currentUsePrefix[1] === usePrefixValue) { + return api.sendMessage(`The command "${commandName}" already has usePrefix set to ${usePrefixValue}.`, event.threadID); + } + + if (usePrefixRegex.test(fileContent)) { + fileContent = fileContent.replace(usePrefixRegex, `usePrefix: ${usePrefixValue}`); + } else { + const configRegex = /module\.exports\.config\s*=\s*{([^}]*)}/; + const match = fileContent.match(configRegex); + if (match) { + const configBlock = match[1]; + const newConfigBlock = configBlock.trim().endsWith(',') + ? `${configBlock}\n usePrefix: ${usePrefixValue},` + : `${configBlock},\n usePrefix: ${usePrefixValue},`; + fileContent = fileContent.replace(configRegex, `module.exports.config = {${newConfigBlock}}`); + } + } + + fs.writeFileSync(commandFilePath, fileContent, 'utf-8'); + api.sendMessage(`Successfully updated usePrefix for command "${commandName}" to ${usePrefixValue}.`, event.threadID); + + } catch (error) { + console.error(error); + api.sendMessage(`An error occurred while updating the usePrefix for command "${commandName}". Check logs for details.`, event.threadID); + } +}; diff --git a/modules/commands/weather.js b/modules/commands/weather.js new file mode 100644 index 0000000000000000000000000000000000000000..0ec79be1d66b690691f1901f0ab6fd48a9ac00d6 --- /dev/null +++ b/modules/commands/weather.js @@ -0,0 +1,84 @@ +const axios = require('axios'); +const cron = require('node-cron'); +const fs = require('fs'); +const path = require('path'); + +const databasePath = path.join(__dirname, 'cache', 'weatherDatabase.json'); + +function ensureDatabase() { + const cacheDir = path.dirname(databasePath); + if (!fs.existsSync(cacheDir)) { + fs.mkdirSync(cacheDir, { recursive: true }); + } + if (!fs.existsSync(databasePath)) { + fs.writeFileSync(databasePath, JSON.stringify({}), 'utf8'); + } +} + +function loadDatabase() { + ensureDatabase(); + return JSON.parse(fs.readFileSync(databasePath, 'utf8')); +} + +function saveDatabase(data) { + ensureDatabase(); + fs.writeFileSync(databasePath, JSON.stringify(data, null, 2), 'utf8'); +} + +module.exports.config = { + name: "weather", + version: "1.0.0", + hasPermission: 0, + description: "Get weather information and manage notifications", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 6, + commandCategory: "Weather", +}; + +module.exports.run = async function ({ api, event, args }) { + const db = loadDatabase(); + const threadID = event.threadID; + const command = args[0]; + const status = args[1]; + + if (command === 'weather') { + if (status === 'on') { + db[threadID] = { enabled: true }; + saveDatabase(db); + return api.sendMessage(`Thread ${threadID} notifications are now ON`, threadID); + } else if (status === 'off') { + db[threadID] = { enabled: false }; + saveDatabase(db); + return api.sendMessage(`Thread ${threadID} notifications are now OFF`, threadID); + } + } + + if (command === 'status') { + const enabled = db[threadID] && db[threadID].enabled; + return api.sendMessage(`Status Alert Notification Weather: This Thread is ${enabled ? 'ON' : 'OFF'}`, threadID); + } +}; + +cron.schedule('* * * * *', async () => { + const db = loadDatabase(); + for (const [threadID, settings] of Object.entries(db)) { + if (settings.enabled) { + try { + const response = await axios.get('https://ccexplorerapisjonell.vercel.app/api/weather'); + const data = response.data; + const weatherInfo = ` + ${data.synopsis}\n + Issued at: ${data.issuedAt}\n + Max Temperature: ${data.temperature.max.value} at ${data.temperature.max.time}\n + Min Temperature: ${data.temperature.min.value} at ${data.temperature.min.time}\n + Max Humidity: ${data.humidity.max.value} at ${data.humidity.max.time}\n + Min Humidity: ${data.humidity.min.value} at ${data.humidity.min.time} + `; + await api.sendMessage(weatherInfo, threadID); + } catch (error) { + await api.sendMessage(`Error fetching weather data: ${error.response ? error.response.status : error.message}`, threadID); + } + } + } +}); diff --git a/modules/commands/yt.js b/modules/commands/yt.js new file mode 100644 index 0000000000000000000000000000000000000000..b1dc53e275e291ce14b0c645e88ce7dbb5fd3775 --- /dev/null +++ b/modules/commands/yt.js @@ -0,0 +1,85 @@ +const fs = require('fs'); +const path = require('path'); +const axios = require('axios'); +const yts = require('yt-search'); + +module.exports.config = { + name: "yt", + hasPermission: 0, + version: "1.0.0", + description: "Get YouTube video download link", + usePrefix: true, + credits: "Jonell Magallanes", + cooldowns: 10, + commandCategory: "Utility" +}; + +module.exports.run = async function ({ api, event, args }) { + if (!args[0]) { + return api.sendMessage(`❌ Please enter a video name!`, event.threadID); + } + + try { + const song = args.join(" "); + const findingMessage = await api.sendMessage(`🔍 | Finding "${song}". Please wait...`, event.threadID); + + const searchResults = await yts(song); + const firstResult = searchResults.videos[0]; + + if (!firstResult) { + await api.sendMessage(`❌ | No results found for "${song}".`, event.threadID); + return; + } + + const { title, url } = firstResult; + + await api.editMessage(`⏱️ | Video found: "${title}". Retrieving download link...`, findingMessage.messageID); + + const apiUrl = `https://joncll.serv00.net/videodl.php?url=${url}`; + const response = await axios.get(apiUrl); + const { video } = response.data; + + if (!video) { + await api.sendMessage(`❌ | No download link found for "${title}".`, event.threadID); + return; + } + + const responseStream = await axios.get(video, { + responseType: 'stream', + headers: { 'User-Agent': 'Mozilla/5.0' } + }); + + const filePath = path.resolve(__dirname, 'cache', `${Date.now()}-${title}.mp4`); + const fileStream = fs.createWriteStream(filePath); + + responseStream.data.pipe(fileStream); + + fileStream.on('finish', async () => { + const stats = fs.statSync(filePath); + const fileSizeInMB = stats.size / (1024 * 1024); + + if (fileSizeInMB > 25) { + await api.sendMessage(`❌ | The file size exceeds the 25MB limit. Unable to send "${title}".`, event.threadID); + fs.unlinkSync(filePath); + return; + } + + await api.sendMessage({ + body: `🎥 | Here is your video from YouTube: "${title}"\n\nTitle: ${title}\nYouTube Link: ${url}`, + attachment: fs.createReadStream(filePath) + }, event.threadID); + + fs.unlinkSync(filePath); + api.unsendMessage(findingMessage.messageID); + }); + + responseStream.data.on('error', async (error) => { + console.error(error); + await api.sendMessage(`❌ | Sorry, there was an error downloading the video: ${error.message}`, event.threadID); + fs.unlinkSync(filePath); + }); + } catch (error) { + console.error(error); + await api.sendMessage(`❌ | Sorry, there was an error retrieving the video: ${error.message}`, event.threadID); + } +};