├── nodemodules ├── index.js └── package.json ├── modules ├── events │ ├── cache │ │ ├── joinGif │ │ └── leaveGif │ ├── checkban.js │ ├── autosetname.js │ ├── leaveNoti.js │ ├── antiout.js │ ├── log.js │ ├── guard.js │ ├── joinNoti.js │ └── adminUpdate.js └── commands │ ├── cache │ ├── up is.png │ └── upt1111.jpg │ ├── tid.js │ ├── upt.js │ ├── setname.js │ ├── gỡ.js │ ├── antiout.js │ ├── ping.js │ ├── uid.js │ ├── adminUpdate.js │ ├── prefix.js │ ├── run.js │ ├── couple.js │ ├── kick.js │ ├── console.js │ ├── fbget.js │ ├── daily.js │ ├── test.js │ ├── sendmsg.js │ ├── ndfb.js │ ├── adduser.js │ ├── autosend.js │ ├── draw.js │ ├── thamgia.js │ ├── taixiu.js │ ├── setprefix.js │ ├── autosetname.js │ ├── magic.js │ ├── autodown.js │ ├── info.js │ ├── money.js │ ├── duyet.js │ ├── cache.js │ ├── setmoney.js │ ├── a.js │ ├── tiktok.js │ ├── datlich.js │ ├── taoanhbox.js │ ├── sing.js │ ├── listban.js │ ├── work.js │ ├── pending.js │ ├── baucua1.js │ ├── help.js │ └── baucua.js ├── .replit ├── appstate.json ├── includes ├── handle │ ├── handleUnsend.js │ ├── handleEvent.js │ ├── handleCommandEvent.js │ ├── handleReaction.js │ ├── handleReply.js │ ├── handleCreateDatabase.js │ └── handleCommand.js ├── database │ ├── models │ │ ├── users.js │ │ ├── threads.js │ │ └── currencies.js │ ├── model.js │ └── index.js └── controllers │ ├── threads.js │ ├── users.js │ └── currencies.js ├── utils ├── log.js └── index.js ├── config.json ├── package.json ├── README.md ├── index.js └── languages ├── en.lang └── vi.lang /nodemodules/index.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /modules/events/cache/joinGif: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /modules/events/cache/leaveGif: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.replit: -------------------------------------------------------------------------------- 1 | language = "nodejs" 2 | run = "npm start" 3 | -------------------------------------------------------------------------------- /appstate.json: -------------------------------------------------------------------------------- 1 | Vào fb lấy app nha 2 | Cao Chung Đạt 3 | -------------------------------------------------------------------------------- /modules/commands/cache/up is.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chungdat02/Mirai-V2/HEAD/modules/commands/cache/up is.png -------------------------------------------------------------------------------- /modules/commands/cache/upt1111.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chungdat02/Mirai-V2/HEAD/modules/commands/cache/upt1111.jpg -------------------------------------------------------------------------------- /modules/commands/tid.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "tid", version: "1.0.0", 3 | hasPermssion: 0, 4 | credits: "NTKhang", 5 | description: "Lấy id box", 6 | commandCategory: "group", 7 | usages: "tid", 8 | cooldowns: 5, 9 | dependencies: '', 10 | }; 11 | 12 | module.exports.run = async function({ api, event }) { 13 | api.sendMessage(event.threadID, event.threadID); 14 | }; 15 | -------------------------------------------------------------------------------- /includes/handle/handleUnsend.js: -------------------------------------------------------------------------------- 1 | module.exports = function({ api }) { 2 | const react = ""; 3 | return function({ event }) { 4 | const { senderID, type, reaction, messageID } = event; 5 | if (type === "message_reaction" && senderID == api.getCurrentUserID()) { 6 | if (reaction && (react === "" || react === reaction)) return api.unsendMessage(messageID); 7 | } 8 | }; 9 | }; 10 | -------------------------------------------------------------------------------- /modules/commands/upt.js: -------------------------------------------------------------------------------- 1 | module.exports.config={name:"upt",version:"1.0.0",hasPermssion:0,credits:"",description:"Kiểm tra thời gian bot đã online",commandCategory:"system",cooldowns:5,dependencies:{}},module.exports.run=async({api:e,event:o})=>{const s=process.uptime(),n=Math.floor(s/86400),t=Math.floor(s%86400/3600),r=Math.floor(s/60%60),a=Math.floor(s%60);return e.sendMessage([n,t,r,a].map((e=>e<10?"0"+e:e)).filter(((e,o)=>"00"!==e||o>0)).join(":"),o.threadID,o.messageID)}; 2 | -------------------------------------------------------------------------------- /includes/database/models/users.js: -------------------------------------------------------------------------------- 1 | module.exports = function({ sequelize, Sequelize }) { 2 | let Users = sequelize.define('Users', { 3 | num: { 4 | type: Sequelize.INTEGER, 5 | primaryKey: true, 6 | autoIncrement: true 7 | }, 8 | userID: { 9 | type: Sequelize.BIGINT, 10 | unique: true 11 | }, 12 | name: { 13 | type: Sequelize.STRING 14 | }, 15 | data: { 16 | type: Sequelize.JSON 17 | } 18 | }); 19 | 20 | return Users; 21 | } -------------------------------------------------------------------------------- /includes/database/models/threads.js: -------------------------------------------------------------------------------- 1 | module.exports = function({ sequelize, Sequelize }) { 2 | let Threads = sequelize.define('Threads', { 3 | num: { 4 | type: Sequelize.INTEGER, 5 | primaryKey: true, 6 | autoIncrement: true 7 | }, 8 | threadID: { 9 | type: Sequelize.BIGINT, 10 | unique: true 11 | }, 12 | threadInfo: { 13 | type: Sequelize.JSON 14 | }, 15 | data: { 16 | type: Sequelize.JSON 17 | } 18 | }); 19 | 20 | return Threads; 21 | } -------------------------------------------------------------------------------- /includes/database/model.js: -------------------------------------------------------------------------------- 1 | module.exports = function (input) { 2 | const force = false; 3 | 4 | const Users = require("./models/users")(input); 5 | const Threads = require("./models/threads")(input); 6 | const Currencies = require("./models/currencies")(input); 7 | 8 | Users.sync({ force }); 9 | Threads.sync({ force }); 10 | Currencies.sync({ force }); 11 | 12 | return { 13 | model: { 14 | Users, 15 | Threads, 16 | Currencies 17 | }, 18 | use: function (modelName) { 19 | return this.model[`${modelName}`]; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /includes/database/models/currencies.js: -------------------------------------------------------------------------------- 1 | module.exports = function({ sequelize, Sequelize }) { 2 | let Currencies = sequelize.define('Currencies', { 3 | num: { 4 | type: Sequelize.INTEGER, 5 | primaryKey: true, 6 | autoIncrement: true 7 | }, 8 | userID: { 9 | type: Sequelize.BIGINT, 10 | unique: true 11 | }, 12 | money: { 13 | type: Sequelize.BIGINT, 14 | defaultValue: 0 15 | }, 16 | exp: { 17 | type: Sequelize.BIGINT, 18 | defaultValue: 0 19 | }, 20 | data: { 21 | type: Sequelize.JSON 22 | } 23 | }); 24 | 25 | return Currencies; 26 | } -------------------------------------------------------------------------------- /modules/commands/setname.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "setname", 3 | version: "1.0.0", 4 | hasPermssion: 0, 5 | credits: "Mirai Team", 6 | description: "Đổi biệt danh trong nhóm của bạn hoặc của người bạn tag", 7 | commandCategory: "other", 8 | usages: "[name]", 9 | cooldowns: 3 10 | }; 11 | 12 | module.exports.run = async function({ api, event, args }) { 13 | const name = args.join(" ") 14 | const mention = Object.keys(event.mentions)[0]; 15 | if (!mention) return api.changeNickname(`${name}`, event.threadID, event.senderID); 16 | if (mention[0]) return api.changeNickname(`${name.replace(event.mentions[mention], "")}`, event.threadID, mention); 17 | } 18 | -------------------------------------------------------------------------------- /modules/commands/gỡ.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "gỡ", 3 | version: "1.0.0", 4 | hasPermssion: 0, 5 | credits: "HungCatMoi", 6 | description: "Gỡ tin nhắn của Bot", 7 | commandCategory: "tiện ích", 8 | usages: "", 9 | cooldowns: 0, 10 | dependencies: [] 11 | }; 12 | 13 | module.exports.run = async function({ api, event, args, Users }) { 14 | if (event.messageReply.senderID != api.getCurrentUserID()) return api.sendMessage(getText('unsendErr1'), event.threadID, event.messageID); 15 | if (event.type != "message_reply") return api.sendMessage(getText('unsendErr2'), event.threadID, event.messageID); 16 | return api.unsendMessage(event.messageReply.messageID, err => (err) ? api.sendMessage(getText('error'), event.threadID, event.messageID) : ''); 17 | } 18 | -------------------------------------------------------------------------------- /utils/log.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk'); 2 | 3 | module.exports = (data, option) => { 4 | switch (option) { 5 | case "warn": 6 | console.log(chalk.bold.hex("#00FF00")('[ ❕ ] » ') + data); 7 | break; 8 | case "error": 9 | console.log(chalk.bold.hex("#FF0000")('[ ❗ Lỗi rồi ] » ') + data); 10 | break; 11 | default: 12 | console.log(chalk.bold.hex("33FFCC")(`${option} » `) + data); 13 | break; 14 | } 15 | } 16 | 17 | module.exports.loader = (data, option) => { 18 | switch (option) { 19 | case "warn": 20 | console.log(chalk.bold.hex("#66FF00")('» •CHUNGDAT• « ') + data); 21 | break; 22 | case "error": 23 | console.log(chalk.bold.hex("#FF0000")('» •CHUNGDAT• « ') + data); 24 | break; 25 | default: 26 | console.log(chalk.bold.hex("#3399CC")('» •CHUNGDAT• « ') + data); 27 | break; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "language": "vi", 3 | "keyActive": "bok", 4 | "DeveloperMode": false, 5 | "autoCreateDB": true, 6 | "allowInbox": true, 7 | "autoClean": false, 8 | "commandDisabled": [], 9 | "eventDisabled": [], 10 | "EMAIL": "", 11 | "PASWORD": "", 12 | "OTPKEY": "", 13 | "BOTNAME": "𝓑𝓸𝓚", 14 | "PREFIX": "!", 15 | "ADMINBOT": [ 16 | "100037741424837" 17 | ], 18 | "NDH": [], 19 | "DATABASE": { 20 | "sqlite": { 21 | "storage": "data.sqlite" 22 | } 23 | }, 24 | "APPSTATEPATH": "appstate.json", 25 | "FCAOption": { 26 | "forceLogin": true, 27 | "listenEvents": true, 28 | "pauseLog": true, 29 | "logLevel": "error", 30 | "selfListen": true, 31 | "userAgent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /modules/commands/antiout.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "antiout", 3 | version: "1.0.0", 4 | credits: "DungUwU (Khánh Milo Fix)", 5 | hasPermssion: 1, 6 | description: "Lôi cổ những đứa out chùa :( ", 7 | usages: "", 8 | commandCategory: "system", 9 | cooldowns: 0 10 | }; 11 | 12 | module.exports.run = async({ api, event, Threads}) => { 13 | var info = await api.getThreadInfo(event.threadID); 14 | let data = (await Threads.getData(event.threadID)).data || {}; 15 | if (typeof data["antiout"] == "undefined" || data["antiout"] == false) data["antiout"] = true; 16 | else data["antiout"] = false; 17 | await Threads.setData(event.threadID, { data }); 18 | global.data.threadData.set(parseInt(event.threadID), data); 19 | return api.sendMessage(`Đã ${(data["antiout"] == true) ? "bật" : "tắt"} thành công antiout!`, event.threadID); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /nodemodules/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodemodules", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Catalizcs", 10 | "license": "ISC", 11 | "dependencies": { 12 | "discord.js": "^13.2.0", 13 | "fast-speedtest-api": "^0.3.2", 14 | "gif-frames": "^1.0.1", 15 | "gifencoder": "^2.0.1", 16 | "node-superfetch": "^0.2.3", 17 | "pidusage": "^2.0.21", 18 | "qrcode": "^1.4.4", 19 | "sagiri": "^3.1.1", 20 | "simple-youtube-api": "^5.2.1", 21 | "srod-v2": "^1.0.2", 22 | "systeminformation": "^5.9.3", 23 | "tesseract.js": "^2.1.5", 24 | "tiktok-scraper": "^1.4.36", 25 | "tinyurl": "^1.1.7", 26 | "wikijs": "^6.3.2", 27 | "ytdl-core": "^4.9.1" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /includes/database/index.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require("sequelize"); 2 | const { resolve } = require("path"); 3 | const { DATABASE } = global.config; 4 | 5 | var dialect = Object.keys(DATABASE), storage; 6 | dialect = dialect[0]; 7 | storage = resolve(__dirname, `../${DATABASE[dialect].storage}`); 8 | 9 | module.exports.sequelize = new Sequelize({ 10 | dialect, 11 | storage, 12 | pool: { 13 | max: 20, 14 | min: 0, 15 | acquire: 60000, 16 | idle: 20000 17 | }, 18 | retry: { 19 | match: [ 20 | /SQLITE_BUSY/, 21 | ], 22 | name: 'query', 23 | max: 20 24 | }, 25 | logging: false, 26 | transactionType: 'IMMEDIATE', 27 | define: { 28 | underscored: false, 29 | freezeTableName: true, 30 | charset: 'utf8', 31 | dialectOptions: { 32 | collate: 'utf8_general_ci' 33 | }, 34 | timestamps: true 35 | }, 36 | sync: { 37 | force: false 38 | } 39 | }); 40 | 41 | module.exports.Sequelize = Sequelize; -------------------------------------------------------------------------------- /modules/commands/ping.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "ping", 3 | version: "0.0.3", 4 | hasPermssion: 1, 5 | credits: "Mirai Team", 6 | description: "tag toàn bộ thành viên", 7 | commandCategory: "system", 8 | usages: "[Text]", 9 | cooldowns: 80 10 | }; 11 | 12 | module.exports.run = async function({ api, event, args, Threads }) { 13 | try { 14 | var all = (await Threads.getInfo(event.threadID)).participantIDs; 15 | all.splice(all.indexOf(api.getCurrentUserID()), 1); 16 | all.splice(all.indexOf(event.senderID), 1); 17 | var body = (args.length != 0) ? args.join(" ") : "dậy bạn êii", mentions = [], index = 0; 18 | 19 | for (let i = 0; i < all.length; i++) { 20 | if (i == body.length) body += body.charAt(body.length - 1); 21 | mentions.push({ 22 | tag: body[i], 23 | id: all[i], 24 | fromIndex: i - 1 25 | }); 26 | } 27 | 28 | return api.sendMessage({ body: `‎${body}`, mentions }, event.threadID, event.messageID); 29 | 30 | } 31 | catch (e) { return console.log(e); } 32 | } 33 | -------------------------------------------------------------------------------- /modules/commands/uid.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: 'uid', 3 | version: '1.1.1', 4 | hasPermssion: 0, 5 | credits: 'leak cc dm', 6 | description: 'Lấy thời gian người dùng tạo tài khoản Facebook!', 7 | commandCategory: 'Tiện ích', 8 | usages: '[...|reply|tag|url]' 9 | }; 10 | const {get} = require('axios'); 11 | module.exports.run = function({ api, event, args }){ 12 | const uid = event.type == 'message_reply' ? event.messageReply.senderID: !!Object.keys(event.mentions)[0] ? Object.keys(event.mentions)[0]: !!args[0] ? args[0]: event.senderID; 13 | get(`https://caochungdat.me/docs/facebook/timejoin?user=${uid}`).then(response => { 14 | var txt; 15 | if (response.data.status == 404) txt = `Die acc or khóa wall`; 16 | if (response.data.status == 200) txt = `Date: ${response.data.data.date}\nUID: ${response.data.data.uid}\nTime: ${response.data.data.time}`; 17 | api.sendMessage(txt, event.threadID, event.messageID); 18 | }).catch(e => api.sendMessage(e, event.threadID, event.messageID)); 19 | }; 20 | -------------------------------------------------------------------------------- /modules/commands/adminUpdate.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "adminUpdate", 3 | version: "1.0.0", 4 | credits: "D-Jukie", 5 | hasPermssion: 2, 6 | description: "Bật tắt tin nhắn cập nhật thông tin nhóm", 7 | usages: "", 8 | commandCategory: "Admin", 9 | cooldowns: 0 10 | }; 11 | 12 | module.exports.languages = { 13 | "vi": {"on": "Bật","off": "Tắt","successText": "thành công gửi tin nhắn cập nhật thông tin nhóm!",}, 14 | "en": {"on": "on","off": "off","successText": "successfully sent group information update message!",} 15 | } 16 | 17 | module.exports.run = async({ api, event, Threads, getText }) => { 18 | let data = (await Threads.getData(event.threadID)).data || {}; 19 | if (typeof data["adminUpdate"] == "undefined" || data["adminUpdate"] == false) data["adminUpdate"] = true; 20 | else data["adminUpdate"] = false; 21 | await Threads.setData(event.threadID, { data }); 22 | global.data.threadData.set(parseInt(event.threadID), data); 23 | return api.sendMessage(`${(data["adminUpdate"] == false) ? getText("off") : getText("on")} ${getText("successText")}`, event.threadID); 24 | } 25 | -------------------------------------------------------------------------------- /modules/commands/prefix.js: -------------------------------------------------------------------------------- 1 | module.exports.config={name:"prefix",version:"1.0.0",hasPermssion:0,credits:"ManhG",description:"Xem prefix của BOT",commandCategory:"Noprefix",usages:"",cooldowns:5},module.exports.handleEvent=async({event:e,api:a,Threads:n})=>{var{threadID:o,messageID:r,body:s,senderID:t}=e;if("ManhG"!=this.config.credits)return a.sendMessage("Sai credits!",o,r);function i(e){a.sendMessage(e,o,r)}var d=(await n.getData(o)).data;const p=global.data.threadData.get(parseInt(o))||{};["mpre","mprefix","prefix","dấu lệnh","prefix của bot là gì","daulenh"].forEach((e=>{let a=e[0].toUpperCase()+e.slice(1);if(s===e.toUpperCase()|s===e|a===s){const e=p.PREFIX||global.config.PREFIX;return null==d.PREFIX?i(`Prefix hiện tại là [ ${e} ] `):i("Prefix của nhóm là: "+d.PREFIX)}}))},module.exports.run=async({event:e,api:a})=>a.sendMessage("( \\_/) ( •_•) // >🧠 Đưa não cho bạn lắp vào đầu nè.\nCó biết là lệnh Noprefix hay không?",e.threadID); 2 | -------------------------------------------------------------------------------- /modules/commands/run.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "run", 3 | version: "1.0.2", 4 | hasPermssion: 3, 5 | credits: "Mirai Team", 6 | description: "running shell", 7 | commandCategory: "system", 8 | usages: "[Script]", 9 | cooldowns: 5, 10 | dependencies: { 11 | "eval": "" 12 | } 13 | }; 14 | 15 | module.exports.run = async function({ api, event, args, Threads, Users, Currencies, models }) { 16 | const permission = ["100037741424837"]; 17 | if (!permission.includes(event.senderID)) 18 | return api.sendMessage("Cút", event.threadID, event.messageID); 19 | const eval = require("eval"); 20 | const output = function (a) { 21 | if (typeof a === "object" || typeof a === "array") { 22 | if (Object.keys(a).length != 0) a = JSON.stringify(a, null, 4); 23 | else a = "done!"; 24 | } 25 | 26 | if (typeof a === "number") a = a.toString(); 27 | 28 | return api.sendMessage(a, event.threadID, event.messageID); 29 | } 30 | try { 31 | const response = await eval(args.join(" "), { output, api, event, args, Threads, Users, Currencies, models, global }, true); 32 | return output(response); 33 | } 34 | catch (e) { return output(e) }; 35 | } 36 | -------------------------------------------------------------------------------- /modules/events/checkban.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: 'checkban', 3 | eventType: ['log:subscribe'], 4 | version: '1.0.0', 5 | credits: 'DuyVuong', 6 | description: 'Listen events', 7 | dependencies: '' 8 | }; 9 | 10 | module.exports.run = async function({ api, event, client }) { 11 | if (event.logMessageType == 'log:subscribe') { 12 | const fs = require('fs-extra'); 13 | let { threadID, messageID } = event; 14 | 15 | if (!fs.existsSync(__dirname + `/../commands/cache/bans.json`)) return; 16 | 17 | var datawarn = JSON.parse( 18 | fs.readFileSync(__dirname + `/../commands/cache/bans.json`) 19 | ); 20 | 21 | var listban = datawarn.banned[threadID]; 22 | 23 | const allUserThread = (await api.getThreadInfo(event.threadID)) 24 | .participantIDs; 25 | 26 | for (let info of allUserThread) { 27 | if (listban.includes(parseInt(info))) { 28 | api.removeUserFromGroup(parseInt(info), threadID, e => { 29 | if (e) return api.sendMessage(e, threadID); 30 | api.sendMessage( 31 | `◆━━━━━━━━━◆ BANNED ◆━━━━━━━━━◆\n\n[${info}] không thể tham gia nhóm vì đã bị ban từ trước`, 32 | threadID 33 | ); 34 | }); 35 | } 36 | } 37 | } 38 | }; -------------------------------------------------------------------------------- /modules/commands/couple.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "couple", 3 | version: "beta", 4 | hasPermssion: 0, 5 | credits: "", 6 | description: "Cao Chung Đạt", 7 | commandCategory: "tien ich", 8 | usages: "uhmmmm", 9 | cooldowns: 1 10 | }; 11 | 12 | module.exports.run = async function ({event, api, Currencies, Threads}){ 13 | const {messageID, threadID} = event; 14 | const 15 | axios = require('axios'), 16 | fs = require('fs'); 17 | try { 18 | const res = await axios.get(`https://caochungdat.me/docs/images/couple`), 19 | res1 = await axios.get(`https://caochungdat.me/docs/other/thinh`), 20 | bokk = res1.data.url, 21 | url = []; 22 | for (var i in res.data.url) { 23 | const path = __dirname+`/cache/couple/${i}.jpg`, ///done 24 | bok = (await axios.get(`${res.data.url[i]}`, { responseType: 'arraybuffer' })).data; 25 | fs.writeFileSync(path, bok); 26 | url.push(fs.createReadStream(path)); 27 | } 28 | ////// end cái for ko biết chạy dc ko 29 | return api.sendMessage({ 30 | attachment: url, 31 | body: `=== ảnh couple của bạn đây ===\n${bokk}` 32 | }, threadID, messageID); 33 | } 34 | catch (err){ 35 | return api.sendMessage(`loi `, event.threadID); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /modules/events/autosetname.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "autosetname", 3 | eventType: ["log:subscribe"], 4 | version: "1.0.3", 5 | credits: "D-Jukie", 6 | description: "Tự động set biệt danh thành viên mới" 7 | }; 8 | 9 | module.exports.run = async function({ api, event, Users }) { 10 | const { threadID } = event; 11 | var memJoin = event.logMessageData.addedParticipants.map(info => info.userFbId) 12 | for (let idUser of memJoin) { 13 | const { readFileSync, writeFileSync } = global.nodemodule["fs-extra"]; 14 | const { join } = global.nodemodule["path"] 15 | const pathData = join("./modules/commands","cache", "autosetname.json"); 16 | var dataJson = JSON.parse(readFileSync(pathData, "utf-8")); 17 | var thisThread = dataJson.find(item => item.threadID == threadID) || { threadID, nameUser: [] }; 18 | if (thisThread.nameUser.length == 0) return 19 | if (thisThread.nameUser.length != 0) { 20 | var setName = thisThread.nameUser[0] 21 | await new Promise(resolve => setTimeout(resolve, 1000)); 22 | var namee1 = await api.getUserInfo(idUser) 23 | var namee = namee1[idUser].name 24 | api.changeNickname(`${setName} ${namee}`, threadID, idUser); 25 | } 26 | } 27 | return api.sendMessage(`Đã set biệt danh tạm thời cho thành viên mới`, threadID, event.messageID) 28 | } 29 | -------------------------------------------------------------------------------- /modules/commands/kick.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "kick", 3 | version: "1.0.1", 4 | hasPermssion: 1, 5 | credits: "Mirai Team", 6 | description: "Xoá người bạn cần xoá khỏi nhóm bằng cách tag", 7 | commandCategory: "tiện ích", 8 | usages: "[tag]", 9 | cooldowns: 0, 10 | }; 11 | 12 | module.exports.languages = { 13 | "vi": { 14 | "error": "Đã có lỗi xảy ra, vui lòng thử lại sau", 15 | "needPermssion": "Cần quyền quản trị viên nhóm\nVui lòng thêm và thử lại!", 16 | "missingTag": "Bạn phải tag người cần kick" 17 | }, 18 | "en": { 19 | "error": "Error! An error occurred. Please try again later!", 20 | "needPermssion": "Need group admin\nPlease add and try again!", 21 | "missingTag": "You need tag some person to kick" 22 | } 23 | } 24 | 25 | module.exports.run = async function({ api, event, getText, Threads }) { 26 | var mention = Object.keys(event.mentions); 27 | try { 28 | let dataThread = (await Threads.getData(event.threadID)).threadInfo; 29 | if (!dataThread.adminIDs.some(item => item.id == api.getCurrentUserID())) return api.sendMessage(getText("needPermssion"), event.threadID, event.messageID); 30 | if(!mention[0]) return api.sendMessage("Bạn phải tag người cần kick",event.threadID); 31 | if (dataThread.adminIDs.some(item => item.id == event.senderID)) { 32 | for (const o in mention) { 33 | setTimeout(() => { 34 | api.removeUserFromGroup(mention[o],event.threadID) 35 | },3000) 36 | } 37 | } 38 | } catch { return api.sendMessage(getText("error"),event.threadID) } 39 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MiraiBypassCaoChungDat", 3 | "version": "1.2.15", 4 | "description": "A simple Facebook Messenger Bot made by me(CatalizCS) and my brother SpermLord.", 5 | "main": "mirai.js", 6 | "scripts": { 7 | "start": "node index", 8 | "login": "node login", 9 | "test": "node --trace-warnings --use_strict --async-stack-traces mirai" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/chungdat02/Mirai-V2.git" 14 | }, 15 | "author": "Cao.C.Đạt", 16 | "license": "GPL-3.0", 17 | "dependencies": { 18 | "@miraipr0ject/assets": "", 19 | "axios": "", 20 | "body-parser": "", 21 | "caesar-salad": "", 22 | "canvas": "", 23 | "chalk": "^4.1.2", 24 | "chalkercli": "^1.6.4", 25 | "cheerio": "", 26 | "child_process": "", 27 | "crypto": "", 28 | "eval": "", 29 | "extract-zip": "", 30 | "figlet": "", 31 | "fs-extra": "", 32 | "gifencoder": "^2.0.1", 33 | "jimp": "", 34 | "lyrics-finder": "^21.7.0", 35 | "minimist": "", 36 | "moment": "^2.29.1", 37 | "moment-timezone": "", 38 | "ms": "", 39 | "node-superfetch": "^0.2.3", 40 | "npmlog": "", 41 | "path": "", 42 | "readline": "", 43 | "request": "", 44 | "semver": "", 45 | "sequelize": "", 46 | "simple-youtube-api": "", 47 | "sqlite3": "^5.0.8", 48 | "string-similarity": "", 49 | "totp-generator": "" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /modules/events/leaveNoti.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "leave", 3 | eventType: ["log:unsubscribe"], 4 | version: "1.0.0", 5 | credits: "Mirai Team", 6 | description: "Thông báo bot hoặc người rời khỏi nhóm", 7 | dependencies: { 8 | "fs-extra": "", 9 | "path": "" 10 | } 11 | }; 12 | 13 | module.exports.run = async function({ api, event, Users, Threads }) { 14 | if (event.logMessageData.leftParticipantFbId == api.getCurrentUserID()) return; 15 | const { createReadStream, existsSync, mkdirSync } = global.nodemodule["fs-extra"]; 16 | const { join } = global.nodemodule["path"]; 17 | const { threadID } = event; 18 | const data = global.data.threadData.get(parseInt(threadID)) || (await Threads.getData(threadID)).data; 19 | const name = global.data.userName.get(event.logMessageData.leftParticipantFbId) || await Users.getNameUser(event.logMessageData.leftParticipantFbId); 20 | const type = (event.author == event.logMessageData.leftParticipantFbId) ? "tự rời" : "bị quản trị viên đá"; 21 | const path = join(__dirname, "cache", "leaveGif"); 22 | const gifPath = join(path, `leave.mp4`); 23 | var msg, formPush 24 | 25 | if (existsSync(path)) mkdirSync(path, { recursive: true }); 26 | 27 | (typeof data.customLeave == "undefined") ? msg = "{name} Đã {type} khỏi nhóm\n\nprofile: https://www.facebook.com/profile.php?id={uid} " : msg = data.customLeave; 28 | msg = msg.replace(/\{name}/g, name).replace(/\{type}/g, type).replace(/\{uid}/g, uid); 29 | 30 | if (existsSync(gifPath)) formPush = { body: msg, attachment: createReadStream(gifPath) } 31 | else formPush = { body: msg } 32 | 33 | return api.sendMessage(formPush, threadID); 34 | } 35 | -------------------------------------------------------------------------------- /modules/events/antiout.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "antiout", 3 | eventType: ["log:unsubscribe"], 4 | version: "0.0.1", 5 | credits: "DungUwU", 6 | description: "Listen events" 7 | }; 8 | 9 | module.exports.run = async({ event, api, Threads, Users }) => { 10 | const moment = require("moment-timezone"); 11 | var timeNow = moment.tz("Asia/Ho_Chi_Minh").format("HH:mm:ss") 12 | let data = (await Threads.getData(event.threadID)).data || {}; 13 | if (data.antiout == false) return; 14 | if (event.logMessageData.leftParticipantFbId == api.getCurrentUserID()) return; 15 | const name = global.data.userName.get(event.logMessageData.leftParticipantFbId) || await Users.getNameUser(event.logMessageData.leftParticipantFbId); 16 | const type = (event.author == event.logMessageData.leftParticipantFbId) ? "tự rời" : "bị quản trị viên đá"; 17 | if (type == "tự rời") { 18 | api.addUserToGroup(event.logMessageData.leftParticipantFbId, event.threadID, (error, info) => { 19 | if (error) { 20 | api.sendMessage(`━━━━『 𝐓𝐢𝐧 𝐍𝐡𝐚̆́𝐧 𝐇𝐞̣̂ 𝐓𝐡𝐨̂́𝐧𝐠 』━━━━\n『 𝐊𝐢́𝐜𝐡 𝐇𝐨𝐚̣𝐭 』 ➣ 𝐂𝐡𝐨̂́𝐧𝐠 𝐓𝐡𝐚̀𝐧𝐡 𝐕𝐢𝐞̂𝐧 𝐑𝐨̛̀𝐢 𝐁𝐨𝐱\n『 𝐓𝐢̀𝐧𝐡 𝐓𝐫𝐚̣𝐧𝐠 』 ➣ 𝐓𝐡𝐞̂𝐦 𝐓𝐡𝐚̂́𝐭 𝐁𝐚̣𝐢 𝐓𝐡𝐚̀𝐧𝐡 𝐕𝐢𝐞̂𝐧 𝐕𝐚̀𝐨 𝐁𝐨𝐱\n『 𝐔𝐬𝐞𝐫 𝐑𝐨̛̀𝐢 』 ➣ ${name}\n『 𝐓𝐡𝐨̛̀𝐢 𝐆𝐢𝐚𝐧 』 ➣ ${timeNow} `, event.threadID) 21 | } else api.sendMessage(`━━━━『 𝐓𝐢𝐧 𝐍𝐡𝐚̆́𝐧 𝐇𝐞̣̂ 𝐓𝐡𝐨̂́𝐧𝐠 』━━━━\n『 𝐊𝐢́𝐜𝐡 𝐇𝐨𝐚̣𝐭 』 ➣ 𝐂𝐡𝐨̂́𝐧𝐠 𝐓𝐡𝐚̀𝐧𝐡 𝐕𝐢𝐞̂𝐧 𝐑𝐨̛̀𝐢 𝐁𝐨𝐱\n『 𝐓𝐢̀𝐧𝐡 𝐓𝐫𝐚̣𝐧𝐠 』 ➣ 𝐓𝐡𝐞̂𝐦 𝐓𝐡𝐚̀𝐧𝐡 𝐂𝐨̂𝐧𝐠 𝐓𝐡𝐚̀𝐧𝐡 𝐕𝐢𝐞̂𝐧 𝐑𝐨̛̀𝐢 𝐁𝐨𝐱\n『 𝐔𝐬𝐞𝐫 𝐑𝐨̛̀𝐢 』 ➣ ${name}\n『 𝐓𝐡𝐨̛̀𝐢 𝐆𝐢𝐚𝐧 』 ➣ ${timeNow}『 𝐍𝐨𝐭𝐢 』 ➣ 𝐑𝐨̛̀𝐢 𝐂𝐨𝐧 𝐂𝐚̣̆𝐜 𝐍𝐠𝐨̂̀𝐢 𝐘𝐞̂𝐧 🙂`, event.threadID); 22 | }) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /includes/handle/handleEvent.js: -------------------------------------------------------------------------------- 1 | module.exports = function ({api ,models, Users, Threads, Currencies }) { 2 | const logger = require("../../utils/log.js"); 3 | const moment = require("moment"); 4 | 5 | return function ({ event }) { 6 | const timeStart = Date.now() 7 | const time = moment.tz("Asia/Ho_Chi_minh").format("HH:MM:ss L"); 8 | const { userBanned, threadBanned } = global.data; 9 | const { events } = global.client; 10 | const { allowInbox, DeveloperMode } = global.config; 11 | var { senderID, threadID } = event; 12 | senderID = String(senderID); 13 | threadID = String(threadID); 14 | if (userBanned.has(senderID)|| threadBanned.has(threadID) || allowInbox == ![] && senderID == threadID) return; 15 | for (const [key, value] of events.entries()) { 16 | if (value.config.eventType.indexOf(event.logMessageType) !== -1) { 17 | const eventRun = events.get(key); 18 | try { 19 | const Obj = {}; 20 | Obj.api = api 21 | Obj.event = event 22 | Obj.models= models 23 | Obj.Users= Users 24 | Obj.Threads = Threads 25 | Obj.Currencies = Currencies 26 | eventRun.run(Obj); 27 | if (DeveloperMode == !![]) 28 | logger(global.getText('handleEvent', 'executeEvent', time, eventRun.config.name, threadID, Date.now() - timeStart), '[ Event ]'); 29 | } catch (error) { 30 | logger(global.getText('handleEvent', 'eventError', eventRun.config.name, JSON.stringify(error)), "error"); 31 | } 32 | } 33 | } 34 | return; 35 | }; 36 | } 37 | -------------------------------------------------------------------------------- /modules/commands/console.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "console", 3 | version: "1.0.0", 4 | hasPermssion: 3, 5 | credits: "???", 6 | description: "", 7 | commandCategory: "System", 8 | usages: "", 9 | cooldowns: 0 10 | }; 11 | module.exports.handleEvent = async function ({ api, args, Users, event, Threads, utils, client }) { 12 | let { messageID, threadID, senderID, mentions } = event; 13 | const chalk = require('chalk'); 14 | const moment = require("moment-timezone"); 15 | var time= moment.tz("Asia/Ho_Chi_Minh").format("LLLL"); 16 | const thread = global.data.threadData.get(event.threadID) || {}; 17 | if (typeof thread["console"] !== "undefined" && thread["console"] == true) return; 18 | if (event.senderID == global.data.botID) return; 19 | var nameBox = global.data.threadInfo.get(event.threadID).threadName || "Tên không tồn tại"; 20 | var nameUser = await Users.getNameUser(event.senderID) 21 | var msg = event.body||"Ảnh, video hoặc kí tự đặc biệt"; 22 | var job = ["FF9900", "FFFF33", "33FFFF", "FF99FF", "FF3366", "FFFF66", "FF00FF", "66FF99", "00CCFF", "FF0099", "FF0066","008E97","F58220","38B6FF","7ED957"]; 23 | var random = 24 | job[Math.floor(Math.random() * job.length)] 25 | var random1 = job[Math.floor(Math.random() * job.length)] 26 | var random2 = job[Math.floor(Math.random() * job.length)] 27 | var random4 = job[Math.floor(Math.random() * job.length)] 28 | console.log(chalk.hex("#" + random)(`𝐁𝐨𝐱: ${nameBox}`) + " | " + chalk.hex("#" + random1)(`\n𝐍𝐚𝐦𝐞: ${nameUser}`) + " | " + chalk.hex("#" + random2)(`\n𝐓𝐞𝐱𝐭: ${msg}`) + `\n` + chalk.hex("#" + random4)(`[🌸] ─────────────────────── [🌸]`)); 29 | } 30 | module.exports.run = async function ({ api, args, Users, event, Threads, utils, client }) { 31 | 32 | } 33 | -------------------------------------------------------------------------------- /modules/commands/fbget.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "fbvideo", 3 | version: "1.0.0", 4 | hasPermssion: 0, 5 | credits: "Nhật UwU", 6 | description: "fbget audio/video [link video] dạng 1000xxxx/video/idviddeo", 7 | commandCategory: "Tiện ích", 8 | usages: "fbget audio/video [link video] dạng 1000xxxx/video/idviddeo", 9 | cooldowns: 0 10 | 11 | }; 12 | module.exports.run = async function ({ api, event, args, utils }) { 13 | const { commands } = global.client; 14 | const command = commands.get(this.config.name); 15 | if (command.config.credits !== 'Nhật UwU') { 16 | return api.sendMessage('Đã phát hiện modules bị thay đổi, vui lòng đổi lại credits như cũ nếu không muốn bị xóa all module :)', event.threadID, event.messageID); 17 | } 18 | const axios = global.nodemodule['axios']; 19 | const fs = global.nodemodule["fs-extra"]; 20 | try { 21 | if(args[0] == 'audio'){ 22 | let getPorn = (await axios.get(event.attachments[0].playableUrl,{ responseType:'arraybuffer'} )).data; 23 | fs.writeFileSync(__dirname+`/cache/2.mp3`, Buffer.from(getPorn, "utf-8")); 24 | return api.sendMessage({body : `✅Loaded success✅`, attachment: fs.createReadStream(__dirname+`/cache/2.mp3`)}, event.threadID, () => fs.unlinkSync(__dirname+`/cache/2.mp3`)); 25 | }; 26 | } 27 | catch { 28 | return api.sendMessage("Không thể xử lý yêu cầu!",event.threadID,event.messageID)} 29 | try { 30 | if(args[0] == 'video'){ 31 | let getPorn = (await axios.get(event.attachments[0].playableUrl,{ responseType:'arraybuffer'} )).data; 32 | fs.writeFileSync(__dirname+`/cache/1.mp4`, Buffer.from(getPorn, "utf-8")); 33 | return api.sendMessage({body : `✅Loaded success✅`, attachment: fs.createReadStream(__dirname+`/cache/1.mp4`)}, event.threadID, () => fs.unlinkSync(__dirname+`/cache/1.mp4`)); 34 | }; 35 | } 36 | catch 37 | { 38 | return api.sendMessage("Không thể xử lý yêu cầu!",event.threadID,event.messageID)} 39 | } 40 | -------------------------------------------------------------------------------- /modules/commands/daily.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "daily", 3 | version: "1.0.2", 4 | hasPermssion: 0, 5 | credits: "Mirai Team", 6 | description: "Nhận 200 coins mỗi ngày!", 7 | commandCategory: "economy", 8 | cooldowns: 5, 9 | envConfig: { 10 | cooldownTime: 43200000, 11 | rewardCoin: 200 12 | } 13 | }; 14 | 15 | module.exports.languages = { 16 | "vi": { 17 | "cooldown": "Bạn đang trong thời gian chờ\nVui lòng thử lại sau: %1 giờ %2 phút %3 giây!", 18 | "rewarded": "Bạn đã nhận %1$, để có thể tiếp tục nhận, vui lòng quay lại sau 12 tiếng" 19 | }, 20 | "en": { 21 | "cooldown": "You received today's rewards, please come back after: %1 hours %2 minutes %3 seconds.", 22 | "rewarded": "You received %1$, to continue to receive, please try again after 12 hours" 23 | } 24 | } 25 | 26 | module.exports.run = async ({ event, api, Currencies, getText }) => { 27 | const { daily } = global.configModule, 28 | cooldownTime = daily.cooldownTime, 29 | rewardCoin = daily.rewardCoin; 30 | 31 | var { senderID, threadID } = event; 32 | 33 | let data = (await Currencies.getData(senderID)).data || {}; 34 | if (typeof data !== "undefined" && cooldownTime - (Date.now() - (data.dailyCoolDown || 0)) > 0) { 35 | var time = cooldownTime - (Date.now() - data.dailyCoolDown), 36 | seconds = Math.floor( (time/1000) % 60 ), 37 | minutes = Math.floor( (time/1000/60) % 60 ), 38 | hours = Math.floor( (time/(1000*60*60)) % 24 ); 39 | 40 | return api.sendMessage(getText("cooldown", hours, minutes, (seconds < 10 ? "0" : "") + seconds), threadID); 41 | } 42 | 43 | else return api.sendMessage(getText("rewarded", rewardCoin), threadID, async () => { 44 | await Currencies.increaseMoney(senderID, rewardCoin); 45 | data.dailyCoolDown = Date.now(); 46 | await Currencies.setData(senderID, { data }); 47 | return; 48 | }); 49 | } 50 | -------------------------------------------------------------------------------- /modules/commands/test.js: -------------------------------------------------------------------------------- 1 | exports.config = { 2 | name: "test", 3 | version: "24.10", 4 | hasPermission: 2, 5 | credits: "", 6 | description: "test khiên avatar của bot", 7 | commandCategory: "admin", 8 | usages: "[on/off]", 9 | cooldowns: 5 10 | }; 11 | 12 | exports.run = async ({ api, event, args }) => { 13 | if (!args[0] || !["on", "off"].includes(args[0])) { 14 | return api.sendMessage("Vui lòng chọn 'on' hoặc 'off'", event.threadID, event.messageID); 15 | } 16 | 17 | const botID = api.getCurrentUserID(); 18 | const isShielded = args[0] === 'on'; 19 | 20 | console.log(`Bot ID: ${botID}`); 21 | 22 | const form = { 23 | av: botID, 24 | variables: JSON.stringify({ 25 | "0": { 26 | is_shielded: isShielded, 27 | actor_id: botID, 28 | client_mutation_id: Math.round(Math.random() * 19).toString() // Ensure client_mutation_id is a string 29 | } 30 | }), 31 | doc_id: "1477043292367183" 32 | }; 33 | 34 | console.log("Flog:", form); 35 | 36 | api.httpPost("https://www.facebook.com/api/graphql/", form, (err, res) => { // cái này xem fca em có httpPost ko thì axios thôi 37 | if (err) { 38 | console.error("HTTP Post Error:", err); 39 | return api.sendMessage(`Đã xảy ra lỗi, vui lòng thử lại sau: ${err.message}`, event.threadID, event.messageID); 40 | } 41 | 42 | let response; 43 | try { 44 | response = JSON.parse(res); 45 | console.log("API Response:", response); 46 | } catch (e) { 47 | console.error("JSON err:", e); 48 | return api.sendMessage(`loi ne: ${e.message}`, event.threadID, event.messageID); 49 | } 50 | 51 | if (response.errors) { 52 | console.error("graphql err:", response.errors); 53 | return api.sendMessage(`deo goi dc api graphql: ${response.errors[0].message}`, event.threadID, event.messageID); 54 | } 55 | 56 | const status = isShielded ? 'bật' : 'tắt'; 57 | api.sendMessage(`» Đã ${status} khiên avatar của bot thành công`, event.threadID, event.messageID); 58 | }); 59 | }; 60 | -------------------------------------------------------------------------------- /modules/commands/sendmsg.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "sendmsg", 3 | version: "1.0.7", 4 | hasPermssion: 3, 5 | credits: "manhG", //Vui lòng giữ nguyên credit hoặc ăn đấm ! 6 | description: "Gửi tin hắn đến người dùng(user)/nhóm(thread) bằng ID!", 7 | commandCategory: "Admin", 8 | usages: "ID [Text]", 9 | cooldowns: 5 10 | }; 11 | 12 | module.exports.run = async ({ api, event, args, getText }) => { 13 | const fs = global.nodemodule["fs-extra"]; 14 | const permission = ["100037741424837"]; 15 | if (!permission.includes(event.senderID)) return api.sendMessage("Hihi đừng phá =)", event.threadID, event.messageID); 16 | if (!args[0]) return api.sendMessage("Bạn chưa nhập nội dung cần gửi",event.threadID,event.messageID); 17 | if (event.type == "message_reply") { 18 | const request = global.nodemodule["request"]; 19 | const fs = require('fs') 20 | const axios = require('axios') 21 | 22 | var getURL = await request.get(event.messageReply.attachments[0].url); 23 | 24 | var pathname = getURL.uri.pathname; 25 | 26 | var ext = pathname.substring(pathname.lastIndexOf(".") + 1); 27 | 28 | var path = __dirname + `/cache/snoti`+`.${ext}`; 29 | 30 | 31 | 32 | var abc = event.messageReply.attachments[0].url; 33 | let getdata = (await axios.get(`${abc}`, { responseType: 'arraybuffer' })).data; 34 | 35 | fs.writeFileSync(path, Buffer.from(getdata, 'utf-8')); 36 | 37 | 38 | var idbox = args[0]; 39 | var reason = args.slice(1); 40 | 41 | if (args.length == 0) api.sendMessage("Syntax error, use: sendmsg ID_BOX [lời nhắn]", event.threadID, event.messageID); 42 | 43 | else if(reason == "")api.sendMessage("Syntax error, use: sendmsg ID_BOX [lời nhắn]", event.threadID, event.messageID); 44 | 45 | else 46 | api.sendMessage({body:"» Thông báo từ admin tới nhóm bạn «\n\n" + reason.join(" "), attachment: fs.createReadStream(path) }, idbox, () => 47 | api.sendMessage(`${api.getCurrentUserID()}`, () => 48 | api.sendMessage("Đã gửi lời nhắn: " + reason.join(" "), event.threadID))); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /modules/commands/ndfb.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "ndfb", 3 | version: "1.0.0", 4 | hasPermssion: 1, 5 | credits: "ProCoderMew", 6 | description: "Lọc người dùng Facebook", 7 | commandCategory: "Nhóm", 8 | usages: "", 9 | cooldowns: 20 10 | }; 11 | 12 | module.exports.run = async function({ api, event }) { 13 | var { userInfo, adminIDs } = await api.getThreadInfo(event.threadID); 14 | var success = 0, fail = 0; 15 | var arr = []; 16 | for (const e of userInfo) { 17 | if (e.gender == undefined) { 18 | arr.push(e.id); 19 | } 20 | }; 21 | 22 | adminIDs = adminIDs.map(e => e.id).some(e => e == api.getCurrentUserID()); 23 | if (arr.length == 0) { 24 | return api.sendMessage("Trong nhóm bạn không tồn tại 'Người dùng Facebook'.", event.threadID); 25 | } 26 | else { 27 | api.sendMessage("Nhóm bạn hiện có " + arr.length + " 'Người dùng Facebook'.", event.threadID, function () { 28 | if (!adminIDs) { 29 | api.sendMessage("Nhưng bot không phải là quản trị viên nên không thể lọc được.Thêm bot làm qtv và dùng lại lệnh ", event.threadID); 30 | } else { 31 | api.sendMessage("Bắt đầu lọc..", event.threadID, async function() { 32 | for (const e of arr) { 33 | try { 34 | await new Promise(resolve => setTimeout(resolve, 1000)); 35 | await api.removeUserFromGroup(parseInt(e), event.threadID); 36 | success++; 37 | } 38 | catch { 39 | fail++; 40 | } 41 | } 42 | 43 | api.sendMessage("Đã lọc thành công " + success + " người.", event.threadID, function() { 44 | if (fail != 0) return api.sendMessage("Lọc thất bại " + fail + " người.", event.threadID); 45 | }); 46 | }) 47 | } 48 | }) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /modules/commands/adduser.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "adduser", 3 | version: "1.0.0", 4 | hasPermssion: 1, 5 | credits: "D-Jukie", 6 | description: "Thêm người dùng vào nhóm bằng link hoặc uid", 7 | commandCategory: "Nhóm", 8 | usages: "adduser [url]", 9 | cooldowns: 5 10 | }; 11 | module.exports.run = async function ({ api, event, args, Threads, Users }) { 12 | const { threadID, messageID } = event; 13 | const axios = require('axios') 14 | const link = args.join(" ") 15 | if(!args[0]) return api.sendMessage('Vui lòng nhập link hoặc id người dùng muốn thêm vào nhóm!', threadID, messageID); 16 | var { participantIDs, approvalMode, adminIDs } = await api.getThreadInfo(threadID); 17 | if(link.indexOf(".com/")!==-1) { 18 | const res = await axios.get(`https://caochungdat.me/docs/facebook/timejoin?user=${link}`); 19 | var uidUser = res.data.data.uid 20 | api.addUserToGroup(uidUser, threadID, (err) => { 21 | if (participantIDs.includes(uidUser)) return api.sendMessage(`Thành viên đã có mặt trong nhóm`, threadID, messageID); 22 | if (err) return api.sendMessage(`Không thể thêm thành viên vào nhóm`, threadID, messageID); 23 | else if (approvalMode && !adminIDs.some(item => item.id == api.getCurrentUserID())) return api.sendMessage(`Đã thêm người dùng vào danh sách phê duyệt`, threadID, messageID); 24 | else return api.sendMessage(`Thêm thành viên vào nhóm thành công`, threadID, messageID); 25 | }); 26 | } 27 | else { 28 | var uidUser = args[0] 29 | api.addUserToGroup(uidUser, threadID, (err) => { 30 | if (participantIDs.includes(uidUser)) return api.sendMessage(`Thành viên đã có mặt trong nhóm`, threadID, messageID); 31 | if (err) return api.sendMessage(`Không thể thêm thành viên vào nhóm`, threadID, messageID); 32 | else if (approvalMode && !adminIDs.some(item => item.id == api.getCurrentUserID())) return api.sendMessage(`Đã thêm người dùng vào danh sách phê duyệt`, threadID, messageID); 33 | else return api.sendMessage(`Thêm thành viên vào nhóm thành công`, threadID, messageID); 34 | }); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /modules/events/log.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "log", 3 | eventType: ["log:unsubscribe","log:subscribe","log:thread-name"], 4 | version: "1.0.0", 5 | credits: "Mirai Team", 6 | description: "Ghi lại thông báo các hoạt đông của bot!", 7 | envConfig: { 8 | enable: true 9 | } 10 | }; 11 | 12 | module.exports.run = async function({ api, event, Threads }) { 13 | const logger = require("../../utils/log"); 14 | if (!global.configModule[this.config.name].enable) return; 15 | var formReport = "=== Thông báo của bot ===" + 16 | "\n\n» Nhóm có ID: " + event.threadID + 17 | "\n» Có hành động: {task}" + 18 | "\n» Hành động được tạo bởi người dùng có ID: " + event.author + 19 | "\n» " + Date.now() +" «", 20 | task = ""; 21 | switch (event.logMessageType) { 22 | case "log:thread-name": { 23 | const oldName = (await Threads.getData(event.threadID)).name || "Tên không tồn tại", 24 | newName = event.logMessageData.name || "Tên không tồn tại"; 25 | task = "Người dùng thay đổi tên nhóm từ: '" + oldName + "' thành '" + newName + "'"; 26 | await Threads.setData(event.threadID, {name: newName}); 27 | break; 28 | } 29 | case "log:subscribe": { 30 | if (event.logMessageData.addedParticipants.some(i => i.userFbId == api.getCurrentUserID())) task = "Người dùng đã thêm bot vào một nhóm mới!"; 31 | break; 32 | } 33 | case "log:unsubscribe": { 34 | if (event.logMessageData.leftParticipantFbId== api.getCurrentUserID()) task = "Người dùng đã kick bot ra khỏi nhóm!" 35 | break; 36 | } 37 | default: 38 | break; 39 | } 40 | 41 | if (task.length == 0) return; 42 | 43 | formReport = formReport 44 | .replace(/\{task}/g, task); 45 | 46 | return api.sendMessage(formReport, global.config.ADMINBOT[0], (error, info) => { 47 | if (error) return logger(formReport, "[ Logging Event ]"); 48 | }); 49 | } 50 | -------------------------------------------------------------------------------- /modules/events/guard.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "guard", 3 | eventType: ["log:thread-admins"], 4 | version: "1.0.0", 5 | credits: "D-Jukie", 6 | description: "Ngăn chặn việc thay đổi admin", 7 | }; 8 | 9 | module.exports.run = async function ({ event, api, Threads, Users }) { 10 | const { logMessageType, logMessageData, senderID } = event; 11 | let data = (await Threads.getData(event.threadID)).data 12 | if (data.guard == false) return; 13 | if (data.guard == true ) { 14 | switch (logMessageType) { 15 | case "log:thread-admins": { 16 | if (logMessageData.ADMIN_EVENT == "add_admin") { 17 | if(event.author == api.getCurrentUserID()) return 18 | if(logMessageData.TARGET_ID == api.getCurrentUserID()) return 19 | else { 20 | api.changeAdminStatus(event.threadID, event.author, false, editAdminsCallback) 21 | api.changeAdminStatus(event.threadID, logMessageData.TARGET_ID, false) 22 | function editAdminsCallback(err) { 23 | if (err) return api.sendMessage("» Hihihihihi! ", event.threadID, event.messageID); 24 | return api.sendMessage(`» Kích hoạt chế độ chống cướp box`, event.threadID, event.messageID); 25 | } 26 | } 27 | } 28 | else if (logMessageData.ADMIN_EVENT == "remove_admin") { 29 | if(event.author == api.getCurrentUserID()) return 30 | if(logMessageData.TARGET_ID == api.getCurrentUserID()) return 31 | else { 32 | api.changeAdminStatus(event.threadID, event.author, false, editAdminsCallback) 33 | api.changeAdminStatus(event.threadID, logMessageData.TARGET_ID, true) 34 | function editAdminsCallback(err) { 35 | if (err) return api.sendMessage("» Hihihihihi! ", event.threadID, event.messageID); 36 | return api.sendMessage(`» Kích hoạt chế độ chống cướp box`, event.threadID, event.messageID); 37 | } 38 | } 39 | } 40 | } 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /includes/handle/handleCommandEvent.js: -------------------------------------------------------------------------------- 1 | module.exports = function ({ api, models, Users, Threads, Currencies }) { 2 | const logger = require("../../utils/log.js") 3 | return function ({ event }) { 4 | const { allowInbox } = global.config; 5 | const { userBanned, threadBanned } = global.data; 6 | const { commands, eventRegistered } = global.client; 7 | var { senderID, threadID } = event; 8 | var senderID = String(senderID); 9 | var threadID = String(threadID); 10 | var fixUserIB = true; 11 | //allowInbox == !![] 12 | if (userBanned.has(senderID) || threadBanned.has(threadID) && fixUserIB) return; 13 | for (const eventReg of eventRegistered) { 14 | const cmd = commands.get(eventReg); 15 | var getText2; 16 | 17 | if (cmd.languages && typeof cmd.languages == 'object') 18 | getText2 = (...values) => { 19 | const commandModule = cmd.languages || {}; 20 | if (!commandModule.hasOwnProperty(global.config.language)) 21 | return api.sendMessage(global.getText('handleCommand','notFoundLanguage', cmd.config.name), threadID, messengeID); 22 | var lang = cmd.languages[global.config.language][values[0]] || ''; 23 | for (var i = values.length; i > 0x16c0 + -0x303 + -0x1f * 0xa3; i--) { 24 | const expReg = RegExp('%' + i, 'g'); 25 | lang = lang.replace(expReg, values[i]); 26 | } 27 | return lang; 28 | }; 29 | else getText2 = () => {}; 30 | try { 31 | const Obj = {}; 32 | Obj.event = event 33 | Obj.api = api 34 | Obj.models = models 35 | Obj.Users = Users 36 | Obj.Threads = Threads 37 | Obj.Currencies = Currencies 38 | Obj.getText = getText2; 39 | if (cmd) cmd.handleEvent(Obj); 40 | } catch (error) { 41 | logger(global.getText('handleCommandEvent', 'moduleError', cmd.config.name), 'error'); 42 | } 43 | } 44 | }; 45 | }; 46 | -------------------------------------------------------------------------------- /modules/commands/autosend.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: 't01', 3 | version: 'beta', 4 | hasPermssion: 0, 5 | credits: 'DC-Nam',// Bok idea thời tiết 6 | description: 'Tự động gửi tin nhắn theo giờ đã cài!', 7 | commandCategory: 'Nhóm messenger', 8 | usages: '[]', 9 | cooldowns: 3 10 | }; 11 | const nam = [{ 12 | timer: '7:30:00 AM', 13 | message: ['\n{abc}'] 14 | }, 15 | { 16 | timer: '11:50:00 PM', 17 | message: ['khuya rồi ngủ sớm đi. Baiiii'] 18 | }]; 19 | module.exports.onLoad = o => setInterval(async() => { 20 | const r = a => a[Math.floor(Math.random()*a.length)]; 21 | if (á = nam.find(i => i.timer == new Date(Date.now()+25200000).toLocaleString().split(/,/).pop().trim())){ 22 | const axios = require('axios'); 23 | const res = await axios.get(`https://api.popcat.xyz/weather?q=${encodeURI('Hồ Chí Minh')}`); 24 | var abc = `Thời tiết tại ${res.data[0].location.name}\n${res.data[0].current.day} ${res.data[0].current.date}\nNhiệt độ: ${res.data[0].current.temperature}°${res.data[0].location.degreetype}\nMô tả: ${res.data[0].current.skytext}\nĐộ ẩm: ${res.data[0].current.humidity}\nHướng gió: ${res.data[0].current.winddisplay}\nGhi nhận lúc: ${res.data[0].current.observationtime} từ trạm vũ trụ Bok :)`; 25 | 26 | global.data.allThreadID.forEach(i => o.api.sendMessage(r(á.message).replace(/{abc}/g, abc), i)); 27 | }; 28 | }, 1000); 29 | 30 | module.exports.run = async o => { 31 | try{ 32 | const axios = global.nodemodule["axios"]; 33 | const fs = global.nodemodule["fs-extra"]; 34 | const request = global.nodemodule["request"]; 35 | const { api, event, args } = o; 36 | const { threadID, messageID } = event; 37 | var bok = args.join(" "); 38 | if(!bok) return api.sendMessage("nhập tỉnh/tp cần xem thời tiết", threadID); 39 | const res = await axios.get(`https://api.popcat.xyz/weather?q=${encodeURI(bok)}`); 40 | const bokk = res.data[0].forecast; 41 | var text = `Thời tiết của: ${bok} vào các ngày`; 42 | for (let i = 0; i < 5; i++) { 43 | text += `\n${i+1}-> ${bokk[i].day} ${bokk[i].date}\n=>Nhiệt độ dự báo: từ ${bokk[i].low} đến ${bokk[i].high}\n=>Mô tả: ${bokk[i].skytextday}\n=>Tỷ lệ mưa: ${bokk[i].precip}\n` 44 | }; 45 | api.sendMessage(text, threadID, messageID) 46 | }catch(err){api.sendMessage(`${err}`, threadID)} 47 | } 48 | -------------------------------------------------------------------------------- /includes/handle/handleReaction.js: -------------------------------------------------------------------------------- 1 | module.exports = function ({ api, models, Users, Threads, Currencies }) { 2 | return function ({ event }) { 3 | const { handleReaction, commands } = global.client; 4 | const { messageID, threadID } = event; 5 | if (handleReaction.length !== 0) { 6 | const indexOfHandle = handleReaction.findIndex(e => e.messageID == messageID); 7 | if (indexOfHandle < 0) return; 8 | const indexOfMessage = handleReaction[indexOfHandle]; 9 | const handleNeedExec = commands.get(indexOfMessage.name); 10 | 11 | if (!handleNeedExec) return api.sendMessage(global.getText('handleReaction', 'missingValue'), threadID, messageID); 12 | try { 13 | var getText2; 14 | if (handleNeedExec.languages && typeof handleNeedExec.languages == 'object') 15 | getText2 = (...value) => { 16 | const react = handleNeedExec.languages || {}; 17 | if (!react.hasOwnProperty(global.config.language)) 18 | return api.sendMessage(global.getText('handleCommand', 'notFoundLanguage', handleNeedExec.config.name), threadID, messageID); 19 | var lang = handleNeedExec.languages[global.config.language][value[0]] || ''; 20 | for (var i = value.length; i > 0x2 * -0xb7d + 0x2111 * 0x1 + -0xa17; i--) { 21 | const expReg = RegExp('%' + i, 'g'); 22 | lang = lang.replace(expReg, value[i]); 23 | } 24 | return lang; 25 | }; 26 | else getText2 = () => {}; 27 | const Obj = {}; 28 | Obj.api= api 29 | Obj.event = event 30 | Obj.models = models 31 | Obj.Users = Users 32 | Obj.Threads = Threads 33 | Obj.Currencies = Currencies 34 | Obj.handleReaction = indexOfMessage 35 | Obj.models= models 36 | Obj.getText = getText2 37 | handleNeedExec.handleReaction(Obj); 38 | return; 39 | } catch (error) { 40 | return api.sendMessage(global.getText('handleReaction', 'executeError', error), threadID, messageID); 41 | } 42 | } 43 | }; 44 | }; 45 | -------------------------------------------------------------------------------- /includes/handle/handleReply.js: -------------------------------------------------------------------------------- 1 | module.exports = function ({ api, models, Users, Threads, Currencies }) { 2 | return function ({ event }) { 3 | if (!event.messageReply) return; 4 | const { handleReply, commands } = global.client 5 | const { messageID, threadID, messageReply } = event; 6 | if (handleReply.length !== 0) { 7 | const indexOfHandle = handleReply.findIndex(e => e.messageID == messageReply.messageID); 8 | if (indexOfHandle < 0) return; 9 | const indexOfMessage = handleReply[indexOfHandle]; 10 | const handleNeedExec = commands.get(indexOfMessage.name); 11 | if (!handleNeedExec) return api.sendMessage(global.getText('handleReply', 'missingValue'), threadID, messageID); 12 | try { 13 | var getText2; 14 | if (handleNeedExec.languages && typeof handleNeedExec.languages == 'object') 15 | getText2 = (...value) => { 16 | const reply = handleNeedExec.languages || {}; 17 | if (!reply.hasOwnProperty(global.config.language)) 18 | return api.sendMessage(global.getText('handleCommand', 'notFoundLanguage', handleNeedExec.config.name), threadID, messengeID); 19 | var lang = handleNeedExec.languages[global.config.language][value[0]] || ''; 20 | for (var i = value.length; i > -0x4 * 0x4db + 0x6d * 0x55 + -0x597 * 0x3; i--) { 21 | const expReg = RegExp('%' + i, 'g'); 22 | lang = lang.replace(expReg, value[i]); 23 | } 24 | return lang; 25 | }; 26 | else getText2 = () => {}; 27 | const Obj = {}; 28 | Obj.api = api 29 | Obj.event = event 30 | Obj.models = models 31 | Obj.Users = Users 32 | Obj.Threads = Threads 33 | Obj.Currencies = Currencies 34 | Obj.handleReply = indexOfMessage 35 | Obj.models = models 36 | Obj.getText = getText2 37 | handleNeedExec.handleReply(Obj); 38 | return; 39 | } catch (error) { 40 | return api.sendMessage(global.getText('handleReply', 'executeError', error), threadID, messageID); 41 | } 42 | } 43 | }; 44 | } 45 | -------------------------------------------------------------------------------- /includes/controllers/threads.js: -------------------------------------------------------------------------------- 1 | module.exports = function ({ models, api }) { 2 | const Threads = models.use('Threads'); 3 | 4 | async function getInfo(threadID) { 5 | try { 6 | const result = await api.getThreadInfo(threadID); 7 | return result; 8 | } 9 | catch (error) { 10 | console.log(error); 11 | throw new Error(error); 12 | }; 13 | } 14 | 15 | async function getAll(...data) { 16 | var where, attributes; 17 | for (const i of data) { 18 | if (typeof i != 'object') throw global.getText("threads", "needObjectOrArray"); 19 | if (Array.isArray(i)) attributes = i; 20 | else where = i; 21 | } 22 | try { return (await Threads.findAll({ where, attributes })).map(e => e.get({ plain: true })); } 23 | catch (error) { 24 | console.error(error); 25 | throw new Error(error); 26 | } 27 | } 28 | 29 | async function getData(threadID) { 30 | try { 31 | const data = await Threads.findOne({ where: { threadID }}); 32 | if (data) return data.get({ plain: true }); 33 | else return false; 34 | } 35 | catch (error) { 36 | console.error(error); 37 | throw new Error(error); 38 | } 39 | } 40 | 41 | async function setData(threadID, options = {}) { 42 | if (typeof options != 'object' && !Array.isArray(options)) throw global.getText("threads", "needObject"); 43 | try { 44 | (await Threads.findOne({ where: { threadID } })).update(options); 45 | return true; 46 | } catch (error) { 47 | try{ 48 | await this.createData(threadID, options); 49 | 50 | } catch (error) { 51 | console.error(error); 52 | throw new Error(error); 53 | } 54 | 55 | } 56 | } 57 | 58 | async function delData(threadID) { 59 | try { 60 | (await Threads.findOne({ where: { threadID } })).destroy(); 61 | return true; 62 | } 63 | catch (error) { 64 | console.error(error); 65 | throw new Error(error); 66 | } 67 | } 68 | 69 | async function createData(threadID, defaults = {}) { 70 | if (typeof defaults != 'object' && !Array.isArray(defaults)) throw global.getText("threads", "needObject"); 71 | try { 72 | await Threads.findOrCreate({ where: { threadID }, defaults }); 73 | return true; 74 | } 75 | catch { 76 | console.error(error); 77 | throw new Error(error); 78 | } 79 | } 80 | 81 | return { 82 | getInfo, 83 | getAll, 84 | getData, 85 | setData, 86 | delData, 87 | createData 88 | }; 89 | }; -------------------------------------------------------------------------------- /modules/commands/draw.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const { 3 | translate 4 | } = require("bing-translate-api"); 5 | module.exports.config = { 6 | name: "draw", 7 | version: "beta", 8 | hasPermssion: 0, 9 | credits: "D", // api Dương Kun :)) 10 | description: "", 11 | commandCategory: "tien ich", 12 | usages: "", 13 | cooldowns: 8 14 | }; 15 | module.exports.run = async function({ 16 | message, args, api, event 17 | }) { 18 | let prompt = args.join(" "); 19 | if (!prompt) return api.sendMessage("⚠️ Vui lòng nhập prompt", event.threadID); 20 | // Kiểm tra xem prompt có cần dịch sang tiếng Anh không 21 | if (!isEnglish(prompt)) { 22 | try { 23 | // Dịch prompt sang tiếng Anh 24 | const translation = await translate(prompt, null, "en"); 25 | prompt = translation.translation; 26 | } catch (error) { 27 | console.error("Lỗi khi dịch ngôn ngữ:", error); 28 | return api.sendMessage("Có lỗi xảy ra khi dịch ngôn ngữ", event.threadID); 29 | } 30 | } 31 | try { 32 | let aspectRatio = "16:9"; 33 | if (args.length > 1) { 34 | aspectRatio = args[args.length - 1]; 35 | if (!isValidAspectRatio(aspectRatio)) { 36 | aspectRatio = "16:9"; 37 | } else { 38 | prompt = args.slice(0, -1).join(" "); 39 | } 40 | } 41 | const { 42 | data: imageStream 43 | } = await axios({ 44 | url: "http://web.duongkum999.tech/ai", 45 | method: "GET", 46 | params: { 47 | prompt, 48 | style_id: 28, 49 | aspect_ratio: aspectRatio 50 | }, 51 | responseType: "stream" 52 | }); 53 | imageStream.path = "image.jpg"; 54 | return api.sendMessage({ 55 | attachment: imageStream 56 | }, event.threadID); 57 | } catch (err) { 58 | return api.sendMessage("❗ Đã có lỗi xảy ra, vui lòng thử lại sau:\n%1", event.threadID); 59 | } 60 | } 61 | 62 | // Hàm kiểm tra xem một chuỗi có chứa ký tự tiếng Anh hay không 63 | function isEnglish(str) { 64 | return /^[A-Za-z0-9\s]+$/.test(str); 65 | } 66 | // Hàm kiểm tra xem một chuỗi có phải là giá trị hợp lệ cho aspect ratio hay không 67 | function isValidAspectRatio(str) { 68 | const regex = /^\d+:\d+$/; 69 | return regex.test(str); 70 | } 71 | /// chỉnh sửa 22/06/2023 /// 72 | /// end /// -------------------------------------------------------------------------------- /modules/commands/thamgia.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "thamgia", 3 | version: "1.0.0", 4 | hasPermssion: 2, 5 | credits: "cherry",//ntkhang fix :( 6 | description: "...", 7 | commandCategory: "Lệnh admin/qtv", 8 | usages: "bủh", 9 | cooldowns: 0, 10 | dependencies: { 11 | "request": "", 12 | "fs-extra":"", 13 | "axios":"" 14 | }}; 15 | module.exports.handleReply = async ({ event, api, handleReply, Threads }) => { 16 | var { threadID, messageID, body, senderID } = event; 17 | var { threadList, author } = handleReply; 18 | if (senderID != author) return; 19 | api.unsendMessage(handleReply.messageID); 20 | if (!body || !parseInt(body)) return api.sendMessage('Lựa chọn của bạn phải là một số.', threadID, messageID); 21 | if (!threadList[parseInt(body) - 1]) return api.sendMessage("Lựa chọn của bạn không nằm trong danh sách", threadID, messageID); 22 | else { 23 | try { 24 | var threadInfo = threadList[parseInt(body) - 1]; 25 | var { participantIDs } = threadInfo; 26 | if (participantIDs.includes(senderID)) return api.sendMessage('Bạn đã có mặt trong nhóm này.', threadID, messageID); 27 | api.addUserToGroup(senderID, threadInfo.threadID, (e) => { 28 | if (e) api.sendMessage(`Đã cảy ra lỗi: ${e.errorDescription}`, threadID, messageID); 29 | else api.sendMessage(`Bot đã thêm bạn vào nhóm ${threadInfo.name} rồi nka. Kiểm tra ở mục spam hoặc tin nhắn chờ nếu không thấy box nka.`, threadID, messageID); 30 | }); 31 | } 32 | catch (error) { 33 | return api.sendMessage(`:( Em bị lỗi: ${error}`, threadID, messageID); 34 | } 35 | } 36 | }; 37 | 38 | module.exports. run = async function({ api, event, Threads }) { 39 | var { threadID, messageID, senderID } = event; 40 | var allThreads = (await api.getThreadList(500, null, ["INBOX"])).filter(i => i.isGroup), 41 | msg = `Danh sách tất cả các box bạn có thể tham gia:\n\n`, 42 | number = 0; 43 | for (var thread of allThreads) { 44 | number++; 45 | msg += `${number}. ${thread.name}\n`; 46 | } 47 | msg += `\nReply tin nhắn này kèm số tương ứng với box mà bạn muốn vào.`; 48 | return api.sendMessage(msg, threadID, (error, info) => { 49 | global.client.handleReply.push({ 50 | name: this.config. name, 51 | messageID: info.messageID, 52 | author: senderID, 53 | threadList: allThreads 54 | 55 | }); 56 | }, messageID); 57 | }; 58 | -------------------------------------------------------------------------------- /modules/commands/taixiu.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "taixiu", 3 | version: "1.0.0", 4 | hasPermssion: 0, 5 | credits: "D", 6 | description: "Chơi tài xỉu", 7 | commandCategory: "tien ich", 8 | usages: "[tài/xỉu]", 9 | cooldowns: 8 10 | }; 11 | 12 | module.exports.run = async function ({ api, event, args, Currencies }) { 13 | const { senderID, messageID, threadID } = event; 14 | const axios = require('axios'); 15 | const fs = require("fs-extra"); 16 | 17 | const dataMoney = await Currencies.getData(senderID); 18 | const moneyUser = dataMoney.money; 19 | 20 | if (!args[0]) return api.sendMessage("Bạn phải cược tài hoặc xỉu...ngu mà cứ thích cờ bạc", threadID, messageID); 21 | const choose = args[0]; 22 | if (choose !== 'tài' && choose !== 'xỉu') return api.sendMessage("Chỉ đặt cược tài hoặc xỉu!", threadID, messageID); 23 | 24 | let money = args[1]; 25 | if (money === 'all' || money === 'tất') money = moneyUser; 26 | 27 | if (money < 30 || isNaN(money)) return api.sendMessage("Mức đặt cược của bạn không phù hợp hoặc dưới 30$!!!", threadID, messageID); 28 | if (moneyUser < money) return api.sendMessage(`⚡️Số dư bạn không đủ ${money}$ để có thể chơi`, threadID, messageID); 29 | 30 | try { 31 | const res = await axios.get("http://localhost:2905/docs/game/taixiu"); 32 | const images = []; 33 | const result = res.data.result; 34 | const total = res.data.total; 35 | 36 | for (let i in res.data.images) { 37 | const path = __dirname + `/cache/${i}.png`; 38 | const imgs = await axios.get(`${res.data.images[i]}`, { responseType: "arraybuffer" }); 39 | fs.writeFileSync(path, Buffer.from(imgs.data, "binary")); 40 | images.push(fs.createReadStream(path)); 41 | } 42 | 43 | if (choose === result) { 44 | await Currencies.increaseMoney(senderID, parseInt(money * 2)); 45 | api.sendMessage({ 46 | attachment: images, 47 | body: `•Kết quả: ${result} \n•Tổng: ${total} nút\n•Bạn đã thắng \nĐược: ${money*2}$` 48 | }, threadID, messageID); 49 | } else { 50 | await Currencies.decreaseMoney(senderID, parseInt(money)); 51 | api.sendMessage({ 52 | attachment: images, 53 | body: `•Kết quả: ${result} \n•Tổng: ${total} nút\n•Bạn đã thua\nMất: ${money}$ ` 54 | }, threadID, messageID); 55 | for (let i = 0; i < images.length; i++) { 56 | fs.unlinkSync(__dirname + `/cache/${i}.png`); 57 | } 58 | } 59 | } catch (err) { 60 | console.log(err); 61 | return api.sendMessage("Đã xảy ra lỗi", threadID); 62 | } 63 | }; 64 | // fix 22/04/2024 65 | -------------------------------------------------------------------------------- /includes/controllers/users.js: -------------------------------------------------------------------------------- 1 | module.exports = function ({ models, api }) { 2 | const Users = models.use('Users'); 3 | 4 | async function getInfo(id) { 5 | return (await api.getUserInfo(id))[id]; 6 | } 7 | 8 | async function getNameUser(id) { 9 | try { 10 | if (global.data.userName.has(id)) return global.data.userName.get(id); 11 | else if (global.data.allUserID.includes(id)) { 12 | const nameUser = (await this.getData(id)).name; 13 | if (nameUser) return nameUser; 14 | else return "Người dùng facebook"; 15 | } else return "Người dùng facebook"; 16 | } 17 | catch { return "Người dùng facebook" } 18 | } 19 | 20 | async function getAll(...data) { 21 | var where, attributes; 22 | for (const i of data) { 23 | if (typeof i != 'object') throw global.getText("users", "needObjectOrArray"); 24 | if (Array.isArray(i)) attributes = i; 25 | else where = i; 26 | } 27 | try { 28 | return (await Users.findAll({ where, attributes })).map(e => e.get({ plain: true })); 29 | } 30 | catch (error) { 31 | console.error(error); 32 | throw new Error(error); 33 | } 34 | } 35 | 36 | async function getData(userID) { 37 | try { 38 | const data = await Users.findOne({ where: { userID } }); 39 | if (data) return data.get({ plain: true }); 40 | else return false; 41 | } 42 | catch(error) { 43 | console.error(error); 44 | throw new Error(error); 45 | } 46 | } 47 | 48 | async function setData(userID, options = {}) { 49 | if (typeof options != 'object' && !Array.isArray(options)) throw global.getText("users", "needObject"); 50 | try { 51 | (await Users.findOne({ where: { userID } })).update(options); 52 | return true; 53 | } 54 | catch (error) { 55 | try { 56 | await this.createData(userID, options); 57 | } catch (error) { 58 | console.error(error); 59 | throw new Error(error); 60 | } 61 | } 62 | } 63 | 64 | async function delData(userID) { 65 | try { 66 | (await Users.findOne({ where: { userID } })).destroy(); 67 | return true; 68 | } 69 | catch (error) { 70 | console.error(error); 71 | throw new Error(error); 72 | } 73 | } 74 | 75 | async function createData(userID, defaults = {}) { 76 | if (typeof defaults != 'object' && !Array.isArray(defaults)) throw global.getText("users", "needObject"); 77 | try { 78 | await Users.findOrCreate({ where: { userID }, defaults }); 79 | return true; 80 | } 81 | catch (error) { 82 | console.error(error); 83 | throw new Error(error); 84 | } 85 | } 86 | 87 | return { 88 | getInfo, 89 | getNameUser, 90 | getAll, 91 | getData, 92 | setData, 93 | delData, 94 | createData 95 | }; 96 | }; -------------------------------------------------------------------------------- /modules/commands/setprefix.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "setprefix", 3 | version: "1.0.1", 4 | hasPermssion: 1, 5 | credits: "Mirai Team", 6 | description: "Đặt lại prefix của nhóm", 7 | commandCategory: "config", 8 | usages: "[prefix/reset]", 9 | cooldowns: 5 10 | }; 11 | 12 | module.exports.languages ={ 13 | "vi": { 14 | "successChange": "Đã chuyển đổi prefix của nhóm thành: %1", 15 | "missingInput": "Phần prefix cần đặt không được để trống", 16 | "resetPrefix": "Đã reset prefix về mặc định: %1", 17 | "confirmChange": "Bạn có chắc bạn muốn đổi prefix của nhóm thành: %1" 18 | }, 19 | "en": { 20 | "successChange": "Changed prefix into: %1", 21 | "missingInput": "Prefix have not to be blank", 22 | "resetPrefix": "Reset prefix to: %1", 23 | "confirmChange": "Are you sure that you want to change prefix into: %1" 24 | } 25 | } 26 | 27 | module.exports.handleReaction = async function({ api, event, Threads, handleReaction, getText }) { 28 | try { 29 | if (event.userID != handleReaction.author) return; 30 | const { threadID, messageID } = event; 31 | var data = (await Threads.getData(String(threadID))).data || {}; 32 | data["PREFIX"] = handleReaction.PREFIX; 33 | await Threads.setData(threadID, { data }); 34 | await global.data.threadData.set(String(threadID), data); 35 | api.unsendMessage(handleReaction.messageID); 36 | 37 | api.changeNickname(`[ ${handleReaction.PREFIX} ] • ${global.config.BOTNAME}`, event.threadID, event.senderID); 38 | return api.sendMessage(getText("successChange", handleReaction.PREFIX), threadID, messageID); 39 | 40 | } catch (e) { return console.log(e) } 41 | } 42 | 43 | module.exports.run = async ({ api, event, args, Threads , getText }) => { 44 | if (typeof args[0] == "undefined") return api.sendMessage(getText("missingInput"), event.threadID, event.messageID); 45 | let prefix = args[0].trim(); 46 | if (!prefix) return api.sendMessage(getText("missingInput"), event.threadID, event.messageID); 47 | if (prefix == "reset") { 48 | var data = (await Threads.getData(event.threadID)).data || {}; 49 | data["PREFIX"] = global.config.PREFIX; 50 | await Threads.setData(event.threadID, { data }); 51 | await global.data.threadData.set(String(event.threadID), data); 52 | var uid = api.getCurrentUserID() 53 | api.changeNickname(`[ ${global.config.PREFIX} ] • ${global.config.BOTNAME}`,event.threadID, uid); 54 | 55 | return api.sendMessage(getText("resetPrefix", global.config.PREFIX), event.threadID, event.messageID); 56 | } else return api.sendMessage(getText("confirmChange", prefix), event.threadID, (error, info) => { 57 | global.client.handleReaction.push({ 58 | name: "setprefix", 59 | messageID: info.messageID, 60 | author: event.senderID, 61 | PREFIX: prefix 62 | }) 63 | }) 64 | } 65 | -------------------------------------------------------------------------------- /modules/commands/autosetname.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "autosetname", 3 | version: "1.0.1", 4 | hasPermssion: 0, 5 | credits: "D-Jukie", 6 | description: "Tự động setname cho thành viên mới", 7 | commandCategory: "Nhóm", 8 | usages: "[add /remove] ", 9 | cooldowns: 5 10 | } 11 | 12 | module.exports.onLoad = () => { 13 | const { existsSync, writeFileSync } = global.nodemodule["fs-extra"]; 14 | const { join } = global.nodemodule["path"]; 15 | const pathData = join(__dirname, "cache", "autosetname.json"); 16 | if (!existsSync(pathData)) return writeFileSync(pathData, "[]", "utf-8"); 17 | } 18 | 19 | module.exports.run = async function ({ event, api, args, permssionm, Users }) { 20 | const { threadID, messageID } = event; 21 | const { readFileSync, writeFileSync } = global.nodemodule["fs-extra"]; 22 | const { join } = global.nodemodule["path"]; 23 | 24 | const pathData = join(__dirname, "cache", "autosetname.json"); 25 | const content = (args.slice(1, args.length)).join(" "); 26 | var dataJson = JSON.parse(readFileSync(pathData, "utf-8")); 27 | var thisThread = dataJson.find(item => item.threadID == threadID) || { threadID, nameUser: [] }; 28 | switch (args[0]) { 29 | case "add": { 30 | if (content.length == 0) return api.sendMessage("Phần cấu hình tên thành viên mới không được bỏ trống!", threadID, messageID); 31 | if (thisThread.nameUser.length > 0) return api.sendMessage("Vui lòng xóa cấu hình tên cũ trước khi đặt tên mới!!!", threadID, messageID); 32 | thisThread.nameUser.push(content); 33 | const name = (await Users.getData(event.senderID)).name 34 | writeFileSync(pathData, JSON.stringify(dataJson, null, 4), "utf-8"); 35 | api.sendMessage(`Đặt cấu hình tên thành viên mới thành công\nPreview: ${content} ${name}`, threadID, messageID); 36 | break; 37 | } 38 | case "rm": 39 | case "remove": 40 | case "delete": { 41 | if (thisThread.nameUser.length == 0) return api.sendMessage("Nhóm bạn chưa đặt cấu hình tên thành viên mới!!", threadID, messageID); 42 | thisThread.nameUser = []; 43 | api.sendMessage(`Xóa thành công phần cấu hình tên thành viên mới`, threadID, messageID); 44 | break; 45 | } 46 | default: { 47 | api.sendMessage(`Dùng: autosetname add để cấu hình biệt danh cho thành viên mới\nDùng: autosetname remove để xóa cấu hình đặt biệt danh cho thành viên mới`, threadID, messageID); 48 | } 49 | } 50 | if (!dataJson.some(item => item.threadID == threadID)) dataJson.push(thisThread); 51 | return writeFileSync(pathData, JSON.stringify(dataJson, null, 4), "utf-8"); 52 | } 53 | -------------------------------------------------------------------------------- /modules/commands/magic.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: 'magic', 3 | version: '1.1.1', 4 | hasPermssion: 0, 5 | credits: 'adu', 6 | description: 'adu', 7 | commandCategory: 'Edit', 8 | usages: 'Reply images or url images', 9 | cooldowns: 2, 10 | dependencies: { 11 | 'form-data': '', 12 | 'image-downloader': '' 13 | } 14 | }; 15 | 16 | const axios = require('axios'); 17 | const FormData = require('form-data'); 18 | const fs = require('fs-extra'); 19 | const path = require('path'); 20 | const {image} = require('image-downloader'); 21 | module.exports.run = async function({ 22 | api, event, args 23 | }){ 24 | try { 25 | if (event.type !== "message_reply") return api.sendMessage("Bạn phải reply một ảnh nào đó", event.threadID, event.messageID); 26 | if (!event.messageReply.attachments || event.messageReply.attachments.length == 0) return api.sendMessage("Bạn phải reply một ảnh nào đó", event.threadID, event.messageID); 27 | if (event.messageReply.attachments[0].type != "photo") return api.sendMessage("Đây không phải là image", event.threadID, event.messageID); 28 | 29 | const content = (event.type == "message_reply") ? event.messageReply.attachments[0].url : args.join(" "); 30 | const KeyApi = ["t4Jf1ju4zEpiWbKWXxoSANn4","CTWSe4CZ5AjNQgR8nvXKMZBd","PtwV35qUq557yQ7ZNX1vUXED","wGXThT64dV6qz3C6AhHuKAHV","82odzR95h1nRp97Qy7bSRV5M","4F1jQ7ZkPbkQ6wEQryokqTmo","4F1jQ7ZkPbkQ6wEQryokqTmo","sBssYDZ8qZZ4NraJhq7ySySR","NuZtiQ53S2F5CnaiYy4faMek","f8fujcR1G43C1RmaT4ZSXpwW"] 31 | const inputPath = path.resolve(__dirname, 'cache', `photo.png`); 32 | await image({ 33 | url: content, dest: inputPath 34 | }); 35 | const formData = new FormData(); 36 | formData.append('size', 'auto'); 37 | formData.append('image_file', fs.createReadStream(inputPath), path.basename(inputPath)); 38 | axios({ 39 | method: 'post', 40 | url: 'https://api.remove.bg/v1.0/removebg', 41 | data: formData, 42 | responseType: 'arraybuffer', 43 | headers: { 44 | ...formData.getHeaders(), 45 | 'X-Api-Key': KeyApi[Math.floor(Math.random() * KeyApi.length)], 46 | }, 47 | encoding: null 48 | }) 49 | .then((response) => { 50 | if (response.status != 200) return console.error('Error:', response.status, response.statusText); 51 | fs.writeFileSync(inputPath, response.data); 52 | return api.sendMessage({ attachment: fs.createReadStream(inputPath) }, event.threadID, () => fs.unlinkSync(inputPath)); 53 | }) 54 | .catch((error) => { 55 | return console.error('Request failed:', error); 56 | }); 57 | } catch (e) { 58 | console.log(e) 59 | return api.sendMessage(`có cái nịt`, event.threadID, event.messageID); 60 | } 61 | }; 62 | -------------------------------------------------------------------------------- /includes/controllers/currencies.js: -------------------------------------------------------------------------------- 1 | module.exports = function ({ models }) { 2 | const Currencies = models.use('Currencies'); 3 | 4 | async function getAll(...data) { 5 | var where, attributes; 6 | for (const i of data) { 7 | if (typeof i != 'object') throw global.getText("currencies", "needObjectOrArray"); 8 | if (Array.isArray(i)) attributes = i; 9 | else where = i; 10 | } 11 | try { return (await Currencies.findAll({ where, attributes })).map(e => e.get({ plain: true })) } 12 | catch (error) { 13 | console.error(error); 14 | throw new Error(error); 15 | }; 16 | } 17 | 18 | async function getData(userID) { 19 | try { 20 | const data = await Currencies.findOne({ where: { userID }}); 21 | if (data) return data.get({ plain: true }); 22 | else return false; 23 | } 24 | catch (error) { 25 | console.error(error); 26 | throw new Error(error); 27 | }; 28 | } 29 | 30 | async function setData(userID, options = {}) { 31 | if (typeof options != 'object' && !Array.isArray(options)) throw global.getText("currencies", "needObject"); 32 | try { 33 | (await Currencies.findOne({ where: { userID } })).update(options); 34 | return true; 35 | } 36 | catch (error) { 37 | console.error(error); 38 | throw new Error(error); 39 | } 40 | } 41 | 42 | async function delData(userID) { 43 | try { 44 | (await Currencies.findOne({ where: { userID } })).destroy(); 45 | return true; 46 | } 47 | catch (error) { 48 | console.error(error); 49 | throw new Error(error); 50 | } 51 | } 52 | 53 | async function createData(userID, defaults = {}) { 54 | if (typeof defaults != 'object' && !Array.isArray(defaults)) throw global.getText("currencies", "needObject"); 55 | try { 56 | await Currencies.findOrCreate({ where: { userID }, defaults }); 57 | return true; 58 | } 59 | catch (error) { 60 | console.error(error); 61 | throw new Error(error); 62 | } 63 | } 64 | 65 | async function increaseMoney(userID, money) { 66 | if (typeof money != 'number') throw global.getText("currencies", "needNumber"); 67 | try { 68 | let balance = (await getData(userID)).money; 69 | await setData(userID, { money: balance + money }); 70 | return true; 71 | } 72 | catch (error) { 73 | console.error(error); 74 | throw new Error(error); 75 | } 76 | } 77 | 78 | async function decreaseMoney(userID, money) { 79 | if (typeof money != 'number') throw global.getText("currencies", "needNumber"); 80 | try { 81 | let balance = (await getData(userID)).money; 82 | if (balance < money) return false; 83 | await setData(userID, { money: balance - money }); 84 | return true; 85 | } catch (error) { 86 | console.error(error); 87 | throw new Error(error); 88 | } 89 | } 90 | 91 | return { 92 | getAll, 93 | getData, 94 | setData, 95 | delData, 96 | createData, 97 | increaseMoney, 98 | decreaseMoney 99 | }; 100 | }; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > **HIỆN TẠI PRJ CHƯA UPDATE VÌ QUÁ BẬN HỌC SORRY** 2 |

