├── README.md ├── configs └── index.js ├── connection.js ├── functions └── index.js ├── handlerMessage └── index.js ├── helpers └── index.js ├── images └── thumbnail.jpg ├── index.js ├── package.json ├── sendingMessage └── index.js └── tmp ├── 7593.jpg └── data.exif /README.md: -------------------------------------------------------------------------------- 1 |
2 | YOGI 3 | 4 | ## Multi Device 5 |
6 | 7 |

8 | 9 |

10 | 11 | # Settings 12 | * [`Get Apikeys`](https://api-xcoders.xyz/) 13 | 14 | # Requirements 15 | * [Node.js](https://nodejs.org/en/) 16 | * [Git](https://git-scm.com/downloads) 17 | * [FFmpeg](https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2020-12-08-13-03/ffmpeg-n4.3.1-26-gca55240b8c-win64-gpl-4.3.zip) 18 | * [Libwebp](https://developers.google.com/speed/webp/download) 19 | * Any text editor 20 | 21 | 22 | ## For Termux 23 | ``` 24 | > termux-setup-storage 25 | > apt update && apt upgrade 26 | > pkg install nodejs 27 | > pkg install git 28 | > pkg install ffmpeg 29 | ``` 30 | 31 | 32 | ## Connect With Me 33 |

34 | InstagramWhatsApp 35 |

