├── LICENSE ├── README.md ├── fn.sh ├── main.js ├── package.json └── src ├── Bangers.ttf ├── fnbots.webp ├── frames ├── frame0.png ├── frame1.png ├── frame2.png ├── frame3.png ├── frame4.png ├── frame5.png └── frame6.png ├── ttp.gif └── ttpw.webp /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 FN 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

FNBots

2 | 3 | ## Hi everyone! 4 | 5 | I trying to create script whatsapp bot using [open-wa](https://github.com/open-wa/wa-automate-nodejs) library. 6 | 7 | ## Installation Using Linux-Ubuntu: 8 | ## IDK if you use RDP or other. because i never use 9 | ``` 10 | sudo apt-get install -y git 11 | git clone https://github.com/Terror-Machine/fn-whatsapp-bot 12 | cd fn-whatsapp-bot 13 | bash fn.sh 14 | pm2 startup 15 | pm2 start main.js 16 | pm2 save 17 | pm2 logs 18 | ``` 19 | ## NOTE! 20 | This script is made for public bots, so use a second account to scan the qr and main account to command. 21 | 22 | ## Thanks to: 23 | [open-wa](https://github.com/open-wa/wa-automate-nodejs) 24 | -------------------------------------------------------------------------------- /fn.sh: -------------------------------------------------------------------------------- 1 | apt-get install -y mc 2 | apt-get -y update 3 | apt-get -y upgrade 4 | apt-get install -y curl 5 | apt-get install -y zip 6 | apt-get install -y webp 7 | apt-get install -y unzip 8 | curl -sL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh 9 | bash nodesource_setup.sh 10 | apt-get install -y nodejs 11 | apt-get install -y gcc g++ make 12 | apt-get install -y python3-pip 13 | apt-get install -y git 14 | apt-get install -y python3-pafy 15 | apt-get install -y ffmpeg 16 | apt-get install -y imagemagick 17 | apt-get install -y gifsicle 18 | apt-get install -y tesseract-ocr 19 | apt-get install -y libtesseract-dev 20 | apt-get install -y curl openssl libssl-dev 21 | apt-get install -y libjpeg-dev libpng-dev libtiff-dev libgif-dev 22 | apt-get install -y libicu-dev libpango1.0-dev libcairo2-dev 23 | apt-get update && apt-get install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget 24 | timedatectl set-timezone Asia/Jakarta 25 | wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 26 | apt-get install -y ./google-chrome-stable_current_amd64.deb 27 | apt-get install -y speedtest-cli 28 | pip3 install ffmpeg 29 | pip3 install pydub 30 | pip3 install youtube-dl 31 | pip3 install img2pdf 32 | pip3 install pafy 33 | pip3 install apnggif 34 | npm i -g cwebp 35 | npm i -g npm 36 | npm i -g pm2 37 | npm i -g pkg 38 | npm i 39 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const { 2 | decryptMedia, 3 | create, 4 | vf 5 | } = require('@open-wa/wa-automate') 6 | const fs = require('fs-extra') 7 | const text2png = require('text2png'); 8 | const ffmpeg = require('fluent-ffmpeg') 9 | const exec = require('child_process').exec; 10 | const crypto = require('crypto') 11 | const hxz = require("hxz-api") 12 | const fetch = require('node-fetch') 13 | const cheerio = require('cheerio') 14 | const FormData = require('form-data') 15 | const process = require('process') 16 | const spawn = require('child_process').exec 17 | const pukimak = "pm2 restart main" 18 | let { instagramdl, instagramdlv2 } = require('@bochilteam/scraper') 19 | 20 | function os_spawn() { 21 | this.execCommand = function(txt) { 22 | return new Promise((resolve, reject) => { 23 | spawn(txt, (error, stdout, stderr) => { 24 | if (error) { 25 | reject(error) 26 | return; 27 | } 28 | resolve(stdout) 29 | }) 30 | }) 31 | } 32 | } 33 | 34 | const unhandledRejections = new Map() 35 | process.on('unhandledRejection', (reason, promise) => { 36 | unhandledRejections.set(promise, reason) 37 | }) 38 | process.on('rejectionHandled', (promise) => { 39 | unhandledRejections.delete(promise) 40 | }) 41 | process.on('Something went wrong', function(err) { 42 | console.log('Caught exception: ', err) 43 | }) 44 | process.on('unhandledRejection', (reason, promise) => { 45 | console.log('Unhandled Rejection at:', promise, 'reason:', reason) 46 | var xsa = new os_spawn() 47 | xsa.execCommand(pukimak).then(res => {}).catch(err => { 48 | console.log(err) 49 | }) 50 | }) 51 | 52 | function sleep(ms) { 53 | return new Promise(resolve => setTimeout(resolve, ms)); 54 | } 55 | 56 | const fnBots = async(fn = new fn()) => { 57 | fn.onStateChanged((state) => { 58 | console.log(color('-> [STATE]'), state) 59 | if (state === 'CONFLICT') fn.forceRefocus() 60 | if (state === 'UNPAIRED') fn.forceRefocus() 61 | }) 62 | fn.onMessage(async(message) => { 63 | try { 64 | await bot(fn, message) 65 | } catch (error) { 66 | console.log(error.message) 67 | } 68 | }); 69 | } 70 | 71 | function randomChoice(arr) { 72 | return arr[Math.floor(Math.random() * arr.length)]; 73 | } 74 | 75 | async function addExif(webpSticker, packname, author, categories = [''], extra = {}) { 76 | const webp = require('node-webpmux') // Optional Feature 77 | const img = new webp.Image(); 78 | const stickerPackId = crypto.randomBytes(32).toString('hex'); 79 | const json = { 'sticker-pack-id': stickerPackId, 'sticker-pack-name': 'FNBOTS', 'sticker-pack-publisher': 'FN', 'emojis': categories, ...extra }; 80 | let exifAttr = Buffer.from([0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00]); 81 | let jsonBuffer = Buffer.from(JSON.stringify(json), 'utf8'); 82 | let exif = Buffer.concat([exifAttr, jsonBuffer]); 83 | exif.writeUIntLE(jsonBuffer.length, 14, 4); 84 | await img.load(webpSticker) 85 | img.exif = exif 86 | return await img.save(null) 87 | } 88 | 89 | async function twitter(url) { 90 | if (!/http(?:s)?:\/\/(?:www\.)?twitter\.com\/([a-zA-Z0-9_]+)/i) throw 'Link invalid!' 91 | let form = new FormData() 92 | form.append('url', encodeURI(url)) 93 | form.append('submit', '') 94 | let res = await fetch('https://www.expertsphp.com/instagram-reels-downloader.php', { 95 | method: 'POST', 96 | headers: { 97 | 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 98 | 'cookie': '_ga=GA1.2.783835709.1637038175; _gid=GA1.2.880188214.1637038175; __gads=ID=5b4991618655cd86-22e2c7aeadce00ae:T=1637038176:RT=1637038176:S=ALNI_MaCe3McPrVVswzBEqcQlgnVZXtZ1g', 99 | 'origin': 'https://www.expertsphp.com', 100 | 'referer': 'https://www.expertsphp.com/twitter-video-downloader.html', 101 | 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', 102 | ...form.getHeaders() 103 | }, 104 | body: form 105 | }) 106 | let html = await res.text() 107 | const $ = cheerio.load(html) 108 | let thumbnail = $('#showdata > img').attr('src') 109 | let result = [] 110 | $('#showdata > div > table > tbody > tr').each(function () { 111 | result.push({ 112 | link: $(this).find('td:nth-child(1) > a').attr('href'), 113 | mime: $(this).find('td:nth-child(2) > strong').text() 114 | }) 115 | }) 116 | let name = /http(?:s)?:\/\/(?:www\.)?twitter\.com\/([a-zA-Z0-9_]+)/g 117 | name = [...url.matchAll(name)][0][1] 118 | return { 119 | name, 120 | thumbnail, 121 | result 122 | } 123 | } 124 | 125 | async function shortlink(url) { 126 | isurl = /https?:\/\//.test(url) 127 | return isurl ? (await require('axios').get('https://tinyurl.com/api-create.php?url='+encodeURIComponent(url))).data : '' 128 | } 129 | 130 | async function bot(fn, message) { 131 | try { 132 | const { 133 | type, 134 | t, 135 | caption, 136 | id, 137 | from, 138 | sender, 139 | isMedia, 140 | quotedMsg, 141 | quotedMsgObj, 142 | mimetype, 143 | fromMe 144 | } = message 145 | let { body } = message 146 | body = (type == 'chat') ? body : ((type && caption)) ? caption : '' 147 | let txt = body.toLowerCase() 148 | const args = body.slice('').trim().split(/ +/).slice(1) || body.slice('').trim().split(/ +/).slice(1) 149 | const arg = body.trim().substring(body.indexOf(' ') + 1) 150 | if (type == 'chat') { 151 | if (!(fromMe)) { 152 | if (txt.match(/https:\/\/www.instagram.com\/(p|reel|tv)/gi)) { 153 | const results = await instagramdl(body).catch(async _ => await instagramdlv2(body)) 154 | for (const { 155 | url 156 | } 157 | of results) await fn.sendFileFromUrl(from, url, 'google.mp4', '') 158 | } 159 | if (txt.includes('tiktok.com')) { 160 | let p = await hxz.ttdownloader(body) 161 | const { 162 | nowm, 163 | wm, 164 | audio 165 | } = p 166 | fn.sendFile(from, nowm, 'tiktok.mp4', ``) 167 | } 168 | if (txt.includes('twitter.com')) { 169 | let res = await twitter(body) 170 | let result = res.result.reverse().filter(({ 171 | mime 172 | }) => /video/i.test(mime)), 173 | video, index 174 | for (let vid of result) { 175 | try { 176 | // video = await (await fetch(vid.link)).buffer() 177 | video = vid.link 178 | index = result.indexOf(vid) 179 | break 180 | } catch (e) { 181 | err = e 182 | continue 183 | } 184 | } 185 | if (!video) throw 'Can\'t get video/image' 186 | let ress = result[index] 187 | fn.sendFile(from, video, 'twitter' + /video/.test(ress.mime) ? '.mp4' : '.png') 188 | } 189 | } 190 | } 191 | if (isMedia) { 192 | if (mimetype == 'image/jpeg') { 193 | const mediaData = await decryptMedia(message) 194 | const imageBase64 = `data:${mimetype};base64,${mediaData.toString('base64')}` 195 | await fn.sendImageAsSticker(from, imageBase64, { 196 | discord: "568919637366931460", 197 | author: 'FN', 198 | keepScale: true, 199 | pack: 'FNBots' 200 | }) 201 | } else 202 | if (mimetype == 'image/gif') { 203 | const mediaData = await decryptMedia(message) 204 | const videoBase64 = `data:${mimetype};base64,${mediaData.toString('base64')}` 205 | await fn.sendMp4AsSticker(from, videoBase64, { 206 | fps: 10, 207 | startTime: '00:00:00.0', 208 | endTime: '00:00:05.0', 209 | loop: 0, 210 | crop: false 211 | }, { 212 | discord: "568919637366931460", 213 | author: 'FN', 214 | keepScale: true, 215 | pack: 'FNBots' 216 | }) 217 | } else 218 | if (mimetype == 'video/mp4') { 219 | const mediaData = await decryptMedia(message) 220 | const videoBase64 = `data:${mimetype};base64,${mediaData.toString('base64')}` 221 | await fn.sendMp4AsSticker(from, videoBase64, { 222 | fps: 10, 223 | startTime: '00:00:00.0', 224 | endTime: '00:00:05.0', 225 | loop: 0, 226 | crop: false 227 | }, { 228 | discord: "568919637366931460", 229 | author: 'FN', 230 | keepScale: true, 231 | pack: 'FNBots' 232 | }) 233 | } 234 | } 235 | 236 | if ((txt == "hi") || (txt == "halo") || (txt == "help") || (txt == "commands") || (txt == "menu") || (txt == "bot") || (txt == "cmd")) { 237 | let cp = "👋 hello, please send me a video, image, or gif and I'll turn it into a sticker!\n" 238 | cp += "📦 If you send a picture and then the shape is not a square, then I will change it to contain sticker!\n" 239 | cp += "🤡 if you send a video or a gif, then i will turn it into a animated sticker!\n" 240 | cp += "☕️ Buy me a coffee with ```donate``` to support this bot\n" 241 | cp += "PS. follow @fnbots on instagram, if this bot gets banned, new number will be posted there :)" 242 | fn.reply(from, cp, id, true) 243 | } else if (txt == "donate") { 244 | let tx = 'OVO: 081286118629\n' 245 | tx += 'DANA: 081286118629\n' 246 | tx += 'GOPAY: 081286118629\n' 247 | tx += 'PULSA: 081286118629' 248 | fn.reply(message.from, tx, message.id, true) 249 | } else if ((body || '').startsWith('attp ') || (txt == "attp")) { 250 | if (quotedMsg) { 251 | if (quotedMsgObj.type === 'chat') { 252 | if (quotedMsg.body.length >= 100) return 253 | text = quotedMsg.body 254 | const animated = (text) => new Promise((resolve, reject) => { 255 | try { 256 | canvasx('white', 0, text) 257 | canvasx('lime', 1, text) 258 | canvasx('red', 2, text) 259 | canvasx('blue', 3, text) 260 | canvasx('yellow', 4, text) 261 | canvasx('aqua', 5, text) 262 | canvasx('purple', 6, text) 263 | exec('convert -delay 20 -loop 0 ./src/frames/*.png -scale 512x512 ./src/ttp.gif', (error, stdout, stderr) => { 264 | if (error) rejects(error) 265 | ffmpeg("./src/ttp.gif") 266 | .on('error', function (err) { 267 | console.error(err) 268 | }) 269 | .on('end', async function () { 270 | resolve(await addExif('./src/ttpw.webp', '', '')) 271 | }) 272 | .toFormat('webp') 273 | .save('./src/ttpw.webp') 274 | }) 275 | } catch (error) { 276 | return reject(error) 277 | } 278 | }) 279 | 280 | function canvasx(color, i, text) { 281 | fs.writeFileSync('./src/frames/frame' + i + '.png', text2png(wordWrap(text, 15), randomChoice([{ 282 | font: '400px Bangers', 283 | localFontPath: './src/Bangers.ttf', 284 | localFontName: 'Bangers', 285 | color: color, 286 | strokeWidth: 12, 287 | strokeColor: 'black', 288 | textAlign: 'center', 289 | lineSpacing: 30, 290 | padding: 300, 291 | backgroundColor: 'transparent' 292 | }]))) 293 | } 294 | 295 | function wordWrap(str, maxWidth) { 296 | var newLineStr = "\n"; 297 | done = false; 298 | res = ''; 299 | while (str.length > maxWidth) { 300 | found = false; 301 | for (i = maxWidth - 1; i >= 0; i--) { 302 | if (testWhite(str.charAt(i))) { 303 | res = res + [str.slice(0, i), newLineStr].join('') 304 | str = str.slice(i + 1) 305 | found = true; 306 | break; 307 | } 308 | } 309 | if (!found) { 310 | res += [str.slice(0, maxWidth), newLineStr].join('') 311 | str = str.slice(maxWidth) 312 | } 313 | } 314 | return res + str; 315 | } 316 | 317 | function testWhite(x) { 318 | var white = new RegExp(/^\s$/) 319 | return white.test(x.charAt(0)) 320 | } 321 | animated(text).then((res) => { 322 | fn.sendRawWebpAsSticker(from, res.toString('base64')) 323 | }) 324 | } 325 | } else { 326 | if (args.length === 0) return 327 | if (arg.length >= 100) return 328 | const text = arg 329 | const animated = (text) => new Promise((resolve, reject) => { 330 | try { 331 | canvasx('white', 0, text) 332 | canvasx('lime', 1, text) 333 | canvasx('red', 2, text) 334 | canvasx('blue', 3, text) 335 | canvasx('yellow', 4, text) 336 | canvasx('aqua', 5, text) 337 | canvasx('purple', 6, text) 338 | exec('convert -delay 20 -loop 0 ./src/frames/*.png -scale 512x512 ./src/ttp.gif', (error, stdout, stderr) => { 339 | if (error) rejects(error) 340 | ffmpeg("./src/ttp.gif") 341 | .on('error', function (err) { 342 | console.error(err) 343 | }) 344 | .on('end', async function () { 345 | resolve(await addExif('./src/ttpw.webp', '', '')) 346 | }) 347 | .toFormat('webp') 348 | .save('./src/ttpw.webp') 349 | }) 350 | } catch (error) { 351 | return reject(error) 352 | } 353 | }) 354 | 355 | function canvasx(color, i, text) { 356 | fs.writeFileSync('./src/frames/frame' + i + '.png', text2png(wordWrap(text, 15), randomChoice([{ 357 | font: '400px Bangers', 358 | localFontPath: './src/Bangers.ttf', 359 | localFontName: 'Bangers', 360 | color: color, 361 | strokeWidth: 12, 362 | strokeColor: 'black', 363 | textAlign: 'center', 364 | lineSpacing: 30, 365 | padding: 300, 366 | backgroundColor: 'transparent' 367 | }]))) 368 | } 369 | 370 | function wordWrap(str, maxWidth) { 371 | var newLineStr = "\n"; 372 | done = false; 373 | res = ''; 374 | while (str.length > maxWidth) { 375 | found = false; 376 | for (i = maxWidth - 1; i >= 0; i--) { 377 | if (testWhite(str.charAt(i))) { 378 | res = res + [str.slice(0, i), newLineStr].join('') 379 | str = str.slice(i + 1) 380 | found = true; 381 | break; 382 | } 383 | } 384 | if (!found) { 385 | res += [str.slice(0, maxWidth), newLineStr].join('') 386 | str = str.slice(maxWidth) 387 | } 388 | } 389 | return res + str; 390 | } 391 | 392 | function testWhite(x) { 393 | var white = new RegExp(/^\s$/) 394 | return white.test(x.charAt(0)) 395 | } 396 | animated(text).then((res) => { 397 | fn.sendRawWebpAsSticker(from, res.toString('base64')) 398 | }) 399 | } 400 | } 401 | } catch (err) { 402 | console.log('[ERROR]', err) 403 | fn.sendText(message.chatId, err) 404 | } 405 | } 406 | 407 | const fnOpt = { 408 | sessionId: 'fnbots', 409 | multiDevice: true, 410 | headless: true, 411 | qrTimeout: 60, 412 | authTimeout: 0, 413 | cacheEnabled: false, 414 | useChrome: true, 415 | killProcessOnBrowserClose: true, 416 | throwErrorOnTosBlock: false, 417 | chromiumArgs: [ 418 | '--no-sandbox', 419 | '--disable-setuid-sandbox', 420 | '--aggressive-cache-discard', 421 | '--disable-cache', 422 | '--disable-application-cache', 423 | '--disable-offline-load-stale-cache', 424 | '--disk-cache-size=0' 425 | ] 426 | } 427 | create(fnOpt) 428 | .then((fn) => fnBots(fn)) 429 | .catch(e => { 430 | console.log('[ERROR]', e) 431 | var xsa = new os_spawn() 432 | xsa.execCommand(pukimak).catch(err => { 433 | console.log("os >>>", err) 434 | }) 435 | }) 436 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coligans", 3 | "version": "0.0.1", 4 | "description": "A BOT PUBLIC MULTI FUNCTION", 5 | "engines": { 6 | "node": "18.x" 7 | }, 8 | "main": "main.js", 9 | "scripts": { 10 | "start": "node main.js" 11 | }, 12 | "dependencies": { 13 | "@bochilteam/scraper": "^2.0.0", 14 | "@open-wa/wa-automate": "^4.36.6", 15 | "@phaticusthiccy/open-apis": "^1.6.0", 16 | "app-root-path": "^3.0.0", 17 | "app-store-scraper": "^0.17.0", 18 | "async-g-i-s": "^1.0.0", 19 | "axios": "^0.21.4", 20 | "bent": "^7.3.12", 21 | "brainly-scraper-v2": "^1.0.3", 22 | "canvacord": "^5.1.0", 23 | "chalk": "4.1.2", 24 | "colors": "1.4.0", 25 | "dotenv": "^10.0.0", 26 | "emoji-api": "^2.0.1", 27 | "figlet": "^1.5.2", 28 | "file-type": "16.5.3", 29 | "flag": "^4.4.0", 30 | "fluent-ffmpeg": "^2.1.2", 31 | "form-data": "^4.0.0", 32 | "fs-extra": "^10.0.0", 33 | "google-it": "^1.6.2", 34 | "google-play-scraper": "^8.1.0", 35 | "hxz-api": "^1.0.1", 36 | "ikyy": "^5.0.6", 37 | "insta-fetcher": "^1.3.21", 38 | "lolis.life": "^4.0.0", 39 | "lowdb": "1.0.0", 40 | "marked": "^4.0.9", 41 | "moment-timezone": "^0.5.34", 42 | "music-lyrics": "^2.0.2", 43 | "nekos.life": "^3.0.0", 44 | "node-cron": "^3.0.0", 45 | "node-fetch": "2.6.6", 46 | "node-gtts": "^2.0.2", 47 | "node-webpmux": "^3.1.1", 48 | "parse-ms": "2.1.0", 49 | "path": "^0.12.7", 50 | "pdfkit": "^0.13.0", 51 | "performance-now": "^2.1.0", 52 | "pretty-ms": "^7.0.1", 53 | "promise": "^8.1.0", 54 | "readline": "^1.3.0", 55 | "remove.bg": "^1.3.0", 56 | "rumus-bdr": "^1.0.0", 57 | "sharp": "^0.30.7", 58 | "spotify-finder": "^2.1.1", 59 | "spotifydl-core": "^0.2.0", 60 | "stream": "0.0.2", 61 | "text2png": "^2.3.0", 62 | "tiktok-scraper-ts": "^1.2.2", 63 | "translatte": "^3.0.1", 64 | "waifu.pics-wrapper": "^1.0.0", 65 | "xfarr-api": "^1.0.3", 66 | "xteam-api": "^0.0.7", 67 | "yt-search": "^2.10.3", 68 | "ytdl-core": "^4.11.0" 69 | }, 70 | "devDependencies": { 71 | "got": "^11.8.1", 72 | "tape": "^5.2.0" 73 | }, 74 | "peerDependencies": { 75 | "fluent-ffmpeg": "^2.1.2", 76 | "sharp": "^0.30.7" 77 | }, 78 | "repository": { 79 | "type": "git", 80 | "url": "git+https://github.com/Terror-Machine/fn-whatsapp-bot.git" 81 | }, 82 | "keywords": [ 83 | "fnbots", 84 | "fnbots-wa", 85 | "whatsapp", 86 | "whatsapp-bot" 87 | ], 88 | "license": "MIT", 89 | "bugs": { 90 | "url": "https://github.com/Terror-Machine/fn-whatsapp-bot/issues" 91 | }, 92 | "homepage": "https://github.com/Terror-Machine/fn-whatsapp-bot#readme", 93 | "author": "arfine meka" 94 | } 95 | -------------------------------------------------------------------------------- /src/Bangers.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/Bangers.ttf -------------------------------------------------------------------------------- /src/fnbots.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/fnbots.webp -------------------------------------------------------------------------------- /src/frames/frame0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/frames/frame0.png -------------------------------------------------------------------------------- /src/frames/frame1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/frames/frame1.png -------------------------------------------------------------------------------- /src/frames/frame2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/frames/frame2.png -------------------------------------------------------------------------------- /src/frames/frame3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/frames/frame3.png -------------------------------------------------------------------------------- /src/frames/frame4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/frames/frame4.png -------------------------------------------------------------------------------- /src/frames/frame5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/frames/frame5.png -------------------------------------------------------------------------------- /src/frames/frame6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/frames/frame6.png -------------------------------------------------------------------------------- /src/ttp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/ttp.gif -------------------------------------------------------------------------------- /src/ttpw.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Terror-Machine/fn-whatsapp-bot/511e7abf11804bd51ec695c268da48050a3b9c19/src/ttpw.webp --------------------------------------------------------------------------------