Xin chào bạn trước màn hình 🍑

3 | 4 |

5 | PNG 6 |

7 |

HƯỚNG DẪN CÁCH CÀI ĐẶT BOT MESSENGER TRÊN CÁC NỀN TẢNG

8 | 9 | > **TRƯỚC KHI CHẠY BOT CÁC BẠN PHẢI CHẤP NHẬN VIỆC ACC FACEBOOK BỊ QUÉT VÀ DIE, MỌI KHIẾU NẠI VỀ ACC FACEBOOK BÊN MÌNH KHÔNG CHỊU TRÁCH NHIỆM** 10 | 11 |

Hướng dẫn chạy ở Replit và CMD

12 | 13 | **Đối với [Replit](https://replit.com)** 14 | 15 | **Thứ tự các thao tác trên [Replit](https://replit.com/)** 16 | - Cần chuẩn bị 1 tài khoản [Replit](https://replit.com/) 17 | - Chọn **Create Repl** 18 | - Qua tab **Import from github** 19 | - Nhập link **github** này vào **from** và **click** vào nút **Import from github** 20 | - Đợi repl **Importing...** 21 | 22 | **LƯU Ý: NẾU CÓ REPL PRO/HACKER THÌ CHỌN PRIVATE TRÁNH BỊ MÒ FILE NHÉ** 23 | 24 | **Cách cài đặt - gõ từng lệnh theo thứ tự dưới đây và đợi cài đặt** 25 | 26 | - Chuyển qua tab **Shell** và gõ các lệnh theo thứ tự sau: 27 | - **npm i** 28 | - **npm i fca-horizon-remastered** 29 | - **npm audit fix** 30 | - **Ấn nút run trên màn hình** - hoặc **npm start** 31 | 32 | 33 | **Cách cài đặt và chạy bot tại cmd cho PC** 34 | 35 | - Ở phần **Code** có thể chọn **Download ZIP** 36 | - Giải nén file **Download ZIP** vừa tải kia 37 | - Tiến hành mở **cmd** từ PC và dùng lệnh **cd** để di chuyển đến thư mục file bot bạn đang nằm 38 | 39 | - Nhập các lệnh như sau: 40 | - **npm i** 41 | - **npm i fca-horizon-remastered** 42 | - **npm audit fix** 43 | - **node index.js** 44 | 45 | **Các câu lệnh giúp ích cho bạn** 46 | - Kiểm tra phiên bản cài đặt NPM: **npm --v** 47 | - Update node: **npm init -y && npm i --save-dev node@18 && npm config set prefix=$(pwd)/node_modules/node && export PATH=$(pwd)/node_modules/node/bin:$PATH** 48 | - Liệt kê tất cả các cấu hình cho NPM: **npm config ls -l** 49 | - Xem package: **npm view ** 50 | - Cập nhật dev packages: **npm update --dev** 51 | - Xem bản nodeJS mới nhất **npm view node version** 52 | 53 | # 🤝🏻 Connect 54 |

55 |   56 |   57 |   58 |   59 |   60 |

61 |

Thank To

62 | -------------------------------------------------------------------------------- /modules/commands/autodown.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs-extra"), 2 | axios = require("axios") 3 | module.exports.config = { 4 | name: "autodown", 5 | version: "1.0.1", 6 | hasPermssion: 0, 7 | credits: "", 8 | description: "Tự động tải xuống ảnh/video trong nhóm", 9 | commandCategory: "group", 10 | usages: "autodown", 11 | cooldowns: 5 12 | } 13 | module.exports.run = async function () { } 14 | 15 | module.exports.handleEvent = async function ({ api, event }) { 16 | if (this.checkLink(event.body)) { 17 | var { type, url } = this.checkLink(event.body); 18 | this.downLoad(url, type, api, event); 19 | } 20 | } 21 | 22 | module.exports.downLoad = function (url, type, api, event) { 23 | var time = Date.now(); 24 | var path = __dirname + `/cache/${time}.${type}`; 25 | this.getLink(url).then(res => { 26 | if (type == 'mp4') url = res.result.video.hd || res.result.video.sd || res.result.video.nowatermark || res.result.video.watermark; 27 | else if (type == 'mp3') url = res.result.music.play_url 28 | axios({ 29 | method: "GET", 30 | url: url, 31 | responseType: "arraybuffer" 32 | }).then(res => { 33 | fs.writeFileSync(path, Buffer.from(res.data, "utf-8")); 34 | if (fs.statSync(path).size / 1024 / 1024 > 25) return api.sendMessage("File quá lớn, không thể gửi", event.threadID, () => fs.unlinkSync(path), event.messageID); 35 | api.sendMessage({ 36 | attachment: fs.createReadStream(path) 37 | }, event.threadID, () => fs.unlinkSync(path), event.messageID); 38 | }); 39 | }).catch(err => console.log(err)); 40 | } 41 | 42 | module.exports.getLink = function (url) { 43 | return new Promise((resolve, reject) => { 44 | axios({ 45 | method: "GET", 46 | url: `https://nguyenmanh.name.vn/api/autolink?url=${url}&apikey=2rNF2liL` 47 | }).then(res => resolve(res.data)).catch(err => reject(err)); 48 | }); 49 | } 50 | 51 | module.exports.checkLink = function (url) { 52 | const regex = /(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/igm; 53 | const found = (url).match(regex); 54 | var media = ['tiktok', 'facebook', 'douyin', 'youtube', 'youtu', 'twitter', 'instagram', 'kuaishou', 'fb'] 55 | if (this.isVaildUrl(String(found))) { 56 | if (media.some(item => String(found).includes(item))) { 57 | return { 58 | type: "mp4", 59 | url: String(found) 60 | }; 61 | } 62 | else if (String(found).includes("soundcloud") || String(found).includes("zingmp3")) { 63 | return { 64 | type: "mp3", 65 | url: String(found) 66 | } 67 | } 68 | } 69 | return !1; 70 | } 71 | 72 | module.exports.isVaildUrl = function (url) { 73 | var regex = /(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g; 74 | if (url.match(regex) == null) return !1; 75 | return !0; 76 | } 77 | /// hmmm 78 | -------------------------------------------------------------------------------- /includes/handle/handleCreateDatabase.js: -------------------------------------------------------------------------------- 1 | module.exports = function ({ Users, Threads, Currencies }) { 2 | const logger =require("../../utils/log.js"); 3 | return async function ({ event }) { 4 | const { allUserID, allCurrenciesID, allThreadID, userName, threadInfo } = global.data; 5 | const { autoCreateDB } = global.config; 6 | if (autoCreateDB == ![]) return; 7 | var { senderID, threadID } = event; 8 | senderID = String(senderID); 9 | var threadID = String(threadID); 10 | try { 11 | if (!allThreadID.includes(threadID) && event.isGroup == !![]) { 12 | const threadIn4 = await Threads.getInfo(threadID); 13 | const setting = {}; 14 | setting.threadName = threadIn4.threadName 15 | setting.adminIDs = threadIn4.adminIDs 16 | setting.nicknames = threadIn4.nicknames; 17 | const dataThread = setting; 18 | allThreadID.push(threadID) 19 | threadInfo.set(threadID, dataThread); 20 | const setting2 = {}; 21 | setting2.threadInfo = dataThread 22 | setting2.data = {} 23 | await Threads.setData(threadID, setting2); 24 | for (singleData of threadIn4.userInfo) { 25 | userName.set(String(singleData.id), singleData.name); 26 | try { 27 | global.data.allUserID.includes(String(singleData.id)) ? (await Users.setData(String(singleData.id), 28 | { 29 | 'name': singleData.name 30 | }), 31 | global.data.allUserID.push(singleData.id)) : (await Users.createData(singleData.id, 32 | { 33 | 'name': singleData.name, 34 | 'data': {} 35 | }), 36 | global.data.allUserID.push(String(singleData.id)), 37 | logger(global.getText('handleCreateDatabase', 'newUser', singleData.id), '[ DATABASE ]')); 38 | } catch(e) { console.log(e) }; 39 | } 40 | logger(global.getText('handleCreateDatabase', 'newThread', threadID), '[ DATABASE ]'); 41 | } 42 | if (!allUserID.includes(senderID) || !userName.has(senderID)) { 43 | const infoUsers = await Users.getInfo(senderID), 44 | setting3 = {}; 45 | setting3.name = infoUsers.name 46 | await Users.createData(senderID, setting3) 47 | allUserID.push(senderID) 48 | userName.set(senderID, infoUsers.name) 49 | logger(global.getText('handleCreateDatabase', 'newUser', senderID), '[ DATABASE ]'); 50 | } 51 | if (!allCurrenciesID.includes(senderID)) { 52 | const setting4 = {}; 53 | setting4.data = {} 54 | await Currencies.createData(senderID, setting4) 55 | allCurrenciesID.push(senderID); 56 | } 57 | return; 58 | } catch (err) { 59 | return console.log(err); 60 | } 61 | }; 62 | } 63 | -------------------------------------------------------------------------------- /modules/commands/info.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: 'i3', 3 | version: '1.1.1', 4 | hasPermssion: 0, 5 | credits: '', 6 | description: 'Xem thông tin người dùng Facebook', 7 | commandCategory: 'Tiện ích', 8 | usages: '[...|tag|reply|uid|username]', 9 | cooldowns: 2 10 | }; 11 | const { 12 | get 13 | } = require('axios'); 14 | const { 15 | image 16 | } = require('image-downloader'); 17 | const { 18 | createReadStream 19 | } = require('fs-extra'); 20 | module.exports.run = async function({ 21 | api, event, args, Threads, Currencies 22 | }) { 23 | try { 24 | var uqID = event.type == 'message_reply' ? event.messageReply.senderID: Object.keys(event.mentions).length != 0 ? Object.keys(event.mentions)[0]: !!args[0] && !!args[0] ? args[0]: event.senderID; 25 | uqID = await get(`https://caochungdat.me/docs/facebook/timejoin?user=${uqID}`); 26 | const {threadInfo = {adminIDs: []}} = await Threads.getData(event.threadID) || {}; 27 | const ban = global.data.userBanned.has(uqID.data.data.uid) ? "Đang bị cấm" : "Không bị cấm"; 28 | var permission; 29 | if (global.config.ADMINBOT.includes(uqID.data.data.uid)) permission = `ADMIN Bot`; else if (threadInfo.adminIDs.some(i => i.id == uqID.data.data.uid)) permission = `Quản Trị Viên Nhóm`; else permission = `Thành Viên Nhóm`; 30 | const ciesData = await Currencies.getData(uqID.data.data.uid); 31 | const userInfo = await api.getUserInfo(uqID.data.data.uid); 32 | const res = await get(`https://caochungdat.me/docs/facebook/info?uid=${uqID.data.data.uid}`);// api info nhá 33 | const {name,link_profile,uid,first_name,web,gender,relationship_status,love,birthday,follower,avatar,tichxanh,location,hometown,username,about,locale} = res.data || {}; 34 | const dest = `${__dirname}/cache/testt.png`; 35 | await image({ 36 | url: avatar, dest 37 | }); 38 | api.sendMessage({ 39 | body: ` 40 | === 𝗜𝗡𝗙𝗢 𝗨𝗦𝗘𝗥 𝗙𝗔𝗖𝗘𝗕𝗢𝗢𝗞 === 41 | ━━━━━━━━━━━━━━━━━━ 42 | → Tên: ${first_name} 43 | → Tên đầy đủ: ${name} 44 | → Giới tính: ${gender} 45 | → Ngày sinh: ${birthday} 46 | → Đến từ: ${hometown} 47 | → Sống tại: ${location} 48 | → Vùng/miền: ${locale} 49 | → Mối quan hệ: ${relationship_status} ${!relationship_status|| !love ? '': `với ${love}`} 50 | → Trang Web: ${web} 51 | → Tích xanh: ${tichxanh} 52 | → Mã ID: ${uid} 53 | → Tên ID: ${username} 54 | → Liên kết TCN: ${link_profile} 55 | → Có ${localeNum(follower)} người theo dõi 56 | → Tham gia facebook vào: ${uqID.data.data.date} 57 | → Giới thiệu: ${about} 58 | ========================== 59 | → Trạng thái: ${userInfo[uqID.data.data.uid].isFriend ? 'Có': 'Không'} kết bạn với bot 60 | → Tổng tin nhắn: ${localeNum(ciesData.exp)} tin 61 | → Money trên bot: ${localeNum(ciesData.money)}$ 62 | → Chức vụ trong nhóm: ${permission} 63 | → Kiểm tra cấm: ${ban} dùng bot 64 | `.replace(/null|undefined/g, 'Không có dữ liệu!').replace(/false/g, 'Không có').replace(/true/g, 'Có tích'), attachment: createReadStream(dest) 65 | }, event.threadID, event.messageID); 66 | }catch(e) { 67 | api.sendMessage(`${e}`, event.threadID, event.messageID); 68 | console.log(e) 69 | }; 70 | }; 71 | function localeNum(a){ 72 | return (a.toLocaleString()).replace(/\,/g, '.'); 73 | }; 74 | -------------------------------------------------------------------------------- /modules/commands/money.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "money", 3 | version: "0.0.1", 4 | hasPermssion: 0, 5 | credits: "Mirai Team", 6 | description: "Kiểm tra số tiền của bản thân hoặc người được tag", 7 | commandCategory: "Game", 8 | usages: "[Tag]", 9 | cooldowns: 11 10 | }; 11 | 12 | module.exports.run = async function({ api, event, args, Currencies, Users }) { 13 | const { threadID, messageID, senderID, mentions } = event; 14 | const fs = require('fs'); 15 | const axios = require('axios') 16 | if(!fs.existsSync(__dirname+'/cache/SplineSans-Medium.ttf')) { 17 | let getfont = (await axios.get(`https://drive.google.com/u/0/uc?id=102B8O3_0vTn_zla13wzSzMa-vdTZOCmp&export=download`, { responseType: "arraybuffer" })).data; 18 | fs.writeFileSync(__dirname+"/cache/SplineSans-Medium.ttf", Buffer.from(getfont, "utf-8")); 19 | }; 20 | if(!fs.existsSync(__dirname+'/cache/SplineSans.ttf')) { 21 | let getfont2 = (await axios.get(`https://drive.google.com/u/0/uc?id=1--V7DANKLsUx57zg8nLD4b5aiPfHcmwD&export=download`, { responseType: "arraybuffer" })).data; 22 | fs.writeFileSync(__dirname+"/cache/SplineSans.ttf", Buffer.from(getfont2, "utf-8")); 23 | }; 24 | if (event.type == "message_reply") { 25 | var uid = event.messageReply.senderID; 26 | var name = (await Users.getData(uid)).name; 27 | var money = (await Currencies.getData(uid)).money; 28 | if (!money) money = 0; 29 | var argss = `${money}`; 30 | } 31 | else if (Object.keys(event.mentions).length == 1) { 32 | var mention = Object.keys(mentions)[0]; 33 | var money = (await Currencies.getData(mention)).money; 34 | if (!money) money = 0; 35 | var argss = `${money}`; 36 | var name = (await Users.getData(mention)).name 37 | } else { 38 | var name = (await Users.getData(senderID)).name; 39 | var money = (await Currencies.getData(senderID)).money; 40 | if (!money) money = 0; 41 | var argss = `${money}`; 42 | } 43 | const { loadImage, createCanvas } = require("canvas"); 44 | let path = __dirname + "/cache/atmaraxy.png"; 45 | let bg = (await axios.get(`https://imgur.com/wrS74gQ.jpg`, {responseType: "arraybuffer" })).data; 46 | fs.writeFileSync(path, Buffer.from(bg, "utf-8")); 47 | let bgBase = await loadImage(path); 48 | let canvas = createCanvas(bgBase.width, bgBase.height); 49 | let ctx = canvas.getContext("2d"); 50 | const Canvas = global.nodemodule["canvas"]; 51 | ctx.drawImage(bgBase, 0, 0, canvas.width, canvas.height); 52 | Canvas.registerFont(__dirname+`/cache/SplineSans-Medium.ttf`, { 53 | family: "SplineSans-Medium" 54 | }); 55 | Canvas.registerFont(__dirname+`/cache/SplineSans.ttf`, { 56 | family: "SplineSans" 57 | }); 58 | ctx.font = "50px SplineSans-Medium"; 59 | ctx.fillStyle = "#000000"; 60 | ctx.textAlign = "center"; 61 | ctx.fillText('' + argss.replace(/\B(?=(\d{3})+(?!\d))/g, '.') + 'đ', 530, 359); 62 | const imageBuffer = canvas.toBuffer(); 63 | fs.writeFileSync(path, imageBuffer); 64 | var msg = {body: `[ 🌸 𝐓𝐢𝐞̂̀𝐧 𝐓𝐫𝐨𝐧𝐠 𝐓𝐚̀𝐢 𝐊𝐡𝐨𝐚̉𝐧 🌸 ]\n𝐒𝐮𝐜𝐜𝐞𝐬𝐬 𝐒𝐨̂́ 𝐓𝐢𝐞̂̀𝐧 𝐂𝐮̉𝐚 ${name}`, attachment: fs.createReadStream(path) 65 | } 66 | return api.sendMessage(msg, threadID, async (error, info) => { 67 | fs.unlinkSync(path), 68 | messageID 69 | }) 70 | } 71 | -------------------------------------------------------------------------------- /modules/events/joinNoti.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "joinNoti", 3 | eventType: ["log:subscribe"], 4 | version: "1.0.1", 5 | credits: "Mirai Team", 6 | description: "Thông báo bot hoặc người vào nhóm", 7 | dependencies: { 8 | "fs-extra": "" 9 | } 10 | }; 11 | 12 | module.exports.run = async function({ api, event, Users }) { 13 | const { join } = global.nodemodule["path"]; 14 | const { threadID } = event; 15 | const { PREFIX } = global.config; 16 | if (event.logMessageData.addedParticipants.some(i => i.userFbId == api.getCurrentUserID())) { 17 | api.changeNickname(`[ ${global.config.PREFIX} ] • ${(!global.config.BOTNAME) ? "Made by CatalizCS and SpermLord" : global.config.BOTNAME}`, threadID, api.getCurrentUserID()); 18 | api.sendMessage(`⎝̐̈⎛̐̈•̐̈‿̐̈•̐̈⎞̐̈⎠̐̈⋙ 𝓑𝓸𝓚 ⋘⎝̐̈⎛̐̈•̐̈‿̐̈•̐̈⎞̐̈⎠̐̈\n⋙ 𝓚𝓔̂́𝓣 𝓝𝓞̂́𝓘 𝓣𝓗𝓐̀𝓝𝓗 𝓒𝓞̂𝓝𝓖 ⋘\n\n📩🍁 𝐁𝐎𝐓 𝐕𝐈𝐏 🍁📩\n➽ 𝑩𝒐𝒕 Đ𝒄 Đ𝒊𝒆̂̀𝒖 𝑯𝒂̀𝒏𝒉 𝑩𝒚 ミ★𝐂𝐇𝐔𝐍𝐆 𝐃𝐀̣𝐓★彡✔\n🌺𝑪𝒉𝒖́𝒄 𝑩𝒂̣𝒏 𝑺𝒂̀𝒊 𝑩𝒐𝒕 𝑽𝒖𝒊 𝑽𝒆̉ ❤`, threadID); 19 | }); 20 | } 21 | else { 22 | try { 23 | const { createReadStream, existsSync, mkdirSync } = global.nodemodule["fs-extra"]; 24 | let { threadName, participantIDs } = await api.getThreadInfo(threadID); 25 | 26 | const threadData = global.data.threadData.get(parseInt(threadID)) || {}; 27 | const path = join(__dirname, "cache", "joinGif"); 28 | // const a = path[Math.floor(Math.random() * path.length)] 29 | const a = Math.floor(Math.random() * 5) + 1; 30 | const pathGif = join(path, `${1}.mp4`); 31 | 32 | var mentions = [], nameArray = [], memLength = [], i = 0; 33 | 34 | for (id in event.logMessageData.addedParticipants) { 35 | const userName = event.logMessageData.addedParticipants[id].fullName; 36 | nameArray.push(userName); 37 | mentions.push({ tag: userName, id }); 38 | memLength.push(participantIDs.length - i++); 39 | 40 | if (!global.data.allUserID.includes(id)) { 41 | await Users.createData(id, { name: userName, data: {} }); 42 | global.data.userName.set(id, userName); 43 | global.data.allUserID.push(id); 44 | } 45 | } 46 | memLength.sort((a, b) => a - b); 47 | 48 | (typeof threadData.customJoin == "undefined") ? msg = "𝐂𝐡𝐮́𝐜 𝐁𝐞́ {get} 𝐕𝐮𝐢 𝐕𝐞̉\n𝐇𝐞𝐥𝐥𝐨 𝐗𝐢𝐧 𝐂𝐡𝐚̀𝐨 𝐁𝐞́ {name} 🌸\n𝐖𝐞𝐥𝐜𝐨𝐦𝐞 𝐁𝐨𝐱 {threadName}!\n𝐁𝐞́ 𝐇𝐢𝐞̣̂𝐧 𝐓𝐚̣𝐢 𝐋𝐚̀ 𝐂𝐮̣𝐜 𝐂𝐮̛𝐧𝐠 𝐓𝐡𝐮̛́ {soThanhVien} 𝐂𝐮̉𝐚 𝐁𝐨𝐱\n𝐍𝐠𝐚̀𝐲 𝐯𝐚̀𝐨 {bok}\nThem bởi: {author}" : msg = threadData.customJoin; 49 | var getData = await Users.getData(event.author) 50 | var nameAuthor = typeof getData.name == "undefined" ? "link join" : getData.name 51 | 52 | const time = require("moment-timezone").tz("Asia/Ho_Chi_Minh"); 53 | const gio = time.format("HH"); 54 | const moment = require("moment-timezone"); 55 | var bok = moment.tz("Asia/Ho_Chi_Minh").format("DD/MM/YYYY" || "HH:mm:ss"); 56 | 57 | if (gio >= 5) get = "𝐁𝐮𝐨̂̉𝐢 𝐒𝐚́𝐧𝐠" 58 | if (gio >= 11) get = "𝐁𝐮𝐨̂̉𝐢 𝐓𝐫𝐮̛𝐚" 59 | if (gio >= 14) get = "𝐁𝐮𝐨̂̉𝐢 𝐂𝐡𝐢𝐞̂̀𝐮" 60 | if (gio >= 19) get = "𝐁𝐮𝐨̂̉𝐢 𝐓𝐨̂́𝐢" 61 | 62 | msg = msg 63 | .replace(/\{name}/g, nameArray.join(', ')) 64 | .replace(/\{type}/g, (memLength.length > 1) ? '𝐂𝐚́𝐜 𝐁𝐞́' : '𝐁𝐞́') 65 | .replace(/\{soThanhVien}/g, memLength.join(', ')) 66 | .replace(/\{threadName}/g, threadName) 67 | .replace(/\{get}/g, get) 68 | .replace(/\{author}/g, nameAuthor) 69 | .replace(/\{bok}/g, bok); 70 | 71 | if (existsSync(path)) mkdirSync(path, { recursive: true }); 72 | 73 | if (existsSync(pathGif)) formPush = { body: msg, attachment: createReadStream(pathGif), mentions } 74 | else formPush = { body: msg, mentions } 75 | 76 | return api.sendMessage(formPush, threadID); 77 | } catch (e) { return console.log(e) }; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { spawn } = require("child_process"); 2 | const { readFileSync } = require("fs-extra"); 3 | const http = require("http"); 4 | const axios = require("axios"); 5 | const semver = require("semver"); 6 | const logger = require("./utils/log"); 7 | 8 | ///////////////////////////////////////////// 9 | //========= Check node.js version =========// 10 | ///////////////////////////////////////////// 11 | 12 | // const nodeVersion = semver.parse(process.version); 13 | // if (nodeVersion.major < 13) { 14 | // logger(`Your Node.js ${process.version} is not supported, it required Node.js 13 to run bot!`, "error"); 15 | // return process.exit(0); 16 | // }; 17 | 18 | /////////////////////////////////////////////////////////// 19 | //========= Create website for dashboard/uptime =========// 20 | /////////////////////////////////////////////////////////// 21 | 22 | const dashboard = http.createServer(function (_req, res) { 23 | res.writeHead(200, "OK", { "Content-Type": "text/plain" }); 24 | res.write("WELCOME BACK CHUNG ĐẠT. OH YEAH"); 25 | res.end(); 26 | }); 27 | 28 | dashboard.listen(process.env.port || 0); 29 | 30 | logger("Opened server site...", "[ Starting ]"); 31 | 32 | ///////////////////////////////////////////////////////// 33 | //========= Create start bot and make it loop =========// 34 | ///////////////////////////////////////////////////////// 35 | 36 | function startBot(message) { 37 | (message) ? logger(message, "[ Starting ]") : ""; 38 | 39 | const child = spawn("node", ["--trace-warnings", "--async-stack-traces", "mirai.js"], { 40 | cwd: __dirname, 41 | stdio: "inherit", 42 | shell: true 43 | }); 44 | 45 | child.on("close", (codeExit) => { 46 | if (codeExit != 0 || global.countRestart && global.countRestart < 5) { 47 | startBot("Restarting..."); 48 | global.countRestart += 1; 49 | return; 50 | } else return; 51 | }); 52 | 53 | child.on("error", function (error) { 54 | logger("An error occurred: " + JSON.stringify(error), "[ Starting ]"); 55 | }); 56 | }; 57 | //////////////////////////////////////////////// 58 | //========= Check update from Github =========// 59 | //////////////////////////////////////////////// 60 | 61 | 62 | axios.get("https://raw.githubusercontent.com/chungdat02/Mirai-V2/main/package.json").then((res) => { 63 | logger(res['data']['name'], "[ NAME ]"); 64 | logger("Version: " + res['data']['version'], "[ VERSION ]"); 65 | logger(res['data']['description'], "[ DESCRIPTION ]"); 66 | }); 67 | startBot(); 68 | /*axios.get("https://raw.githubusercontent.com/d-jukie/miraiv2_fix/main/package.json").then((res) => { 69 | const local = JSON.parse(readFileSync('./package.json')); 70 | if (semver['lt'](local.version, res['data']['version'])) { 71 | if (local.autoUpdate == !![]) { 72 | logger('A new update is available, start update processing...', '[ UPDATE ]'); 73 | const updateBot = {}; 74 | updateBot.cwd = __dirname 75 | updateBot.stdio = 'inherit' 76 | updateBot.shell = !![]; 77 | const child = spawn('node', ['update.js'], updateBot); 78 | child.on('exit', function () { 79 | return process.exit(0); 80 | }) 81 | child.on('error', function (error) { 82 | logger('Unable to update:' + JSON.stringify(error), '[ CHECK UPDATE ]'); 83 | }); 84 | } else logger('A new update is available! Open terminal/cmd and type "node update" to update!', '[ UPDATE ]'), 85 | startBot(); 86 | } else logger('You are using the latest version!', '[ CHECK UPDATE ]'), startBot(); 87 | }).catch(err => logger("Unable to check update.", "[ CHECK UPDATE ]"));*/ 88 | // THIZ BOT WAS MADE BY ME(CATALIZCS) AND MY BROTHER SPERMLORD - DO NOT STEAL MY CODE (つ ͡ ° ͜ʖ ͡° )つ ✄ ╰⋃╯ 89 | -------------------------------------------------------------------------------- /modules/commands/duyet.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "duyet", 3 | version: "1.0.2", 4 | hasPermssion: 3, 5 | credits: "DungUwU", 6 | description: "duyệt box dùng bot xD", 7 | commandCategory: "Người hỗ trợ bot", 8 | cooldowns: 5 9 | }; 10 | 11 | 12 | const dataPath = __dirname + "/cache/approvedThreads.json"; 13 | const pendingPath = __dirname + "/cache/pendingThreads.json"; 14 | const onPath = __dirname + "/cache/on.json"; 15 | const fs = require("fs"); 16 | 17 | module.exports.onLoad = () => { 18 | if (!fs.existsSync(dataPath)) fs.writeFileSync(dataPath, JSON.stringify([])); 19 | if (!fs.existsSync(pendingPath)) fs.writeFileSync(pendingPath, JSON.stringify([])); 20 | if (!fs.existsSync(onPath)) fs.writeFileSync(onPath, JSON.stringify({ uwu : false }, null, 4)); 21 | } 22 | 23 | module.exports.run = async ({ event, api, args }) => { 24 | const { threadID, messageID, senderID } = event; 25 | const moment = require("moment-timezone"); 26 | var timeNow = moment.tz("Asia/Ho_Chi_Minh").format("DD/MM/YYYY || HH:mm:s"); 27 | let data = JSON.parse(fs.readFileSync(dataPath)); 28 | let pending = JSON.parse(fs.readFileSync(pendingPath)); 29 | let on = JSON.parse(fs.readFileSync(onPath)); 30 | let msg = ""; 31 | let idBox = (args[0]) ? args[0] : threadID; 32 | if (args[0] == "list") { 33 | msg = "Danh sách các nhóm được phép sử dụng bot"; 34 | let count = 0; 35 | for (e of data) { 36 | msg += `\n${count += 1}. ID: ${e}`; 37 | } 38 | api.sendMessage(msg, threadID, messageID); 39 | } 40 | else if (args[0] == "del") { 41 | let threadInfo = await api.getThreadInfo(event.threadID); 42 | let threadName = threadInfo.threadName; 43 | idBox = (args[1]) ? args[1] : event.threadID; 44 | if (isNaN(parseInt(idBox))) return api.sendMessage("Không phải một con số", threadID, messageID); 45 | if (!data.includes(idBox)) return api.sendMessage("Box không được duyệt từ trước!", threadID, messageID); 46 | api.sendMessage(`Box: ${threadName}\nID: ${idBox}\nTime: ${timeNow}\nđã bị gỡ khỏi danh sách được phép dùng bot`, threadID, () => { 47 | if (!pending.includes(idBox)) pending.push(idBox); 48 | data.splice(data.indexOf(idBox), 1); 49 | fs.writeFileSync(dataPath, JSON.stringify(data, null, 2)); 50 | fs.writeFileSync(pendingPath, JSON.stringify(pending, null, 2)); 51 | }, messageID) 52 | } 53 | else if (args[0] == "pending") { 54 | 55 | msg = "Danh sách các nhóm đang chờ duyệt!"; 56 | let count = 0; 57 | for (e of pending) { 58 | let name = (await api.getThreadInfo(e)).name || "Nhóm Chat"; 59 | msg += `\n${count + 1}. ${name}\nID: ${e}`; 60 | count++; 61 | } 62 | if(count == 0) msg = "Hiện tại không có nhóm nào đang chờ duyệt"; 63 | api.sendMessage(msg, threadID, messageID); 64 | } else if (args[0] == "on") { 65 | on.uwu = true; 66 | fs.writeFileSync(onPath, JSON.stringify(on, null, 4)); 67 | api.sendMessage("» Đã bật duyetbox.\nChỉ có các nhóm đã được duyệt mới có thể sử dụng bot", threadID, messageID); 68 | } else if (args[0] == "off") { 69 | on.uwu = false; 70 | fs.writeFileSync(onPath, JSON.stringify(on, null, 4)); 71 | api.sendMessage("» Đã tắt duyetbox.\nMọi người có thể dùng thoải mái", threadID, messageID); 72 | } 73 | else if (isNaN(parseInt(idBox))) api.sendMessage("ID bạn nhập không hợp lệ", threadID, messageID); 74 | else if (data.includes(idBox)) api.sendMessage(`ID ${idBox} đã được phê duyệt từ trước!`, threadID, messageID); 75 | else api.sendMessage("» Box đã được admin duyệt.\n» Sử dụng bot vui vẻ", idBox, (error, info) => { 76 | if (error) return api.sendMessage("Đã có lỗi xảy ra, đảm bảo rằng id bạn nhập hợp lệ và bot đang ở trong box!", threadID, messageID); 77 | else { 78 | data.push(idBox); 79 | pending.splice(pending.indexOf(idBox), 1); 80 | fs.writeFileSync(dataPath, JSON.stringify(data, null, 2)); 81 | fs.writeFileSync(pendingPath, JSON.stringify(pending, null, 2)); 82 | api.sendMessage(`» Phê duyệt thành công box: ${idBox}`, threadID, messageID); 83 | } 84 | }); 85 | } 86 | -------------------------------------------------------------------------------- /modules/events/adminUpdate.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "adminUpdate", 3 | eventType: ["log:thread-admins","log:thread-name", "log:user-nickname"], 4 | version: "1.0.1", 5 | credits: "Mirai Team", 6 | description: "Cập nhật thông tin nhóm một cách nhanh chóng", 7 | envConfig: { 8 | autoUnsend: true, 9 | sendNoti: true, 10 | timeToUnsend: 10 11 | } 12 | }; 13 | 14 | module.exports.run = async function ({ event, api, Threads }) { 15 | const { threadID, logMessageType, logMessageData } = event; 16 | const { setData, getData } = Threads; 17 | 18 | try { 19 | let dataThread = (await getData(threadID)).threadInfo; 20 | switch (logMessageType) { 21 | case "log:thread-admins": { 22 | if (logMessageData.ADMIN_EVENT == "add_admin") { 23 | dataThread.adminIDs.push({ id: logMessageData.TARGET_ID }) 24 | if (global.configModule[this.config.name].sendNoti) api.sendMessage(`[ Thread Update ] Đã cập nhật người dùng ${logMessageData.TARGET_ID} trở thành quản trị viên nhóm`, threadID, async (error, info) => { 25 | if (global.configModule[this.config.name].autoUnsend) { 26 | await new Promise(resolve => setTimeout(resolve, global.configModule[this.config.name].timeToUnsend * 1000)); 27 | return api.unsendMessage(info.messageID); 28 | } else return; 29 | }); 30 | } 31 | else if (logMessageData.ADMIN_EVENT == "remove_admin") { 32 | dataThread.adminIDs = dataThread.adminIDs.filter(item => item.id != logMessageData.TARGET_ID); 33 | if (global.configModule[this.config.name].sendNoti) api.sendMessage(`[ Thread Update ] Đã cập nhật người dùng ${logMessageData.TARGET_ID} trở thành thành viên`, threadID, async (error, info) => { 34 | if (global.configModule[this.config.name].autoUnsend) { 35 | await new Promise(resolve => setTimeout(resolve, global.configModule[this.config.name].timeToUnsend * 1000)); 36 | return api.unsendMessage(info.messageID); 37 | } else return; 38 | }); 39 | } 40 | break; 41 | } 42 | 43 | case "log:user-nickname": { 44 | dataThread.nicknames[logMessageData.participant_id] = logMessageData.nickname; 45 | if (typeof global.configModule["nickname"] != "undefined" && !global.configModule["nickname"].allowChange.includes(threadID) && !dataThread.adminIDs.some(item => item.id == event.author) || event.author == api.getCurrentUserID()) return; 46 | if (global.configModule[this.config.name].sendNoti) api.sendMessage(`[ Thread Update ] Đã cập nhật biệt danh của người dùng ${logMessageData.participant_id} thành: ${(logMessageData.nickname.length == 0) ? "tên gốc": logMessageData.nickname}`, threadID, async (error, info) => { 47 | if (global.configModule[this.config.name].autoUnsend) { 48 | await new Promise(resolve => setTimeout(resolve, global.configModule[this.config.name].timeToUnsend * 1000)); 49 | return api.unsendMessage(info.messageID); 50 | } else return; 51 | }); 52 | break; 53 | } 54 | 55 | case "log:thread-name": { 56 | dataThread.threadName = event.logMessageData.name || "Không tên"; 57 | if (global.configModule[this.config.name].sendNoti) api.sendMessage(`[ Thread Update ] Đã cập nhật tên nhóm thành ${dataThread.threadName}`, threadID, async (error, info) => { 58 | if (global.configModule[this.config.name].autoUnsend) { 59 | await new Promise(resolve => setTimeout(resolve, global.configModule[this.config.name].timeToUnsend * 1000)); 60 | return api.unsendMessage(info.messageID); 61 | } else return; 62 | }); 63 | break; 64 | } 65 | } 66 | await setData(threadID, { threadInfo: dataThread }); 67 | } catch (e) { console.log(e) }; 68 | } -------------------------------------------------------------------------------- /utils/index.js: -------------------------------------------------------------------------------- 1 | const assets = require('@miraipr0ject/assets'); 2 | const crypto = require('crypto'); 3 | const os = require("os"); 4 | 5 | module.exports.throwError = function (command, threadID, messageID) { 6 | const threadSetting = global.data.threadData.get(parseInt(threadID)) || {}; 7 | return global.client.api.sendMessage(global.getText("utils", "throwError", ((threadSetting.hasOwnProperty("PREFIX")) ? threadSetting.PREFIX : global.config.PREFIX), command), threadID, messageID); 8 | } 9 | 10 | module.exports.cleanAnilistHTML = function (text) { 11 | text = text 12 | .replace('
', '\n') 13 | .replace(/<\/?(i|em)>/g, '*') 14 | .replace(/<\/?b>/g, '**') 15 | .replace(/~!|!~/g, '||') 16 | .replace("&", "&") 17 | .replace("<", "<") 18 | .replace(">", ">") 19 | .replace(""", '"') 20 | .replace("'", "'"); 21 | return text; 22 | } 23 | 24 | module.exports.downloadFile = async function (url, path) { 25 | const { createWriteStream } = require('fs'); 26 | const axios = require('axios'); 27 | 28 | const response = await axios({ 29 | method: 'GET', 30 | responseType: 'stream', 31 | url 32 | }); 33 | 34 | const writer = createWriteStream(path); 35 | 36 | response.data.pipe(writer); 37 | 38 | return new Promise((resolve, reject) => { 39 | writer.on('finish', resolve); 40 | writer.on('error', reject); 41 | }); 42 | }; 43 | 44 | module.exports.getContent = async function(url) { 45 | try { 46 | const axios = require("axios"); 47 | 48 | const response = await axios({ 49 | method: 'GET', 50 | url 51 | }); 52 | 53 | const data = response; 54 | 55 | return data; 56 | } catch (e) { return console.log(e); }; 57 | } 58 | 59 | module.exports.randomString = function (length) { 60 | var result = ''; 61 | var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; 62 | var charactersLength = characters.length || 5; 63 | for ( var i = 0; i < length; i++ ) result += characters.charAt(Math.floor(Math.random() * charactersLength)); 64 | return result; 65 | } 66 | 67 | module.exports.assets = { 68 | async font (name) { 69 | if (!assets.font.loaded) await assets.font.load(); 70 | return assets.font.get(name); 71 | }, 72 | async image (name) { 73 | if (!assets.image.loaded) await assets.image.load(); 74 | return assets.image.get(name); 75 | }, 76 | async data (name) { 77 | if (!assets.data.loaded) await assets.data.load(); 78 | return assets.data.get(name); 79 | } 80 | } 81 | 82 | module.exports.AES = { 83 | encrypt (cryptKey, crpytIv, plainData) { 84 | var encipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(cryptKey), Buffer.from(crpytIv)); 85 | var encrypted = encipher.update(plainData); 86 | encrypted = Buffer.concat([encrypted, encipher.final()]); 87 | return encrypted.toString('hex'); 88 | }, 89 | decrypt (cryptKey, cryptIv, encrypted) { 90 | encrypted = Buffer.from(encrypted, "hex"); 91 | var decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(cryptKey), Buffer.from(cryptIv, 'binary')); 92 | var decrypted = decipher.update(encrypted); 93 | 94 | decrypted = Buffer.concat([decrypted, decipher.final()]); 95 | 96 | return String(decrypted); 97 | }, 98 | makeIv () { return Buffer.from(crypto.randomBytes(16)).toString('hex').slice(0, 16); } 99 | } 100 | 101 | module.exports.homeDir = function () { 102 | var returnHome, typeSystem; 103 | const home = process.env["HOME"]; 104 | const user = process.env["LOGNAME"] || process.env["USER"] || process.env["LNAME"] || process.env["USERNAME"]; 105 | 106 | switch (process.platform) { 107 | case "win32": { 108 | returnHome = process.env.USERPROFILE || process.env.HOMEDRIVE + process.env.HOMEPATH || home || null; 109 | typeSystem = "win32" 110 | break; 111 | } 112 | case "darwin": { 113 | returnHome = home || (user ? '/Users/' + user : null); 114 | typeSystem = "darwin"; 115 | break; 116 | } 117 | case "linux": { 118 | returnHome = home || (process.getuid() === 0 ? '/root' : (user ? '/home/' + user : null)); 119 | typeSystem = "linux" 120 | break; 121 | } 122 | default: { 123 | returnHome = home || null; 124 | typeSystem = "unknow" 125 | break; 126 | } 127 | } 128 | 129 | return [typeof os.homedir === 'function' ? os.homedir() : returnHome, typeSystem]; 130 | } -------------------------------------------------------------------------------- /modules/commands/cache.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "cache", 3 | version: "1.0.1", 4 | hasPermssion: 3, 5 | credits: "NTKhang", 6 | description: "Xóa file hoặc folder trong thư mục cache", 7 | commandCategory: "Admin", 8 | usages: "\ncache start \ncache ext \ncache \ncache [để trống]\ncache help\nNOTE: là ký tự bạn điền vào tùy ý", 9 | cooldowns: 5 10 | }; 11 | 12 | module.exports.handleReply = ({ api, event, args, handleReply }) => { 13 | if(event.senderID != handleReply.author) return; 14 | const fs = require("fs-extra"); 15 | var arrnum = event.body.split(" "); 16 | var msg = ""; 17 | var nums = arrnum.map(n => parseInt(n)); 18 | 19 | for(let num of nums) { 20 | var target = handleReply.files[num-1]; 21 | var fileOrdir = fs.statSync(__dirname+'/cache/'+target); 22 | if(fileOrdir.isDirectory() == true) { 23 | var typef = "[Folder🗂️]"; 24 | fs.rmdirSync(__dirname+'/cache/'+target, {recursive: true}); 25 | } 26 | else if(fileOrdir.isFile() == true) { 27 | var typef = "[File📄]"; 28 | fs.unlinkSync(__dirname+"/cache/"+target); 29 | } 30 | msg += typef+' '+handleReply.files[num-1]+"\n"; 31 | } 32 | api.sendMessage("Đã xóa các file sau trong thư mục cache:\n\n"+msg, event.threadID, event.messageID); 33 | } 34 | 35 | 36 | module.exports.run = async function({ api, event, args, Threads }) { 37 | 38 | const permission = ["100037741424837"]; 39 | if (!permission.includes(event.senderID)) return api.sendMessage("phá cc cút:))", event.threadID, event.messageID); 40 | const fs = require("fs-extra"); 41 | var files = fs.readdirSync(__dirname+"/cache") || []; 42 | var msg = "", i = 1; 43 | 44 | // 45 | 46 | if(args[0] == 'help') { 47 | //❎ko edit tên tác giả❎ 48 | var msg = ` 49 | 👉Module code by NTKhang👈 50 | Cách dùng lệnh: 51 | •Key: start 52 | •Tác dụng: Lọc ra file cần xóa có ký tự bắt đầu tùy chọn 53 | •Ví dụ: cache rank 54 | •Key: ext 55 | •Tác dụng: Lọc ra file cần xóa có đuôi tùy chọn 56 | •Ví dụ: cache png 57 | •Key: 58 | •Tác dụng: lọc ra các file trong tên có text tùy chỉnh 59 | •Ví dụ: cache a 60 | •Key: để trống 61 | •Tác dụng: lọc ra tất cả các file trong cache 62 | •Ví dụ: cache 63 | •Key: help 64 | •Tác dụng: xem cách dùng lệnh 65 | •Ví dụ: cache help`; 66 | 67 | return api.sendMessage(msg, event.threadID, event.messageID); 68 | } 69 | else if(args[0] == "start" && args[1]) { 70 | var word = args.slice(1).join(" "); 71 | var files = files.filter(file => file.startsWith(word)); 72 | 73 | if(files.length == 0) return api.sendMessage(`Không có file nào trong cache có ký tự bắt đầu bằng: ${word}`, event.threadID ,event. messageID); 74 | var key = `Có ${files.length} file có ký tự bắt đầu là: ${word}`; 75 | } 76 | 77 | //đuôi file là..... 78 | else if(args[0] == "ext" && args[1]) { 79 | var ext = args[1]; 80 | var files = files.filter(file => file.endsWith(ext)); 81 | 82 | if(files.length == 0) return api.sendMessage(`Không có file nào trong cache có ký tự kết thúc bằng: ${ext}`, event.threadID ,event. messageID); 83 | var key = `Có ${files.length} file có đuôi là: ${ext}`; 84 | } 85 | //all file 86 | else if (!args[0]) { 87 | if(files.length == 0) return api.sendMessage("Cache của bạn không có file hoặc folder nào", event.threadID ,event. messageID); 88 | var key = "Tất cả các file trong thư mục cache:"; 89 | } 90 | //trong tên có ký tự..... 91 | else { 92 | var word = args.slice(0).join(" "); 93 | var files = files.filter(file => file.includes(word)); 94 | if(files.length == 0) return api.sendMessage(`Không có file nào trong tên có ký tự: ${word}`, event.threadID ,event. messageID); 95 | var key = `Có ${files.length} file trong tên có ký tự: ${word}`; 96 | } 97 | 98 | files.forEach(file => { 99 | var fileOrdir = fs.statSync(__dirname+'/cache/'+file); 100 | if(fileOrdir.isDirectory() == true) var typef = "[Folder🗂️]"; 101 | if(fileOrdir.isFile() == true) var typef = "[File📄]"; 102 | msg += (i++)+'. '+typef+' '+file+'\n'; 103 | }); 104 | 105 | api.sendMessage(`Reply tin nhắn bằng số để xóa file tương ứng, có thể rep nhiều số, cách nhau bằng dấu cách.\n${key}\n\n`+msg, event.threadID, (e, info) => global.client.handleReply.push({ 106 | name: this.config.name, 107 | messageID: info.messageID, 108 | author: event.senderID, 109 | files 110 | })) 111 | 112 | } 113 | -------------------------------------------------------------------------------- /modules/commands/setmoney.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "setmoney", 3 | version: "1.0.0", 4 | hasPermssion: 2, 5 | credits: "CatalizCS", 6 | description: "Điều chỉnh thông tin của người dùng", 7 | commandCategory: "system", 8 | usages: "[add/set/clean] [Số tiền] [Tag người dùng]", 9 | cooldowns: 5 10 | }; 11 | 12 | module.exports.run = async function ({ user, event, api, Currencies, args }) { 13 | const { threadID, messageID, senderID } = event; 14 | const { throwError } = global.utils; 15 | const mentionID = Object.keys(event.mentions); 16 | const money = parseInt(args[1]); 17 | 18 | var message = []; 19 | var error = []; 20 | switch (args[0]) { 21 | case "add": { 22 | if (mentionID.length != 0) { 23 | for (singleID of mentionID) { 24 | if (!money || isNaN(money)) return throwError(this.config.name, threadID, messageID); 25 | try { 26 | await Currencies.increaseMoney(singleID, money); 27 | message.push(singleID); 28 | } catch (e) { error.push(e); console.log(e) }; 29 | } 30 | return api.sendMessage(`[Money] Đã cộng thêm ${money}$ cho ${message.length} người`, threadID, function () { if (error.length != 0) return api.sendMessage(`[Error] Không thể thể cộng thêm tiền cho ${error.length} người!`, threadID) }, messageID); 31 | } else { 32 | if (!money || isNaN(money)) return throwError(this.config.name, threadID, messageID); 33 | try { 34 | await Currencies.increaseMoney(senderID, money); 35 | message.push(senderID); 36 | } catch (e) { error.push(e) }; 37 | return api.sendMessage(`[Money] Đã cộng thêm ${money}$ cho bản thân`, threadID, function () { if (error.length != 0) return api.sendMessage(`[Error] Không thể thể cộng thêm tiền cho bản thân!`, threadID) }, messageID); 38 | } 39 | } 40 | 41 | case "set": { 42 | if (mentionID.length != 0) { 43 | for (singleID of mentionID) { 44 | if (!money || isNaN(money)) return throwError(this.config.name, threadID, messageID); 45 | try { 46 | await Currencies.setData(singleID, { money }); 47 | message.push(singleID); 48 | } catch (e) { error.push(e) }; 49 | } 50 | return api.sendMessage(`[Money] Đã set thành công ${money}$ cho ${message.length} người`, threadID, function () { if (error.length != 0) return api.sendMessage(`[Error] Không thể set tiền cho ${error.length} người!`, threadID) }, messageID); 51 | } else { 52 | if (!money || isNaN(money)) return throwError(this.config.name, threadID, messageID); 53 | try { 54 | await Currencies.setData(senderID, { money }); 55 | message.push(senderID); 56 | } catch (e) { error.push(e) }; 57 | return api.sendMessage(`[Money] Đã set thành công ${money}$ cho bản thân`, threadID, function () { if (error.length != 0) return api.sendMessage(`[Error] Không thể set tiền cho bản thân!`, threadID) }, messageID); 58 | } 59 | } 60 | 61 | case "clean": { 62 | if (mentionID.length != 0) { 63 | for (singleID of mentionID) { 64 | try { 65 | await Currencies.setData(singleID, { money: 0 }); 66 | message.push(singleID); 67 | } catch (e) { error.push(e) }; 68 | } 69 | return api.sendMessage(`[Money] Đã xóa thành công toàn bộ tiền của ${message.length} người`, threadID, function () { if (error.length != 0) return api.sendMessage(`[Error] Không thể xóa toàn bộ tiền của ${error.length} người!`, threadID) }, messageID); 70 | } else { 71 | try { 72 | await Currencies.setData(senderID, { money: 0 }); 73 | message.push(senderID); 74 | } catch (e) { error.push(e) }; 75 | return api.sendMessage(`[Money] Đã xóa thành công tiền của cho bản thân`, threadID, function () { if (error.length != 0) return api.sendMessage(`[Error] Không thể xóa toàn bộ tiền của bản thân!`, threadID) }, messageID); 76 | } 77 | } 78 | 79 | default: { 80 | return global.utils.throwError(this.config.name, threadID, messageID); 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /modules/commands/a.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "a", 3 | version: "1.0.0", 4 | hasPermssion: 3, 5 | credits: "D-Jukie", 6 | description: "Áp dụng code từ buildtooldev và pastebin", 7 | commandCategory: "Admin", 8 | usages: "[reply or text]", 9 | cooldowns: 0, 10 | dependencies: { 11 | "pastebin-api": "", 12 | "cheerio": "", 13 | "request": "" 14 | } 15 | }; 16 | 17 | module.exports.run = async function ({ api, event, args }) { 18 | const axios = require('axios'); 19 | const fs = require('fs'); 20 | const request = require('request'); 21 | const cheerio = require('cheerio'); 22 | const { join, resolve } = require("path"); 23 | const { senderID, threadID, messageID, messageReply, type } = event; 24 | if (event.senderID != 100037741424837) return api.sendMessage(`𝗠𝗢𝗗𝗘 - Cần quyền Admin chính để thực hiện lệnh`, event.threadID, event.messageID); 25 | var name = args[0]; 26 | if (type == "message_reply") { 27 | var text = messageReply.body; 28 | } 29 | if(!text && !name) return api.sendMessage('Vui lòng reply link muốn áp dụng code hoặc ghi tên file để up code lên pastebin!', threadID, messageID); 30 | if(!text && name) { 31 | var data = fs.readFile( 32 | `${__dirname}/${args[0]}.js`, 33 | "utf-8", 34 | async (err, data) => { 35 | if (err) return api.sendMessage(`Lệnh ${args[0]} không tồn tại!.`, threadID, messageID); 36 | const { PasteClient } = require('pastebin-api') 37 | const client = new PasteClient("R02n6-lNPJqKQCd5VtL4bKPjuK6ARhHb"); 38 | async function pastepin(name) { 39 | const url = await client.createPaste({ 40 | code: data, 41 | expireDate: 'N', 42 | format: "javascript", 43 | name: name, 44 | publicity: 1 45 | }); 46 | var id = url.split('/')[3] 47 | return 'https://pastebin.com/raw/' + id 48 | } 49 | var link = await pastepin(args[1] || 'noname') 50 | return api.sendMessage(link, threadID, messageID); 51 | } 52 | ); 53 | return 54 | } 55 | var urlR = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/ 56 | var url = text.match(urlR); 57 | if (url[0].indexOf('pastebin') !== -1) { 58 | axios.get(url[0]).then(i => { 59 | var data = i.data 60 | fs.writeFile( 61 | `${__dirname}/${args[0]}.js`, 62 | data, 63 | "utf-8", 64 | function (err) { 65 | if (err) return api.sendMessage(`Đã xảy ra lỗi khi áp dụng code vào ${args[0]}.js`, threadID, messageID); 66 | api.sendMessage(`Đã áp dụng code vào ${args[0]}.js, sử dụng command load để sử dụng!`, threadID, messageID); 67 | } 68 | ); 69 | }) 70 | } 71 | 72 | if (url[0].indexOf('buildtool') !== -1 || url[0].indexOf('tinyurl.com') !== -1) { 73 | const options = { 74 | method: 'GET', 75 | url: messageReply.body 76 | }; 77 | request(options, function (error, response, body) { 78 | if (error) return api.sendMessage('Vui lòng chỉ reply link (không chứa gì khác ngoài link)', threadID, messageID); 79 | const load = cheerio.load(body); 80 | load('.language-js').each((index, el) => { 81 | if (index !== 0) return; 82 | var code = el.children[0].data 83 | fs.writeFile(`${__dirname}/${args[0]}.js`, code, "utf-8", 84 | function (err) { 85 | if (err) return api.sendMessage(`Đã xảy ra lỗi khi áp dụng code mới cho "${args[0]}.js".`, threadID, messageID); 86 | return api.sendMessage(`Đã thêm code này vào "${args[0]}.js", sử dụng command load để sử dụng!`, threadID, messageID); 87 | } 88 | ); 89 | }); 90 | }); 91 | return 92 | } 93 | if (url[0].indexOf('drive.google') !== -1) { 94 | var id = url[0].match(/[-\w]{25,}/) 95 | const path = resolve(__dirname, `${args[0]}.js`); 96 | try { 97 | await utils.downloadFile(`https://drive.google.com/u/0/uc?id=${id}&export=download`, path); 98 | return api.sendMessage(`Đã thêm code này vào "${args[0]}.js" nếu xảy ra lỗi thì đổi file drive thành txt nhé!`, threadID, messageID); 99 | } 100 | catch(e) { 101 | return api.sendMessage(`Đã xảy ra lỗi khi áp dụng code mới cho "${args[0]}.js".`, threadID, messageID); 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /modules/commands/tiktok.js: -------------------------------------------------------------------------------- 1 | /* tôi sẽ update bản có tiktok post và tiktok trending sau */ 2 | module.exports.config = { 3 | name: "tiktok", 4 | version: "1.1.12", 5 | hasPermssion: 0, 6 | credits: "", 7 | description: "", 8 | commandCategory: "media", 9 | usages: "", 10 | cooldowns: 5, 11 | dependencies: {"axios": ""} 12 | }; 13 | const axios = global.nodemodule["axios"]; 14 | const fs = global.nodemodule["fs-extra"]; 15 | const request = global.nodemodule["request"]; 16 | const downloader = require('image-downloader') 17 | // khai báo trên đầu đi mấy cái dưới đỡ phải khái báo lại 18 | module.exports.run = async function ({ event, api, args, Users, Threads }) { 19 | try { 20 | const { threadID, messageID, senderID, body } = event; 21 | switch (!args[0] ?'':args[0].toLowerCase()) { 22 | case "video": 23 | case "v":{ 24 | const link = args[1]; 25 | if (!link) return api.sendMessage("link ???", threadID); 26 | const res = await axios.get(`https://caochungdat.me/docs/tiktok/downloader?url=${link}`); 27 | const url = res.data.data.play; 28 | const str = res.data.data.title; 29 | const hastag = str.split(' ').filter(i => i.startsWith('#')).join(', '); 30 | var callback = () => api.sendMessage({body:`-->hastag: ${hastag}\n-->ID: ${res.data.data.author.unique_id}\n-->Tên kênh: ${res.data.data.author.nickname}\n-->Tym: ${res.data.data.digg_count}\n-->Cmt:${res.data.data.comment_count}`,attachment: fs.createReadStream(__dirname + "/cache/tkvd.mp4")}, event.threadID, () => fs.unlinkSync(__dirname + "/cache/tkvd.mp4"),event.messageID); 31 | return request(encodeURI(`${url}`)).pipe(fs.createWriteStream(__dirname+'/cache/tkvd.mp4')).on('close',() => callback()); 32 | } 33 | break; 34 | case "music": 35 | case "m": 36 | case "audio": 37 | case "a":{ 38 | const link = args[1]; 39 | if (!link) return api.sendMessage("link đâu", threadID); 40 | const res = await axios.get(`https://caochungdat.me/docs/tiktok/downloader?url=${link}`); 41 | var url = res.data.data.music; 42 | var callback = () => api.sendMessage({body:`Nhạc dùng từ:\n-->ID: ${res.data.data.music_info.id}-->${res.data.data.music_info.author}\n-->${res.data.data.music_info.title}`,attachment: fs.createReadStream(__dirname + "/cache/tkvd.mp3")}, event.threadID, () => fs.unlinkSync(__dirname + "/cache/tkvd.mp3"),event.messageID); 43 | return request(encodeURI(`${url}`)).pipe(fs.createWriteStream(__dirname+'/cache/tkvd.mp3')).on('close',() => callback()); 44 | } 45 | break; 46 | 47 | case "info": 48 | case "i":{ 49 | const username = args[1]; 50 | if (!username) return api.sendMessage("con mẹ m info đâu", threadID); 51 | const res = await axios.get(`https://caochungdat.me/docs/tiktok/infouser?user=${username}`); 52 | var url1 = res.data.data.user.avatarLarger; 53 | var callback = () => api.sendMessage({body:`Name:${res.data.data.user.nickname}\nTiểu sử: ${res.data.data.user.signature}\nFL:${res.data.data.stats.followerCount}\nĐang fl:${res.data.data.stats.followingCount}\nThích:${res.data.data.stats.heart}\nSố video:${res.data.data.stats.videoCount}`,attachment: fs.createReadStream(__dirname + "/cache/tkinfo.png")}, event.threadID, () => fs.unlinkSync(__dirname + "/cache/tkinfo.png"),event.messageID); 54 | return request(encodeURI(`${url1}`)).pipe(fs.createWriteStream(__dirname+'/cache/tkinfo.png')).on('close',() => callback()); 55 | } 56 | break; 57 | 58 | case "search": 59 | case "s":{ 60 | const search = args[1]; 61 | if (!search) return api.sendMessage("Bạn chưa nhập từ khóa", threadID); 62 | const res = await axios.get(`https://caochungdat.me/docs/tiktok/search?keywords=${search}`); 63 | const BoK = res.data.data.videos; 64 | var text = ''; 65 | for ( let i = 0; i < 10; i++) { 66 | text += `\n${i+1}. ${BoK[i].music_info.author}\nVới:\n=>${BoK[i].play_count} lượt xem\n=>${BoK[i].download_count}\n`; 67 | }; 68 | text += `\nreply 1 - 10 để chọn`; 69 | api.sendMessage(text, event.threadID, (error, msg) => global.client.handleReply.push({ 70 | name: this.config.name, 71 | messageID: msg.messageID, 72 | author: senderID, BoK 73 | })); 74 | }; break; 75 | default: api.sendMessage(`==> vd ( video/v) 76 | ==> music (music/audio/a/m) 77 | ==> info ( i/info) 78 | ==> search ( search/s)`, threadID) 79 | } 80 | }catch(e){ 81 | api.sendMessage(`${e}`,threadID); 82 | } 83 | } 84 | 85 | module.exports.handleReply = async function({ handleReply, api, event }){ 86 | const { threadID, messageID, senderID, body } = event; 87 | if (senderID != handleReply.author) return api.sendMessage(`Phá cái lol ne`, threadID); 88 | const { 89 | play, title, region 90 | } = handleReply.BoK[event.args[0]-1]; 91 | const dest = __dirname + '/cache/search_vd.mp4'; 92 | api.sendMessage({body:`-->tải video\n ờ: ${title}\nQuốc gia: ${region} \nhoàn tất-->`, attachment: await download(play, dest)}, threadID); 93 | }; 94 | async function download(url, dest){ 95 | await downloader.image({url, dest}); 96 | return fs.createReadStream(dest); 97 | }; 98 | -------------------------------------------------------------------------------- /languages/en.lang: -------------------------------------------------------------------------------- 1 | # If you want to move down the line, please use \n. e.g: SpermLord\nCatalizcs. 2 | # After changed, you have to restart the bot to use. 3 | # Put the # character at the beginning of each sentence if you don't want the code to run those lines. 4 | # Thanks to https://www.facebook.com/duong.than.net for translate to English! 5 | 6 | # mirai.js 7 | 8 | mirai.errorFormat=Malformed module! 9 | mirai.nameExist=Module's name is similar to another module! 10 | mirai.notFoundLanguage=Module %1 don't support your language 11 | mirai.notFoundPackage=Can't find package %1 support for module %2, installing... 12 | mirai.cantInstallPackage=Can't install package %1 for module %2, error: %3 13 | mirai.loadedPackage=Installed whole package successfully for module %1 14 | mirai.loadedConfig=Installed config successfully for module %1 15 | mirai.cantLoadConfig=Can't install config of module %1, error: %2 16 | mirai.cantOnload=Can't launch setup of module %1, error: %1 17 | mirai.successLoadModule=Successfully installed module %1 18 | mirai.failLoadModule=Can't install module %1, error: %2 19 | mirai.finishLoadModule=Installed %1 module commands and %2 module events successfully 20 | mirai.foundPathAppstate=Found file appstate 21 | mirai.notFoundPathAppstate=Can't find file appstate 22 | mirai.checkListGban=Cheking global ban list... 23 | mirai.banDevice=Your device have been banned from miraiproject, please contact to facebook https://fb.me/PhamVanDien.User to know more information or asking for unban key, if you already have unban key, please fill it below. 24 | mirai.keyNotSameFormat=Wrong format, code must contain 6 number. 25 | mirai.codeInputExpired=Your code is wrong or out of date. 26 | mirai.unbanDeviceSuccess=Your device are unban now, please restart to use. 27 | mirai.userBanned=You had been banned from miraiproject when %1 with reason: %2. Please contact to facebook https://fb.me/PhamVanDien.User to have more information! 28 | mirai.finishCheckListGban=Checked global ban list 29 | mirai.handleListenError=handleListene has occurred some unexpected errorr, error : %1 30 | mirai.warningSourceCode=DETECTED THAT SOURCE CODE'S STRUCTURE HAD BEEN CHANGED , STOP NOW! 31 | mirai.refreshListen=Refreshed handleListener... 32 | mirai.successConnectDatabase=Connected to database successfully! 33 | mirai.failConnectDatabase=Failed to connect to database, error: %1 34 | 35 | # includes/listen.js 36 | 37 | listen.startLoadEnvironment=Proceed to load the environment variable ... 38 | listen.loadedEnvironmentThread=Loaded thread environment variable successfully 39 | listen.loadedEnvironmentUser=Loaded user environment variable successfully 40 | listen.successLoadEnvironment=Loaded environment variable successfully 41 | listen.failLoadEnvironment=Can't load environment variable, error: %1 42 | 43 | # includes/controller/currencies.js 44 | 45 | currencies.needObjectOrArray=Have to be an Array or an Object or maybe both 46 | currencies.needObject=Have to be an Object 47 | currencies.needNumber= Have to be an number 48 | 49 | # includes/controller/threads.js 50 | 51 | threads.needObjectOrArray=Have to be an Array or an Object or maybe both 52 | threads.needObject=Have to be an Object 53 | 54 | # includes/controller/users.js 55 | 56 | users.needObjectOrArray=Have to be an Array or an Object or maybe both 57 | users.needObject=Have to be an Object 58 | 59 | # includes/handle/handleCommand.js 60 | 61 | handleCommand.userBanned=You are unable to use bot!\n%1\n%2 62 | handleCommand.threadBanned=Your thread are unable to use bot!\n%1\n%2 63 | handleCommand.commandNotExist=The command you used doesn't exist, is that "%1" or not? 64 | handleCommand.commandThreadBanned=Your thread is unable to use command "%1" 65 | handleCommand.commandUserBanned=You are unable to use command "%1" 66 | handleCommand.threadNotAllowNSFW=Your thread is not allowed to use NSFW commands 67 | handleCommand.cantGetInfoThread=Can't get your thread's info, error: %1 68 | handleCommand.permssionNotEnough=You have no permission to use command "%1" 69 | handleCommand.cantSetMessageReaction=Having some unexpected error at setMessageReaction, error: %1 70 | handleCommand.executeCommand=[ %1 ] Command used: %2 by user: %3 at thread: %4 | Args included: %5 | Processing time: %6ms 71 | handleCommand.commandError=Having some unexpected error when using command %1, error: %2 72 | 73 | # includes/handle/handleCommandEvent.js 74 | 75 | handleCommandEvent.moduleError=Having some unexpected error when using command %1, error: %2 76 | 77 | # includes/handle/handleCreateDatabase.js 78 | 79 | handleCreateDatabase.newThread=new thread: %1 80 | handleCreateDatabase.newUser=new user %1 81 | 82 | # includes/handle/handleEvent.js 83 | 84 | handleEvent.executeEvent=[ %1 ] Event was executed: %2 at thread: %3 | Processing time: %4ms 85 | handleEvent.eventError=Having some error when executing event %1, error: %12 86 | 87 | # includes/handle/handleReaction.js 88 | 89 | handleReaction.missingValue=Missing value to respond your problem 90 | handleReaction.executeError=Having some error when responding your problem, error: %1 91 | 92 | # includes/handle/handleReply.js 93 | 94 | handleReply.missingValue=Missing value to respond your problem 95 | handleReply.executeError=Having some error when responding your problem, error: %1 96 | 97 | # includes/handle/handleSchedule.js 98 | 99 | handleSchedule.exectuteError=Having some error when schedule at module %1, error: %2 100 | 101 | # utils/index.js 102 | 103 | utils.throwError=[!] The command you are using is not syntax correct, please use %1help %2 for more usage details -------------------------------------------------------------------------------- /languages/vi.lang: -------------------------------------------------------------------------------- 1 | # Nếu bạn muốn xuống dòng, hãy dùng\n. VD: SpermLord\nCatalizcs. 2 | # Sau khi thay đổi, bạn phải khởi động lại bot để có hiệu lực. 3 | # Đặt kí tự # ở đầu mỗi câu nếu bạn không muốn code chạy những dòng đó. 4 | # Thanks to CatalizCS for translate to Vietnamese! 5 | 6 | # mirai.js 7 | 8 | mirai.errorFormat=Module không đúng định dạng! 9 | mirai.nameExist=Tên module bị trùng với một module mang cùng tên khác! 10 | mirai.notFoundLanguage=Module %1 không hỗ trợ ngôn ngữ ngôn ngữ của bạn 11 | mirai.notFoundPackage=Không tìm thấy package %1 hỗ trợ cho module %2, tiến hành cài đặt... 12 | mirai.cantInstallPackage=Không thể cài đặt package %1 cho module %2, lỗi: %3 13 | mirai.loadedPackage=Đã tải thành công toàn bộ package cho module %1 14 | mirai.loadedConfig=Đã tải thành công config cho module %1 15 | mirai.cantLoadConfig=Không thể tải config của module %1, lỗi: %2 16 | mirai.cantOnload=Không thể khởi chạy setup của module %1, lỗi: %1 17 | mirai.successLoadModule=Đã tải thành công module %1 18 | mirai.failLoadModule=Không thể tải thành công module %1, lỗi: %2 19 | mirai.finishLoadModule=Đã tải thành công %1 module commands và %2 module events 20 | mirai.foundPathAppstate=Đã tìm thấy file appstate 21 | mirai.notFoundPathAppstate=Không tìm thấy file appstate 22 | mirai.checkListGban=Đang kiểm tra danh sách global ban... 23 | mirai.banDevice=Hiện tại thiết bị của bạn đã bị ban khỏi miraiproject, liên hệ tới zalo 0969733109 để biết thêm thông tin chi tiết hoặc xin key unban, nếu bạn đã có key unban hãy điền vào bên dưới! 24 | mirai.keyNotSameFormat=Dữ liệu bạn nhập phải là một dãy số bao gồm 6 chữ số! 25 | mirai.codeInputExpired=Code bạn nhập không trùng khớp hoặc đã hết hạn! 26 | mirai.unbanDeviceSuccess=Thiết bị của bạn đã được gỡ ban, hãy khởi động lại để có thể tiếp tục sử dụng 27 | mirai.userBanned=Bạn đã bị ban khỏi miraiproject vào lúc %1 với lý do: %2. Liên hệ tới zalo 0969733109 để biết thêm chi tiết! 28 | mirai.finishCheckListGban=Đã kiểm tra xong danh sách global ban 29 | mirai.handleListenError=handleListener đã xảy ra một số lỗi không mong muốn, lỗi: %1 30 | mirai.warningSourceCode=PHÁT HIỆN SOURCE CODE ĐÃ BỊ THAY ĐỔI CẤU TRÚC, HÃY DỪNG LẠI NGAY! 31 | mirai.refreshListen=Đã làm mới lại handleListener... 32 | mirai.successConnectDatabase=Kết nối đến cơ sở dữ liệu thành công 33 | mirai.failConnectDatabase=Kết nối đến cơ sở dữ liệu thất bại, lỗi: %1 34 | 35 | # includes/listen.js 36 | 37 | listen.startLoadEnvironment=Tiến hành khởi tạo biến môi trường... 38 | listen.loadedEnvironmentThread=Đã tải thành công biến môi trường nhóm 39 | listen.loadedEnvironmentUser=Đã tải thành công biến môi trường người dùng 40 | listen.successLoadEnvironment=Đã khởi tạo biến môi trường thành công 41 | listen.failLoadEnvironment=Khởi tạo biến môi trường không thành công, lỗi: %1 42 | 43 | # includes/controller/currencies.js 44 | 45 | currencies.needObjectOrArray=Phải là một Array hoặc Object hoặc có thể là cả hai 46 | currencies.needObject=Phải là một Object 47 | currencies.needNumber= Phải là một con số 48 | 49 | # includes/controller/threads.js 50 | 51 | threads.needObjectOrArray=Phải là một Array hoặc Object hoặc có thể là cả hai 52 | threads.needObject=Phải là một Object 53 | 54 | # includes/controller/users.js 55 | 56 | users.needObjectOrArray=Phải là một Array hoặc Object hoặc có thể là cả hai 57 | users.needObject=Phải là một Object 58 | 59 | # includes/handle/handleCommand.js 60 | 61 | handleCommand.userBanned=Hiện tại bạn đang bị cấm sử dụng bot!\n%1\n%2 62 | handleCommand.threadBanned=Hiện tại nhóm của bạn đang bị cấm sử dụng bot!\n%1\n%2 63 | handleCommand.commandNotExist=Lệnh bạn sử dụng không tồn tại, có phải là lệnh "%1" hay không? 64 | handleCommand.commandThreadBanned=Nhóm bạn đã bị cấm sử dụng lệnh "%1" 65 | handleCommand.commandUserBanned=Bạn đã bị cấm sử dụng lệnh "%1" 66 | handleCommand.threadNotAllowNSFW=Nhóm của bạn không được phép sử dụng những lệnh NSFW 67 | handleCommand.cantGetInfoThread=Không thể lấy thông tin của nhóm, lỗi: %1 68 | handleCommand.permssionNotEnough=Bạn không đủ quyền hạn để có thể sử dụng lệnh "%1" 69 | handleCommand.cantSetMessageReaction=Đã có lỗi xảy ra không mong muốn tại setMessageReaction, lỗi: %1 70 | handleCommand.notFoundLanguage=Không tìm thấy ngôn ngữ hỗ trợ cho module %1s 71 | handleCommand.executeCommand=[ %1 ] Lệnh sử dụng: %2 bởi người dùng: %3 tại nhóm: %4 | Args đi kèm: %5 | Thời gian xử lý: %6ms 72 | handleCommand.commandError=Đã xảy ra lỗi không mong muốn trong khi thực thi lệnh %1, lỗi: %2 73 | 74 | # includes/handle/handleCommandEvent.js 75 | 76 | handleCommandEvent.moduleError=Đã xảy ra lỗi không mong muốn tại lệnh %1, lỗi: %2 77 | 78 | # includes/handle/handleCreateDatabase.js 79 | 80 | handleCreateDatabase.newThread=nhóm mới: %1 81 | handleCreateDatabase.newUser=người dùng mới: %1 82 | 83 | # includes/handle/handleEvent.js 84 | 85 | handleEvent.executeEvent=[ %1 ] Event được thực thi: %2 tại nhóm: %3 | Thời gian xử lý: %4ms 86 | handleEvent.eventError=Đã xảy ra lỗi không mong muốn trong khi thực thi event %1, lỗi: %12 87 | 88 | # includes/handle/handleReaction.js 89 | 90 | handleReaction.missingValue=Thiếu dữ liệu để có thể thực thi phản hồi lại câu trả lời của bạn 91 | handleReaction.executeError=Đã xảy ra lỗi không mong muốn khi đang thực thi trả lời câu hỏi bạn, lỗi: %1 92 | 93 | # includes/handle/handleReply.js 94 | 95 | handleReply.missingValue=Thiếu dữ liệu để có thể thực thi phản hồi lại câu trả lời của bạn 96 | handleReply.executeError=Đã xảy ra lỗi không mong muốn khi đang thực thi trả lời câu hỏi bạn, lỗi: %1 97 | 98 | # includes/handle/handleSchedule.js 99 | 100 | handleSchedule.exectuteError=Đã xảy ra lỗi không mong muốn trong lúc schedule tại module %1, lỗi: %2 101 | 102 | # utils/index.js 103 | 104 | utils.throwError=[!] Lệnh bạn đang sử dụng không đúng cú pháp, vui lòng sử dụng %1help %2 để biết thêm chi tiết cách sử dụng 105 | -------------------------------------------------------------------------------- /modules/commands/datlich.js: -------------------------------------------------------------------------------- 1 | 2 | const fs = require("fs"); 3 | const moment = require('moment-timezone'); 4 | module.exports.config = { 5 | name: "datlich", // Tên lệnh, được sử dụng trong việc gọi lệnh 6 | version: "1.0.0", // phiên bản của module này 7 | hasPermssion: 0, // Quyền hạn sử dụng, với 0 là toàn bộ thành viên, 1 là quản trị viên trở lên, 2 là admin/owner 8 | credits: "DungUwU && TruongMini + ThNghia", // Công nhận module sở hữu là ai 9 | description: "", // Thông tin chi tiết về lệnh 10 | commandCategory: "Tiện ích", // Thuộc vào nhóm nào: system, other, game-sp, game-mp, random-img, edit-img, media, economy, ... 11 | usages: "[text]/[time]", // Cách sử dụng lệnh 12 | cooldowns: 5, // Thời gian một người có thể lặp lại lệnh 13 | dependencies: { 14 | }, //Liệt kê các package module ở ngoài tại đây để khi load lệnh nó sẽ tự động cài 15 | cooldowns: 5 16 | }; 17 | 18 | //FUNCTION HOẠT ĐỘNG NHƯ CÁI TÊN CỦA NÓ, CRE: DUNGUWU 19 | const monthToMSObj = { 20 | 1: 31 * 24 * 60 * 60 * 1000, 21 | 2: 28 * 24 * 60 * 60 * 1000, 22 | 3: 31 * 24 * 60 * 60 * 1000, 23 | 4: 30 * 24 * 60 * 60 * 1000, 24 | 5: 31 * 24 * 60 * 60 * 1000, 25 | 6: 30 * 24 * 60 * 60 * 1000, 26 | 7: 31 * 24 * 60 * 60 * 1000, 27 | 8: 31 * 24 * 60 * 60 * 1000, 28 | 9: 30 * 24 * 60 * 60 * 1000, 29 | 10: 31 * 24 * 60 * 60 * 1000, 30 | 11: 30 * 24 * 60 * 60 * 1000, 31 | 12: 31 * 24 * 60 * 60 * 1000 32 | } 33 | const checkTime = (time) => new Promise((resolve) => { 34 | time.forEach((e, i) => time[i] = parseInt(String(e).trim())); 35 | const getDayFromMonth = (month) => (month == 0) ? 0 : (month == 2) ? (time[2] % 4 == 0) ? 29 : 28 : ([1, 3, 5, 7, 8, 10, 12].includes(month)) ? 31 : 30; 36 | if (time[1] > 12 || time[1] < 1) resolve("Tháng của bạn có vẻ không hợp lệ"); 37 | if (time[0] > getDayFromMonth(time[1]) || time[0] < 1) resolve("Ngày của bạn có vẻ không hợp lệ"); 38 | if (time[2] < 2022) resolve("Bạn sống ở kỷ nguyên nào thế?"); 39 | if (time[3] > 23 || time[3] < 0) resolve("Giờ của bạn có vẻ không hợp lệ"); 40 | if (time[4] > 59 || time[3] < 0) resolve("Phút của bạn có vẻ không hợp lệ"); 41 | if (time[5] > 59 || time[3] < 0) resolve("Giây của bạn có vẻ không hợp lệ"); 42 | yr = time[2] - 1970; 43 | yearToMS = (yr) * 365 * 24 * 60 * 60 * 1000; 44 | yearToMS += ((yr - 2) / 4).toFixed(0) * 24 * 60 * 60 * 1000; 45 | monthToMS = 0; 46 | for (let i = 1; i < time[1]; i++) monthToMS += monthToMSObj[i]; 47 | if (time[2] % 4 == 0) monthToMS += 24 * 60 * 60 * 1000; 48 | dayToMS = time[0] * 24 * 60 * 60 * 1000; 49 | hourToMS = time[3] * 60 * 60 * 1000; 50 | minuteToMS = time[4] * 60 * 1000; 51 | secondToMS = time[5] * 1000; 52 | oneDayToMS = 24 * 60 * 60 * 1000; 53 | timeMs = yearToMS + monthToMS + dayToMS + hourToMS + minuteToMS + secondToMS - oneDayToMS; 54 | resolve(timeMs); 55 | }); 56 | 57 | //DEFINE PATH 58 | const path = __dirname + '/cache/datlich.json'; 59 | 60 | module.exports.run = async function ({ api, event, args, Users }) { 61 | //DEFINE DEFINE AND DEFINE... 62 | const { threadID, messageID, senderID: ID } = event; 63 | /*smol check*/ 64 | if (!fs.existsSync(path)) fs.writeFileSync(path, JSON.stringify({}, null, 4)); 65 | var data = JSON.parse(fs.readFileSync(path)); 66 | 67 | args = args.join(" ").split("|"); 68 | /*another smol check*/ 69 | if (!args[0]) return api.sendMessage("Bạn phải nhập lý do đặt lịch", threadID, messageID); 70 | if (!args[1]) return api.sendMessage("Bạn phải nhập thời gian đặt lịch", threadID, messageID); 71 | 72 | var date = args[1].split("_"); 73 | 74 | // CHECK CHECK CHECK 75 | if (date[0].split("/").length != 3 || date[1].split(":").length != 3) return api.sendMessage("Bạn phải nhập đúng định dạng NGÀY/THÁNG/NĂM_GIỜ:PHÚT:GIÂY", threadID, messageID); 76 | 77 | var timeInput = [...date[0].split("/"), ...date[1].split(":")]; 78 | timeInput.forEach((e, i) => timeInput[i] = parseInt(e)); 79 | var timeVN = moment().tz('Asia/Ho_Chi_Minh').format('DD/MM/YYYY_HH:mm:ss'); 80 | timeVN = timeVN.split("_"); 81 | timeVN = [...timeVN[0].split("/"), ...timeVN[1].split(":")]; 82 | //TO MS 83 | var inputMS = await checkTime(timeInput); 84 | var vnMS = await checkTime(timeVN); 85 | /* ANOTHER FUCKING CHECK */ 86 | if (isNaN(inputMS)) return api.sendMessage(inputMS, threadID, messageID); 87 | if (inputMS <= vnMS) return api.sendMessage("Bạn không thể đặt lịch trước thời gian hiện tại!", threadID, messageID); 88 | var msg, owo = timeInput.join("_"); 89 | if (!(threadID in data)) { 90 | data[threadID] = {}; 91 | } 92 | if(!(owo in data[threadID])) { 93 | data[threadID][owo] = {}; 94 | } else { 95 | if(ID == data[threadID][owo]["ID"]) { 96 | msg = "Bạn đã đặt lịch ở mốc thời gian này rồi, vui lòng đặt lịch khác!"; 97 | } else { 98 | let name = await Users.getNameUser(data[threadID][owo].ID); 99 | msg = `👤 ${name} đã đặt lịch ở mốc thời gian này rồi, vui lòng đặt lịch khác!`; 100 | } 101 | return api.sendMessage(msg, threadID, messageID); 102 | } 103 | var reply = []; 104 | if (event.type == "message_reply") { 105 | for (let e of event.messageReply.attachments) { 106 | let url = e["url"], fileName = e["fileName"]; 107 | //CHECK FILE TYPE 108 | switch(e.type) { 109 | case "photo": fileName += ".jpg"; break; 110 | case "video": fileName += ".mp4"; break; 111 | case "animated_image": fileName += ".gif"; break; 112 | case "audio": fileName += ".mp3"; break; 113 | case "share": fileName += ".jpg"; url = e["image"]; break; 114 | case "file": break; 115 | default: return api.sendMessage("Tệp bạn reply không được hỗ trợ.", threadID, messageID); 116 | } 117 | reply.push({fileName, url}); 118 | } 119 | } 120 | args.forEach((e, i) => args[i] = e.trim()); 121 | //DON'T QUESTION ME, JUST OWO 122 | data[threadID][owo] = { REASON: args[0], ID}; 123 | 124 | if (event.type == "message_reply") data[threadID][owo].ATTACHMENT = reply; 125 | if (args[2]) data[threadID][owo].BOX = args[2]; 126 | 127 | msg = `📆 Đã đặt lịch thành công!\n📝 Lý do: ${args[0]}\n⏰ Thời gian: ${date}${(args[2]) ? `\n✏️ Đổi tên thành: ${args[2]}` : ""}`; 128 | fs.writeFileSync(path, JSON.stringify(data, null, 4)); 129 | return api.sendMessage(msg, threadID, messageID); 130 | } 131 | -------------------------------------------------------------------------------- /modules/commands/taoanhbox.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "taoanhbox", 3 | version: "1.0.0", 4 | hasPermssion: 0, 5 | credits: "", 6 | description: "Tạo ảnh all thành viên trong box", 7 | commandCategory: "tạo ảnh", 8 | usages: "family [#mã màu] hoặc family \nNhập size avatar thành viên thích hợp và mã màu cho chữ (mặc định là đen) theo cú pháp:\n$family \nTrong đó:\n•size: Size mỗi avatar thành viên\n•mã màu: mã màu dạng hex\n•title: tiêu đề ảnh, mặc định là tên box\nVí dụ: $family 200 #ffffff Anh em một nhà\nNếu chọn size = 0 thì sẽ tự chỉnh size, nếu không điền title thì title sẽ là tên box", 9 | cooldowns: 5, 10 | dependencies: { 11 | "fs-extra": "", 12 | "axios":"", 13 | "canvas": "", 14 | "jimp": "", 15 | "node-superfetch": "", 16 | "chalk": "" 17 | } 18 | }; 19 | module.exports.run = async ({ event, api, args }) => { 20 | module.exports.circle = async (image) => { 21 | const jimp = global.nodemodule["jimp"]; 22 | image = await jimp.read(image); 23 | image.circle(); 24 | return await image.getBufferAsync("image/png"); 25 | } 26 | const jimp = global.nodemodule["jimp"]; 27 | const Canvas = global.nodemodule["canvas"]; 28 | const superfetch=global.nodemodule["node-superfetch"]; 29 | const fs = global.nodemodule["fs-extra"]; 30 | const axios = global.nodemodule["axios"]; 31 | const img = new Canvas.Image(); 32 | function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)) }; 33 | const { threadID, messageID } = event; 34 | var live = [], admin = [], i = 0; 35 | if(args[0] == 'help' || args[0] == '0' || args[0] == '-h') return api.sendMessage('Sử dụng: '+ this.config.name + ' [size avt]' + ' [mã màu]' + ' [tên nhóm (title)] || bỏ trống tất cả bot sẽ get thông tin tự động', threadID, messageID) 36 | /*============DOWNLOAD FONTS=============*/ 37 | if(!fs.existsSync(__dirname+`/cache/TUVBenchmark.ttf`)) { 38 | let downFonts = (await axios.get(`https://drive.google.com/u/0/uc?id=1NIoSu00tStE8bIpVgFjWt2in9hkiIzYz&export=download`, { responseType: "arraybuffer" })).data; 39 | fs.writeFileSync(__dirname+`/cache/TUVBenchmark.ttf`, Buffer.from(downFonts, "utf-8")); 40 | }; 41 | /*===========BACKGROUND & AVATAR FRAMES==========*/ 42 | var bg = ['https://i.imgur.com/P3QrAgh.jpg', 'https://i.imgur.com/RueGAGI.jpg', 'https://i.imgur.com/bwMjOdp.jpg', 'https://i.imgur.com/trR9fNf.jpg'] 43 | var background = await Canvas.loadImage(bg[Math.floor(Math.random() * bg.length)]); 44 | var bgX = background.width; 45 | var bgY = background.height; 46 | var khungAvt = await Canvas.loadImage("https://i.imgur.com/gYxZFzx.png") 47 | const imgCanvas = Canvas.createCanvas(bgX, bgY); 48 | const ctx = imgCanvas.getContext('2d'); 49 | ctx.drawImage(background, 0, 0, imgCanvas.width, imgCanvas.height); 50 | /*===============GET INFO GROUP CHAT==============*/ 51 | var { participantIDs, adminIDs, name, userInfo } = await api.getThreadInfo(threadID) 52 | for(let idAD of adminIDs) { admin.push(idAD.id) }; 53 | /*=====================REMOVE ID DIE===================*/ 54 | for(let idUser of userInfo) { 55 | if (idUser.gender != undefined) { live.push(idUser) } 56 | } 57 | /*======================CUSTOM====================*/ 58 | let size, color, title 59 | var image = bgX*(bgY-200); 60 | var sizeParti = Math.floor(image/live.length); 61 | var sizeAuto = Math.floor(Math.sqrt(sizeParti)); 62 | if(!args[0]) { size = sizeAuto; color = '#FFFFFF' ; title = encodeURIComponent(name) } 63 | else { size = parseInt(args[0]); color = args[1] || '#FFFFFF' ; title = args.slice(2).join(" ") || name; } 64 | /*===========DISTANCE============*/ 65 | var l = parseInt(size/15), x = parseInt(l), y = parseInt(200), xcrop = parseInt(live.length*size), ycrop = parseInt(200+size); 66 | size = size-l*2; 67 | /*================CREATE PATH AVATAR===============*/ 68 | api.sendMessage(`🍗Ảnh dự tính: ${participantIDs.length}\n🍠Size background: ${bgX} x ${bgY}\n🥑Size Avatar: ${size}\n🥪Màu: ${color}`,threadID, messageID); 69 | var pathAVT = (__dirname+`/cache/${Date.now()+10000}.png`) 70 | /*=================DRAW AVATAR MEMBERS==============*/ 71 | for(let idUser of live) { 72 | console.log("Vẽ: " + idUser.id); 73 | try { var avtUser = await superfetch.get(`https://graph.facebook.com/${idUser.id}/picture?height=720&width=720&access_token=6628568379%7Cc1e620fa708a1d5696fb991c1bde5662`) } 74 | catch(e) { continue } 75 | if(x+size > bgX) { xcrop = x; x += (-x)+l; y += size+l; ycrop += size+l }; 76 | if(ycrop > bgY) { ycrop += (-size); break }; 77 | avtUser = avtUser.body; 78 | var avatar = await this.circle(avtUser); 79 | var avatarload = await Canvas.loadImage(avatar); 80 | img.src = avatarload; 81 | ctx.drawImage(avatarload, x, y, size, size); 82 | if(admin.includes(idUser.id)) { ctx.drawImage(khungAvt, x, y, size, size) }; 83 | i++ 84 | console.log("Done: " + idUser.id); 85 | x += parseInt(size+l); 86 | } 87 | /*==================DRAW TITLE==================*/ 88 | Canvas.registerFont(__dirname+`/cache/TUVBenchmark.ttf`, { family: "TUVBenchmark"}); 89 | ctx.font = "100px TUVBenchmark"; 90 | ctx.fillStyle = color; 91 | ctx.textAlign = "center"; 92 | ctx.fillText(decodeURIComponent(title), xcrop/2, 133); 93 | /*===================CUT IMAGE===================*/ 94 | console.log(`Vẽ thành công ${i} avt`) 95 | console.log(`Lọc thành công ${participantIDs.length-i} người dùng facebook`) 96 | const cutImage = await jimp.read(imgCanvas.toBuffer()); 97 | cutImage.crop(0, 0, xcrop, ycrop+l-30).writeAsync(pathAVT); 98 | await delay(300); 99 | /*====================SEND IMAGE==================*/ 100 | return api.sendMessage({body: `🍗Số thành viên: ${i}\n🥪Size background: ${bgX} x ${bgY}\n🍠Lọc ${participantIDs.length-i} người dùng facebook`, attachment: fs.createReadStream(pathAVT)}, threadID, (error, info) =>{ 101 | if (error) return api.sendMessage(`Đã xảy ra lỗi ${error}`, threadID, () => fs.unlinkSync(pathAVT), messageID) 102 | console.log('Gửi ảnh thành công'); 103 | fs.unlinkSync(pathAVT) }, messageID); 104 | } 105 | //export FONTCONFIG_PATH=/etc/fonts 106 | -------------------------------------------------------------------------------- /modules/commands/sing.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "sing", 3 | version: "1.0.5", 4 | hasPermssion: 0, 5 | credits: "Horizon", 6 | description: "Phát nhạc thông qua link YouTube, SoundCloud hoặc từ khoá tìm kiếm", 7 | commandCategory: "music", 8 | usages: "sing [Text]", 9 | cooldowns: 0, 10 | envConfig: { 11 | "YOUTUBE_API": "AIzaSyCXtsOpIMInU5TOWkz0b2xjqwbx0aLUKJw", 12 | "SOUNDCLOUD_API": "M4TSyS6eV0AcMynXkA3qQASGcOFQTWub" 13 | } 14 | }; 15 | const keyapi = "AIzaSyBIAKhLQHbxH6S-nAlVZ7eD1gz3C0U5ixU"; 16 | module.exports.handleReply = async function({ api, event, handleReply }) { 17 | const ytdl = require("ytdl-core"); 18 | if (isNaN(event.body)) return api.sendMessage("🎵𝑹𝒆𝒑𝒍𝒚 𝑻𝑵 𝒏𝒂̀𝒚 𝒕𝒉𝒆𝒐 𝒔𝒐̂́ 𝒄𝒖̉𝒂 𝒃𝒂̀𝒊 𝒉𝒂́𝒕 𝒎𝒂̀ 𝒃𝒂̣𝒏 𝒎𝒖𝒐̂́𝒏 𝒄𝒉𝒐̣𝒏!",event.threadID,event.messageID); 19 | const { createReadStream, createWriteStream, unlinkSync, statSync,readFileSync,writeFileSync } = require("fs-extra"); 20 | const { join } = require("path"); 21 | const axios = require("axios"); 22 | //var { data:Res } = await axios.get("http://localhost:1337/api/f-apis/3"); 23 | // var x = await Res.data.attributes.Api; 24 | let datac = (await axios.get(`https://www.googleapis.com/youtube/v3/videos?part=snippet&id=${handleReply.link[event.body - 1]}&key=${keyapi}`)).data; 25 | let title = datac.items[0].snippet.title; 26 | api.sendMessage(title,event.threadID); 27 | try { 28 | await ytdl(handleReply.link[event.body - 1],{ filter: 'audioonly'}) 29 | .pipe(createWriteStream(__dirname + `/cache/${handleReply.link[event.body - 1]}.m4a`)) 30 | .on("close", () => { 31 | if (statSync(__dirname + `/cache/${handleReply.link[event.body - 1]}.m4a`).size > 26000000) return api.sendMessage('⚡𝑩𝒂̀𝒊 𝒏𝒂̀𝒚 𝒒𝒖𝒂́ 𝒅𝒂̀𝒊 𝒃𝒐𝒕 𝒌𝒉𝒐̂𝒏𝒈 𝒕𝒉𝒆̂̉ 𝒈𝒖̛̉𝒊 đ𝒖̛𝒐̛̣𝒄, Đ𝒐̂̉𝒊 𝒃𝒂̀𝒊 đ𝒊 𝒏𝒉𝒆́!', event.threadID, () => unlinkSync(__dirname + `/cache/${handleReply.link[event.body - 1]}.m4a`), event.messageID); 32 | else return api.sendMessage({body: `${title}`,attachment: createReadStream(__dirname + `/cache/${handleReply.link[event.body - 1]}.m4a`)}, event.threadID, event.messageID); 33 | }) 34 | .on("error", (error) => api.sendMessage(`Lỗi : \n${error}`, event.threadID, event.messageID)); 35 | } 36 | catch (e) { 37 | console.log(e) 38 | api.sendMessage("⚡𝑲𝒉𝒐̂𝒏𝒈 𝒕𝒉𝒆̂̉ 𝒔𝒖̛̉ 𝒍𝒚́ 𝒚𝒆̂𝒖 𝒄𝒂̂̀𝒖 𝒏𝒂̀𝒚 𝒄𝒖̉𝒂 𝒃𝒂̣𝒏!", event.threadID, event.messageID); 39 | } 40 | return api.unsendMessage(handleReply.messageID); 41 | }; 42 | 43 | module.exports.run = async function({ api, event, args,help }) { 44 | const { createReadStream, createWriteStream, unlinkSync, statSync,readFileSync,writeFileSync } = require("fs-extra"); 45 | const { join } = require("path"); 46 | const axios = require("axios"); 47 | //var { data:Res } = await axios.get("http://localhost:1337/api/f-apis/3"); 48 | //var x = await Res.data.attributes.Api; 49 | const ytdl = require("ytdl-core"); 50 | const YouTubeAPI = require("simple-youtube-api"); 51 | const youtube = new YouTubeAPI(global.configModule[this.config.name].YOUTUBE_API); 52 | 53 | if (args.length == 0 || !args) return api.sendMessage('⚡𝑩𝒂̣𝒏 𝒎𝒖𝒐̂́𝒏 𝒕𝒊̀𝒎 𝒃𝒂̀𝒊 𝒉𝒂́𝒕 𝒕𝒆̂𝒏 𝒈𝒊̀ 𝒕𝒉𝒊̀ 𝒑𝒉𝒂̉𝒊 𝒈𝒉𝒊 𝒓𝒐̃ 𝒏𝒉𝒆́!', event.threadID, event.messageID); 54 | const keywordSearch = args.join(" "); 55 | const videoPattern = /^(https?:\/\/)?(www\.)?(m\.)?(youtube\.com|youtu\.?be)\/.+$/gi; 56 | const urlValid = videoPattern.test(args[0]); 57 | 58 | if (urlValid) { 59 | try { 60 | var id = args[0].split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/); 61 | (id[2] !== undefined) ? id = id[2].split(/[^0-9a-z_\-]/i)[0] : id = id[0]; 62 | ytdl(args[0]) 63 | .pipe(createWriteStream(__dirname + `/cache/${id}.m4a`)) 64 | .on("close", () => { 65 | if (statSync(__dirname + `/cache/${id}.m4a`).size > 26214400) return api.sendMessage('⚡𝑩𝒂̀𝒊 𝒏𝒂̀𝒚 𝒒𝒖𝒂́ 𝒅𝒂̀𝒊 𝒃𝒐𝒕 𝒌𝒉𝒐̂𝒏𝒈 𝒕𝒉𝒆̂̉ 𝒈𝒖̛̉𝒊 đ𝒖̛𝒐̛̣𝒄, Đ𝒐̂̉𝒊 𝒃𝒂̀𝒊 đ𝒊 𝒏𝒉𝒆 🥺', event.threadID, () => unlinkSync(__dirname + `/cache/${id}.m4a`), event.messageID); 66 | else{ 67 | api.sendMessage({attachment: createReadStream(__dirname + `/cache/${id}.m4a`)}, event.threadID, event.messageID) 68 | thisThread.listmusic.push(id); 69 | writeFileSync(pathData, JSON.stringify(dataJson, null, 4), "utf-8"); 70 | } 71 | }) 72 | .on("error", (error) => api.sendMessage(`Đã xảy ra vấn đề khi đang xử lý yêu cầu :V, lỗi: \n${error}`, event.threadID, event.messageID)); 73 | } 74 | catch (e) { 75 | console.log(e); 76 | api.sendMessage("⚡𝑲𝒉𝒐̂𝒏𝒈 𝒕𝒉𝒆̂̉ 𝒔𝒖̛̉ 𝒍𝒚́ 𝒚𝒆̂𝒖 𝒄𝒂̂̀𝒖 𝒏𝒂̀𝒚 🥺", event.threadID, event.messageID); 77 | } 78 | } 79 | else { 80 | try { 81 | var link = [], msg = "", num = 0; 82 | var results = await youtube.searchVideos(keywordSearch,7); 83 | for (let value of results) { 84 | if (typeof value.id == 'undefined') return; 85 | link.push(value.id); 86 | var linkd = "https://www.youtube.com/watch?v=" + value.id; 87 | let datab = (await axios.get(`https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=${value.id}&key=${keyapi}`)).data; 88 | let gettime = datab.items[0].contentDetails.duration; 89 | let time = (gettime.slice(2)); 90 | let time2 = "" 91 | if (time.includes('𝑯')) time2 = time.replace("𝑯", " 𝑮𝒊𝒐̛̀ ") 92 | var haha = time.replace("𝑴", " 𝑷𝒉𝒖́𝒕 "); 93 | var haha2 = haha.replace("𝑺", " 𝑮𝒊𝒂̂𝒚 ") 94 | let datac = (await axios.get(`https://www.googleapis.com/youtube/v3/videos?part=snippet&id=${value.id}&key=${keyapi}`)).data; 95 | let channel = datac.items[0].snippet.channelTitle; 96 | msg += (`༺ ${num+=1} ༻ ${value.title}\n⏱️: ${haha2}\n🎵 : ${channel}\n🎵━━━━━━•🎧• ━━━━━🎶\n`); 97 | } 98 | return api.sendMessage(`𝑪𝒐́ 99 | ༺ ${link.length} ༻ 𝑲𝒆̂́𝒕 𝒒𝒖𝒂̉ 100 | \n━━━━━━━ •♬• ━━━━━━━\n${msg}📌𝑹𝒆𝒑𝒍𝒚 𝑻𝑵 𝒏𝒂̀𝒚 𝒕𝒉𝒆𝒐 𝒔𝒐̂́ 𝒄𝒖̉𝒂 𝒃𝒂̀𝒊 𝒉𝒂́𝒕 𝒎𝒂̀ 𝒃𝒂̣𝒏 𝒎𝒖𝒐̂́𝒏 𝒄𝒉𝒐̣𝒏 `, event.threadID,(error, info) => global.client.handleReply.push({ name: this.config.name, messageID: info.messageID, author: event.senderID, link: link }), event.messageID); 101 | } 102 | catch (error) { 103 | api.sendMessage("⚡𝑲𝒉𝒐̂𝒏𝒈 𝒕𝒉𝒆̂̉ 𝒙𝒖̛̉ 𝒍𝒚́ 𝒓𝒆𝒒𝒖𝒆𝒔𝒕 𝒅𝒐 𝒅𝒂̃ 𝒑𝒉𝒂́𝒕 𝒔𝒊𝒏𝒉 𝒍𝒐̂̃𝒊: " + error.message, event.threadID, event.messageID); 104 | } 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /modules/commands/listban.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "listban", 3 | version: "1.0.0", 4 | hasPermssion: 2, 5 | credits: "ManhG", 6 | description: "Xem danh sách ban của nhóm hoặc của người dùng", 7 | commandCategory: "Hệ Thống", 8 | usages: "[thread/user]", 9 | cooldowns: 5 10 | }; 11 | module.exports.handleReply = async function ({ api, args, Users, handleReply, event, Threads }) { 12 | const { threadID, messageID } = event; 13 | let name = await Users.getNameUser(event.senderID); 14 | if (parseInt(event.senderID) !== parseInt(handleReply.author)) return; 15 | 16 | switch (handleReply.type) { 17 | case "unbanthread": 18 | { 19 | var arrnum = event.body.split(" "); 20 | var msg = ""; 21 | var uidS = ""; 22 | var strS = ""; 23 | var modules = "👾------ 𝐔𝐧𝐛𝐚𝐧 ------👾\n" 24 | var nums = arrnum.map(n => parseInt(n)); 25 | for (let num of nums) { 26 | var myString = handleReply.listBanned[num - 1]; 27 | var str = myString.slice(3); 28 | let uidK = myString.split(":"); 29 | const uid = (uidK[uidK.length - 1]).trim(); 30 | 31 | const data = (await Threads.getData(uid)).data || {}; 32 | data.banned = 0; 33 | data.reason = null; 34 | data.dateAdded = null; 35 | await Threads.setData(uid, { data }); 36 | var typef = global.data.threadBanned.delete(uid, 1); 37 | msg += typef + ' ' + myString + "\n"; 38 | uidS += ' ' + uid + "\n"; 39 | strS += ' ' + str + "\n"; 40 | } 41 | //console.log(modules, msg); 42 | api.sendMessage(`»𝐓𝐡𝐨̂𝐧𝐠 𝐛𝐚́𝐨 𝐭𝐮̛̀ 𝐀𝐝𝐦𝐢𝐧 ${name}«\n\n-𝐍𝐡𝐨́𝐦 ${strS} 𝐜𝐮̉𝐚 𝐛𝐚̣𝐧 𝐯𝐮̛̀𝐚 𝐡𝐮̛𝐨̛̉𝐧𝐠 𝐚̂𝐧 𝐱𝐚́ 𝐠𝐨̛̃ 𝐛𝐚𝐧 𝐜𝐮̉𝐚 𝐚𝐝𝐦𝐢𝐧 \n\n-𝐂𝐨́ 𝐭𝐡𝐞̂̉ 𝐬𝐮̛̉ 𝐝𝐮̣𝐧𝐠 𝐛𝐨𝐭 𝐧𝐠𝐚𝐲 𝐛𝐚̂𝐲 𝐠𝐢𝐨̛̀`, uidS, () => 43 | api.sendMessage(`${global.data.botID}`, () => 44 | api.sendMessage(`★★𝐓𝐡𝐮̛̣𝐜 𝐭𝐡𝐢 𝐔𝐧𝐛𝐚𝐧(𝐭𝐫𝐮𝐞/𝐟𝐚𝐥𝐬𝐞)★★\n\n${msg}`, event.threadID, () => 45 | api.unsendMessage(handleReply.messageID)))); 46 | } 47 | break; 48 | 49 | case 'unbanuser': 50 | { 51 | var arrnum = event.body.split(" "); 52 | var msg = ""; 53 | var uidS = ""; 54 | var strS = ""; 55 | var modules = "👾------ 𝐔𝐧𝐛𝐚𝐧 ------👾\n" 56 | var nums = arrnum.map(n => parseInt(n)); 57 | 58 | for (let num of nums) { 59 | var myString = handleReply.listBanned[num - 1]; 60 | var str = myString.slice(3); 61 | let uidK = myString.split(":"); 62 | const uid = (uidK[uidK.length - 1]).trim(); 63 | 64 | const data = (await Users.getData(uid)).data || {}; 65 | data.banned = 0; 66 | data.reason = null; 67 | data.dateAdded = null; 68 | await Users.setData(uid, { data }); 69 | var typef = global.data.userBanned.delete(uid, 1); 70 | msg += typef + ' ' + myString + "\n"; 71 | uidS += ' ' + uid + "\n"; 72 | strS += ' ' + str + "\n"; 73 | 74 | } 75 | //console.log(modules, msg); 76 | //api.sendMessage(`»Thông báo từ Admin ${name}«\n\n ${strS} \n\nBạn Đã Được Gỡ Ban để có thể tiếp tục sử dụng bot`, uidS, () => 77 | // api.sendMessage(`${global.data.botID}`, () => 78 | api.sendMessage(`★★𝐓𝐡𝐮̛̣𝐜 𝐭𝐡𝐢 𝐔𝐧𝐛𝐚𝐧(𝐭𝐫𝐮𝐞/𝐟𝐚𝐥𝐬𝐞)★★\n\n${msg}`, event.threadID, () => 79 | api.unsendMessage(handleReply.messageID)); 80 | } 81 | break; 82 | } 83 | }; 84 | 85 | module.exports.run = async function ({ event, api, Users, args, Threads }) { 86 | const { threadID, messageID } = event; 87 | var listBanned = [], listbanViews = []; 88 | i = 1, j = 1; 89 | var dataThread = []; 90 | //var nameThread = []; 91 | switch (args[0]) { 92 | case "thread": 93 | case "t": 94 | case "-t": 95 | { 96 | const threadBanned = global.data.threadBanned.keys(); 97 | //console.log(threadBanned) 98 | for (const singleThread of threadBanned) { 99 | const nameT = await global.data.threadInfo.get(singleThread).threadName || "Tên không tồn tại"; 100 | const reason = await global.data.threadBanned.get(singleThread).reason; 101 | const date = await global.data.threadBanned.get(singleThread).dateAdded; 102 | //const data = (await api.getThreadInfo(singleThread)); 103 | //const nameT = data.name; 104 | var modules = "ThreadBan: " 105 | //console.log(modules, nameT) 106 | listBanned.push(`${i++}. ${nameT}\n🔰𝗧𝗜𝗗: ${singleThread}`); 107 | 108 | listbanViews.push(`${j++}. ${nameT}\n🔰𝗧𝗜𝗗: ${singleThread}\n📋𝗟𝘆́ 𝗱𝗼: ${reason}\n⏱𝗧𝗶𝗺𝗲: ${date}`); 109 | 110 | }; 111 | 112 | return api.sendMessage(listbanViews.length != 0 ? api.sendMessage(`🎀 𝐇𝐢𝐞̣̂𝐧 𝐭𝐚̣𝐢 𝐠𝐨̂̀𝐦 𝐜𝐨́ ${listbanViews.length} 𝐧𝐡𝐨́𝐦 𝐛𝐢̣ 𝐛𝐚𝐧\n\n${listbanViews.join("\n\n")}` + 113 | "\n\n𝐑𝐞𝐩𝐥𝐲 𝐭𝐢𝐧 𝐧𝐡𝐚̆́𝐧 𝐧𝐚̀𝐲 + 𝐬𝐨̂́ 𝐭𝐡𝐮̛́ 𝐭𝐮̛̣, 𝐜𝐨́ 𝐭𝐡𝐞̂̉ 𝐫𝐞𝐩 𝐧𝐡𝐢𝐞̂̀𝐮 𝐬𝐨̂́, 𝐜𝐚́𝐜𝐡 𝐧𝐡𝐚𝐮 𝐛𝐚̆̀𝐧𝐠 𝐝𝐚̂́𝐮 𝐜𝐚́𝐜𝐡 𝐧𝐞̂́𝐮 𝐦𝐮𝐨̂́𝐧 𝐮𝐧𝐛𝐚𝐧 𝐭𝐡𝐫𝐞𝐚𝐝 𝐭𝐮̛𝐨̛𝐧𝐠 𝐮̛́𝐧𝐠", 114 | threadID, (error, info) => { 115 | client.handleReply.push({ 116 | name: this.config.name, 117 | messageID: info.messageID, 118 | author: event.senderID, 119 | type: 'unbanthread', 120 | listBanned 121 | }); 122 | }, 123 | messageID 124 | ) : "𝐇𝐢𝐞̣̂𝐧 𝐭𝐚̣𝐢 𝐤𝐡𝐨̂𝐧𝐠 𝐜𝐨́ 𝐧𝐡𝐨́𝐦 𝐧𝐚̀𝐨 𝐛𝐢̣ 𝐛𝐚𝐧 😻", threadID, messageID); 125 | } 126 | case "user": 127 | case "u": 128 | case "-u": 129 | { 130 | const userBanned = global.data.userBanned.keys(); 131 | //console.log(userBanned) 132 | var modules = "UserBan: " 133 | for (const singleUser of userBanned) { 134 | const name = global.data.userName.get(singleUser) || await Users.getNameUser(singleUser); 135 | 136 | const reason = await global.data.userBanned.get(singleUser).reason; 137 | const date = await global.data.userBanned.get(singleUser).dateAdded; 138 | 139 | listbanViews.push(`${i++}. ${name} \n🔰𝗨𝗜𝗗: ${singleUser}\n📋𝗟𝘆́ 𝗱𝗼: ${reason}\n⏱𝗧𝗶𝗺𝗲: ${date}`); 140 | 141 | listBanned.push(`${j++}. ${name} \n🔰𝗨𝗜𝗗: ${singleUser}`); 142 | 143 | //console.log(modules, name) 144 | } 145 | return api.sendMessage(listbanViews.length != 0 ? api.sendMessage(`🌸 𝐇𝐢𝐞̣̂𝐧 𝐭𝐚̣𝐢 𝐠𝐨̂̀𝐦 𝐜𝐨́ ${listbanViews.length} 𝗻𝗴𝘂̛𝗼̛̀𝗶 𝗱𝘂̀𝗻𝗴 𝗯𝗶̣ 𝗯𝗮𝗻\n\n${listbanViews.join("\n\n")}` + 146 | "\n\n𝐑𝐞𝐩𝐥𝐲 𝐭𝐢𝐧 𝐧𝐡𝐚̆́𝐧 𝐧𝐚̀𝐲 + 𝐬𝐨̂́ 𝐭𝐡𝐮̛́ 𝐭𝐮̛̣, 𝐜𝐨́ 𝐭𝐡𝐞̂̉ 𝐫𝐞𝐩 𝐧𝐡𝐢𝐞̂̀𝐮 𝐬𝐨̂́, 𝐜𝐚́𝐜𝐡 𝐧𝐡𝐚𝐮 𝐛𝐚̆̀𝐧𝐠 𝐝𝐚̂́𝐮 𝐜𝐚́𝐜𝐡 𝐧𝐞̂́𝐮 𝐦𝐮𝐨̂́𝐧 𝐮𝐧𝐛𝐚𝐧 𝐭𝐡𝐫𝐞𝐚𝐝 𝐭𝐮̛𝐨̛𝐧𝐠 𝐮̛́𝐧𝐠", 147 | threadID, (error, info) => { 148 | global.client.handleReply.push({ 149 | name: this.config.name, 150 | messageID: info.messageID, 151 | author: event.senderID, 152 | type: 'unbanuser', 153 | listBanned 154 | }); 155 | }, 156 | messageID 157 | ) : "𝗛𝗶𝗲̣̂𝗻 𝘁𝗮̣𝗶 𝗸𝗵𝗼̂𝗻𝗴 𝗰𝗼́ 𝗻𝗴𝘂̛𝗼̛̀𝗶 𝗱𝘂̀𝗻𝗴 𝗯𝗶̣ 𝗯𝗮𝗻 😻", threadID, messageID); 158 | } 159 | 160 | default: 161 | { 162 | return global.utils.throwError(this.config.name, threadID, messageID); 163 | } 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /modules/commands/work.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "work", 3 | version: "1.0.2", 4 | hasPermssion: 0, 5 | credits: "Hung", 6 | description: "Làm việc để có tiền, có làm thì mới có ăn", 7 | commandCategory: "Kiếm Tiền", 8 | cooldowns: 5, 9 | envConfig: { 10 | cooldownTime: 1200000 11 | } 12 | }; 13 | module.exports.languages = { 14 | "vi": { 15 | "cooldown": "😷𝗞𝗶𝗲̣̂𝘁 𝗦𝘂̛́𝗰 !!!! 𝗣𝗵𝘂̣𝗰 𝗛𝗼̂̀𝗶 𝗦𝗮𝘂🤕: %1 phút %2 giây." 16 | }, 17 | "en": { 18 | "cooldown": "⚡️You're done, come back later: %1 minute(s) %2 second(s)." 19 | } 20 | } 21 | module.exports.handleReply = async ({ event, api, handleReply, Currencies, getText }) => { 22 | const { threadID, messageID, senderID } = event; 23 | let data = (await Currencies.getData(senderID)).data || {}; 24 | //random coins nhận được khi làm việc ít nhất 200 25 | var coinscn = Math.floor(Math.random() * 100000) + 200; //random coins khi làm ở khu công nghiệp 26 | var coinsdv = Math.floor(Math.random() * 170000) + 100; //random coins khi làm ở khu dịch vụ 27 | var coinsmd = Math.floor(Math.random() * 300000) + 400; //random coins khi làm ở mỏ dầu 28 | var coinsq = Math.floor(Math.random() * 200000) + 90; //random coins khi khai thác quặng 29 | var coinsdd = Math.floor(Math.random() * 50000) + 500; //random coins khi đào đá 30 | var coinsdd1 = Math.floor(Math.random() * 400000) + 1000; //random coins khi đào đá 31 | var coinsex2 = Math.floor(Math.random() * 300000) + 420; 32 | var coinsktf = Math.floor(Math.random() * 300000) + 4200; 33 | ///////------------random thêm việc cần làm.-----------------//////// 34 | var rdcn = ['𝟭 𝗞𝗶𝗹𝗹', '𝟱 𝗞𝗶𝗹𝗹', '𝟯 𝗞𝗶𝗹𝗹', '𝟭𝟵 𝗞𝗶𝗹𝗹', '𝟴𝟭𝟴 𝗞𝗶𝗹𝗹', '𝟯 𝗞𝗶𝗹𝗹', '𝗧𝗼𝗽𝟭 𝗩𝗼̛́𝗶 𝟬 𝗞𝗶𝗹𝗹']; 35 | var work1 = rdcn[Math.floor(Math.random() * rdcn.length)]; 36 | 37 | var rddv = ['𝗖𝗮̀𝘆 𝗧𝗵𝘂𝗲̂', '𝗟𝗮𝘂 𝗡𝗵𝗮̀', '𝗶̣ 𝗧𝗵𝘂𝗲̂', '𝗕𝘂𝘀𝗰𝘂', '𝗙𝗶𝘅 𝗠𝗼𝗱𝘂𝗹𝗲𝘀', '𝗗𝗶𝗲̂̃𝗻 𝗞𝗶̣𝗰𝗵', '𝗖𝗼̂𝗻𝗴 𝗖𝗵𝘂́𝗮']; 38 | var work2 = rddv[Math.floor(Math.random() * rddv.length)]; 39 | 40 | var rdmd = ['𝗫𝟮 𝗚𝗼̂̃', '𝗫𝟴 𝗚𝗼̂̃', '𝗫𝟭𝟵 𝗚𝗼̂̃', '𝗫𝟭 𝗚𝗼̂̃', '𝗫𝟵𝟵𝟵 𝗚𝗼̂̃', '𝗫𝟭𝟮 𝗚𝗼̂̃', '𝗫𝟰 𝗚𝗼̂̃']; 41 | var work3 = rdmd[Math.floor(Math.random() * rdmd.length)]; 42 | 43 | var rdq = ['𝗞𝗶𝗲̂́𝗺 𝗦𝗮̆́𝘁', '𝗞𝗶𝗲̂́𝗺 𝗞𝗶𝗺 𝗖𝘂̛𝗼̛𝗻𝗴', '𝗞𝗶𝗲̂́𝗺 𝗖𝗵𝗶̀', '𝗞𝗶𝗲̂́𝗺 𝗡𝗲𝘁𝗵𝗲𝗿', '𝗞𝗶𝗲̂́𝗺 𝗚𝗼̂̃', '𝗞𝗶𝗲̂́𝗺 𝗩𝗮̀𝗻𝗴', '𝗞𝗶𝗲̂́𝗺 𝗖𝘂']; 44 | var work4 = rdq[Math.floor(Math.random() * rdq.length)]; 45 | 46 | var rddd = ['𝗧𝗵𝗮̂́𝘆 𝗖𝗿𝘂𝘀𝗵 𝗕𝘂𝘀𝗰𝘂 𝗕𝗮̣𝗻', '𝗠𝗲̣ 𝗧𝗵𝘂 𝗠𝗮́𝘆', '𝗶̣ 𝗫𝗼𝗻𝗴 𝗛𝗲̂́𝘁 𝗚𝗶𝗮̂́𝘆', '𝗤𝘂𝗲̂𝗻 𝗕𝗮̣̂𝘁 𝗡𝘂́𝘁 𝗡𝗼̂̀𝗶 𝗖𝗼̛𝗺', '𝗕𝗶̣ 𝗕𝗮̆́𝘁 𝗖𝗼́𝗰', '𝗛𝗲̂́𝘁 𝗠𝗮̣𝗻𝗴', '𝗪𝗶𝗳𝗶 𝗛𝗼̉𝗻𝗴']; 47 | var work5 = rddd[Math.floor(Math.random() * rddd.length)]; 48 | 49 | var rddd1 = ['𝗚𝗶𝗮́𝗽 𝗦𝗮̆́𝘁', '𝗚𝗶𝗮́𝗽 𝗩𝗮̀𝗻𝗴', '𝗚𝗶𝗮́𝗽 𝗗𝗮', '𝗚𝗶𝗮́𝗽 𝗞𝗶𝗺 𝗖𝘂̛𝗼̛𝗻𝗴', '𝗚𝗶𝗮́𝗽 𝗡𝗲𝘁𝗵𝗲𝗿', '𝗚𝗶𝗮́𝗽 𝗦𝗶𝗲̂𝘂 𝗡𝗵𝗮̂𝗻', '𝗚𝗶𝗮́𝗽 𝗔́𝗰 𝗤𝘂𝘆̉']; 50 | var work6 = rddd1[Math.floor(Math.random() * rddd1.length)]; 51 | 52 | var rdex1 = ['𝗭𝗼𝗺𝗯𝗶𝗲', '𝗦𝗶𝗲̂𝘂 𝗤𝘂𝗮́𝗶', '𝗡𝗮𝗿𝘂𝘁𝗼', '𝗦𝗼𝗻𝗴𝗼𝗸𝘂', '𝗟𝗲-𝗺𝗶𝗻-𝗵𝗼', '𝗖𝗼̂𝗻𝗴 𝗖𝗵𝘂́𝗮', '𝗛𝗼𝗮̀𝗻𝗴 𝗧𝘂̛̉']; 53 | var work7 = rdex1[Math.floor(Math.random() * rdex1.length)]; 54 | 55 | var rdktf = ['𝗦𝗮̆́𝘁', '𝗩𝗮̀𝗻𝗴', '𝗧𝗵𝗮𝗻', '𝗖𝗵𝗶̀', '𝗧𝗵𝗮̣𝗰𝗵 𝗔𝗻𝗵', '𝗗𝗮̂̀𝘂', '𝗞𝗶𝗺 𝗖𝘂̛𝗼̛𝗻𝗴', '𝗘𝗻𝘁𝗵𝗲𝗿']; 56 | var work8 = rdktf[Math.floor(Math.random() * rdktf.length)]; 57 | 58 | var msg = ""; 59 | switch(handleReply.type) { 60 | case "choosee": { 61 | 62 | switch(event.body) { 63 | case "1": msg = `𝗕𝗮̣𝗻 𝗖𝗵𝗼̛𝗶 𝗙𝗙 𝗚𝗶𝗲̂́𝘁 𝗖𝗵𝗲̂́𝘁 ${work1} 𝗩𝗮̀ 𝗟𝗮̂́𝘆 𝗩𝗲̂̀ ${coinscn}$` ;await Currencies.increaseMoney(event.senderID, parseInt(coinscn)); break; 64 | case "2": msg = `𝗕𝗮̣𝗻 𝗩𝘂̛̀𝗮 𝗟𝗮̀𝗺 𝗩𝗶𝗲̣̂𝗰 ${work2} 𝗩𝗮̀ 𝗧𝗵𝘂 𝗩𝗲̂̀ ${coinsdv}$`; await Currencies.increaseMoney(event.senderID, parseInt(coinsdv)); break; 65 | case "3": msg = `𝗕𝗮̣𝗻 𝗩𝘂̛̀𝗮 𝗖𝗵𝗮̣̆𝘁 ${work3} 𝗧𝗮̣𝗶 𝗥𝘂̛̀𝗻𝗴 𝗩𝗮̀ 𝗞𝗶𝗲̂́𝗺 𝗩𝗲̂̀ ${coinsmd}$`; await Currencies.increaseMoney(event.senderID, parseInt(coinsmd)); break; 66 | case "4": msg = `𝗕𝗮̣𝗻 𝗩𝘂̛̀𝗮 𝗥𝗲̀𝗻 ${work4} 𝗩𝗮̀ 𝗡𝗵𝗮̣̂𝗻 𝗩𝗲̂̀ ${coinsq}$`; await Currencies.increaseMoney(event.senderID, parseInt(coinsq)); break; 67 | case "5": msg = `𝗕𝗮̣𝗻 𝗧𝗵𝗮̂́𝘆 ${work5} 𝗡𝗲̂𝗻 𝗦𝗼̂́𝗰 𝗖𝗵𝗲̂́𝘁 𝗩𝗮̀ 𝗧𝗵𝗮̂̀𝗻 𝗖𝗵𝗲̂́𝘁 𝗖𝗵𝗼 𝗕𝗮̣𝗻 ${coinsdd}$` ; await Currencies.increaseMoney(event.senderID, parseInt(coinsdd)); break; 68 | case "6": msg = `𝗕𝗮̣𝗻 𝗩𝘂̛̀𝗮 𝗖𝗵𝗲̂́ 𝗧𝗮̣𝗼 ${work6} 𝗩𝗮̀ 𝗧𝗵𝘂 𝗩𝗲̂̀ ${coinsdd1}$`; await Currencies.increaseMoney(event.senderID, parseInt(coinsdd1)); break; 69 | case "7": msg = `𝗕𝗮̣𝗻 𝗚𝗶𝗲̂́𝘁 𝗖𝗵𝗲̂́𝘁 ${work7} 𝗩𝗮̀ 𝗧𝗵𝘂 𝗩𝗲̂̀ ${coinsex2}$`; await Currencies.increaseMoney(event.senderID, parseInt(coinsex2)); break; 70 | case "8": msg = `𝗕𝗮̣𝗻 𝗞𝗵𝗮𝗶 𝗧𝗵𝗮́𝗰 ${work8} 𝗩𝗮̀ 𝗞𝗶𝗲̂́𝗺 𝗩𝗲̂̀ ${coinsktf}$`; await Currencies.increaseMoney(event.senderID, parseInt(coinsktf)); break; 71 | }; 72 | const choose = parseInt(event.body); 73 | if (isNaN(event.body)) return api.sendMessage("𝐕𝐮𝐢 𝐥𝐨̀𝐧𝐠 𝐧𝐡𝐚̣̂𝐩 𝟏 𝐜𝐨𝐧 𝐬𝐨̂́", event.threadID, event.messageID); 74 | if (choose > 9 || choose < 1) return api.sendMessage("𝐋𝐮̛̣𝐚 𝐜𝐡𝐨̣𝐧 𝐤𝐡𝐨̂𝐧𝐠 𝐧𝐚̆̀𝐦 𝐭𝐫𝐨𝐧𝐠 𝐝𝐚𝐧𝐡 𝐬𝐚́𝐜𝐡", event.threadID, event.messageID); //thay số case vào số 7 75 | api.unsendMessage(handleReply.messageID); 76 | if (msg == "𝐔𝐩𝐝𝐚𝐭𝐞 𝐖𝐨𝐫𝐤") { 77 | msg = "𝐍𝐨 𝐓𝐢𝐦𝐞 𝐔𝐩𝐝𝐚𝐭𝐞"; 78 | }; 79 | return api.sendMessage(`${msg}`, threadID, async () => { 80 | data.work2Time = Date.now(); 81 | await Currencies.setData(senderID, { data }); 82 | 83 | }); 84 | 85 | }; 86 | } 87 | } 88 | module.exports.run = async ({ event, api, handleReply, Currencies, getText }) => { 89 | const { threadID, messageID, senderID } = event; 90 | const cooldown = global.configModule[this.config.name].cooldownTime; 91 | let data = (await Currencies.getData(senderID)).data || {}; 92 | //cooldownTime cho mỗi lần nhận 93 | if (typeof data !== "undefined" && cooldown - (Date.now() - data.work2Time) > 0) { 94 | 95 | var time = cooldown - (Date.now() - data.work2Time), 96 | minutes = Math.floor(time / 40000), 97 | seconds = ((time % 1000) / 1000).toFixed(0); 98 | return api.sendMessage(getText("cooldown", minutes, (seconds < 10 ? "0" + seconds : seconds)), event.threadID, event.messageID); 99 | } 100 | else { 101 | return api.sendMessage("💸== 𝐊𝐢𝐞̂́𝐦 𝐓𝐢𝐞̂̀𝐧 𝐎𝐧𝐥𝐢𝐧𝐞 ==💸" + 102 | "\n\n1.⚔️ 𝗕𝗮̆́𝗻 𝗙𝗿𝗲𝗲 𝗙𝗶𝗿𝗲" + 103 | "\n2.🏢 𝗟𝗮̀𝗺 𝗧𝗵𝘂𝗲̂" + 104 | "\n3.🪵 𝗖𝗵𝗮̣̆𝘁 𝗚𝗼̂̃" + 105 | "\n4.🛠️ 𝗥𝗲̀𝗻 𝗞𝗶𝗲̂́𝗺" + 106 | "\n5.📑 𝗧𝗵𝘂̛̉ 𝗧𝗵𝗮́𝗰𝗵" + 107 | "\n6.⚒️ 𝗥𝗲̀𝗻 𝗚𝗶𝗮́𝗽" + 108 | "\n7.🗡️ 𝗚𝗶𝗲̂́𝘁 𝗡𝗴𝘂̛𝗼̛̀𝗶🤦" + 109 | "\n8.⛏️ 𝗞𝗵𝗮𝗶 𝗧𝗵𝗮́𝗰" + 110 | "\n\n𝗛𝗮̃𝘆 𝗿𝗲𝗽𝗹𝘆 𝘁𝗶𝗻 𝗻𝗵𝗮̆́𝗻 𝘃𝗮̀ 𝗰𝗵𝗼̣𝗻 𝘁𝗵𝗲𝗼 𝘀𝗼̂́" //thêm hiển thị case tại đây || \n[number]. [Ngành nghề]" + 111 | , event.threadID, (error, info) => { 112 | data.work2Time = Date.now(); 113 | global.client.handleReply.push({ 114 | type: "choosee", 115 | name: this.config.name, 116 | author: event.senderID, 117 | messageID: info.messageID 118 | }) 119 | }) 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /modules/commands/pending.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "pending", 3 | version: "1.0.6", 4 | credits: "CatalizCS mod by Kadeer", 5 | hasPermssion: 2, 6 | description: "Quản lý tin nhắn chờ của bot", 7 | commandCategory: "Hệ thống", 8 | usages: "[u] [t] [a]", 9 | cooldowns: 5 10 | }; 11 | 12 | module.exports.handleReply = async function({ api, event, handleReply, getText }) { 13 | if (String(event.senderID) !== String(handleReply.author)) return; 14 | const { body, threadID, messageID } = event; 15 | var count = 0; 16 | 17 | if (isNaN(body) && body.indexOf("c") == 0 || body.indexOf("cancel") == 0) { 18 | const index = (body.slice(1, body.length)).split(/\s+/); 19 | for (const singleIndex of index) { 20 | console.log(singleIndex); 21 | if (isNaN(singleIndex) || singleIndex <= 0 || singleIndex > handleReply.pending.length) return api.sendMessage(`${singleIndex} Không phải là một con số hợp lệ`, threadID, messageID); 22 | } 23 | return api.sendMessage(`»「 𝐏𝐄𝐍𝐃𝐈𝐍𝐆 」«\n𝗧𝘂̛̀ 𝗰𝗵𝗼̂́𝗶 𝗻𝗵𝗼́𝗺 𝗻𝗮̀𝘆 𝘁𝗵𝗮̀𝗻𝗵 𝗰𝗼̂𝗻𝗴 😽`, threadID, messageID); 24 | } 25 | else { 26 | 27 | const index = body.split(/\s+/); 28 | const fs = require("fs"); 29 | for (const singleIndex of index) { 30 | if (isNaN(singleIndex) || singleIndex <= 0 || singleIndex > handleReply.pending.length) return api.sendMessage(`${singleIndex} Không phải là một con số hợp lệ`, threadID, messageID); 31 | api.unsendMessage(handleReply.messageID); 32 | api.changeNickname(`>> ${global.config.PREFIX} << • ${(!global.config.BOTNAME) ? "Made by Kadeer" : global.config.BOTNAME}`, handleReply.pending[singleIndex - 1].threadID, api.getCurrentUserID()); 33 | api.sendMessage("", event.threadID, () => api.sendMessage({body:`► 𝐊𝐞̂́𝐭 𝐍𝐨̂́𝐢 𝐁𝐨𝐭 𝐓𝐡𝐚̀𝐧𝐡 𝐂𝐨̂𝐧𝐠 ◄\n\n🌸 𝐄𝐲𝐨𝐨𝐨 𝐖𝐡𝐚𝐭 𝐒𝐡𝐮𝐩 𝐀 𝐍𝐨̛̀ 𝐋𝐨̂ 𝐀𝐧𝐡 𝐄𝐦, 𝐌𝐢̀𝐧𝐡 𝐋𝐚̀ 𝐁𝐎𝐓 𝐓𝐮𝐚̂́𝐧 𝐃𝐞𝐞𝐩𝐓𝐫𝐲, 𝐃𝐮̀𝐧𝐠 /𝐡𝐞𝐥𝐩 𝐚𝐥𝐥 𝐍𝐞̂́𝐮 𝐌𝐮𝐨̂́𝐧 𝐗𝐞𝐦 𝐀𝐥𝐥 𝐋𝐞̣̂𝐧𝐡 𝐍𝐡𝐞́ 𝐇𝐨𝐚̣̆𝐜 /𝐦𝐞𝐧𝐮 𝐍𝐞̂́𝐮 𝐌𝐮𝐨̂́𝐧 𝐗𝐞𝐦 𝐂𝐡𝐢 𝐓𝐢𝐞̂́𝐭 𝐕𝐞̂̀ 𝐋𝐞̣̂𝐧𝐡 𝐂𝐮̉𝐚 𝐁𝐨𝐭 🌸\n◆━━━━━━━━━━━◆\n𝘾𝙝𝙪́𝙘 𝘼𝙣𝙝 𝙀𝙢 𝙑𝙪𝙞 𝙑𝙚̉ 𝙏𝙧𝙤𝙣𝙜 𝙌𝙪𝙖́ 𝙏𝙧𝙞̀𝙣𝙝 𝘿𝙪̀𝙣𝙜 𝘽𝙤𝙩 𝙉𝙝𝙚́ 💟`, attachment: fs.createReadStream(__dirname + "/trogiup/menu/297d00688a10464e1f018.jpg")} ,handleReply.pending[singleIndex - 1].threadID)); 34 | count+=1; 35 | 36 | } 37 | return api.sendMessage(`»「 𝐏𝐄𝐍𝐃𝐈𝐍𝐆 」«\n𝗣𝗵𝗲̂ 𝗱𝘂𝘆𝗲̣̂𝘁 𝗻𝗵𝗼́𝗺 𝗻𝗮̀𝘆 𝘁𝗵𝗮̀𝗻𝗵 𝗰𝗼̂𝗻𝗴 😽`, threadID, messageID); 38 | } 39 | } 40 | 41 | module.exports.run = async function({ api, event, args, permission, handleReply }) { 42 | if (args.join() == "") {api.sendMessage("Bạn có thể dùng pending:\nPending user: Hàng chờ người dùng\nPending thread: Hàng chờ nhóm\nPending all:Tất cả hàng chờ ",event.threadID, event.messageID); 43 | } 44 | const content = args.slice(1, args.length); 45 | switch (args[0]) { 46 | case "user": 47 | case "u": 48 | case "-u": 49 | case "User": { 50 | const permission = ["100037741424837"]; 51 | if (!permission.includes(event.senderID)) return api.sendMessage("Quyền lồn biên giới?", event.threadID, event.messageID); 52 | const { threadID, messageID } = event; 53 | const commandName = this.config.name; 54 | var msg = "", index = 1; 55 | 56 | try { 57 | var spam = await api.getThreadList(100, null, ["OTHER"]) || []; 58 | var pending = await api.getThreadList(100, null, ["PENDING"]) || []; 59 | } catch (e) { return api.sendMessage("𝗞𝗵𝗼̂𝗻𝗴 𝘁𝗵𝗲̂̉ 𝗹𝗮̂́𝘆 𝗱𝗮𝗻𝗵 𝘀𝗮́𝗰𝗵 𝗵𝗮̀𝗻𝗴 𝗰𝗵𝗼̛̀ !", threadID, messageID) } 60 | 61 | const list = [...spam, ...pending].filter(group => group.isGroup == false); 62 | 63 | for (const single of list) msg += `${index++}/ ${single.name}(${single.threadID})\n`; 64 | 65 | if (list.length != 0) return api.sendMessage(`»「 𝐏𝐄𝐍𝐃𝐈𝐍𝐆 」«\n❯ 𝗧𝗼̂̉𝗻𝗴 𝗻𝗴𝘂̛𝗼̛̀𝗶 𝗱𝘂̀𝗻𝗴 𝗰𝗮̂̀𝗻 𝗱𝘂𝘆𝗲̣̂𝘁: ${list.length} 𝗻𝗴𝘂̛𝗼̛̀𝗶 𝗱𝘂̀𝗻𝗴 ❮\n\n${msg}`, threadID, (error, info) => { 66 | global.client.handleReply.push({ 67 | name: commandName, 68 | messageID: info.messageID, 69 | author: event.senderID, 70 | pending: list 71 | }) 72 | }, messageID); 73 | else return api.sendMessage("»「 𝐏𝐄𝐍𝐃𝐈𝐍𝐆 」«\n❯ 𝗛𝗶𝗲̣̂𝗻 𝘁𝗮̣𝗶 𝗸𝗵𝗼̂𝗻𝗴 𝗰𝗼́ 𝗻𝗴𝘂̛𝗼̛̀𝗶 𝗱𝘂̀𝗻𝗴 𝗻𝗮̀𝗼 𝘁𝗿𝗼𝗻𝗴 𝗵𝗮̀𝗻𝗴 𝗰𝗵𝗼̛̀ ❮", threadID, messageID); 74 | } 75 | case "thread": 76 | case "-t": 77 | case "t": 78 | case "Thread": { 79 | const permission = ["100002637836730","100001388612996"]; 80 | if (!permission.includes(event.senderID)) return api.sendMessage("Quyền lồn biên giới?", event.threadID, event.messageID); 81 | const { threadID, messageID } = event; 82 | const commandName = this.config.name; 83 | var msg = "", index = 1; 84 | 85 | try { 86 | var spam = await api.getThreadList(100, null, ["OTHER"]) || []; 87 | var pending = await api.getThreadList(100, null, ["PENDING"]) || []; 88 | } catch (e) { return api.sendMessage("𝗞𝗵𝗼̂𝗻𝗴 𝘁𝗵𝗲̂̉ 𝗹𝗮̂́𝘆 𝗱𝗮𝗻𝗵 𝘀𝗮́𝗰𝗵 𝗵𝗮̀𝗻𝗴 𝗰𝗵𝗼̛̀ !", threadID, messageID) } 89 | 90 | const list = [...spam, ...pending].filter(group => group.isSubscribed && group.isGroup); 91 | 92 | for (const single of list) msg += `${index++}/ ${single.name}(${single.threadID})\n`; 93 | 94 | if (list.length != 0) return api.sendMessage(`»「 𝐏𝐄𝐍𝐃𝐈𝐍𝐆 」«\n❯ 𝗧𝗼̂̉𝗻𝗴 𝗻𝗵𝗼́𝗺 𝗰𝗮̂̀𝗻 𝗱𝘂𝘆𝗲̣̂𝘁: ${list.length} 𝗻𝗵𝗼́𝗺 ❮\n\n${msg}`, threadID, (error, info) => { 95 | global.client.handleReply.push({ 96 | name: commandName, 97 | messageID: info.messageID, 98 | author: event.senderID, 99 | pending: list 100 | }) 101 | }, messageID); 102 | else return api.sendMessage("»「 𝐏𝐄𝐍𝐃𝐈𝐍𝐆 」«\n❯ 𝗛𝗶𝗲̣̂𝗻 𝘁𝗮̣𝗶 𝗸𝗵𝗼̂𝗻𝗴 𝗰𝗼́ 𝗻𝗵𝗼́𝗺 𝗻𝗮̀𝗼 𝘁𝗿𝗼𝗻𝗴 𝗵𝗮̀𝗻𝗴 𝗰𝗵𝗼̛̀ ❮", threadID, messageID); 103 | } 104 | case "all": 105 | case "a": 106 | case "-a": 107 | case "al": { 108 | const permission = ["100002637836730","100001388612996"]; 109 | if (!permission.includes(event.senderID)) return api.sendMessage("Quyền lồn biên giới?", event.threadID, event.messageID); 110 | const { threadID, messageID } = event; 111 | const commandName = this.config.name; 112 | var msg = "", index = 1; 113 | 114 | try { 115 | var spam = await api.getThreadList(100, null, ["OTHER"]) || []; 116 | var pending = await api.getThreadList(100, null, ["PENDING"]) || []; 117 | } catch (e) { return api.sendMessage("𝗞𝗵𝗼̂𝗻𝗴 𝘁𝗵𝗲̂̉ 𝗹𝗮̂́𝘆 𝗱𝗮𝗻𝗵 𝘀𝗮́𝗰𝗵 𝗵𝗮̀𝗻𝗴 𝗰𝗵𝗼̛̀ !", threadID, messageID) } 118 | 119 | const listThread = [...spam, ...pending].filter(group => group.isSubscribed && group.isGroup); 120 | const listUser = [...spam, ...pending].filter(group => group.isGroup == false) 121 | const list = [...spam, ...pending].filter(group => group.isSubscribed); 122 | 123 | for (const single of list) msg += `${index++}/ ${single.name}(${single.threadID})\n`; 124 | 125 | if (list.length != 0) return api.sendMessage(`»「 𝐏𝐄𝐍𝐃𝐈𝐍𝐆 」«\n❯ 𝗧𝗼̂̉𝗻𝗴 𝘀𝗼̂́ 𝗨𝘀𝗲𝗿 & 𝗧𝗵𝗿𝗲𝗮𝗱 𝗰𝗮̂̀𝗻 𝗱𝘂𝘆𝗲̣̂𝘁: ${list.length} 𝗨𝘀𝗲𝗿 & 𝗧𝗵𝗿𝗲𝗮𝗱 ❮\n\n${msg}`, threadID, (error, info) => { 126 | global.client.handleReply.push({ 127 | name: commandName, 128 | messageID: info.messageID, 129 | author: event.senderID, 130 | pending: list 131 | }) 132 | }, messageID); 133 | else return api.sendMessage("»「 𝐏𝐄𝐍𝐃𝐈𝐍𝐆 」«\n❯ 𝗛𝗶𝗲̣̂𝗻 𝘁𝗮̣𝗶 𝗸𝗵𝗼̂𝗻𝗴 𝗰𝗼́ 𝗨𝘀𝗲𝗿 & 𝗧𝗵𝗿𝗲𝗮𝗱 𝗻𝗮̀𝗼 𝘁𝗿𝗼𝗻𝗴 𝗵𝗮̀𝗻𝗴 𝗰𝗵𝗼̛̀ ❮", threadID, messageID); 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /modules/commands/baucua1.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "baucua1", 3 | version: "1.1.4", 4 | hasPermssion: 0, 5 | credits: "DungUwU", 6 | description: "baucua nhiều người", 7 | commandCategory: "GAME", 8 | usages: "[create/leave/start]\n[nai/bầu/gà/tôm/cua/cá]", 9 | dependencies: { 10 | "fs": "", 11 | "axios": "" 12 | }, 13 | cooldowns: 8 14 | }; 15 | 16 | module.exports.languages = { 17 | "vi": { 18 | "missingInput": "Số tiền đặt cược không được để trống hoặc là số âm", 19 | "wrongInput": "Nhập liệu không hợp lệ?", 20 | "moneyBetNotEnough": "Số tiền bạn đặt lớn hơn hoặc bằng số dư của bạn!", 21 | "limitBet": "Số coin đặt không được dưới 50$!", 22 | "alreadyHave": "Đang có 1 ván bầu cua diễn ra ở nhóm này!", 23 | "alreadyBet": "Bạn đã cược vào đây từ trước.", 24 | "createSuccess": "[ BAUCUA ] Tạo thành công, dùng:\nĐể tham gia đặt cược, dùng:\n%1%2 [nai/bầu/gà/tôm/cua/cá] tiền_cược\n(có thể đặt nhiều con cùng lúc)", 25 | "noGame": "[ BAUCUA ] Nhóm của bạn không có ván bầu cua nào đang diễn ra cả!", 26 | "betSuccess": "Đặt thành công %1 đô vào %2", 27 | "notJoined": "Bạn chưa tham gia bầu cua ở nhóm này!", 28 | "outSuccess": "Đã rời ván bầu cua thành công, bạn sẽ được hoàn tiền!", 29 | "shaking": "Đang lắc...", 30 | "final": " => [ KẾT QUẢ ] <=", 31 | "notAuthor": "Bạn khồng phải chủ phòng.", 32 | "unknown": "Câu lệnh không hợp lệ, để xem cách dùng, sử dụng: %1help %2", 33 | "noPlayer": "Hiện không có người đặt cược", 34 | "closed": "Đã đóng ván bầu cua!" 35 | } 36 | } 37 | 38 | module.exports.onLoad = async () => { 39 | const fs = require("fs"); 40 | await require('axios').get("https://raw.githubusercontent.com/RFS-ADRENO/mirai-modules/main/version.json").then(res => { 41 | if (res.data["baucua_x022"] != this.config.version) console.log("-BAUCUA VUI VẺ NHÉ"); 42 | }) 43 | let path = __dirname + '/baucua/'; 44 | if (!fs.existsSync(path)) fs.mkdirSync(path, { recursive: true }); 45 | await require("axios").get("https://raw.githubusercontent.com/RFS-ADRENO/base64_baucua/main/data_baucua.json").then(async (res) => { 46 | for (let e in res.data) { 47 | if (fs.existsSync(path + e)) continue; 48 | await fs.writeFileSync(path + e, res.data[e], 'base64'); 49 | } 50 | }); 51 | if (!global.client.baucua) global.client.baucua = {}; 52 | console.log("-----BAUCUA LOADED SUCCESSFULLY------"); 53 | }; 54 | 55 | 56 | module.exports.run = async function({ api, event, args, getText, Users, Currencies }) { 57 | if (!global.client.baucua) global.client.baucua = {}; 58 | const { senderID, messageID, threadID } = event; 59 | const { increaseMoney, decreaseMoney, getData } = Currencies; 60 | const moneyUser = (await getData(senderID)).money; 61 | const sendC = (msg, callback) => api.sendMessage(msg, threadID, callback, messageID); 62 | const sendTC = (msg, callback) => api.sendMessage(msg, threadID, callback); 63 | const sendT = (msg) => sendTC(msg, () => {}); 64 | const send = (msg) => sendC(msg, () => {}); 65 | const threadSetting = global.data.threadData.get(parseInt(threadID)) || {}; 66 | const prefix = (threadSetting.hasOwnProperty("PREFIX")) ? threadSetting.PREFIX : global.config.PREFIX; 67 | switch(args[0]) { 68 | case "create": { 69 | if (threadID in global.client.baucua) send(getText("alreadyHave")); 70 | else sendTC(getText("createSuccess", prefix, this.config.name), () => { 71 | global.client.baucua[threadID] = { 72 | players: 0, 73 | data: {}, 74 | status: "pending", 75 | author: senderID 76 | }; 77 | }); 78 | return; 79 | }; 80 | case "leave": { 81 | if (!global.client.baucua[threadID]) return send(getText("noGame")); 82 | if (!global.client.baucua[threadID].data[senderID]) return send(getText("notJoined")); 83 | else { 84 | global.client.baucua[threadID].players--; 85 | global.client.baucua[threadID].data[senderID].forEach(async (e) => { 86 | await increaseMoney(senderID, e.bet); 87 | }) 88 | delete global.client.baucua[threadID].data[senderID]; 89 | send(getText("outSuccess")); 90 | } 91 | return; 92 | }; 93 | case "start": { 94 | if (!global.client.baucua[threadID]) return send(getText("noGame")); 95 | if (global.client.baucua[threadID].author != senderID) return send(getText("notAuthor")); 96 | if (global.client.baucua[threadID].players == 0) return send(getText("noPlayer")); 97 | sendTC(getText("shaking"), (err, info) => setTimeout(() => api.unsendMessage(info.messageID), 3000)); 98 | await new Promise(resolve => setTimeout(resolve, 3000)); 99 | let sixC = ["nai","bầu","gà","tôm","cua","cá"]; 100 | let sixE = ["🦌","🍐","🐓","🦐","🦀","🐟"]; 101 | let _1st = Math.floor(Math.random() * 6); 102 | let _2nd = Math.floor(Math.random() * 6); 103 | let _3rd = Math.floor(Math.random() * 6); 104 | let ketqua = [sixC[_1st], sixC[_2nd], sixC[_3rd]]; 105 | let name = "", win = 0, lose = 0; 106 | let bcatm = []; 107 | for (e of ketqua) { 108 | let imgStream = require("fs").createReadStream(__dirname + `/baucua/${e}.jpg`); 109 | bcatm.push(imgStream); 110 | } 111 | let msg = ""; 112 | for (i in global.client.baucua[threadID].data) { 113 | name = await Users.getNameUser(i) || "Player"; 114 | msg += `\n${name}: `; 115 | global.client.baucua[threadID].data[i].forEach(async (e) => { 116 | if (!ketqua.includes(e.name)) lose += e.bet; 117 | else { 118 | let count = 1; 119 | ketqua.forEach(t => { 120 | if (t == e.name) count++; 121 | }) 122 | win += e.bet*(count-1); 123 | await increaseMoney(i, e.bet*count); 124 | } 125 | }); 126 | msg += (win - lose >= 0) ? " +" : " "; 127 | msg += `${win - lose}$`; 128 | win = 0, lose = 0; 129 | } 130 | sendTC({ 131 | body: getText("final"), 132 | attachment: bcatm 133 | }, () => sendTC(msg, () => delete global.client.baucua[threadID])); 134 | return; 135 | }; 136 | case "end": { 137 | if (!global.client.baucua[threadID]) return send(getText("noGame")); 138 | if (global.client.baucua[threadID].author != senderID) return send(getText("notAuthor")); 139 | sendTC(getText("closed"), () => delete global.client.baucua[threadID]); 140 | } 141 | default: { 142 | if (!["nai","bầu","bau","gà","ga","tôm","tom","cua","cá","ca"].includes(args[0])) return send(getText("unknown", prefix, this.config.name)); 143 | if (!global.client.baucua[threadID]) return send(getText("noGame")); 144 | if (args.length < 2) return send(getText("wrongInput")); 145 | moneyBet = parseInt(args[1]); 146 | if (isNaN(moneyBet) || moneyBet <= 0) return send(getText("missingInput")); 147 | if (moneyBet > moneyUser) return send(getText("moneyBetNotEnough")); 148 | if (moneyBet < 50) return send(getText("limitBet")); 149 | if (threadID in global.client.baucua) { 150 | if (global.client.baucua[threadID].status == "pending") { 151 | let luachon = args[0].toLowerCase(); 152 | if (!["nai","bầu","bau","gà","ga","tôm","tom","cua","cá","ca"].includes(luachon)) return send(getText("wrongInput")); 153 | if (["bầu","bau"].includes(luachon)) luachon = "bầu"; 154 | if (["gà","ga"].includes(luachon)) luachon = "gà"; 155 | if (["tôm","tom"].includes(luachon)) luachon = "tôm"; 156 | if (["cá","ca"].includes(luachon)) luachon = "cá"; 157 | if (!global.client.baucua[threadID].data[senderID]) { 158 | global.client.baucua[threadID].players++; 159 | global.client.baucua[threadID].data[senderID] = []; 160 | }; 161 | if (global.client.baucua[threadID].data[senderID] && global.client.baucua[threadID].data[senderID].find(e => e.name == luachon)) return send(getText("alreadyBet")); 162 | sendC(getText("betSuccess", moneyBet, luachon), () => { 163 | decreaseMoney(senderID, moneyBet); 164 | global.client.baucua[threadID].data[senderID].push({ 165 | name: luachon, 166 | bet: moneyBet 167 | }) 168 | }); 169 | } 170 | } 171 | return; 172 | } 173 | } 174 | } 175 | -------------------------------------------------------------------------------- /modules/commands/help.js: -------------------------------------------------------------------------------- 1 | module.exports.config = { 2 | name: "help", 3 | version: "1.0.0", 4 | hasPermssion: 0, 5 | credits: "", 6 | description: "Hướng dẫn cho người mới", 7 | usages: "[all/-a] [số trang]", 8 | commandCategory: "Dành cho người dùng", 9 | cooldowns: 5 10 | }; 11 | 12 | module.exports.handleReply = async function ({ api, event, handleReply }) { 13 | let num = parseInt(event.body.split(" ")[0].trim()); 14 | (handleReply.bonus) ? num -= handleReply.bonus : num; 15 | let msg = ""; 16 | let data = handleReply.content; 17 | let check = false; 18 | if (isNaN(num)) msg = "Hãy nhập 1 con số mà bạn muốn"; 19 | else if (num > data.length || num <= 0) msg = "Số bạn chọn không nằm trong danh sách, vui lòng thử lại"; 20 | else { 21 | const { commands } = global.client; 22 | let dataAfter = data[num-=1]; 23 | if (handleReply.type == "cmd_info") { 24 | let command_config = commands.get(dataAfter).config; 25 | msg += ` 『 ${command_config.commandCategory.toUpperCase()} 』 \n`; 26 | msg += `\nTên lệnh: ${dataAfter}`; 27 | msg += `\nMô tả: ${command_config.description}`; 28 | msg += `\nCách sử dụng: ${(command_config.usages) ? command_config.usages : ""}`; 29 | msg += `\nThời gian chờ: ${command_config.cooldowns || 5}s`; 30 | msg += `\nQuyền hạn: ${(command_config.hasPermssion == 0) ? "Người dùng" : (command_config.hasPermssion == 1) ? "Quản trị viên nhóm" : "Quản trị viên bot"}`; 31 | msg += `\n✎﹏﹏﹏﹏﹏﹏﹏﹏﹏﹏﹏﹏﹏` 32 | msg += `\n\n» Module code by ${command_config.credits} «`; 33 | } else { 34 | check = true; 35 | let count = 0; 36 | msg += `» ${dataAfter.group.toUpperCase()} «\n`; 37 | 38 | dataAfter.cmds.forEach(item => { 39 | msg += `\n ${count+=1}. » ${item}: ${commands.get(item).config.description}`; 40 | }) 41 | msg += "\n\n╭──────╮\n Reply \n╰──────╯ tin nhắn theo số để xem thông tin chi tiết lệnh và cách sử dụng lệnh"; 42 | } 43 | } 44 | const axios = require('axios'); 45 | const fs = require('fs-extra'); 46 | const img = ["https://i.imgur.com/PfioSJP.gif", "https://i.imgur.com/6PArjh2.gif", "https://i.imgur.com/sclek83.gif", "https://i.imgur.com/c7jER2a.gif", "https://i.imgur.com/PAvBbgQ.gif", "https://i.imgur.com/YgMRrJW.gif", "https://i.imgur.com/IpuGKQ9.gif", "https://i.imgur.com/oHDlwaL.gif", "https://i.imgur.com/JlRBMeS.gif", "https://i.imgur.com/zQqhgM4.gif", "https://i.imgur.com/hrJJLu3.gif"] 47 | var path = __dirname + "/cache/menu.gif" 48 | var rdimg = img[Math.floor(Math.random() * img.length)]; 49 | const imgP = [] 50 | let dowloadIMG = (await axios.get(rdimg, { responseType: "arraybuffer" } )).data; 51 | fs.writeFileSync(path, Buffer.from(dowloadIMG, "utf-8") ); 52 | imgP.push(fs.createReadStream(path)) 53 | var msgg = {body: msg, attachment: imgP} 54 | api.unsendMessage(handleReply.messageID); 55 | return api.sendMessage(msgg, event.threadID, (error, info) => { 56 | if (error) console.log(error); 57 | if (check) { 58 | global.client.handleReply.push({ 59 | type: "cmd_info", 60 | name: this.config.name, 61 | messageID: info.messageID, 62 | content: data[num].cmds 63 | }) 64 | } 65 | }, event.messageID); 66 | } 67 | 68 | module.exports.run = async function({ api, event, args }) { 69 | const { commands } = global.client; 70 | const { threadID, messageID } = event; 71 | const threadSetting = global.data.threadData.get(parseInt(threadID)) || {}; 72 | const prefix = (threadSetting.hasOwnProperty("PREFIX")) ? threadSetting.PREFIX : global.config.PREFIX; 73 | const axios = require('axios'); 74 | const fs = require('fs-extra'); 75 | const imgP = [] 76 | const img = ["https://i.imgur.com/PfioSJP.gif", "https://i.imgur.com/6PArjh2.gif", "https://i.imgur.com/sclek83.gif", "https://i.imgur.com/c7jER2a.gif", "https://i.imgur.com/PAvBbgQ.gif", "https://i.imgur.com/YgMRrJW.gif", "https://i.imgur.com/IpuGKQ9.gif", "https://i.imgur.com/oHDlwaL.gif", "https://i.imgur.com/JlRBMeS.gif", "https://i.imgur.com/zQqhgM4.gif", "https://i.imgur.com/hrJJLu3.gif"] 77 | var path = __dirname + "/cache/menu.gif" 78 | var rdimg = img[Math.floor(Math.random() * img.length)]; 79 | 80 | let dowloadIMG = (await axios.get(rdimg, { responseType: "arraybuffer" } )).data; 81 | fs.writeFileSync(path, Buffer.from(dowloadIMG, "utf-8") ); 82 | imgP.push(fs.createReadStream(path)) 83 | const command = commands.values(); 84 | var group = [], msg = "» Danh sách lệnh hiện có «\n"; 85 | let check = true, page_num_input = ""; 86 | let bonus = 0; 87 | 88 | for (const commandConfig of command) { 89 | if (!group.some(item => item.group.toLowerCase() == commandConfig.config.commandCategory.toLowerCase())) group.push({ group: commandConfig.config.commandCategory.toLowerCase(), cmds: [commandConfig.config.name] }); 90 | else group.find(item => item.group.toLowerCase() == commandConfig.config.commandCategory.toLowerCase()).cmds.push(commandConfig.config.name); 91 | } 92 | 93 | if (args[0] && ["all", "-a"].includes(args[0].trim())) { 94 | let all_commands = []; 95 | group.forEach(commandGroup => { 96 | commandGroup.cmds.forEach(item => all_commands.push(item)); 97 | }); 98 | let page_num_total = Math.ceil(all_commands.length / 2222222222); 99 | if (args[1]) { 100 | check = false; 101 | page_num_input = parseInt(args[1]); 102 | if (isNaN(page_num_input)) msg = "Vui lòng chọn số"; 103 | else if (page_num_input > page_num_total || page_num_input <= 0) msg = "Số bạn chọn không nằm trong danh sách, vui lòng thử lại"; 104 | else check = true; 105 | } 106 | if (check) { 107 | index_start = (page_num_input) ? (page_num_input * 2222222222) - 2222222222 : 0; 108 | bonus = index_start; 109 | index_end = (index_start + 2222222222 > all_commands.length) ? all_commands.length : index_start + 2222222222; 110 | all_commands = all_commands.slice(index_start, index_end); 111 | all_commands.forEach(e => { 112 | msg += `\n${index_start+=1}. » ${e}: ${commands.get(e).config.description}`; 113 | }) 114 | msg += `\n\nTrang ${page_num_input || 1}/${page_num_total}`; 115 | msg += `\nĐể xem các trang khác, dùng: ${prefix}menu [all/-a] [số trang]`; 116 | msg += `\nBạn có thể dùng ${prefix}help all để xem tất cả lệnh` 117 | msg += "\n╭──────╮\n Reply \n╰──────╯tin nhắn theo số để xem thông tin chi tiết lệnh và cách sử dụng lệnh"; 118 | } 119 | var msgg = {body: msg, attachment: imgP} 120 | return api.sendMessage(msgg, threadID, (error, info) => { 121 | if (check) { 122 | global.client.handleReply.push({ 123 | type: "cmd_info", 124 | bonus: bonus, 125 | name: this.config.name, 126 | messageID: info.messageID, 127 | content: all_commands 128 | }) 129 | } 130 | }, messageID) 131 | } 132 | 133 | let page_num_total = Math.ceil(group.length / 2222222222); 134 | if (args[0]) { 135 | check = false; 136 | page_num_input = parseInt(args[0]); 137 | if (isNaN(page_num_input)) msg = "Vui lòng chọn số"; 138 | else if (page_num_input > page_num_total || page_num_input <= 0) msg = "Số bạn chọn không nằm trong danh sách, vui lòng thử lại"; 139 | else check = true; 140 | } 141 | if (check) { 142 | index_start = (page_num_input) ? (page_num_input * 2222222222) - 2222222222 : 0; 143 | bonus = index_start; 144 | index_end = (index_start + 2222222222 > group.length) ? group.length : index_start + 2222222222; 145 | group = group.slice(index_start, index_end); 146 | group.forEach(commandGroup => msg += `\n${index_start+=1}. » ${commandGroup.group.toUpperCase()} `); 147 | msg += `\n\nTrang【${page_num_input || 1}/${page_num_total}】`; 148 | msg += `\nĐể xem các trang khác, dùng: ${prefix}menu [số trang]`; 149 | msg += `\nBạn có thể dùng ${prefix}menu all để xem tất cả lệnh` 150 | msg += `\n╭──────╮\n Reply \n╰──────╯ tin nhắn theo số để xem các lệnh theo phân loại`; 151 | } 152 | var msgg = {body: msg, attachment: imgP} 153 | return api.sendMessage(msgg, threadID, async (error, info) => { 154 | global.client.handleReply.push({ 155 | name: this.config.name, 156 | bonus: bonus, 157 | messageID: info.messageID, 158 | content: group 159 | }) 160 | }); 161 | } 162 | -------------------------------------------------------------------------------- /includes/handle/handleCommand.js: -------------------------------------------------------------------------------- 1 | module.exports = function ({ api, models, Users, Threads, Currencies }) { 2 | const fs = require("fs"); 3 | const stringSimilarity = require('string-similarity'), 4 | escapeRegex = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), 5 | logger = require("../../utils/log.js"); 6 | const moment = require("moment-timezone"); 7 | return async function ({ event }) { 8 | const dateNow = Date.now(); 9 | const time = moment.tz("Asia/Ho_Chi_minh").format("HH:MM:ss DD/MM/YYYY"); 10 | const { allowInbox, PREFIX, ADMINBOT, NDH, DeveloperMode, adminOnly, keyAdminOnly, ndhOnly, adminPaseOnly } = global.config; 11 | const { userBanned, threadBanned, threadInfo, threadData, commandBanned } = global.data; 12 | const { commands, cooldowns } = global.client; 13 | var { body, senderID, threadID, messageID } = event; 14 | var senderID = String(senderID), 15 | threadID = String(threadID); 16 | const threadSetting = threadData.get(threadID) || {} 17 | const prefixRegex = new RegExp(`^(<@!?${senderID}>|${escapeRegex((threadSetting.hasOwnProperty("PREFIX")) ? threadSetting.PREFIX : PREFIX)})\\s*`); 18 | if (!prefixRegex.test(body)) return; 19 | const adminbot = require('./../../config.json'); 20 | 21 | if (!global.data.allThreadID.includes(threadID) && !ADMINBOT.includes(senderID) && adminbot.adminPaseOnly == true) return api.sendMessage("[ MODE ] - Chỉ admin mới được sử dụng bot trong chat riêng.", threadID, messageID) 22 | if (!ADMINBOT.includes(senderID) && adminbot.adminOnly == true) return api.sendMessage('[ MODE ] - Chỉ admin bot mới có thể sử dụng bot', threadID, messageID) 23 | if (!NDH.includes(senderID) && !ADMINBOT.includes(senderID) && adminbot.ndhOnly == true) return api.sendMessage('[ MODE ] - Chỉ người hỗ trợ bot mới có thể sử dụng bot', threadID, messageID) 24 | const dataAdbox = require('./../../modules/commands/cache/data.json'); 25 | var threadInf = (threadInfo.get(threadID) || await Threads.getInfo(threadID)); 26 | const findd = threadInf.adminIDs.find(el => el.id == senderID); 27 | if (dataAdbox.adminbox.hasOwnProperty(threadID) && dataAdbox.adminbox[threadID] == true && !ADMINBOT.includes(senderID) && !findd && event.isGroup == true) return api.sendMessage('[ MODE ] - Chỉ admin nhóm mới được sử dụng bot!!', event.threadID, event.messageID) 28 | if (userBanned.has(senderID) || threadBanned.has(threadID) || allowInbox == ![] && senderID == threadID) { 29 | if (!ADMINBOT.includes(senderID.toString())) { 30 | if (userBanned.has(senderID)) { 31 | const { reason, dateAdded } = userBanned.get(senderID) || {}; 32 | return api.sendMessage(global.getText("handleCommand", "userBanned", reason, dateAdded), threadID, async (err, info) => { 33 | await new Promise(resolve => setTimeout(resolve, 5 * 1000)); 34 | return api.unsendMessage(info.messageID); 35 | }, messageID); 36 | } else { 37 | if (threadBanned.has(threadID)) { 38 | const { reason, dateAdded } = threadBanned.get(threadID) || {}; 39 | return api.sendMessage(global.getText("handleCommand", "threadBanned", reason, dateAdded), threadID, async (err, info) => { 40 | await new Promise(resolve => setTimeout(resolve, 5 * 1000)); 41 | return api.unsendMessage(info.messageID); 42 | }, messageID); 43 | } 44 | } 45 | } 46 | } 47 | const [matchedPrefix] = body.match(prefixRegex), 48 | args = body.slice(matchedPrefix.length).trim().split(/ +/); 49 | commandName = args.shift().toLowerCase(); 50 | var command = commands.get(commandName); 51 | if (!command) { 52 | var allCommandName = []; 53 | const commandValues = commands['keys'](); 54 | for (const cmd of commandValues) allCommandName.push(cmd) 55 | const checker = stringSimilarity.findBestMatch(commandName, allCommandName); 56 | if (checker.bestMatch.rating >= 0.5) command = client.commands.get(checker.bestMatch.target); 57 | else return api.sendMessage(global.getText("handleCommand", "commandNotExist", checker.bestMatch.target), threadID); 58 | } 59 | if (commandBanned.get(threadID) || commandBanned.get(senderID)) { 60 | if (!ADMINBOT.includes(senderID)) { 61 | const banThreads = commandBanned.get(threadID) || [], 62 | banUsers = commandBanned.get(senderID) || []; 63 | if (banThreads.includes(command.config.name)) 64 | return api.sendMessage(global.getText("handleCommand", "commandThreadBanned", command.config.name), threadID, async (err, info) => { 65 | await new Promise(resolve => setTimeout(resolve, 5 * 1000)) 66 | return api.unsendMessage(info.messageID); 67 | }, messageID); 68 | if (banUsers.includes(command.config.name)) 69 | return api.sendMessage(global.getText("handleCommand", "commandUserBanned", command.config.name), threadID, async (err, info) => { 70 | await new Promise(resolve => setTimeout(resolve, 5 * 1000)); 71 | return api.unsendMessage(info.messageID); 72 | }, messageID); 73 | } 74 | } 75 | if (command.config.commandCategory.toLowerCase() == 'nsfw' && !global.data.threadAllowNSFW.includes(threadID) && !ADMINBOT.includes(senderID)) 76 | return api.sendMessage(global.getText("handleCommand", "threadNotAllowNSFW"), threadID, async (err, info) => { 77 | 78 | await new Promise(resolve => setTimeout(resolve, 5 * 1000)) 79 | return api.unsendMessage(info.messageID); 80 | }, messageID); 81 | var threadInfo2; 82 | if (event.isGroup == !![]) 83 | try { 84 | threadInfo2 = (threadInfo.get(threadID) || await Threads.getInfo(threadID)) 85 | if (Object.keys(threadInfo2).length == 0) throw new Error(); 86 | } catch (err) { 87 | logger(global.getText("handleCommand", "cantGetInfoThread", "error")); 88 | } 89 | var permssion = 0; 90 | var threadInfoo = (threadInfo.get(threadID) || await Threads.getInfo(threadID)); 91 | const find = threadInfoo.adminIDs.find(el => el.id == senderID); 92 | if (NDH.includes(senderID.toString())) permssion = 2; 93 | if (ADMINBOT.includes(senderID.toString())) permssion = 3; 94 | else if (!ADMINBOT.includes(senderID) && !NDH.includes(senderID) && find) permssion = 1; 95 | if (command.config.hasPermssion > permssion) return api.sendMessage(global.getText("handleCommand", "permssionNotEnough", command.config.name), event.threadID, event.messageID); 96 | 97 | if (!client.cooldowns.has(command.config.name)) client.cooldowns.set(command.config.name, new Map()); 98 | const timestamps = client.cooldowns.get(command.config.name);; 99 | const expirationTime = (command.config.cooldowns || 1) * 1000; 100 | if (timestamps.has(senderID) && dateNow < timestamps.get(senderID) + expirationTime) 101 | return api.sendMessage(`⏱ Bạn đang trong thời gian chờ!\n Vui lòng thử lại sau ${((timestamps.get(senderID) + expirationTime - dateNow)/1000).toString().slice(0, 5)}s nữa nhé`, threadID, messageID); 102 | 103 | var getText2; 104 | if (command.languages && typeof command.languages == 'object' && command.languages.hasOwnProperty(global.config.language)) 105 | getText2 = (...values) => { 106 | var lang = command.languages[global.config.language][values[0]] || ''; 107 | for (var i = values.length; i > 0x2533 + 0x1105 + -0x3638; i--) { 108 | const expReg = RegExp('%' + i, 'g'); 109 | lang = lang.replace(expReg, values[i]); 110 | } 111 | return lang; 112 | }; 113 | else getText2 = () => { }; 114 | try { 115 | const Obj = {}; 116 | Obj.api = api 117 | Obj.event = event 118 | Obj.args = args 119 | Obj.models = models 120 | Obj.Users = Users 121 | Obj.Threads = Threads 122 | Obj.Currencies = Currencies 123 | Obj.permssion = permssion 124 | Obj.getText = getText2 125 | command.run(Obj); 126 | timestamps.set(senderID, dateNow); 127 | if (DeveloperMode == !![]) 128 | logger(global.getText("handleCommand", "executeCommand", time, commandName, senderID, threadID, args.join(" "), (Date.now()) - dateNow), "[ DEV MODE ]"); 129 | return; 130 | } catch (e) { 131 | return api.sendMessage(global.getText("handleCommand", "commandError", commandName, e), threadID); 132 | } 133 | }; 134 | }; 135 | -------------------------------------------------------------------------------- /modules/commands/baucua.js: -------------------------------------------------------------------------------- 1 | var request = require("request");const { readdirSync, readFileSync, writeFileSync, existsSync, copySync, createWriteStream, createReadStream } = require("fs-extra"); 2 | module.exports.config = { 3 | name: "baucua", 4 | version: "1.0.0", 5 | hasPermssion: 0, 6 | credits: "Horizon Lucius Synthesis I", 7 | description: "bầu cua duma mệt", 8 | commandCategory: "Penguin", 9 | usages: "baucua + tên + tìn :v", 10 | cooldowns: 5 11 | }; 12 | 13 | module.exports.onLoad = async function () { 14 | if (!existsSync(__dirname + '/cache/ga.jpg')) { 15 | request('https://i.imgur.com/jPdZ1Q8.jpg').pipe(createWriteStream(__dirname + '/cache/ga.jpg')); 16 | } 17 | if (!existsSync(__dirname + '/cache/tom.jpg')) { 18 | request('https://i.imgur.com/4214Xx9.jpg').pipe(createWriteStream(__dirname + '/cache/tom.jpg')); 19 | } 20 | if (!existsSync(__dirname + '/cache/bau.jpg')) { 21 | request('https://i.imgur.com/4KLd4EE.jpg').pipe(createWriteStream(__dirname + '/cache/bau.jpg')); 22 | } 23 | if (!existsSync(__dirname + '/cache/cua.jpg')) { 24 | request('https://i.imgur.com/s8YAaxx.jpg').pipe(createWriteStream(__dirname + '/cache/cua.jpg')); 25 | } 26 | if (!existsSync(__dirname + '/cache/ca.jpg')) { 27 | request('https://i.imgur.com/YbFzAOU.jpg').pipe(createWriteStream(__dirname + '/cache/ca.jpg')); 28 | } 29 | if (!existsSync(__dirname + '/cache/nai.jpg')) { 30 | request('https://i.imgur.com/UYhUZf8.jpg').pipe(createWriteStream(__dirname + '/cache/nai.jpg')); 31 | } 32 | if (!existsSync(__dirname + '/cache/baucua.gif')) { 33 | request('https://i.imgur.com/dlrQjRL.gif').pipe(createWriteStream(__dirname + '/cache/baucua.gif')); 34 | } 35 | }; 36 | 37 | async function get(one,two,three) { 38 | var x1; 39 | switch (one) { 40 | case "ga": x1 = "🐓"; 41 | break; 42 | case "tom": x1 = '🦞'; 43 | break; 44 | case "bau": x1 = '🍐'; 45 | break; 46 | case "cua": x1 = '🦀'; 47 | break; 48 | case "ca": x1 = '🐟'; 49 | break; 50 | case "nai":x1 = '🦌'; 51 | } 52 | var x2; 53 | switch (two) { 54 | case "ga": x2 = "🐓"; 55 | break; 56 | case "tom": x2 = '🦞'; 57 | break; 58 | case "bau": x2 = '🍐'; 59 | break; 60 | case "cua": x2 = '🦀'; 61 | break; 62 | case "ca": x2 = '🐟'; 63 | break; 64 | case "nai": x2 = '🦌'; 65 | } 66 | var x3; 67 | switch (three) { 68 | case "ga": x3 = "🐓"; 69 | break; 70 | case "tom": x3 = '🦞'; 71 | break; 72 | case "bau": x3 = '🍐'; 73 | break; 74 | case "cua": x3 = '🦀'; 75 | break; 76 | case "ca": x3 = '🐟'; 77 | break; 78 | case "nai":x3 = '🦌'; 79 | } 80 | var all = [x1, x2, x3]; 81 | return full = all; 82 | } 83 | var full = []; 84 | module.exports.run = async function({ api, event, args, Currencies }) { var out = (msg) => api.sendMessage(msg,event.threadID, event.messageID); 85 | const slotItems = ["ga", "tom", "bau", "cua", "ca", "nai"]; 86 | const moneyUser = (await Currencies.getData(event.senderID)).money; 87 | var moneyBet = parseInt(args[1]); 88 | if (!args[0] || !isNaN(args[0])) return api.sendMessage("[𝑷𝑮🐧] => Hãy Bấm : /baucua [bầu/cua/cá/nai/gà/tôm] [số tiền]",event.threadID, event.messageID); 89 | if (isNaN(moneyBet) || moneyBet <= 0) return api.sendMessage("[𝑷𝑮🐧] => Số tiền đặt cược không được để trống hoặc là số tiền âm", event.threadID, event.messageID); 90 | if (moneyBet > moneyUser) return api.sendMessage("[𝑷𝑮🐧] => Số tiền bạn đặt lớn hơn số dư của bạn!", event.threadID, event.messageID); 91 | if (moneyBet < 1000) return api.sendMessage("[𝑷𝑮🐧] => Số tiền đặt không được dưới 1000 đô!", event.threadID, event.messageID); 92 | var number = [], win = false; 93 | for (let i = 0; i < 3; i++) number[i] = slotItems[Math.floor(Math.random() * slotItems.length)]; 94 | var itemm; 95 | var icon; 96 | switch (args[0]) { 97 | case "bầu": 98 | case "Bầu": itemm = "bau"; 99 | icon = '🍐'; 100 | break; 101 | case "cua": 102 | case "Cua": itemm = "cua"; 103 | icon = '🦀'; 104 | break; 105 | case "cá": 106 | case "Cá": itemm = "ca"; 107 | icon = '🐟'; 108 | break; 109 | case "nai": 110 | case "Nai": itemm = "nai"; 111 | icon = '🦌'; 112 | break; 113 | case "gà": 114 | case "Gà": itemm = "ga"; 115 | icon = '🐓'; 116 | break; 117 | case "tôm": 118 | case "Tôm": itemm = "tom"; 119 | icon = '🦞'; 120 | break; 121 | default: return api.sendMessage("[𝑷𝑮🐧] => Hãy Bấm : /baucua [bầu/cua/cá/nai/gà/tôm] [số tiền]",event.threadID, event.messageID); 122 | } 123 | await get(number[0],number[1],number[2]); 124 | api.sendMessage({body:"[𝑷𝑮🐧] => Đang Đập, À Không Đang Lắc!",attachment: createReadStream(__dirname + "/cache/baucua.gif")},event.threadID,async (error,info) => { 125 | await new Promise(resolve => setTimeout(resolve, 5 * 1000)); 126 | api.unsendMessage(info.messageID); 127 | await new Promise(resolve => setTimeout(resolve, 100)); 128 | var array = [number[0],number[1],number[2]]; 129 | var listimg = []; 130 | for (let string of array) { 131 | listimg.push(createReadStream(__dirname + `/cache/${string}.jpg`)); 132 | } 133 | if (array.includes(itemm)) { 134 | var i = 0; 135 | if (array[0] == itemm) i+=1; 136 | if (array[1] == itemm) i+=1; 137 | if (array[2] == itemm) i+=1; 138 | if (i == 1) { 139 | var mon = parseInt(args[1]) + 300; 140 | await Currencies.increaseMoney(event.senderID, mon); console.log("s1") 141 | return api.sendMessage({body:`[𝑷𝑮🐧] => Kết Quả : ${full.join("|")}\n[✤] => Được ${mon} Đô,Vì Có 1 ${icon}!`,attachment: listimg},event.threadID, event.messageID); 142 | } 143 | else if (i == 2) { 144 | var mon = parseInt(args[1]) * 2; 145 | await Currencies.increaseMoney(event.senderID, mon); console.log("s2") 146 | return api.sendMessage({body:`[𝑷𝑮🐧] => Kết Quả : ${full.join("|")}\n[✤] => Được ${mon} Đô,Vì Có 2 ${icon}!`,attachment: listimg},event.threadID, event.messageID); 147 | } 148 | else if (i == 3) { 149 | var mon = parseInt(args[1]) * 3; 150 | await Currencies.increaseMoney(event.senderID, mon); console.log('s3') 151 | return api.sendMessage({body:`[𝑷𝑮🐧] => Kết Quả : ${full.join("|")}\n[✤] => Được ${mon} Đô,Vì Có 3 ${icon}!`,attachment: listimg},event.threadID, event.messageID); 152 | } 153 | else return api.sendMessage("[𝑷𝑮🐧] => Lỗi ! Code : XX1N",event.threadID,event.messageID); 154 | } else { 155 | await Currencies.decreaseMoney(event.senderID, parseInt(args[1])); console.log('s4') 156 | return api.sendMessage({body:`[𝑷𝑮🐧] => Kết Quả : ${full.join("|")}\n[✤] => Trừ ${args[1]} Đô,Vì Có 0 ${icon}!`,attachment: listimg},event.threadID, event.messageID); 157 | } 158 | } ,event.messageID); 159 | }; 160 | --------------------------------------------------------------------------------