36 | 37 | # Thanks To 38 | * [`Baileys`](https://github.com/adiwajshing/Baileys) 39 | -------------------------------------------------------------------------------- /configs/index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | 3 | global.apikeys = "Your Apikeys"; 4 | global.prefix = "!"; 5 | global.multiprefix = false; 6 | global.nonprefix = false; 7 | global.watermark = "𝕎𝕙𝕒𝕥𝕤𝔸𝕡𝕡 𝔹𝕆𝕋 𝕄𝕦𝕝𝕥𝕚 𝔻𝕖𝕧𝕚𝕔𝕖"; 8 | global.packname = "Created By"; 9 | global.authorname = "Farhannn"; 10 | global.language = true; 11 | global.ownerNumber = ["0@s.whatsapp.net"]; 12 | global.thumbnail = fs.readFileSync("./images/thumbnail.jpg"); 13 | global.responseEN = { 14 | isCreators: "*Owner Only*", 15 | success: "*Success...*", 16 | error: { 17 | request: "*Oops, Your request error '_'*", 18 | url: "*Invalid Input url*" 19 | }, 20 | process: "```[⏳] Waiting Processed```", 21 | }; 22 | global.responseID = { 23 | isCreators: "*Khusus Owner*", 24 | success: "*Sukses...*", 25 | error: { 26 | request: "*Ups, permintaan Anda error '_'*", 27 | url: "*URL Yang Anda Masukkan Tidak Valid*" 28 | }, 29 | process: "```[⏳] Mohon Tunggu Permintaan Anda Diproses```", 30 | }; 31 | 32 | let file = require.resolve(__filename); 33 | fs.watchFile(file, () => { 34 | fs.unwatchFile(file); 35 | console.log(`Update ${__filename}`); 36 | delete require.cache[file]; 37 | require(file); 38 | }); 39 | -------------------------------------------------------------------------------- /connection.js: -------------------------------------------------------------------------------- 1 | const { spawn } = require("child_process"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | function start(connect) { 6 | let args = [path.join(connect), ...process.argv.slice(2)]; 7 | let p = spawn(process.argv[0], args, { 8 | stdio: ['inherit', 'inherit', 'inherit', 'ipc'] 9 | }).on('message', data => { 10 | console.log('[RECEIVED]', data); 11 | switch (data) { 12 | case 'reset': 13 | p.kill(); 14 | start.apply(this, arguments); 15 | break; 16 | case 'uptime': 17 | p.send(process.uptime()); 18 | break; 19 | } 20 | }).on('error', e => { 21 | console.error(e); 22 | fs.watchFile(args[0], () => { 23 | start(); 24 | fs.unwatchFile(args[0]); 25 | }); 26 | }); 27 | } 28 | start('./index'); -------------------------------------------------------------------------------- /functions/index.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const formData = require("form-data"); 3 | const { fromBuffer } = require("file-type"); 4 | const { sizeFormatter } = require("human-readable"); 5 | const fs = require("fs"); 6 | 7 | exports.getBuffer = this.getBuffer = (url) => { 8 | return new Promise(async(resolve, reject) => { 9 | await axios.request({ 10 | method: "GET", 11 | url: url, 12 | headers: { 13 | DNT: 1, 14 | "Upgrade-Insecure-Request": 1 15 | }, 16 | responseType: "arraybuffer" 17 | }) 18 | .then(({ data }) => resolve(data)) 19 | .catch(reject); 20 | }); 21 | }; 22 | 23 | exports.getJson = this.getJson = (url) => { 24 | return new Promise(async(resolve, reject) => { 25 | await axios.get(url) 26 | .then(({ data }) => resolve(data)) 27 | .catch(reject); 28 | }); 29 | }; 30 | 31 | exports.runtime = this.runtime = (seconds) => { 32 | seconds = Number(seconds); 33 | var d = Math.floor(seconds / (3600 * 24)); 34 | var h = Math.floor(seconds % (3600 * 24) / 3600); 35 | var m = Math.floor(seconds % 3600 / 60); 36 | var s = Math.floor(seconds % 60); 37 | var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : ""; 38 | var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : ""; 39 | var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : ""; 40 | var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : ""; 41 | return dDisplay + hDisplay + mDisplay + sDisplay; 42 | }; 43 | 44 | exports.sizeFormat = this.sizeFormat = sizeFormatter({ 45 | std: "JEDEC", 46 | decimalPlaces: 2, 47 | keepTrailingZeroes: false, 48 | render: (literal, symbol) => `${literal} ${symbol}B`, 49 | }); 50 | 51 | exports.h2k = this.h2k = (number) => { 52 | var SI_POSTFIXES = ["", " K", " M", " G", " T", " P", " E"]; 53 | var tier = Math.log10(Math.abs(number)) / 3 | 0; 54 | if (tier == 0) return number; 55 | var postfix = SI_POSTFIXES[tier]; 56 | var scale = Math.pow(10, tier * 3); 57 | var scaled = number / scale; 58 | var formatted = scaled.toFixed(1) + ""; 59 | if (/\.0$/.test(formatted)) 60 | formatted = formatted.substr(0, formatted.length - 2); 61 | return formatted + postfix; 62 | }; 63 | 64 | exports.getRandom = this.getRandom = (ext) => { 65 | return `${Math.floor(Math.random() * 10000)+1}${ext}`; 66 | }; 67 | exports.getNumberAdminsGroups = this.getNumberAdminsGroups = (participant) => { 68 | let position = []; 69 | for (let i = 0; i < participant.length; i++) { 70 | if(participant[i].admin !== null) { 71 | position.push(participant[i].id); 72 | } 73 | } 74 | return position; 75 | }; 76 | 77 | exports.exif = this.exif = (packname, authorname, filename) => { 78 | if (!filename) filename = "data"; 79 | const packID = "com.snowcorp.stickerly.android.stickercontentprovider b5e7275f-f1de-4137-961f-57becfad34f2"; 80 | const playstore = "https://play.google.com/store/apps/details?id=com.stickify.stickermaker"; 81 | const itunes = "https://itunes.apple.com/app/sticker-maker-studio/id1443326857"; 82 | const json = { 83 | "sticker-pack-id": packID, 84 | "sticker-pack-name": packname, 85 | "sticker-pack-publisher": authorname, 86 | "android-app-store-link": playstore, 87 | "ios-app-store-link": itunes 88 | }; 89 | let len = JSON.stringify(json).length; 90 | const f = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00]); 91 | const code = [0x00, 0x00, 0x16, 0x00, 0x00, 0x00]; 92 | if (len > 256) { 93 | len = len - 256; 94 | code.unshift(0x01); 95 | } else { 96 | code.unshift(0x00); 97 | } 98 | const fff = Buffer.from(code); 99 | const ffff = Buffer.from(JSON.stringify(json)); 100 | if (len < 16) { 101 | len = len.toString(16); 102 | len = "0" + len; 103 | } else { 104 | len = len.toString(16); 105 | } 106 | const ff = Buffer.from(len, "hex"); 107 | const buffer = Buffer.concat([f, ff, fff, ffff]); 108 | fs.writeFile(`./tmp/${filename}.exif`, buffer, (err) => { 109 | if (err) return console.error(err); 110 | console.log("Success!"); 111 | }); 112 | }; 113 | 114 | exports.uploader = this.uploader = async (buffer) => { 115 | return new Promise(async(resolve, reject) => { 116 | const { ext } = await fromBuffer(buffer); 117 | let FormData = new formData(); 118 | FormData.append("file", buffer, `${Date.now() +"."+ ext}`); 119 | let data; 120 | await axios({ 121 | method: "POST", 122 | url: "https://telegra.ph/upload", 123 | data: FormData.getBuffer(), 124 | headers: { 125 | ...FormData.getHeaders() 126 | } 127 | }) 128 | .then(({ data }) => { 129 | if(data.error) throw data.error; 130 | resolve(`https://telegra.ph${data[0].src}`); 131 | }).catch(reject); 132 | }); 133 | }; 134 | 135 | let file = require.resolve(__filename); 136 | fs.watchFile(file, () => { 137 | fs.unwatchFile(file); 138 | console.log(`Update ${__filename}`); 139 | delete require.cache[file]; 140 | require(file); 141 | }); 142 | -------------------------------------------------------------------------------- /handlerMessage/index.js: -------------------------------------------------------------------------------- 1 | //External Modules 2 | const { 3 | downloadContentFromMessage 4 | } = require("@adiwajshing/baileys-md"); 5 | const { 6 | fromBuffer 7 | } = require("file-type"); 8 | const perf = require("perf_hooks").performance; 9 | const chalk = require("chalk"); 10 | const util = require("util"); 11 | const axios = require("axios"); 12 | const moment = require("moment-timezone"); 13 | const speed = require("performance-now"); 14 | const child = require("child_process"); 15 | const ffmpeg = require("fluent-ffmpeg"); 16 | const os = require("os"); 17 | const fs = require("fs"); 18 | 19 | //internal Modules 20 | require("./../configs"); 21 | const { 22 | getBuffer, 23 | getJson, 24 | runtime, 25 | sizeFormat, 26 | h2k, 27 | getRandom, 28 | getNumberAdminsGroups, 29 | exif, 30 | uploader 31 | } = require("./../functions"); 32 | 33 | const { 34 | help, 35 | stats 36 | } = require("./../helpers"); 37 | 38 | const { 39 | sendButtonsMenu, 40 | buttonsDownload, 41 | sendImage, 42 | sendAudio, 43 | sendVideo 44 | } = require("./../sendingMessage"); 45 | 46 | //global configs 47 | let owners = global.ownerNumber; 48 | let apikeys = global.apikeys; 49 | let watermark = global.watermark; 50 | let packname = global.packname; 51 | let authorname = global.authorname; 52 | let multiprefix = global.multiprefix; 53 | let nonprefix = global.nonprefix; 54 | let thumbnail = global.thumbnail; 55 | let participantRequest = []; 56 | 57 | module.exports = async (xcoders, x) => { 58 | try { 59 | const type = Object.keys(x.message)[0]; 60 | const content = JSON.stringify(x.message); 61 | const from = x.key.remoteJid; 62 | const cmd = (type === "conversation" && x.message.conversation) ? x.message.conversation : (type == "imageMessage") && x.message.imageMessage.caption ? x.message.imageMessage.caption : (type == "videoMessage") && x.message.videoMessage.caption ? x.message.videoMessage.caption : (type == "extendedTextMessage") && x.message.extendedTextMessage.text ? x.message.extendedTextMessage.text : "".slice(1).trim().split(/ +/).shift().toLowerCase(); 63 | let prefix; 64 | if (multiprefix) { 65 | prefix = /^[°⊳π÷×¶∆£¢€¥®™✓=|~zZ+×_!#$%^&./\\©^]/.test(cmd) ? cmd.match(/^[°⊳π÷×¶∆£¢€¥®™✓=|~zZ+×_!#$,|`÷?;:%abcdefghijklmnopqrstuvwxyz%^&./\\©^]/gi) : "."; 66 | } else { 67 | if (nonprefix) prefix = ""; 68 | else prefix = global.prefix; 69 | } 70 | const buttonsResponseText = (type == "buttonsResponseMessage") ? x.message.buttonsResponseMessage.selectedDisplayText : ""; 71 | const buttonsResponseID = (type == "buttonsResponseMessage") ? x.message.buttonsResponseMessage.selectedButtonId : ""; 72 | const body = (type === "conversation" && x.message.conversation.startsWith(prefix)) ? x.message.conversation : (type == "imageMessage") && x.message[type].caption.startsWith(prefix) ? x.message[type].caption : (type == "videoMessage") && x.message[type].caption.startsWith(prefix) ? x.message[type].caption : (type == "extendedTextMessage") && x.message[type].text.startsWith(prefix) ? x.message[type].text : (type == "templateButtonReplyMessage") && x.message.templateButtonReplyMessage.selectedId ? x.message.templateButtonReplyMessage.selectedId : ""; 73 | const budy = (type === "conversation") ? x.message.conversation : (type === "extendedTextMessage") ? x.message.extendedTextMessage.text : ""; 74 | const isCmd = body.startsWith(prefix); 75 | const isGroups = from.endsWith("@g.us"); 76 | const metadataGroups = isGroups ? await xcoders.groupMetadata(from) : ""; 77 | const nameGroups = isGroups ? metadataGroups.subject : ""; 78 | const countAdminsGroups = isGroups ? metadataGroups.participants.map(map => map.admin == null).filter(fill => fill == true).length : ""; 79 | const getParticipants = isGroups ? metadataGroups.participants : ""; 80 | const getAdminsGroups = isGroups ? getNumberAdminsGroups(getParticipants) : ""; 81 | 82 | const senderNumber = isGroups ? x.key.participant : x.key.remoteJid; 83 | const senderName = x.pushName; 84 | const isCreators = x.key.fromMe || owners.includes(senderNumber); 85 | const command = body.replace(prefix, "").trim().split(/ +/).shift().toLowerCase(); 86 | const args = body.trim().split(/ +/).slice(1); 87 | const query = body.trim().substring(body.indexOf(" ") + 1); 88 | 89 | const timeNow = moment.tz("Asia/Jakarta").format("HH:mm"); 90 | const hours = moment(Date.now()).tz("Asia/Jakarta").locale("id").format("a"); 91 | const says = `Selamat ${hours.charAt(0).toUpperCase() + hours.slice(1)}`; 92 | let response; 93 | if(global.language == false) { 94 | response = global.responseID; 95 | } else { 96 | response = global.responseEN; 97 | } 98 | 99 | //sender message 100 | const reply = async (text) => { 101 | await xcoders.sendMessage(from, { text }, { quoted: x }); 102 | }; 103 | const toJSON = (string) => { 104 | return JSON.stringify(string, null, 2); 105 | }; 106 | const monospace = (string) => { 107 | return "```"+ string +"```"; 108 | }; 109 | const isUrl = (url) => { 110 | return url.match(new RegExp(/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)?/gi)); 111 | }; 112 | 113 | if (!isCmd) { 114 | if (isGroups) console.log(chalk.bgBlack.italic.red.bold(timeNow), chalk.italic.red("[ MSG ]"), chalk.bold.italic.greenBright(" From "), chalk.italic.bold.yellow(senderName), chalk.italic.bold.greenBright("in"), chalk.visible.italic.bold(nameGroups)); 115 | else if (!isGroups) console.log(chalk.bgBlack.italic.red.bold(timeNow), chalk.italic.red("[ MSG ]"), chalk.bold.italic.greenBright(" From "), chalk.italic.bold.yellow(senderName)); 116 | } else { 117 | if (isGroups) console.log(chalk.bgBlack.red.italic.bold(timeNow), chalk.bold.italic.green(`[ EXEC ${command.toUpperCase()} ]`), chalk.italic.greenBright.bold(" From"), chalk.bold.italic.yellow(senderName), chalk.italic.bold.greenBright("in"), chalk.bold.italic.yellow(nameGroups)); 118 | else if (!isGroups) console.log(chalk.bgBlack.red.italic.bold(timeNow), chalk.bold.italic.greenBright(`[ EXEC ${command.toUpperCase()} ]`), chalk.italic.greenBright.bold(" From"), chalk.bold.italic.yellow(senderName)); 119 | } 120 | const isQuotedImage = (type == "extendedTextMessage") && content.includes("imageMessage"); 121 | const isQuotedAudio = (type == "extendedTextMessage") && content.includes("audioMessage"); 122 | const isQuotedDocument = (type == "extendedTextMessage") && content.includes("documentMessage"); 123 | const isQuotedVideo = (type == "extendedTextMessage") && content.includes("videoMessage"); 124 | const isQuotedSticker = (type == "extendedTextMessage") && content.includes("stickerMessage"); 125 | 126 | switch (command) { 127 | case "statistic": 128 | xcoders.sendMessage(from, { text: monospace(stats(os, speed, perf, performance, runtime, sizeFormat)) }, { quoted: x }); 129 | break; 130 | case "help": case "menu": 131 | sendButtonsMenu(from, xcoders, prefix, senderName, thumbnail, says, x); 132 | break; 133 | case "allmenu": 134 | xcoders.sendMessage(from, { text: help(prefix), mentions: [senderNumber] }, { quoted: x }); 135 | break; 136 | case "owner": 137 | let vcard = "BEGIN:VCARD\n" + "VERSION:3.0\n" + "FN:Fxc7\n" + "ORG:Fxc7;\n" + "TEL;type=CELL;type=VOICE;waid="+ owners[0].split("@")[0].replace(/[^0-9]/g, "") +":+"+ owners[0].split("@")[0].replace(/[^0-9]/g, "") +"\n" + "END:VCARD"; 138 | xcoders.sendMessage(from, { contacts: { displayName: "Farhannnn", contacts: [{ vcard }] } }, { quoted: x }); 139 | break; 140 | 141 | //downloader 142 | case "tiktok": 143 | if (args.length < 1) return reply(`Example: ${prefix + command} https://vt.tiktok.com/ZSJhvu1AE`); 144 | if (!query.match(/tiktok/gi)) return reply(response.error.url); 145 | var res = await getJson(`https://api-xcoders.xyz/api/download/tiktok3?url=${query}&apikey=${apikeys}`); 146 | if (res.result == undefined || res.status == false) return reply(response.error.request); 147 | reply(response.process); 148 | const caption = monospace(`\n\t\t『 TIKTOK DOWNLOADER 』\n\n❑ Request Form: @${senderNumber.split("@")[0]}\nMerespon Dalam: ${res.processed}\n`); 149 | await buttonsDownload(from, xcoders, res.result.video_nowm, res.result.audio, res.result.thumbnail, caption, x, senderNumber); 150 | participantRequest.push(senderNumber); 151 | break; 152 | case "ytshort": 153 | if (args.length < 1) return reply(`Example: ${prefix + command} https://youtube.com/shorts/kkScVmU_2Lg?feature=share`); 154 | if (!query.match(/youtube\.com\/short/gi)) return reply(response.error.url); 155 | var res = await getJson(`https://api-xcoders.xyz/api/download/ytshort?url=${query}&apikey=${apikeys}`); 156 | if (res.status == false) return reply(response.error.request); 157 | ytshort = monospace(`\n\t\t\t\t『 YOUTUBE SHORT 』\n\n❑ Title: ${res.result.title}\n❑ Quality: ${res.result.quality}\n❑ Size: ${res.result.size}\n`); 158 | sendImage(from, xcoders, res.result.thumbnail, ytshort, x); 159 | reply(response.process); 160 | sendVideo(from, xcoders, res.result.url, response.success, x); 161 | break; 162 | case "ytmp3": 163 | if (args.length < 1) return reply(`Example: ${prefix + command} https://youtu.be/Nq5rzeJ5Ab4`); 164 | if (!query.match(/youtu/gi)) return reply(response.error.url); 165 | var res = await getJson(`https://api-xcoders.xyz/api/download/ytmp3?url=${encodeURIComponent(query)}&apikey=${apikeys}`); 166 | if (res.status == false) return reply(response.error.request); 167 | ytmp3 = monospace(`\n\t\t\t\t『 YOUTUBE MP3 』\n\n❑ Title: ${res.result.title}\n❑ Quality: ${res.result.quality}\n❑ Size: ${res.result.size}\n`); 168 | sendImage(from, xcoders, res.result.thumbnail, ytmp3, x); 169 | reply(response.process); 170 | sendAudio(from, xcoders, res.result.url, res.result.title, x); 171 | break; 172 | case "ytmp4": 173 | if (args.length < 1) return reply(`Example: ${prefix + command} https://youtu.be/Nq5rzeJ5Ab4`); 174 | if (!query.match(/youtu/gi)) return reply(response.error.url); 175 | var res = await getJson(`https://api-xcoders.xyz/api/download/ytmp4?url=${encodeURIComponent(query)}&apikey=${apikeys}`); 176 | if (res.status == false) return reply(response.error.request); 177 | ytmp4 = monospace(`\n\t\t\t\t『 YOUTUBE MP4 』\n\n❑ Title: ${res.result.title}\n❑ Quality: ${res.result.quality}\n❑ Size: ${res.result.size}\n`); 178 | sendImage(from, xcoders, res.result.thumbnail, ytmp4, x); 179 | reply(response.process); 180 | sendVideo(from, xcoders, res.result.url, response.success, x); 181 | break; 182 | case "joox": 183 | if (args.length < 1) return reply(`Example: ${prefix + command} momolog pamumgkas`); 184 | var res = await getJson(`https://api-xcoders.xyz/api/download/joox?query=${encodeURIComponent(query)}&apikey=${apikeys}`); 185 | if (res.result == undefined || res.status == false) return reply(response.error.request); 186 | joox = monospace(`\n\t\t\t\t『 JOOX DOWNLOADER 』\n\n❑ Title: ${res.result.judul}\n❑ Artist: ${res.result.artist}\n❑ Album: ${res.result.album}\n❑ Size: ${res.result.size}\n❑ Duration: ${res.result.duration}\n`); 187 | sendImage(from, xcoders, res.result.thumbnail, joox, x); 188 | reply(response.process); 189 | sendAudio(from, xcoders, res.result.link, res.result.judul+".mp3", x); 190 | break; 191 | case "fbdl": 192 | if (args.length < 1) return reply(`Example: ${prefix + command} https://www.facebook.com/alanwalkermusic/videos/277641643524720`); 193 | if (!query.match(/facebook/gi)) return reply(response.error.url); 194 | var res = await getJson(`https://api-xcoders.xyz/api/download/fb?url=${query}&apikey=${apikeys}`); 195 | if (res.result == undefined || res.status == false) return reply(response.error.request); 196 | const fbdlUrl = await axios.get(`https://tinyurl.com/api-create.php?url=${res.result.data.url}`); 197 | if (res.result.data.size > 50000000) { 198 | var fbdl = monospace(`\n\t\t\t\t『 FACEBOOK DOWNLOADER 』\n\n❑ Size: ${res.result.data.formattedSize}\n❑ Quality: ${res.result.data.quality}\n\n\nOps Your Request Soo Large Please Klick Url Below To Download Video\n\n❑ Url: ${fbdlUrl.data}`); 199 | sendImage(from, xcoders, res.result.thumbnail, fbdl, x); 200 | } else { 201 | var fbdl = monospace(`\n\t\t\t\t『 FACEBOOK DOWNLOADER 』\n\n❑ Size: ${res.result.data.formattedSize}\n❑ Quality: ${res.result.data.quality}\n`); 202 | sendImage(from, xcoders, res.result.thumbnail, fbdl, x); 203 | reply(response.process); 204 | sendVideo(from, xcoders, fbdlUrl.data, response.success, x); 205 | } 206 | break 207 | case "igdl": 208 | if (args.length < 1) return reply(`Example: ${prefix + command} https://www.instagram.com/p/CNtpwxuH5NK/?igshid=g26k5coikzwr`) 209 | if (!query.match(/instagram\.com\/(?:p|reel)/gi)) return reply(response.error.url); 210 | await getJson(`https://api-xcoders.xyz/api/download/ig?url=${query}&apikey=${apikeys}`).then(async res => { 211 | if (res.result == undefined || res.status == false) return reply(response.error.request); 212 | if (res.result.media_count == 1) { 213 | if (res.result.type == "image") { 214 | var caption = monospace(`\n\t\t\t\t\t『 INSTAGRAM DOWNLOADER 』\n\n❑ Username: ${res.result.username}\n❑ Fullname: ${res.result.name}\n❑ Like: ${res.result.likes}\n❑ Caption: ${res.result.caption}\n`); 215 | reply(response.process) 216 | sendImage(from, xcoders, res.result.url, caption, x); 217 | } else if (res.result.type == "video") { 218 | var caption = monospace(`\n\t\t\t\t\t『 INSTAGRAM DOWNLOADER 』\n\n❑ Username: ${res.result.username}\n❑ Fullname: ${res.result.name}\n❑ Duration: ${res.result.duration}\n❑ ViewsCount: ${res.result.viewCount}\n❑ Like: ${res.result.likes}\n❑ Caption: ${res.result.caption}\n`); 219 | reply(response.process); 220 | sendVideo(from, xcoders, res.result.url, caption, x); 221 | } else { 222 | reply(response.error.request); 223 | } 224 | } else if (res.result.media_count !== 1) { 225 | var caption = monospace(`\n\t\t\t\t\t『 INSTAGRAM DOWNLOADER 』\n\n❑ Username: ${res.result.username}\n❑ Fullname: ${res.result.name}\n❑ Like: ${res.result.likes}\n❑ Caption: ${res.result.caption}\n`); 226 | reply(response.process); 227 | for (let grapSidecar of res.result.link) { 228 | if (grapSidecar.type == "image") { 229 | sendImage(from, xcoders, grapSidecar.url, caption, x); 230 | } else { 231 | sendVideo(from, xcoders, grapSidecar.url, caption, x); 232 | } 233 | } 234 | } else { 235 | reply(response.error.request); 236 | } 237 | }).catch(e => { console.error(e); reply(response.error.request)}); 238 | break; 239 | case "igtv": 240 | if (args.length < 1) return reply(`Example: ${prefix + command} https://www.instagram.com/tv/CSW1PMohXDm/?utm_medium=copy_link`) 241 | if (!query.match(/instagram\.com\/tv/gi)) return reply(response.error.url); 242 | var res = await getJson(`https://api-xcoders.xyz/api/download/igtv?url=${query}&apikey=${apikeys}`) 243 | if (res.result == undefined || res.status == false) return reply(response.error.request); 244 | const igtvUrl = await axios.get(`https://tinyurl.com/api-create.php?url=${res.result.data.url}`); 245 | if (res.result.data.size >= 50000000) { 246 | igtv = monospace(`\n\t\t『 INSTAGRAM TV DOWNLOADER 』\n\n❑ Title: ${res.result.title}\n❑ Size: ${res.result.data.formattedSize}\n❑ Quality: ${res.result.data.quality}\n\n\nOps Your Request Soo Large Please Klick Url Below To Download Video\n\n❑ Url: ${igtvUrl.data}`); 247 | sendImage(from, xcoders, res.result.thumbnail, igtv, x); 248 | } else { 249 | igtv = monospace(`\n\t\t『 INSTAGRAM TV DOWNLOADER 』\n\n❑ Title: ${res.result.title}\n❑ Size: ${res.result.data.formattedSize}\n❑ Quality: ${res.result.data.quality}\n`); 250 | sendImage(from, xcoders, res.result.thumbnail, igtv, x); 251 | reply(response.process); 252 | sendVideo(from, xcoders, igtvUrl.data, response.success, x); 253 | } 254 | break; 255 | case "soundcloud": case "scdl": 256 | if (args.length < 1) return reply(`Example: ${prefix + command} https://m.soundcloud.com/licooys/pamungkas-monolog`); 257 | if (!query.match(/soundcloud/gi)) return reply(response.error.url); 258 | await getJson(`https://api-xcoders.xyz/api/download/soundcloud?url=${query}&apikey=${apikeys}`).then(async res => { 259 | if (res.result == undefined || res.status == false) return reply(response.error.request); 260 | soundCloud = monospace(`\n\t\t\t『 SOUND CLOUD DOWNLOADER 』\n\n❑ Title: ${res.result.title}\n❑ Duration: ${res.result.duration}\n❑ Quality: ${res.result.data.quality}\n❑ Size: ${res.result.data.formattedSize}\n`); 261 | sendImage(from, xcoders, res.result.thumbnail, soundCloud, x); 262 | reply(response.process); 263 | sendAudio(from, xcoders, res.result.data.url, res.result.title, x); 264 | }).catch(() => reply(response.error.request)); 265 | break; 266 | case "ifunny": 267 | if (args.length < 1) return reply(`Example: ${prefix + command} https://ifunny.co/video/cf-tiktok-hi-lemoine-Ye4Uu0729?s=cl`); 268 | if (!query.match(/ifunny/gi)) return reply(response.error.url); 269 | await getJson(`https://api-xcoders.xyz/api/download/ifunny?url=${query}&apikey=${apikeys}`).then(async res => { 270 | ifunny = monospace(`\n\t\t\t\t『 IFUNNY DOWNLOADER 』 \n \n❑ Title: ${res.result.title}\n❑ Quality: ${res.result.data.quality}\n❑ Size: ${res.result.data.formattedSize}\n`); 271 | sendImage(from, xcoders, res.result.thumbnail, ifunny, x); 272 | reply(response.process); 273 | sendVideo(from, xcoders, res.result.data.url, response.success, x); 274 | }).catch(() => reply(response.error.request)); 275 | break; 276 | case "imdb": 277 | if (args.length < 1) return reply(`Example ${prefix + command} https://m.imdb.com/video/vi3698310169?playlistId=tt6806448&ref_=tt_ov_vi`) 278 | if (!query.match(/imdb/gi)) return reply(response.error.url); 279 | await getJson(`https://api-xcoders.xyz/api/download/imdb?url=${query}&apikey=${apikeys}`).then(async res => { 280 | if (res.result.data.size > 50000000) { 281 | imdb = monospace(`\n\t\t\t\t『 IMDB DOWNLOADER 』\n\n❑ Quality: ${res.result.data.quality}\n❑ Size: ${res.result.data.formattedSize}\n\n\n Oops Your Request Is Too Large Please Click The Url Below To Download Video\n\n❑ Url: ${imdbUrl.data}\n`); 282 | sendImage(from, xcoders, res.result.thumbnail, imdb, x); 283 | } else { 284 | imdb = monospace(`\n\t\t\t\t『 IMDB DOWNLOADER 』\n\n❑ Quality: ${res.result.data.quality}\n❑ Size: ${res.result.data.formattedSize}\n`); 285 | sendImage(from, xcoders, res.result.thumbnail, imdb, x); 286 | reply(response.process); 287 | sendVideo(from, xcoders, res.result.data.url, response.success, x); 288 | } 289 | }).catch(() => reply(response.error.request)); 290 | break; 291 | case "twitter": 292 | if (args.length < 1) return reply(`Example: ${prefix + command} https://twitter.com/AligBocah/status/1416673824058134534?s=20`); 293 | if (!query.match(/twitter/gi)) return reply(response.error.url); 294 | await getJson(`https://api-xcoders.xyz/api/download/twitter?url=${query}&apikey=${apikeys}`).then(async res => { 295 | if (res.result == undefined || res.status == false) return reply(response.error.request); 296 | twitterdl = monospace(`\n\t\t\t\t『 TWITTER DOWNLOADER 』\n\n${res.result.desc}\n`); 297 | sendImage(from, xcoders, res.result.thumb, twitterdl, x); 298 | reply(response.process); 299 | sendVideo(from, xcoders, res.result.HD, response.success, x); 300 | }).catch(() => reply(response.error.request)); 301 | break; 302 | case "cocofun": 303 | if (args.length < 1) return reply(`Example: ${prefix + command} https://www.icocofun.com/share/post/qUc04yiC8WapxKtUXRy9dg==?lang=id&pkg=id&share_to=copy_link&m=23d0cac4747cc62954b3b1ed94697669&d=387544412ee2b99fddea8cb15c30fdd15b79f282b6c54a2aac6ca62db597c140&nt=1`); 304 | if (!query.match(/cocofun/gi)) return reply(response.error.url); 305 | await getJson(`https://api-xcoders.xyz/api/download/cocofun?url=${query}&apikey=${apikeys}`).then(async res => { 306 | if (res.result == undefined || res.status == false) return reply(response.error.request); 307 | cocofun = monospace(`\n\t\t\t\t『 COCOFUN DOWNLOADER 』 \n\n❑ Title: ${res.result.title}\n❑ Desc: ${res.result.desc}\n❑ Like: ${h2k(res.result.like)}\n❑ Play Count: ${h2k(res.result.play_count)}\n❑ Shared: ${h2k(res.result.shared)}\n❑ Resolusi: ${res.result.resolution}\n❑ Duration: ${res.result.duration}\n`); 308 | sendImage(from, xcoders, res.result.thumbnail, cocofun, x); 309 | sendVideo(from, xcoders, res.result.url, response.success, x); 310 | }).catch(() => reply(response.error.request)); 311 | break; 312 | case "pindl": 313 | if (args.length < 1) return reply(`Example: ${prefix + command} https://id.pinterest.com/pin/881790802010631188/`); 314 | if (!query.match(/pin/gi)) return reply(response.error.url); 315 | await getJson(`https://api-xcoders.xyz/api/download/pinterest?url=${query}&apikey=${apikeys}`).then(async res => { 316 | var str = monospace(`\n\t\t\t\t『 PINTEREST DOWNLOADER 』\n\n❑ Duration: ${res.result.duration}\n❑ Quality: ${res.result.data.quality}\n❑ Size: ${res.result.data.formattedSize}\n`); 317 | sendImage(from, xcoders, res.result.thumbnail, str, x); 318 | sendVideo(from, xcoders, res.result.data.url, response.success, x); 319 | }).catch(() => reply(response.error.request)); 320 | break; 321 | case "xvideosdl": 322 | if (args.length < 1) return reply(`Example: ${prefix + command} https://www.xvideos.com/video45738459/pervymother.com_-_mom_and_sister_threeway_fantasy`); 323 | if (!query.match(/xvideos/gi)) return reply(response.error.url); 324 | await getJson(`https://api-xcoders.xyz/api/download/xvideos?url=${query}&apikey=${apikeys}`).then(async res => { 325 | str = monospace(`\n\t\t\t『 XVIDEOS DOWNLOADER 』\n\nTitle: ${res.result.title}\n❑ Viewers: ${res.result.views}\n❑ Votes: ${res.result.vote}\n❑ Likes: ${res.result.like_count}\n❑ Dislikes: ${res.result.dislike_count}\n\nKeywords: \n❑ ${res.result.keyword.split(/,/g).join("\n❑ ")}\n`); 326 | sendImage(from, xcoders, res.result.thumb, str, x); 327 | reply(response.process); 328 | sendVideo(from, xcoders, res.result.url, response.success, x); 329 | }).catch(() => reply(response.error.request)); 330 | break; 331 | case "xnxxdl": 332 | if (args.length < 1) return reply(`Example: ${prefix + command} https://www.xnxx.com/video-kmyob38/hot_milf_step_mom_huge_boobs_brunette_ryder_skye_sex_with_stepson_pov`); 333 | if (!query.match(/xnxx/gi)) return reply(response.error.url); 334 | await getJson(`https://api-xcoders.xyz/api/download/xnxx?url=${query}&apikey=${apikeys}`).then(async res => { 335 | var str = monospace(`\n\t\t\t『 XNXX DOWNLOADER 』\n\n❑ Title: ${res.result.title}\n❑ Duration: ${res.result.duration}\n❑ Quality: ${res.result.quality}\n❑ Viewers: ${res.result.views}\n\nKeywords: \n❑ ${res.result.keyword.split(/,/g).join("\n❑ ")}\n`); 336 | sendImage(from, xcoders, res.result.thumb, str, x); 337 | reply(response.process); 338 | sendVideo(from, xcoders, res.result.url, response.success, x); 339 | }).catch(() => reply(response.error.request)); 340 | break; 341 | 342 | //stalker fitur 343 | case "ttstalk": 344 | if (args.length < 1) return reply(`Example: ${prefix + command} chikakiku`); 345 | await getJson(`https://api-xcoders.xyz/api/stalk/tiktok?username=${query}&apikey=${apikeys}`).then(async res => { 346 | const ttstalk = `\n\t\t\t\t『 TIKTOK STALKER 』\n\n❑ Username : ${res.result.username}\n❑ Nickname : ${res.result.nickname}\n❑ Signature : ${res.result.signature}\n❑ Verified Acc : ${res.result.verified}\n❑ Private Acc : ${res.result.privateAccount}\n❑ Followers : ${h2k(res.result.followers)}\n❑ Following : ${h2k(res.result.followings)}\n❑ Heart Count : ${h2k(res.result.hearts)}\n❑ Video Count : ${h2k(res.result.videoCount)}\n\n❑ Created Time : ${res.result.createTime}`; 347 | reply(response.process); 348 | sendImage(from, xcoders, res.result.profile, ttstalk, x); 349 | }).catch(() => reply(response.error.request)); 350 | break; 351 | case "igstalk": 352 | if (args.length < 1) return reply(`Example: ${prefix + command} only_fxc7`); 353 | await getJson(`https://api-xcoders.xyz/api/stalk/ig?username=${query}&apikey=${apikeys}`).then(async res => { 354 | const Igstlk = `\n\t\t\t『 INSTAGRAM STALKER 』\n\n❑ Username : ${res.result.username}\n❑ Fullname : ${res.result.full_name}\n❑ Followers : ${res.result.followers}\n❑ Following : ${res.result.following}\n❑ Private Acc : ${res.result.is_private}\n❑ Verified Acc : ${res.result.is_verified}\n❑ Post Count : ${res.result.posts_count}\n❑ Bio :\n${res.result.biography}\n` 355 | reply(response.process); 356 | sendImage(from, xcoders, res.result.profile_url, Igstlk, x) 357 | }).catch(() => reply(response.error.request)); 358 | break; 359 | case "githubstalk": case "ghstalk": 360 | if (args.length < 1) return reply(`Example: ${prefix + command} Fxc7`); 361 | await getJson(`https://api-xcoders.xyz/api/stalk/github?username=${query}&apikey=${apikeys}`).then(async res => { 362 | Ghstalk = `\n\t\t\t\t\t『 GITHUB STALKER 』\n\n` 363 | Ghstalk += `❑ Username : ${res.result.username}\n❑ Name : ${res.result.name}\n❑ Blog : ${res.result.blog}\n❑ Company : ${res.result.company}\n❑ Location : ${res.result.location}\n❑ Followers : ${h2k(res.result.followers)}\n❑ Following : ${h2k(res.result.following)}\n❑ Repo Count : ${h2k(res.result.repository_count)}\n❑ Bio :\n${res.result.bio}\n\n\n❑ Created at : ${res.result.created_at}\n❑ Update at : ${res.result.update_at}`; 364 | reply(response.process); 365 | sendImage(from, xcoders, res.result.profile_url, Ghstalk, x); 366 | }).catch(() => reply(response.error.request)); 367 | break; 368 | //end stalker 369 | 370 | //maker/convert 371 | case "tourl": 372 | var downloadMediaMessage = (x.message.imageMessage || x.message.extendedTextMessage?.contextInfo.quotedMessage.imageMessage) || (x.message.videoMessage || x.message.extendedTextMessage?.contextInfo.quotedMessage.videoMessage) 373 | if(downloadMediaMessage === undefined) return reply(`Kirim Image/Video dengan caption ${prefix + command} / reply media`); 374 | let mime; 375 | if(downloadMediaMessage.mimetype === "video/mp4") mime = "video"; 376 | else mime = "image"; 377 | reply(response.process); 378 | var downloadContentMedia = await downloadContentFromMessage(downloadMediaMessage, mime); 379 | var buffer = Buffer.from([]); 380 | for await(const chunk of downloadContentMedia) { 381 | buffer = Buffer.concat([buffer, chunk]); 382 | } 383 | reply(await uploader(buffer)); 384 | break; 385 | case "sticker": case "stiker": case "s": 386 | if ((type === "imageMessage") || isQuotedImage) { 387 | var downloadContentMedia = await downloadContentFromMessage(x.message.imageMessage || x.message.extendedTextMessage?.contextInfo.quotedMessage.imageMessage, "image"); 388 | var buffer = Buffer.from([]); 389 | for await(const chunk of downloadContentMedia) { 390 | buffer = Buffer.concat([buffer, chunk]); 391 | } 392 | var filenameS = "./tmp/"+ getRandom(".jpg"); 393 | var filenameW = "./tmp/"+ getRandom(".webp"); 394 | fs.writeFileSync(filenameS, buffer); 395 | ffmpeg(filenameS).on("error", console.error).on("end", () => { 396 | child.exec(`webpmux -set exif ./tmp/data.exif ${filenameW} -o ${filenameW}`, async (error) => { 397 | reply(response.process); 398 | xcoders.sendMessage(from, { sticker: fs.readFileSync(filenameW) }, { quoted: x }); 399 | fs.unlinkSync(filenameS); 400 | fs.unlinkSync(filenameW); 401 | }); 402 | }).addOutputOptions(["-vcodec", "libwebp", "-vf", "scale='min(320,iw)':min'(320,ih)':force_original_aspect_ratio=decrease,fps=15, pad=320:320:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse"]).toFormat("webp").save(filenameW); 403 | } else if ((type === "videoMessage") || isQuotedVideo) { 404 | var downloadContentMedia = await downloadContentFromMessage(x.message.imageMessage || x.message.extendedTextMessage?.contextInfo.quotedMessage.videoMessage, "video"); 405 | var buffer = Buffer.from([]) 406 | for await(const chunk of downloadContentMedia) { 407 | buffer = Buffer.concat([buffer, chunk]); 408 | } 409 | var filenameS = "./tmp/"+ getRandom(".mp4") 410 | var filenameW = "./tmp/"+ getRandom(".webp") 411 | fs.writeFileSync(filenameS, buffer); 412 | ffmpeg(filenameS).on("error", console.error).on("end", () => { 413 | child.exec(`webpmux -set exif ./tmp/data.exif ${filenameW} -o ${filenameW}`, async (error) => { 414 | reply(response.process); 415 | xcoders.sendMessage(from, { sticker: fs.readFileSync(filenameW) }, { quoted: x }); 416 | fs.unlinkSync(filenameS); 417 | fs.unlinkSync(filenameW); 418 | }); 419 | }).addOutputOptions(["-vcodec", "libwebp", "-vf", "scale='min(320,iw)':min'(320,ih)':force_original_aspect_ratio=decrease,fps=15, pad=320:320:-1:-1:color=white@0.0, split [a][b]; [a] palettegen=reserve_transparent=on:transparency_color=ffffff [p]; [b][p] paletteuse"]).toFormat("webp").save(filenameW); 420 | } else { 421 | reply(`Kirim gambar/vidio dengan caption ${command} atau balas gambar/vidio yang sudah dikirim\nNote : Maximal vidio 10 detik!`); 422 | } 423 | break; 424 | case "tahta": 425 | if(args.length < 1) return reply(`Example: ${prefix + command} Farhan`); 426 | reply(response.process); 427 | sendImage(from, xcoders, `https://api-xcoders.xyz/api/maker/tahta?text=${query}&apikey=${apikeys}`, response.success, x) 428 | break; 429 | 430 | //anime/wibu 431 | case "loli": 432 | reply(response.process); 433 | sendImage(from, xcoders, `https://api-xcoders.xyz/api/anime/loli?apikey=${apikeys}`, response.success, x); 434 | break; 435 | 436 | //group only 437 | case "tagall": 438 | if (!isGroups) return reply("*Only Groups*"); 439 | let number = []; 440 | let tagall = `\t\tMember *${nameGroups}*\n\n`; 441 | for (let mem of getParticipants) { 442 | tagall += `[+] @${mem.id.split("@")[0]}\n`; 443 | number.push(mem.id); 444 | } 445 | xcoders.sendMessage(from, { text: tagall, mentions: number }, { quoted: x }); 446 | break; 447 | case "listadmin": case "adminlist": 448 | if (!isGroups) return reply("*Only Groups"); 449 | let numberAdmin = []; 450 | let listadmin = `\t\tAdmins *${nameGroups}*\n\n`; 451 | for (let adm of getParticipants) { 452 | if (adm.admin !== null) { 453 | numberAdmin.push(adm.id); 454 | listadmin += `[+] @${adm.id.split("@")[0]}\n`; 455 | } 456 | } 457 | xcoders.sendMessage(from, { text: listadmin, mentions: numberAdmin }, { quoted: x }); 458 | break; 459 | 460 | //owner only 461 | case "setexif": 462 | if(!isCreators) return reply(response.isCreator); 463 | await exif(args[0] || packname, args[1] || authorname); 464 | reply(response.success); 465 | break; 466 | case "setprefix": 467 | if(!isCreators) return reply(response.isCreator); 468 | if(args.length < 1) return reply(`Example Optional:\n ${prefix + command} nopref/multi/[optional]`); 469 | if(query === "multi") { 470 | multiprefix = true; 471 | nonprefix = false; 472 | reply(response.success); 473 | } else if(query === "nopref") { 474 | multiprefix = false; 475 | nonprefix = true; 476 | reply(response.success); 477 | } else { 478 | multiprefix = false; 479 | nonprefix = false; 480 | global.prefix = query 481 | reply(response.success); 482 | } 483 | reply(response.success); 484 | break; 485 | case "restart": 486 | if(!isCreators) return reply(response.isCreator); 487 | child.exec(process.send("reset"), (err, stdout) => { 488 | if (err) return reply(util.format(err)); 489 | if (stdout) return reply(util.format(stdout)); 490 | }); 491 | break; 492 | case "language": 493 | if(!isCreators) return reply(response.isCreators); 494 | if(args.length < 1) return reply("Masukkan Optional"); 495 | if(query.toLowerCase() == "en") { 496 | global.language = true; 497 | reply(response.success); 498 | } else if(query.toLowerCase() == "id") { 499 | global.language = false; 500 | reply(response.success); 501 | } else { 502 | reply(`Optional: \n${prefix + command} en/id`); 503 | } 504 | break; 505 | 506 | default: 507 | if (budy.startsWith(">") || budy.startsWith("=>")) { 508 | if(!isCreators) return; 509 | try { 510 | const evaling = await eval(`;(async () => { 511 | ${budy.slice(2)} 512 | })();`); 513 | const utilites = await util.format(evaling); 514 | reply(utilites); 515 | } catch (e) { 516 | reply(util.format(e)); 517 | } 518 | } 519 | if (budy.startsWith("$")) { 520 | if (!isCreators) return; 521 | child.exec(budy.slice(2), (err, stdout) => { 522 | if (err) return reply(util.format(err)); 523 | if (stdout) return reply(util.format(stdout)); 524 | }); 525 | } 526 | if(buttonsResponseText == "🎥 Video") { 527 | if(!participantRequest.includes(senderNumber)) return reply("these buttons are not for you"); 528 | reply(response.process); 529 | sendVideo(from, xcoders, buttonsResponseID, response.success, x); 530 | for(let i=0; i < participantRequest.length; i++) { 531 | if(participantRequest[i] == senderNumber) { 532 | participantRequest.splice(i, 1); 533 | break; 534 | } 535 | } 536 | } 537 | if(buttonsResponseText == "🎵 Audio") { 538 | if(!participantRequest.includes(senderNumber)) return reply("these buttons are not for you"); 539 | reply(response.process); 540 | sendAudio(from, xcoders, buttonsResponseID, getRandom(".mp3"), x); 541 | for(let i=0; i < participantRequest.length; i++) { 542 | if(participantRequest[i] == senderNumber) { 543 | participantRequest.splice(i, 1); 544 | break; 545 | } 546 | } 547 | } 548 | } 549 | } catch (e) { 550 | console.log(chalk.red.bold.underline(String(e))); 551 | xcoders.sendMessage(owners[0], { text: util.format(e) }); 552 | } 553 | }; 554 | 555 | let file = require.resolve(__filename); 556 | fs.watchFile(file, () => { 557 | fs.unwatchFile(file); 558 | console.log(`Update ${__filename}`); 559 | delete require.cache[file]; 560 | require(file); 561 | }); 562 | -------------------------------------------------------------------------------- /helpers/index.js: -------------------------------------------------------------------------------- 1 | const m = '```'; 2 | 3 | exports.help = this.help = (prefix) => { 4 | return ` 5 | *❑ DOWNLOADER MENU ❑* 6 | ${m}✰ ${prefix}ytshort${m} 7 | ${m}✰ ${prefix}ytmp3${m} 8 | ${m}✰ ${prefix}ytmp4${m} 9 | ${m}✰ ${prefix}joox${m} 10 | ${m}✰ ${prefix}fbdl${m} 11 | ${m}✰ ${prefix}igtv${m} 12 | ${m}✰ ${prefix}igdl${m} 13 | ${m}✰ ${prefix}tiktok${m} 14 | ${m}✰ ${prefix}soundcloud${m} 15 | ${m}✰ ${prefix}ifunny${m} 16 | ${m}✰ ${prefix}imdb${m} 17 | ${m}✰ ${prefix}twitter${m} 18 | ${m}✰ ${prefix}cocofun${m} 19 | ${m}✰ ${prefix}pindl${m} 20 | ${m}✰ ${prefix}xnxxdl${m} 21 | ${m}✰ ${prefix}xvideosdl${m} 22 | 23 | *❑ STALKER MENU ❑* 24 | ${m}✰ ${prefix}ttstalk${m} 25 | ${m}✰ ${prefix}igstalk${m} 26 | ${m}✰ ${prefix}githubstalk${m} 27 | 28 | *❑ CONVERTER MENU ❑* 29 | ${m}✰ ${prefix}tourl${m} 30 | ${m}✰ ${prefix}sticker${m} 31 | 32 | *❑ MAKER MENU ❑* 33 | ${m}✰ ${prefix}tahta${m} 34 | 35 | *❑ ANIME/WIBU ❑* 36 | ${m}✰ ${prefix}loli${m} 37 | 38 | *❑ GROUPS ONLY ❑* 39 | ${m}✰ ${prefix}tagall${m} 40 | ${m}✰ ${prefix}listadmin${m} 41 | 42 | *❑ OWNERS ONLY ❑* 43 | ${m}✰ >${m} 44 | ${m}✰ $${m} 45 | ${m}✰ ${prefix}setprefix${m} 46 | ${m}✰ ${prefix}restart${m} 47 | ${m}✰ ${prefix}language${m} 48 | ${m}✰ ${prefix}setexif${m} 49 | 50 | \t\t\t\t*_WhatsApp BOT Multi Device_* 51 | `; 52 | }; 53 | 54 | exports.stats = this.stats = (os, speed, perf, performance, runtime, sizeFormat) => { 55 | const used = process.memoryUsage(); 56 | const cpus = os.cpus().map(cpu => { cpu.total = Object.keys(cpu.times).reduce((last, type) => last + cpu.times[type], 0); return cpu }); 57 | const cpu = cpus.reduce((last, cpu, _, { length }) => { 58 | last.total += cpu.total; 59 | last.speed += cpu.speed / length; 60 | last.times.user += cpu.times.user; 61 | last.times.nice += cpu.times.nice; 62 | last.times.sys += cpu.times.sys; 63 | last.times.idle += cpu.times.idle; 64 | last.times.irq += cpu.times.irq; 65 | return last; 66 | }, { speed: 0, total: 0, times: { user: 0, nice: 0, sys: 0, idle: 0, irq: 0 } }); 67 | let timestamp = speed(); 68 | let latensi = speed() - timestamp; 69 | let perf_now = perf.now(); 70 | let perf_old = performance.now(); 71 | return ` 72 | Kecepatan Respon ${latensi.toFixed(4)} _Second_ \n ${perf_old - perf_now} _miliseconds_ 73 | 74 | ⊳ Runtime : ${runtime(process.uptime())} 75 | 76 | 💻 Info Server 77 | ⊳ RAM: ${sizeFormat(os.totalmem() - os.freemem())} / ${sizeFormat(os.totalmem())} 78 | ⊳ Homedir: ${os.userInfo().homedir} 79 | ⊳ OS Type: ${os.type()} 80 | ⊳ OS Version: ${os.version()} 81 | ⊳ Hostname: ${os.hostname()} 82 | 83 | 🔰 NodeJS Memory Usage 84 | ${Object.keys(used).map((key, _, arr) => `⊳ ${key.padEnd(Math.max(...arr.map(v => v.length)), ' ')}: ${sizeFormat(used[key])}`).join('\n')} 85 | ${cpus[0] ? `\n\t🌐 Total CPU Usage 86 | ${cpus[0].model.trim()} (${cpu.speed} MHZ)\n${Object.keys(cpu.times).map(type => `⊳ ${(type).padEnd(6)}: ${(100 * cpu.times[type] / cpu.total).toFixed(2)}%`).join('\n')} 87 | 88 | ♨️ CPU Core(s) Usage (${cpus.length} Core CPU) 89 | ${cpus.map((cpu, i) => `${i + 1}. ${cpu.model.trim()} (${cpu.speed} MHZ)\n${Object.keys(cpu.times).map(type => `⊳ ${(type).padEnd(6)}: ${(100 * cpu.times[type] / cpu.total).toFixed(2)}%`).join('\n')}`).join('\n\n')}` : ''} 90 | `.trim(); 91 | }; 92 | 93 | exports.templateContentText = this.templateContentText = (senderName, says) => { 94 | return `\n\t\t\t\t\t*Hai ${senderName + ' ' + says} 💫*\n\n\n\t\t\t\t\t*_WhatsApp Bot Multi Device_*\n\n\t\t\t\t\t\t_Powered By Farhannn_`; 95 | }; 96 | 97 | exports.templateFooterText = this.templateFooterText = () => { 98 | return `𝐓𝐡𝐚𝐧𝐤𝐬 𝐓𝐨:\n• 𝐀𝐝𝐢𝐰𝐚𝐣𝐬𝐡𝐢𝐧𝐠\n• 𝐖𝐚𝐧𝐬\n• 𝐋𝐨𝐩𝐢𝐚\n• 𝐆𝐚𝐥𝐮𝐧𝐠\n• 𝐋𝐨𝐫𝐝 𝐌𝐚𝐧𝐨\t\t\t\t`; 99 | }; 100 | 101 | const fs = require("fs"); 102 | 103 | let file = require.resolve(__filename); 104 | fs.watchFile(file, () => { 105 | fs.unwatchFile(file); 106 | console.log(`Update ${__filename}`); 107 | delete require.cache[file]; 108 | require(file); 109 | }); -------------------------------------------------------------------------------- /images/thumbnail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fxc7/weabot-md/70457ae235e8e5dcc24e2bf98416907017ce105e/images/thumbnail.jpg -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const pino = require("pino"); 4 | const CFonts = require("cfonts"); 5 | const chalk = require("chalk"); 6 | const ora = require("ora"); 7 | const os = require("os"); 8 | const { 9 | default: makeWASocket, 10 | DisconnectReason, 11 | useSingleFileAuthState 12 | } = require("@adiwajshing/baileys-md"); 13 | 14 | const { state, saveState } = useSingleFileAuthState("./sessions.json"); 15 | 16 | // start a connection 17 | const started = () => { 18 | const xcoders = makeWASocket({ 19 | version: [2, 2147, 16], 20 | logger: pino({ level: "fatal" }), 21 | printQRInTerminal: true, 22 | auth: state 23 | }); 24 | console.clear(); 25 | CFonts.say("WEABOT|MD", { 26 | font: "block", 27 | align: "center", 28 | gradient: ["red", "magenta"], 29 | background: "transparent", 30 | letterSpacing: 1, 31 | lineHeight: 1, 32 | space: true, 33 | maxLength: 0, 34 | independentGradient: true, 35 | transitionGradient: false, 36 | env: "node" 37 | }); 38 | CFonts.say("WhatsApps BOT Multi Device", { 39 | font: "console", 40 | align: "center", 41 | gradient: ["red", "magenta"] 42 | }); 43 | const spin = ora({ discardStdin: true, text: chalk.bold.green.italic("Connecting"), spinner: "aesthetic" }); 44 | 45 | xcoders.ev.on("messages.upsert", async function (m) { 46 | const x = m.messages[0]; 47 | if (!x.message) return; 48 | if (x.key && x.key.remoteJid == "status@broadcast") return; 49 | x.message = (Object.keys(x.message)[0] === "ephemeralMessage") ? x.message.ephemeralMessage.message : x.message; 50 | require("./handlerMessage")(xcoders, x); 51 | }); 52 | xcoders.ev.on("connection.update", async function (update) { 53 | //connection configuration update 54 | if(update.lastDisconnect === undefined) { 55 | // update connection when qr session is unknown or not exist 56 | if (update.qr !== undefined) spin.warn(chalk.bold.green.italic("Scan This QR Code\n")); 57 | 58 | //connection when reconnecting or just starting 59 | if (update.connection === "connecting") spin.start(); 60 | 61 | //connection when open or connected in whatsapp device 62 | if (update.connection === "open") spin.succeed(chalk.bold.green.italic(`Connected\n`)); 63 | } else { 64 | //connection when it is closed or the network is interrupted 65 | if (update.connection === "close") return started(); 66 | spin.fail(chalk.bold.green.italic("WhatsApp WEB Disconnected")); 67 | } 68 | }); 69 | 70 | // listen for when the auth credentials is updated 71 | xcoders.ev.on("creds.update", saveState); 72 | return xcoders; 73 | }; 74 | started(); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Fxc7", 3 | "version": "0.0.1-fxc7", 4 | "description": "WhatsApp Bot Multi Device Version..", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node connection", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [ 11 | "Bot", 12 | "WhatsApp", 13 | "Whatsapp", 14 | "md" 15 | ], 16 | "author": "FarhanXCode7", 17 | "license": "MIT", 18 | "dependencies": { 19 | "@adiwajshing/baileys-md": "github:adiwajshing/baileys#multi-device", 20 | "axios": "^0.24.0", 21 | "cfonts": "^2.9.1", 22 | "chalk": "4.1.2", 23 | "child_process": "^1.0.2", 24 | "file-type": "16.5.0", 25 | "fluent-ffmpeg": "^2.1.2", 26 | "form-data": "^4.0.0", 27 | "fs": "^0.0.1-security", 28 | "human-readable": "^0.2.1", 29 | "moment-timezone": "^0.5.34", 30 | "ora": "5.4.1", 31 | "os": "^0.1.2", 32 | "path": "^0.12.7", 33 | "perf_hooks": "^0.0.1", 34 | "performance-now": "^2.1.0", 35 | "util": "^0.12.4" 36 | }, 37 | "repository": { 38 | "type": "git", 39 | "url": "git+https://github.com/Fxc7/weabot-md.git" 40 | }, 41 | "bugs": { 42 | "url": "https://github.com/Fxc7/weabot-md/issues" 43 | }, 44 | "homepage": "https://github.com/Fxc7/weabot-md#readme" 45 | } 46 | -------------------------------------------------------------------------------- /sendingMessage/index.js: -------------------------------------------------------------------------------- 1 | require("./../configs"); 2 | const { 3 | prepareWAMessageMedia, 4 | generateWAMessageFromContent, 5 | proto 6 | } = require("@adiwajshing/baileys-md"); 7 | const fs = require("fs"); 8 | const { 9 | templateContentText, 10 | templateFooterText 11 | } = require("./../helpers"); 12 | const { 13 | getBuffer 14 | } = require("./../functions"); 15 | 16 | exports.sendButtonsMenu = async (from, xcoders, prefix, senderName, thumbnail, says, quotedObj) => { 17 | const prepareMessage = await prepareWAMessageMedia({ image: thumbnail }, { upload: xcoders.waUploadToServer }); 18 | const templateMessage = await generateWAMessageFromContent(from, proto.Message.fromObject({ 19 | templateMessage: { 20 | hydratedTemplate: { 21 | imageMessage: prepareMessage.imageMessage, 22 | hydratedContentText: templateContentText(senderName, says), 23 | hydratedFooterText: templateFooterText(), 24 | hydratedButtons: [{ 25 | urlButton: { 26 | displayText: "𝐑𝐞𝐬𝐭 𝐀𝐏𝐈𝐬", 27 | url: "https://api-xcoders.xyz/" 28 | } 29 | }, { 30 | callButton: { 31 | displayText: "𝐂𝐚𝐥𝐥 𝐍𝐮𝐦𝐛𝐞𝐫", 32 | phoneNumber: "+62 831-1800-241" 33 | } 34 | }, { 35 | quickReplyButton: { 36 | displayText: "𝐂𝐨𝐦𝐦𝐚𝐧𝐝", 37 | id: `${prefix}allmenu` 38 | } 39 | }, { 40 | quickReplyButton: { 41 | displayText: "𝐒𝐭𝐚𝐭𝐢𝐬𝐭𝐢𝐜", 42 | id: `${prefix}statistic` 43 | } 44 | }, { 45 | quickReplyButton: { 46 | displayText: "𝐎𝐰𝐧𝐞𝐫𝐬", 47 | id: `${prefix}owner` 48 | } 49 | }] 50 | } 51 | } 52 | }), { userJid: from }); 53 | return await xcoders.relayMessage(from, templateMessage.message, { messageId: templateMessage.key.id, quoted: quotedObj }); 54 | }; 55 | 56 | exports.buttonsDownload = this.buttonsDownload = async (from, xcoders, video, audio, thumbnail , caption, x, senderNumber) => { 57 | button = [{ buttonId: audio, buttonText: { displayText: `🎵 Audio` }, type: 1 }, { buttonId: video, buttonText: { displayText: `🎥 Video` }, type: 1 }]; 58 | return await xcoders.sendMessage(from, { location: { jpegThumbnail: await getBuffer(thumbnail) }, caption: caption, buttons: button, footer: "Pilih Salah Satu Button Dibawah ⬇️", mentions: [senderNumber] }).catch(e => { xcoders.sendMessage(from, {text: global.responseEN.error.request}, {quoted: x}) }); 59 | }; 60 | 61 | exports.sendImage = async (from, xcoders, url, caption = global.responseEN.success, x) => { 62 | return await xcoders.sendMessage(from, { image: { url: url }, caption: caption }, { quoted: x }).catch(e => { xcoders.sendMessage(from, {text: global.responseEN.error.request}, {quoted: x}) }); 63 | }; 64 | 65 | exports.sendAudio = async (from, xcoders, url, filename, x) => { 66 | return xcoders.sendMessage(from, { document: { url: url }, fileName: filename, mimetype: 'audio/mp4' }, { quoted: x}).catch(e => { xcoders.sendMessage(from, {text: global.responseEN.error.request}, {quoted: x}) }); 67 | }; 68 | 69 | exports.sendVideo = async (from, xcoders, url, caption, x) => { 70 | return await xcoders.sendMessage(from, { video: { url: url }, caption: caption }, { quoted: x }).catch(e => { xcoders.sendMessage(from, {text: global.responseEN.error.request}, {quoted: x}) }); 71 | }; 72 | 73 | let file = require.resolve(__filename); 74 | fs.watchFile(file, () => { 75 | fs.unwatchFile(file); 76 | console.log(`Update ${__filename}`); 77 | delete require.cache[file]; 78 | require(file); 79 | }); -------------------------------------------------------------------------------- /tmp/7593.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fxc7/weabot-md/70457ae235e8e5dcc24e2bf98416907017ce105e/tmp/7593.jpg -------------------------------------------------------------------------------- /tmp/data.exif: -------------------------------------------------------------------------------- 1 | II*AWn{"sticker-pack-id":"com.snowcorp.stickerly.android.stickercontentprovider b5e7275f-f1de-4137-961f-57becfad34f2","sticker-pack-name":"Created By","sticker-pack-publisher":"Farhannn","android-app-store-link":"https://play.google.com/store/apps/details?id=com.stickify.stickermaker","ios-app-store-link":"https://itunes.apple.com/app/sticker-maker-studio/id1443326857"} --------------------------------------------------------------------------------