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