├── 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 |

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 | 
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* AW n {"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"}
--------------------------------------------------------------------------------