diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..d49a879407c13806eda1d17c7270813f8b5bfe26 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +# Menggunakan Node.js versi 18 sebagai base image +FROM node:18 + +# Menginstal git, ffmpeg, imagemagick, dan webp +RUN apt-get update && \ + apt-get install -y \ + git \ + ffmpeg \ + imagemagick \ + webp && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Menetapkan direktori kerja +WORKDIR /app + +# Membuat direktori sessions +RUN mkdir -p /app/sessions + +# Menyalin file package.json dan package-lock.json +COPY package.json ./ + +# Menginstal dependensi Node.js +RUN npm install + +# Menyalin semua file aplikasi ke dalam container +COPY . . + +# Mengubah kepemilikan direktori /app +RUN chown -R node:node /app + +# Beralih ke pengguna non-root +USER node + +# Mengekspos port 7860 +EXPOSE 7860 + +# Menjalankan aplikasi +CMD ["npm", "start"] \ No newline at end of file diff --git a/Procfile b/Procfile new file mode 100644 index 0000000000000000000000000000000000000000..ada54c4c82e8f8e1b0aacffd02611465c3cfed8f --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +worker: node index.js --autocleartmp --autoread diff --git a/README.md b/README.md index 5d948edc1d0cfa2a0c0a94dd19669625926504aa..6888c51733a10514524ab8a853d67975620a677e 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,10 @@ --- -title: Projek1 -emoji: ๐Ÿ‘€ -colorFrom: purple -colorTo: red -sdk: gradio -sdk_version: 5.8.0 -app_file: app.py +title: veila +emoji: ๐Ÿ˜ป +colorFrom: red +colorTo: indigo +sdk: docker pinned: false --- -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference \ No newline at end of file diff --git a/config.js b/config.js new file mode 100644 index 0000000000000000000000000000000000000000..62d6470f7fe37e0ece2f32b2e8a2f45b76e45124 --- /dev/null +++ b/config.js @@ -0,0 +1,45 @@ +global.owner = ['6285878836361'] +global.mods = ['6285878836361'] +global.prems = ['6285878836361'] +global.nameowner = 'rizki' +global.numberowner = '6285878836361' +global.mail = 'irfanwibu88@gmail.com' +global.gc = 'https://chat.whatsapp.com/KIcqnzY4NJMHXPTz8Xopvd' +global.instagram = 'https://instagram.com/ikykunnnn' +global.wm = 'ยฉ ikyyBot Whatsapp Multi device' +global.wait = '_*Tunggu sedang di proses...*_' +global.eror = '_*Server Error*_' +global.stiker_wait = '*โซนโซบ Stiker sedang dibuat...*' +global.packname = 'Made With' +global.author = 'Bot WhatsApp' +global.autobio = true // Set true untuk mengaktifkan autobio +global.maxwarn = '3' // Peringatan maksimum +global.antiporn = true // Auto delete pesan porno (bot harus admin) + +//INI WAJIB DI ISI!// +global.btc = 'BohqrvbJ' +//Daftar terlebih dahulu https://api.botcahx.eu.org + +//INI OPTIONAL BOLEH DI ISI BOLEH JUGA ENGGA// +global.lann = 'btzrizkiirfan1709' +//Daftar https://api.betabotz.eu.org + +//jangan diganti! +global.APIs = { + btc: 'https://api.botcahx.eu.org' +} + +//ini tidak di isi juga tidak apa-apa +global.APIKeys = { + 'https://api.botcahx.eu.org': 'BohqrvbJ' +} + +let fs = require('fs') +let chalk = require('chalk') +let file = require.resolve(__filename) +fs.watchFile(file, () => { + fs.unwatchFile(file) + console.log(chalk.redBright("Update 'config.js'")) + delete require.cache[file] + require(file) +}) diff --git a/database.json b/database.json new file mode 100644 index 0000000000000000000000000000000000000000..fc1e73b735b5deaccd40ecef707a56518e9314a2 --- /dev/null +++ b/database.json @@ -0,0 +1,854 @@ +{ + "users": { + "6285878836361@s.whatsapp.net": { + "taxi": 0, + "lasttaxi": 0, + "lastyoutuber": 0, + "subscribers": 0, + "viewers": 0, + "like": 0, + "playButton": 0, + "saldo": 0, + "pengeluaran": 0, + "healt": 100, + "health": 100, + "energi": 100, + "power": 100, + "title": 0, + "haus": 100, + "laper": 100, + "tprem": 0, + "stamina": 100, + "level": 0, + "follow": 0, + "lastfollow": 0, + "followers": 0, + "pasangan": "", + "sahabat": "", + "location": "Gubuk", + "titlein": "Belum Ada", + "ultah": "", + "waifu": "Belum Di Set", + "husbu": "Belum Di Set", + "pc": 0, + "exp": 66, + "coin": 0, + "atm": 0, + "limit": 100, + "skata": 0, + "tigame": 999, + "lastclaim": 0, + "judilast": 0, + "lastnambang": 0, + "lastnebang": 0, + "lastmulung": 0, + "lastkerja": 0, + "lastmaling": 0, + "lastbunuhi": 0, + "lastbisnis": 0, + "lastberbisnis": 0, + "bisnis": 0, + "berbisnis": 0, + "lastmancing": 0, + "pancing": 0, + "pancingan": 0, + "totalPancingan": 0, + "kardus": 0, + "botol": 0, + "kaleng": 0, + "money": 0, + "litecoin": 0, + "chip": 0, + "tiketcoin": 0, + "poin": 0, + "bank": 0, + "balance": 0, + "diamond": 0, + "emerald": 0, + "rock": 0, + "wood": 0, + "berlian": 0, + "iron": 0, + "emas": 0, + "common": 0, + "uncommon": 0, + "mythic": 0, + "legendary": 0, + "rumahsakit": 0, + "tambang": 0, + "camptroops": 0, + "pertanian": 0, + "fortress": 0, + "trofi": 0, + "rtrofi": "perunggu", + "makanan": 0, + "troopcamp": 0, + "shield": 0, + "arlok": 0, + "ojekk": 0, + "ojek": 0, + "lastngewe": 0, + "ngewe": 0, + "polisi": 0, + "pedagang": 0, + "dokter": 0, + "petani": 0, + "montir": 0, + "kuli": 0, + "korbanngocok": 0, + "coal": 0, + "korekapi": 0, + "ayambakar": 0, + "gulai": 0, + "rendang": 0, + "ayamgoreng": 0, + "oporayam": 0, + "steak": 0, + "babipanggang": 0, + "ikanbakar": 0, + "lelebakar": 0, + "nilabakar": 0, + "bawalbakar": 0, + "udangbakar": 0, + "pausbakar": 0, + "kepitingbakar": 0, + "soda": 0, + "vodka": 0, + "ganja": 0, + "bandage": 0, + "sushi": 0, + "roti": 0, + "ramuan": 0, + "lastramuanclaim": 0, + "gems": 0, + "cupon": 0, + "lastgemsclaim": 0, + "eleksirb": 0, + "penduduk": 0, + "archer": 0, + "shadow": 0, + "laststringclaim": 0, + "lastpotionclaim": 0, + "lastswordclaim": 0, + "lastweaponclaim": 0, + "lastironclaim": 0, + "lastmancingclaim": 0, + "anakpancingan": 0, + "as": 0, + "paus": 0, + "kepiting": 0, + "gurita": 0, + "cumi": 0, + "buntal": 0, + "dory": 0, + "lumba": 0, + "lobster": 0, + "hiu": 0, + "lele": 0, + "nila": 0, + "bawal": 0, + "udang": 0, + "ikan": 0, + "orca": 0, + "banteng": 0, + "harimau": 0, + "gajah": 0, + "kambing": 0, + "panda": 0, + "buaya": 0, + "kerbau": 0, + "sapi": 0, + "monyet": 0, + "babihutan": 0, + "babi": 0, + "ayam": 0, + "apel": 20, + "ayamb": 0, + "ayamg": 0, + "ssapi": 0, + "sapir": 0, + "leleb": 0, + "leleg": 0, + "esteh": 0, + "pet": 0, + "potion": 0, + "sampah": 0, + "kucing": 0, + "kucinglastclaim": 0, + "kucingexp": 0, + "kuda": 0, + "kudalastclaim": 0, + "rubah": 0, + "rubahlastclaim": 0, + "rubahexp": 0, + "anjing": 0, + "anjinglastclaim": 0, + "anjingexp": 0, + "naga": 0, + "nagalastclaim": 0, + "griffin": 0, + "griffinlastclaim": 0, + "centaur": 0, + "fightnaga": 0, + "centaurlastclaim": 0, + "serigala": 0, + "serigalalastclaim": 0, + "serigalaexp": 0, + "phonix": 0, + "phonixlastclaim": 0, + "phonixexp": 0, + "makanannaga": 0, + "makananphonix": 0, + "makanancentaur": 0, + "makananserigala": 0, + "Banneduser": false, + "BannedReason": "", + "banned": false, + "bannedTime": 0, + "warn": 0, + "afk": -1, + "afkReason": "", + "anakkucing": 0, + "anakkuda": 0, + "anakrubah": 0, + "anakanjing": 0, + "makananpet": 0, + "makananPet": 0, + "antispam": 0, + "antispamlastclaim": 0, + "kayu": 0, + "batu": 0, + "string": 0, + "umpan": 0, + "armor": 0, + "armordurability": 0, + "weapon": 0, + "weapondurability": 0, + "sword": 0, + "sworddurability": 0, + "pickaxe": 0, + "pickaxedurability": 0, + "fishingrod": 0, + "fishingroddurability": 0, + "katana": 0, + "katanadurability": 0, + "bow": 0, + "bowdurability": 0, + "kapak": 0, + "kapakdurability": 0, + "axe": 0, + "axedurability": 0, + "pisau": 0, + "pisaudurability": 0, + "kerjasatu": 0, + "kerjadua": 0, + "kerjatiga": 0, + "kerjaempat": 0, + "kerjalima": 0, + "kerjaenam": 0, + "kerjatujuh": 0, + "kerjadelapan": 0, + "kerjasembilan": 0, + "kerjasepuluh": 0, + "kerjasebelas": 0, + "kerjaduabelas": 0, + "kerjatigabelas": 0, + "kerjaempatbelas": 0, + "kerjalimabelas": 0, + "pekerjaansatu": 0, + "pekerjaandua": 0, + "pekerjaantiga": 0, + "pekerjaanempat": 0, + "pekerjaanlima": 0, + "pekerjaanenam": 0, + "pekerjaantujuh": 0, + "pekerjaandelapan": 0, + "pekerjaansembilan": 0, + "pekerjaansepuluh": 0, + "pekerjaansebelas": 0, + "pekerjaanduabelas": 0, + "pekerjaantigabelas": 0, + "pekerjaanempatbelas": 0, + "pekerjaanlimabelas": 0, + "lastadventure": 0, + "lastwar": 0, + "lastberkebon": 0, + "lastberburu": 0, + "lastbansos": 0, + "lastrampok": 0, + "lastkill": 0, + "lastfishing": 0, + "lastdungeon": 0, + "lastduel": 0, + "lastmining": 0, + "lasthourly": 0, + "lastdagang": 0, + "lasthunt": 0, + "lasthun": 0, + "lastweekly": 0, + "lastmonthly": 0, + "lastyearly": 0, + "lastjb": 0, + "lastrob": 0, + "lastdaang": 0, + "lastngojek": 0, + "lastgrab": 0, + "lastngocok": 0, + "lastturu": 0, + "lastseen": 0, + "lastSetStatus": 0, + "registered": false, + "mangga": 0, + "stroberi": 0, + "semangka": 0, + "jeruk": 0, + "name": "+62 858-7883-6361", + "age": -1, + "regTime": -1, + "premiumDate": -1, + "premium": false, + "premiumTime": 0, + "vip": "tidak", + "vipPoin": 0, + "job": "Pengangguran", + "jobexp": 0, + "jail": false, + "penjara": false, + "antarpaket": 0, + "dirawat": false, + "lbars": "[โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’]", + "role": "Newbie ใ‹ก", + "autolevelup": true, + "lastIstigfar": 0, + "skill": "", + "korps": "", + "korpsgrade": "", + "demon": "", + "breaths": "", + "magic": "", + "darahiblis": 0, + "demonblood": 0, + "demonkill": 0, + "hashirakill": 0, + "alldemonkill": 0, + "allhashirakill": 0, + "attack": 0, + "speed": 0, + "strenght": 0, + "defense": 0, + "regeneration": 0, + "ovo": 0, + "dana": 0, + "gopay": 0, + "lastngaji": 0, + "lastlonte": 0, + "lastkoboy": 0, + "lastdate": 0, + "lasttambang": 0, + "lastngepet": 0, + "command": null, + "commandTotal": null, + "lastCmd": 1732074341233, + "glimit": 10, + "pertambangan": 0, + "lastbossbattle": 0, + "aqua": 0, + "glory": 0, + "enchant": 0, + "psepick": 0, + "psenjata": 0, + "lastgemclaim": 0, + "makanangriffin": 0, + "healthmonster": 0, + "anakserigala": 0, + "anaknaga": 0, + "anakphonix": 0, + "anakgriffin": 0, + "kyubi": 0, + "anakkyubi": 0, + "anakcentaur": 0, + "kingdom": false, + "lastsda": 0, + "lastberbru": 0, + "lastgift": 0, + "jualan": 0, + "lastjualan": 0, + "ngocokk": 0, + "lastngocokk": 0, + "lastcodereg": 0, + "anggur": 0, + "pisang": 0, + "bibitanggur": 0, + "bibitpisang": 0, + "bibitapel": 0, + "bibitmangga": 0, + "bibitjeruk": 0 + }, + "6283121935164@s.whatsapp.net": { + "taxi": 0, + "lasttaxi": 0, + "lastyoutuber": 0, + "subscribers": 0, + "viewers": 0, + "like": 0, + "playButton": 0, + "saldo": 0, + "pengeluaran": 0, + "healt": 100, + "health": 100, + "energi": 100, + "power": 100, + "title": 0, + "haus": 100, + "laper": 100, + "tprem": 0, + "stamina": 100, + "level": 0, + "follow": 0, + "lastfollow": 0, + "followers": 0, + "pasangan": "", + "sahabat": "", + "location": "Gubuk", + "titlein": "Belum Ada", + "ultah": "", + "waifu": "Belum Di Set", + "husbu": "Belum Di Set", + "pc": 0, + "exp": 0, + "coin": 0, + "atm": 0, + "limit": 100, + "skata": 0, + "tigame": 999, + "lastclaim": 0, + "judilast": 0, + "lastnambang": 0, + "lastnebang": 0, + "lastmulung": 0, + "lastkerja": 0, + "lastmaling": 0, + "lastbunuhi": 0, + "lastbisnis": 0, + "lastberbisnis": 0, + "bisnis": 0, + "berbisnis": 0, + "lastmancing": 0, + "pancing": 0, + "pancingan": 0, + "totalPancingan": 0, + "kardus": 0, + "botol": 0, + "kaleng": 0, + "money": 0, + "litecoin": 0, + "chip": 0, + "tiketcoin": 0, + "poin": 0, + "bank": 0, + "balance": 0, + "diamond": 0, + "emerald": 0, + "rock": 0, + "wood": 0, + "berlian": 0, + "iron": 0, + "emas": 0, + "common": 0, + "uncommon": 0, + "mythic": 0, + "legendary": 0, + "rumahsakit": 0, + "tambang": 0, + "camptroops": 0, + "pertanian": 0, + "fortress": 0, + "trofi": 0, + "rtrofi": "perunggu", + "makanan": 0, + "troopcamp": 0, + "shield": 0, + "arlok": 0, + "ojekk": 0, + "ojek": 0, + "lastngewe": 0, + "ngewe": 0, + "polisi": 0, + "pedagang": 0, + "dokter": 0, + "petani": 0, + "montir": 0, + "kuli": 0, + "korbanngocok": 0, + "coal": 0, + "korekapi": 0, + "ayambakar": 0, + "gulai": 0, + "rendang": 0, + "ayamgoreng": 0, + "oporayam": 0, + "steak": 0, + "babipanggang": 0, + "ikanbakar": 0, + "lelebakar": 0, + "nilabakar": 0, + "bawalbakar": 0, + "udangbakar": 0, + "pausbakar": 0, + "kepitingbakar": 0, + "soda": 0, + "vodka": 0, + "ganja": 0, + "bandage": 0, + "sushi": 0, + "roti": 0, + "ramuan": 0, + "lastramuanclaim": 0, + "gems": 0, + "cupon": 0, + "lastgemsclaim": 0, + "eleksirb": 0, + "penduduk": 0, + "archer": 0, + "shadow": 0, + "laststringclaim": 0, + "lastpotionclaim": 0, + "lastswordclaim": 0, + "lastweaponclaim": 0, + "lastironclaim": 0, + "lastmancingclaim": 0, + "anakpancingan": 0, + "as": 0, + "paus": 0, + "kepiting": 0, + "gurita": 0, + "cumi": 0, + "buntal": 0, + "dory": 0, + "lumba": 0, + "lobster": 0, + "hiu": 0, + "lele": 0, + "nila": 0, + "bawal": 0, + "udang": 0, + "ikan": 0, + "orca": 0, + "banteng": 0, + "harimau": 0, + "gajah": 0, + "kambing": 0, + "panda": 0, + "buaya": 0, + "kerbau": 0, + "sapi": 0, + "monyet": 0, + "babihutan": 0, + "babi": 0, + "ayam": 0, + "apel": 20, + "ayamb": 0, + "ayamg": 0, + "ssapi": 0, + "sapir": 0, + "leleb": 0, + "leleg": 0, + "esteh": 0, + "pet": 0, + "potion": 0, + "sampah": 0, + "kucing": 0, + "kucinglastclaim": 0, + "kucingexp": 0, + "kuda": 0, + "kudalastclaim": 0, + "rubah": 0, + "rubahlastclaim": 0, + "rubahexp": 0, + "anjing": 0, + "anjinglastclaim": 0, + "anjingexp": 0, + "naga": 0, + "nagalastclaim": 0, + "griffin": 0, + "griffinlastclaim": 0, + "centaur": 0, + "fightnaga": 0, + "centaurlastclaim": 0, + "serigala": 0, + "serigalalastclaim": 0, + "serigalaexp": 0, + "phonix": 0, + "phonixlastclaim": 0, + "phonixexp": 0, + "makanannaga": 0, + "makananphonix": 0, + "makanancentaur": 0, + "makananserigala": 0, + "Banneduser": false, + "BannedReason": "", + "banned": false, + "bannedTime": 0, + "warn": 0, + "afk": -1, + "afkReason": "", + "anakkucing": 0, + "anakkuda": 0, + "anakrubah": 0, + "anakanjing": 0, + "makananpet": 0, + "makananPet": 0, + "antispam": 0, + "antispamlastclaim": 0, + "kayu": 0, + "batu": 0, + "string": 0, + "umpan": 0, + "armor": 0, + "armordurability": 0, + "weapon": 0, + "weapondurability": 0, + "sword": 0, + "sworddurability": 0, + "pickaxe": 0, + "pickaxedurability": 0, + "fishingrod": 0, + "fishingroddurability": 0, + "katana": 0, + "katanadurability": 0, + "bow": 0, + "bowdurability": 0, + "kapak": 0, + "kapakdurability": 0, + "axe": 0, + "axedurability": 0, + "pisau": 0, + "pisaudurability": 0, + "kerjasatu": 0, + "kerjadua": 0, + "kerjatiga": 0, + "kerjaempat": 0, + "kerjalima": 0, + "kerjaenam": 0, + "kerjatujuh": 0, + "kerjadelapan": 0, + "kerjasembilan": 0, + "kerjasepuluh": 0, + "kerjasebelas": 0, + "kerjaduabelas": 0, + "kerjatigabelas": 0, + "kerjaempatbelas": 0, + "kerjalimabelas": 0, + "pekerjaansatu": 0, + "pekerjaandua": 0, + "pekerjaantiga": 0, + "pekerjaanempat": 0, + "pekerjaanlima": 0, + "pekerjaanenam": 0, + "pekerjaantujuh": 0, + "pekerjaandelapan": 0, + "pekerjaansembilan": 0, + "pekerjaansepuluh": 0, + "pekerjaansebelas": 0, + "pekerjaanduabelas": 0, + "pekerjaantigabelas": 0, + "pekerjaanempatbelas": 0, + "pekerjaanlimabelas": 0, + "lastadventure": 0, + "lastwar": 0, + "lastberkebon": 0, + "lastberburu": 0, + "lastbansos": 0, + "lastrampok": 0, + "lastkill": 0, + "lastfishing": 0, + "lastdungeon": 0, + "lastduel": 0, + "lastmining": 0, + "lasthourly": 0, + "lastdagang": 0, + "lasthunt": 0, + "lasthun": 0, + "lastweekly": 0, + "lastmonthly": 0, + "lastyearly": 0, + "lastjb": 0, + "lastrob": 0, + "lastdaang": 0, + "lastngojek": 0, + "lastgrab": 0, + "lastngocok": 0, + "lastturu": 0, + "lastseen": 0, + "lastSetStatus": 0, + "registered": false, + "mangga": 0, + "stroberi": 0, + "semangka": 0, + "jeruk": 0, + "name": "irfan", + "age": -1, + "regTime": -1, + "premiumDate": -1, + "premium": false, + "premiumTime": 0, + "vip": "tidak", + "vipPoin": 0, + "job": "Pengangguran", + "jobexp": 0, + "jail": false, + "penjara": false, + "antarpaket": 0, + "dirawat": false, + "lbars": "[โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’]", + "role": "Newbie ใ‹ก", + "autolevelup": true, + "lastIstigfar": 0, + "skill": "", + "korps": "", + "korpsgrade": "", + "demon": "", + "breaths": "", + "magic": "", + "darahiblis": 0, + "demonblood": 0, + "demonkill": 0, + "hashirakill": 0, + "alldemonkill": 0, + "allhashirakill": 0, + "attack": 0, + "speed": 0, + "strenght": 0, + "defense": 0, + "regeneration": 0, + "ovo": 0, + "dana": 0, + "gopay": 0, + "lastngaji": 0, + "lastlonte": 0, + "lastkoboy": 0, + "lastdate": 0, + "lasttambang": 0, + "lastngepet": 0, + "glimit": 10, + "pertambangan": 0, + "lastbossbattle": 0, + "aqua": 0, + "glory": 0, + "enchant": 0, + "psepick": 0, + "psenjata": 0, + "lastgemclaim": 0, + "makanangriffin": 0, + "healthmonster": 0, + "anakserigala": 0, + "anaknaga": 0, + "anakphonix": 0, + "anakgriffin": 0, + "kyubi": 0, + "anakkyubi": 0, + "anakcentaur": 0, + "kingdom": false, + "lastsda": 0, + "lastberbru": 0, + "lastgift": 0, + "jualan": 0, + "lastjualan": 0, + "ngocokk": 0, + "lastngocokk": 0, + "lastcodereg": 0, + "anggur": 0, + "pisang": 0, + "bibitanggur": 0, + "bibitpisang": 0, + "bibitapel": 0, + "bibitmangga": 0, + "bibitjeruk": 0 + } + }, + "chats": { + "6285878836361@s.whatsapp.net": { + "isBanned": false, + "welcome": true, + "welcometype": 1, + "detect": false, + "isBannedTime": false, + "mute": false, + "listStr": {}, + "sWelcome": "Hai, @user!\nSelamat datang di grup @subject\n\n@desc", + "sBye": "Selamat tinggal @user!", + "sPromote": "", + "sDemote": "", + "delete": false, + "antiLink": false, + "antiLinknokick": false, + "antiSticker": false, + "antiStickernokick": false, + "viewonce": false, + "antiToxic": true, + "antilinkig": false, + "antilinkignokick": false, + "antilinkyt": false, + "antilinkytnokick": false, + "antilinktwit": false, + "antilinktwitnokick": false, + "antilinkfb": false, + "antilinkfbnokick": false, + "antilinkall": false, + "antilinkallnokick": false, + "antilinkwame": false, + "antilinkwamenokick": false, + "antilinktele": false, + "antilinktelenokick": false, + "antilinktt": false, + "antilinkttnokick": false, + "antibot": false, + "rpg": false, + "expired": 0, + "memgc": { + "6285878836361@s.whatsapp.net": { + "blacklist": false, + "banned": false, + "bannedTime": 0, + "chat": 0, + "chatTotal": 0, + "command": 0, + "commandTotal": 0, + "lastseen": 0 + }, + "6283121935164@s.whatsapp.net": { + "blacklist": false, + "banned": false, + "bannedTime": 0, + "chat": 0, + "chatTotal": 0, + "command": 0, + "commandTotal": 0, + "lastseen": 0 + } + } + } + }, + "stats": { + "menu.js": { + "total": 2, + "success": 2, + "last": 1732074269621, + "lastSuccess": 1732074269621 + }, + "downloader-pindl.js": { + "total": 2, + "success": 0, + "last": 1732074298135, + "lastSuccess": 0 + }, + "downloader-pinterest.js": { + "total": 2, + "success": 2, + "last": 1732074374075, + "lastSuccess": 1732074374075 + } + }, + "msgs": {}, + "sticker": {} +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..2ad24f6a8404b76dae6f15de11e66ebbcf652f7d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +version: '3.8' + +services: + bot: + build: . + ports: + - "7860:7860" + volumes: + - ./sessions:/app/sessions + environment: + - DB_URI=mongodb+srv://rizkiirfan1709:sovB4gs2FBEyXZg2@ikybotwa.bye92.mongodb.net/?retryWrites=true&w=majority&appName=IkyBotWA \ No newline at end of file diff --git a/handler.js b/handler.js new file mode 100644 index 0000000000000000000000000000000000000000..5b70f1cc6eb2aa5b007cc3edc23fc0b91b58d3f2 --- /dev/null +++ b/handler.js @@ -0,0 +1,1261 @@ +const simple = require('./lib/simple') +const util = require('util') + +const isNumber = x => typeof x === 'number' && !isNaN(x) +const delay = ms => isNumber(ms) && new Promise(resolve => setTimeout(resolve, ms)) + +module.exports = { + async handler(chatUpdate) { + if (global.db.data == null) await loadDatabase() + this.msgqueque = this.msgqueque || [] + // console.log(chatUpdate) + if (!chatUpdate) return + // if (chatUpdate.messages.length > 2 || !chatUpdate.messages.length) return + if (chatUpdate.messages.length > 1) console.log(chatUpdate.messages) + let m = chatUpdate.messages[chatUpdate.messages.length - 1] + if (!m) return + //console.log(JSON.stringify(m, null, 4)) + try { + m = simple.smsg(this, m) || m + if (!m) return + // console.log(m) + m.exp = 0 + m.limit = false + try { + let user = global.db.data.users[m.sender] + if (typeof user !== 'object') global.db.data.users[m.sender] = {} + if (user) { + if (!isNumber(user.saldo)) user.saldo = 0 + if (!isNumber(user.pengeluaran)) user.pengeluaran = 0 + if (!isNumber(user.healt)) user.healt = 100 + if (!isNumber(user.health)) user.health = 100 + if (!isNumber(user.energi)) user.energi = 100 + if (!isNumber(user.power)) user.power = 100 + if (!isNumber(user.title)) user.title = 0 + if (!isNumber(user.stamina)) user.stamina = 100 + if (!isNumber(user.haus)) user.haus = 100 + if (!isNumber(user.laper)) user.laper = 100 + if (!isNumber(user.level)) user.level = 0 + if (!('titlein' in user)) user.titlein = 'Belum Ada' + if (!("ultah" in user)) user.ultah = '' + if (!('pasangan' in user)) user.pasangan = '' + if (!('sahabat' in user)) user.sahabat = '' + if (!('location' in user)) user.location = 'Gubuk' + if (!('husbu' in user)) user.husbu = 'Belum Di Set' + if (!('waifu' in user)) user.waifu = 'Belum Di Set' + if (!isNumber(user.follow)) user.follow = 0 + if (!isNumber(user.lastfollow)) user.lastfollow = 0 + if (!isNumber(user.followers)) user.followers = 0 + if (!isNumber(user.exp)) user.exp = 0 + if (!isNumber(user.pc)) user.pc = 0 + if (!isNumber(user.korbanngocok)) user.korbanngocok = 0 + if (!isNumber(user.ojekk)) user.ojekk = 0 + if (!isNumber(user.polisi)) user.polisi = 0 + if (!isNumber(user.ojek)) user.ojek = 0 + if (!isNumber(user.pedagang)) user.pedagang = 0 + if (!isNumber(user.dokter)) user.dokter = 0 + if (!isNumber(user.petani)) user.petani = 0 + if (!isNumber(user.montir)) user.montir = 0 + if (!isNumber(user.kuli)) user.kuli = 0 + if (!isNumber(user.trofi)) user.trofi= 0 + if (!user.rtrofi) user.rtrofi = 'Perunggu' + if (!isNumber(user.troopcamp)) user.troopcamp = 0 + if (!isNumber(user.coin)) user.coin = 0 + if (!isNumber(user.atm)) user.atm = 0 + if (!isNumber(user.limit)) user.limit = 100 + if (!isNumber(user.glimit)) user.glimit = 10 + if (!isNumber(user.tprem)) user.tprem = 0 + if (!isNumber(user.tigame)) user.tigame = 5 + if (!isNumber(user.lastclaim)) user.lastclaim = 0 + if (isNumber(user.lastmulung)) user.lastmulung = 0 + if (!isNumber(user.judilast)) user.judilast = 0 + if (!isNumber(user.lastnambang)) user.lastnambang = 0 + if (!isNumber(user.lastnebang)) user.lastnebang = 0 + if (!isNumber(user.lastkerja)) user.lastkerja = 0 + if (!isNumber(user.lastmaling)) user.lastmaling = 0 + if (!isNumber(user.lastbunuhi)) user.lastbunuhi = 0 + if (!isNumber(user.lastbisnis)) user.lastbisnis = 0 + if (!isNumber(user.lastberbisnis)) user.lastberbisnis = 0 + if (!isNumber(user.berbisnis)) user.berbisnis = 0 + if (!isNumber(user.bisnis)) user.bisnis = 0 + if (!isNumber(user.lastmancing)) user.lastmancing = 0 + if (!isNumber(user.money)) user.money = 0 + if (!isNumber(user.rumahsakit)) user.rumahsakit= 0 + if (!isNumber(user.fortress)) user.fortress = 0 + if (!isNumber(user.shield)) user.shield = false + if (!isNumber(user.pertanian)) user.pertanian = 0 + if (!isNumber(user.pertambangan)) user.pertambangan = 0 + if (!isNumber(user.camptroops)) user.camptroops = 0 + if (!isNumber(user.tambang)) user.tambang = 0 + + //Tambahan rpg + if (!isNumber(user.litecoin)) user.litecoin = 0 + if (!isNumber(user.chip)) user.chip = 0 + if (!isNumber(user.tiketcoin)) user.tiketcoin = 0 + if (!isNumber(user.poin)) user.poin = 0 + if (!isNumber (user.lastbossbattle)) user.lastbossbattle = 0 + if (!isNumber (user.bank)) user.bank = 0 + if (!isNumber (user.balance)) user.balance = 0 + + if (!isNumber(user.botol)) user.botol = 0 + if (!isNumber(user.kardus)) user.kardus = 0 + if (!isNumber(user.kaleng)) user.kaleng = 0 + if (!isNumber(user.aqua)) user.aqua = 0 + if (!isNumber(user.diamond)) user.diamond = 0 + if (!isNumber(user.emerald)) user.emerald = 0 + if (!isNumber(user.wood)) user.wood = 0 + if (!isNumber(user.rock)) user.rock = 0 + if (!isNumber(user.berlian)) user.berlian = 0 + if (!isNumber(user.iron)) user.iron = 0 + if (!isNumber(user.emas)) user.emas = 0 + if (!isNumber(user.arlok)) user.arlok = 0 + + if (!isNumber(user.common)) user.common = 0 + if (!isNumber(user.as)) user.as = 0 + if (!isNumber(user.uncommon)) user.uncommon = 0 + if (!isNumber(user.mythic)) user.mythic = 0 + if (!isNumber(user.legendary)) user.legendary = 0 + if (!isNumber(user.glory)) user.glory = 0 + if (!isNumber(user.enchant)) user.enchant = 0 + if (!isNumber(user.pet)) user.pet = 0 + if (!isNumber(user.psepick)) user.psepick = 0 + if (!isNumber(user.psenjata)) user.psenjata = 0 + //rpg meracik + if (!isNumber(user.lastramuanclaim)) user.lastramuanclaim = 0 + if (!isNumber(user.gems)) user.gems = 0 + if (!isNumber(user.cupon)) user.cupon = 0 + if (!isNumber(user.lastgemclaim)) user.lastgemclaim = 0 + if (!isNumber(user.eleksirb)) user.eleksirb = 0 + if (!isNumber(user.penduduk)) user.penduduk = 0 + if (!isNumber(user.archer)) user.archer = 0 + if (!isNumber(user.shadow)) user.shadow = 0 + if (!isNumber(user.lastpotionclaim)) user.lastpotionclaim = 0 + if (!isNumber(user.laststringclaim)) user.laststringclaim = 0 + if (!isNumber(user.lastswordclaim)) user.lastswordclaim = 0 + if (!isNumber(user.lastweaponclaim)) user.lastweaponclaim = 0 + if (!isNumber(user.lastironclaim)) user.lastironclaim = 0 + if (!isNumber(user.lastmancingclaim)) user.lastmancingclaim = 0 + if (!isNumber(user.anakpancingan)) user.anakpancingan = 0 + + if (!isNumber(user.potion)) user.potion = 0 + if (!isNumber(user.sampah)) user.sampah = 0 + if (!isNumber(user.pancing)) user.pancing = 0 + if (!isNumber(user.pancingan)) user.pancingan = 0 + if (!isNumber(user.totalPancingan)) user.totalPancingan = 0 + //penambah stamina + if (!isNumber(user.apel)) user.apel = 0 + if (!isNumber(user.ayamb)) user.ayamb = 0 + if (!isNumber(user.ayamg)) user.ayamg = 0 + if (!isNumber(user.sapir)) user.sapir = 0 + if (!isNumber(user.ssapi)) user.ssapi = 0 + if (!isNumber(user.esteh)) user.esteh = 0 + if (!isNumber(user.leleg)) user.leleg = 0 + if (!isNumber(user.leleb)) user.leleb = 0 + + if (!isNumber(user.ayambakar)) user.ayambakar = 0 + if (!isNumber(user.gulai)) user.gulai = 0 + if (!isNumber(user.rendang)) user.rendang = 0 + if (!isNumber(user.ayamgoreng)) user.ayamgoreng = 0 + if (!isNumber(user.oporayam)) user.oporayam = 0 + if (!isNumber(user.steak)) user.steak = 0 + if (!isNumber(user.babipanggang)) user.babipanggang = 0 + if (!isNumber(user.ikanbakar)) user.ikanbakar = 0 + if (!isNumber(user.nilabakar)) user.nilabakar = 0 + if (!isNumber(user.lelebakar)) user.lelebakar = 0 + if (!isNumber(user.bawalbakar)) user.bawalbakar = 0 + if (!isNumber(user.udangbakar)) user.udangbakar = 0 + if (!isNumber(user.pausbakar)) user.pausbakar = 0 + if (!isNumber(user.kepitingbakar)) user.kepitingbakar = 0 + if (!isNumber(user.soda)) user.soda = 0 + if (!isNumber(user.vodka)) user.vodka = 0 + if (!isNumber(user.ganja)) user.ganja = 0 + if (!isNumber(user.bandage)) user.bandage = 0 + if (!isNumber(user.sushi)) user.sushi = 0 + if (!isNumber(user.roti)) user.roti = 0 + //untuk masak + if (!isNumber(user.coal)) user.coal = 0 + if (!isNumber(user.korekapi)) user.korekapi = 0 + //tools + if (!isNumber(user.umpan)) user.umpan = 0 + + if (!isNumber(user.armor)) user.armor = 0 + if (!isNumber(user.armordurability)) user.armordurability = 0 + if (!isNumber(user.weapon)) user.weapon = 0 + if (!isNumber(user.weapondurability)) user.weapondurability = 0 + if (!isNumber(user.sword)) user.sword = 0 + if (!isNumber(user.sworddurability)) user.sworddurability = 0 + if (!isNumber(user.pickaxe)) user.pickaxe = 0 + if (!isNumber(user.pickaxedurability)) user.pickaxedurability = 0 + if (!isNumber(user.fishingrod)) user.fishingrod = 0 + if (!isNumber(user.fishingroddurability)) user.fishingroddurability = 0 + if (!isNumber(user.katana)) user.katana = 0 + if (!isNumber(user.katanadurability)) user.katanadurability = 0 + if (!isNumber(user.bow)) user.bow = 0 + if (!isNumber(user.bowdurability)) user.bowdurability = 0 + if (!isNumber(user.kapak)) user.kapak = 0 + if (!isNumber(user.kapakdurability)) user.kapakdurability = 0 + if (!isNumber(user.axe)) user.axe = 0 + if (!isNumber(user.axedurability)) user.axedurability = 0 + if (!isNumber(user.pisau)) user.pisau = 0 + if (!isNumber(user.pisaudurability)) user.pisaudurability = 0 + + if (!isNumber(user.kerjasatu)) user.kerjasatu = 0 + if (!isNumber(user.kerjadua)) user.kerjadua = 0 + if (!isNumber(user.kerjatiga)) user.kerjatiga = 0 + if (!isNumber(user.kerjaempat)) user.kerjaempat = 0 + if (!isNumber(user.kerjalima)) user.kerjalima = 0 + if (!isNumber(user.kerjaenam)) user.kerjaenam = 0 + if (!isNumber(user.kerjatujuh)) user.kerjatujuh = 0 + if (!isNumber(user.kerjadelapan)) user.kerjadelapan = 0 + if (!isNumber(user.kerjasembilan)) user.kerjasembilan = 0 + if (!isNumber(user.kerjasepuluh)) user.kerjasepuluh = 0 + if (!isNumber(user.kerjasebelas)) user.kerjasebelas = 0 + if (!isNumber(user.kerjaduabelas)) user.kerjaduabelas = 0 + if (!isNumber(user.kerjatigabelas)) user.kerjatigabelas = 0 + if (!isNumber(user.kerjaempatbelas)) user.kerjaempatbelas = 0 + if (!isNumber(user.kerjalimabelas)) user.kerjalimabelas = 0 + + if (!isNumber(user.pekerjaansatu)) user.pekerjaansatu = 0 + if (!isNumber(user.pekerjaandua)) user.pekerjaandua = 0 + if (!isNumber(user.pekerjaantiga)) user.pekerjaantiga = 0 + if (!isNumber(user.pekerjaanempat)) user.pekerjaanempat = 0 + if (!isNumber(user.pekerjaanlima)) user.pekerjaanlima = 0 + if (!isNumber(user.pekerjaanenam)) user.pekerjaanenam = 0 + if (!isNumber(user.pekerjaantujuh)) user.pekerjaantujuh = 0 + if (!isNumber(user.pekerjaandelapan)) user.pekerjaandelapan = 0 + if (!isNumber(user.pekerjaansembilan)) user.pekerjaansembilan = 0 + if (!isNumber(user.pekerjaansepuluh)) user.pekerjaansepuluh = 0 + if (!isNumber(user.pekerjaansebelas)) user.pekerjaansebelas = 0 + if (!isNumber(user.pekerjaanduabelas)) user.pekerjaanduabelas = 0 + if (!isNumber(user.pekerjaantigabelas)) user.pekerjaantigabelas = 0 + if (!isNumber(user.pekerjaanempatbelas)) user.pekerjaanempatbelas = 0 + if (!isNumber(user.pekerjaanlimabelas)) user.pekerjaanlimabelas = 0 + + if (!isNumber(user.kucing)) user.kucing = 0 + if (!isNumber(user.kucinglastclaim)) user.kucinglastclaim = 0 + if (!isNumber(user.kucingexp)) user.kucingexp = 0 + if (!isNumber(user.kuda)) user.kuda = 0 + if (!isNumber(user.kudalastclaim)) user.kudalastclaim = 0 + if (!isNumber(user.rubah)) user.rubah = 0 + if (!isNumber(user.rubahlastclaim)) user.rubahlastclaim = 0 + if (!isNumber(user.rubahexp)) user.rubahexp = 0 + if (!isNumber(user.anjing)) user.anjing = 0 + if (!isNumber(user.anjinglastclaim)) user.anjinglastclaim = 0 + if (!isNumber(user.anjingexp)) user.anjingexp = 0 + if (!isNumber(user.serigalalastclaim)) user.serigalalastclaim = 0 + if (!isNumber(user.nagalastclaim)) user.nagalastclaim = 0 + if (!isNumber(user.phonixlastclaim)) user.phonixlastclaim = 0 + if (!isNumber(user.phonixexp)) user.phonixexp = 0 + if (!isNumber(user.griffinlastclaim)) user.griffinlastclaim = 0 + if (!isNumber(user.centaurlastclaim)) user.centaurlastclaim = 0 + + if (!isNumber(user.makananpet)) user.makananpet = 0 + if (!isNumber(user.makanannaga)) user.makanannaga = 0 + if (!isNumber(user.makananphonix)) user.makananphonix = 0 + if (!isNumber(user.makanangriffin)) user.makanangriffin = 0 + if (!isNumber(user.makananserigala)) user.makananserigala = 0 + if (!isNumber(user.makanancentaur)) user.makanancentaur = 0 + + if (!'Banneduser' in user) user.Banneduser = false + if (!'BannedReason' in user) user.BannedReason = '' + if (!isNumber(user.warn)) user.warn = 0 + if (!('banned' in user)) user.banned = false + if (!isNumber(user.bannedTime)) user.bannedTime = 0 + + if (!isNumber(user.afk)) user.afk = -1 + if (!'afkReason' in user) user.afkReason = '' + + //PET + if (!isNumber(user.healthmonster)) user.healthmonster = 0 + if (!isNumber(user.anakkucing)) user.anakkucing = 0 + if (!isNumber(user.anakkuda)) user.anakkuda = 0 + if (!isNumber(user.anakrubah)) user.anakrubah = 0 + if (!isNumber(user.anakanjing)) user.anakanjing = 0 + if (!isNumber(user.serigala)) user.serigala = 0 + if (!isNumber(user.serigalaexp)) user.serigalaexp = 0 + if (!isNumber(user.anakserigala)) user.anakserigala = 0 + if (!isNumber(user.naga)) user.naga = 0 + if (!isNumber(user.anaknaga)) user.anaknaga = 0 + if (!isNumber(user.phonix)) user.phonix = 0 + if (!isNumber(user.anakphonix)) user.anakphonix = 0 + if (!isNumber(user.griffin)) user.griffin = 0 + if (!isNumber(user.anakgriffin)) user.anakgriffin = 0 + if (!isNumber(user.kyubi)) user.kyubi = 0 + if (!isNumber(user.anakkyubi)) user.anakkyubi = 0 + if (!isNumber(user.centaur)) user.centaur = 0 + if (!isNumber(user.fightnaga)) user.fightnaga = 0 + if (!isNumber(user.anakcentaur)) user.anakcentaur = 0 + if (!isNumber(user.makananPet)) user.makananPet = 0 + + if (!isNumber(user.antispam)) user.antispam = 0 + if (!isNumber(user.antispamlastclaim)) user.antispamlastclaim = 0 + + if (!isNumber(user.kayu)) user.kayu = 0 + if (!('kingdom' in user)) user.kingdom = false + if (!isNumber(user.batu)) user.batu = 0 + if (!isNumber(user.ramuan)) user.ramuan = 0 + if (!isNumber(user.string)) user.string = 0 + + //mancing + if (!isNumber(user.paus)) user.paus = 0 + if (!isNumber(user.kepiting)) user.kepiting = 0 + if (!isNumber(user.gurita)) user.gurita = 0 + if (!isNumber(user.cumi)) user.cumi= 0 + if (!isNumber(user.buntal)) user.buntal = 0 + if (!isNumber(user.dory)) user.dory = 0 + if (!isNumber(user.lumba)) user.lumba = 0 + if (!isNumber(user.lobster)) user.lobster = 0 + if (!isNumber(user.hiu)) user.hiu = 0 + if (!isNumber(user.udang)) user.udang = 0 + if (!isNumber(user.ikan)) user.ikan = 0 + if (!isNumber(user.nila)) user.nila = 0 + if (!isNumber(user.bawal)) user.bawal = 0 + if (!isNumber(user.lele)) user.lele = 0 + if (!isNumber(user.orca)) user.orca = 0 + + if (!isNumber(user.banteng)) user.banteng = 0 + if (!isNumber(user.harimau)) user.harimau = 0 + if (!isNumber(user.gajah)) user.gajah = 0 + if (!isNumber(user.kambing)) user.kambing = 0 + if (!isNumber(user.panda)) user.panda = 0 + if (!isNumber(user.buaya)) user.buaya = 0 + if (!isNumber(user.kerbau)) user.kerbau = 0 + if (!isNumber(user.sapi)) user.sapi = 0 + if (!isNumber(user.monyet)) user.monyet = 0 + if (!isNumber(user.babihutan)) user.babihutan = 0 + if (!isNumber(user.babi)) user.babi = 0 + if (!isNumber(user.ayam)) user.ayam = 0 + + if (!isNumber(user.lastadventure)) user.lastadventure = 0 + if (!isNumber(user.lastberburu)) user.lastberburu = 0 + if (!isNumber(user.lastkill)) user.lastkill = 0 + if (!isNumber(user.lastfishing)) user.lastfishing = 0 + if (!isNumber(user.lastdungeon)) user.lastdungeon = 0 + if (!isNumber(user.lastwar)) user.lastwar = 0 + if (!isNumber(user.lastsda)) user.lastsda = 0 + if (!isNumber(user.lastberbru)) user.lastberbru = 0 + if (!isNumber(user.lastduel)) user.lastduel = 0 + if (!isNumber(user.lastjb)) user.lastjb = 0 + if (!isNumber(user.lastSetStatus)) user.lastSetStatus = 0 + if (!isNumber(user.lastmining)) user.lastmining = 0 + if (!isNumber(user.lasthunt)) user.lasthunt = 0 + if (!isNumber(user.lasthun)) user.lasthun = 0 + if (!isNumber(user.lastngocok)) user.lastngocok = 0 + if (!isNumber(user.lastgift)) user.lastgift = 0 + if (!isNumber(user.lastrob)) user.lastrob = 0 + if (!isNumber(user.lastngojek)) user.lastngojek = 0 + if (!isNumber(user.lastngewe)) user.lastngewe = 0 + if (!isNumber(user.ngewe)) user.ngewe = 0 + if (!isNumber(user.jualan)) user.jualan = 0 + if (!isNumber(user.lastjualan)) user.lastjualan = 0 + if (!isNumber(user.ngocokk)) user.ngocokk = 0 + if (!isNumber(user.lastngocokk)) user.lastngocokk = 0 + if (!isNumber(user.lastgrab)) user.lastgrab = 0 + if (!isNumber(user.lastberkebon)) user.lastberkebon = 0 + if (!isNumber(user.lastcodereg)) user.lastcodereg = 0 + if (!isNumber(user.lastdagang)) user.lastdagang = 0 + if (!isNumber(user.lasthourly)) user.lasthourly = 0 + if (!isNumber(user.lastweekly)) user.lastweekly = 0 + if (!isNumber(user.lastyearly)) user.lastyearly = 0 + if (!isNumber(user.lastmonthly)) user.lastmonthly = 0 + if (!isNumber(user.lastIstigfar)) user.lastIstigfar = 0 + if (!isNumber(user.lastturu)) user.lastturu = 0 + if (!isNumber(user.lastseen)) user.lastseen = 0 + if (!isNumber(user.lastbansos)) user.lastbansos = 0 + if (!isNumber(user.lastrampok)) user.lastrampok = 0 + if (!('registered' in user)) user.registered = false + if (!user.registered) { + if (!('name' in user)) user.name = this.getName(m.sender) + + if (!isNumber(user.apel)) user.apel = 0 + if (!isNumber(user.anggur)) user.anggur = 0 + if (!isNumber(user.jeruk)) user.jeruk = 0 + if (!isNumber(user.semangka)) user.semangka = 0 + if (!isNumber(user.mangga)) user.mangga = 0 + if (!isNumber(user.stroberi)) user.stroberi = 0 + if (!isNumber(user.pisang)) user.pisang = 0 + if (!isNumber(user.kayu)) user.kayu = 0 + if (!isNumber(user.makanan)) user.makanan = 0 + if (!isNumber(user.bibitanggur)) user.bibitanggur = 0 + if (!isNumber(user.bibitpisang)) user.bibitpisang = 0 + if (!isNumber(user.bibitapel)) user.bibitapel = 0 + if (!isNumber(user.bibitmangga)) user.bibitmangga = 0 + if (!isNumber(user.bibitjeruk)) user.bibitjeruk = 0 + + //sambung kata + if (!isNumber(user.skata)) user.skata = 0 + + + if (!isNumber(user.age)) user.age = -1 + if (!isNumber(user.premiumDate)) user.premiumDate = -1 + if (!isNumber(user.regTime)) user.regTime = -1 + + } + if (!isNumber(user.level)) user.level = 0 + if (!user.job) user.job = 'Pengangguran' + if (!isNumber(user.jobexp)) user.jobexp = 0 + if (!('jail' in user)) user.jail = false + if (!('penjara' in user)) user.penjara = false + if (!('dirawat' in user)) user.dirawat = false + if (!isNumber(user.antarpaket)) user.antarpaket = 0 + if (!user.lbars) user.lbars = '[โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’]' + if (!user.premium) user.premium = false + if (!user.premiumTime) user.premiumTime= 0 + if (!user.vip) user.vip = 'tidak' + if (!isNumber(user.vipPoin)) user.vipPoin = 0 + if (!user.role) user.role = 'Newbie ใ‹ก' + if (!('autolevelup' in user)) user.autolevelup = true + if (!('lastIstigfar' in user)) user.lastIstigfar = true + + //demon slayer dan rpg baru + if (!("skill" in user)) user.skill = "" + if (!("korps" in user)) user.korps = "" + if (!("korpsgrade" in user)) user.korpsgrade = "" + if (!("breaths" in user)) user.breaths = "" + if (!("magic" in user)) user.magic = "" + if (!("demon" in user)) user.demon = "" + if (!isNumber(user.darahiblis)) user.darahiblis = 0 + if (!isNumber(user.demonblood)) user.demonblood = 0 + if (!isNumber(user.demonkill)) user.demonkill = 0 + if (!isNumber(user.hashirakill)) user.hashirakill = 0 + if (!isNumber(user.alldemonkill)) user.alldemonkill = 0 + if (!isNumber(user.allhashirakill)) user.allhashirakill = 0 + if (!isNumber(user.attack)) user.attack = 0 + if (!isNumber(user.strenght)) user.strenght = 0 + if (!isNumber(user.speed)) user.speed = 0 + if (!isNumber(user.defense)) user.defense = 0 + if (!isNumber(user.regeneration)) user.regeneration = 0 + if (!isNumber(user.dana)) user.dana = 0 + if (!isNumber(user.gopay)) user.gopay = 0 + if (!isNumber(user.ovo)) user.ovo = 0 + if (!isNumber(user.lastngaji)) user.lastngaji = 0 + if (!isNumber(user.lastlonte)) user.lastlonte = 0 + if (!isNumber(user.lastkoboy)) user.lastkoboy = 0 + if (!isNumber(user.lastdate)) user.lastdate = 0 + if (!isNumber(user.lasttambang)) user.lasttambang = 0 + if (!isNumber(user.lastngepet)) user.lastngepet = 0 + if (!isNumber(user.lasttaxi)) user.lasttaxi = 0 + if (!isNumber(user.taxi)) user.taxi = 0 + if (!isNumber(user.lastyoutuber)) user.lastyoutuber = 0 + if (!isNumber(user.subscribers)) user.subscribers = 0 + if (!isNumber(user.viewers)) user.viewers = 0 + if (!isNumber(user.like)) user.like = 0 + if (!isNumber(user.playButton)) user.playButton = 0 + + } else global.db.data.users[m.sender] = { + taxi: 0, + lasttaxi: 0, + lastyoutuber: 0, + subscribers: 0, + viewers: 0, + like: 0, + playButton: 0, + saldo: 0, + pengeluaran: 0, + healt: 100, + health: 100, + energi: 100, + power: 100, + title: '', + haus: 100, + laper: 100, + tprem: 0, + stamina : 100, + level: 0, + follow: 0, + lastfollow: 0, + followers: 0, + pasangan: '', + sahabat: '', + location: 'Gubuk', + titlein: 'Belum Ada', + ultah: '', + waifu: 'Belum Di Set', + husbu: 'Belum Di Set', + pc : 0, + exp: 0, + coin: 0, + atm: 0, + limit: 100, + skata: 0, + tigame: 999, + lastclaim: 0, + judilast: 0, + lastnambang: 0, + lastnebang: 0, + lastmulung: 0, + lastkerja: 0, + lastmaling: 0, + lastbunuhi: 0, + lastbisnis: 0, + lastberbisnis: 0, + bisnis: 0, + berbisnis: 0, + lastmancing: 0, + pancing: 0, + pancingan: 0, + totalPancingan: 0, + kardus: 0, + botol: 0, + kaleng: 0, + money: 0, + litecoin: 0, + chip: 0, + tiketcoin: 0, + poin: 0, + bank: 0, + balance: 0, + diamond: 0, + emerald: 0, + rock: 0, + wood: 0, + berlian: 0, + iron: 0, + emas: 0, + common: 0, + uncommon: 0, + mythic: 0, + legendary: 0, + rumahsakit: 0, + tambang: 0, + camptroops: 0, + pertanian: 0, + fortress: 0, + trofi: 0, + rtrofi: 'perunggu', + makanan: 0, + troopcamp: 0, + shield: 0, + arlok: 0, + ojekk: 0, + ojek: 0, + lastngewe: 0, + ngewe: 0, + polisi: 0, + pedagang: 0, + dokter: 0, + petani: 0, + montir: 0, + kuli: 0, + korbanngocok: 0, + //+ stamina + coal: 0, + korekapi: 0, + ayambakar: 0, + gulai: 0, + rendang: 0, + ayamgoreng: 0, + oporayam: 0, + steak: 0, + babipanggang: 0, + ikanbakar: 0, + lelebakar: 0, + nilabakar: 0, + bawalbakar: 0, + udangbakar: 0, + pausbakar: 0, + kepitingbakar: 0, + soda: 0, + vodka: 0, + ganja: 0, + bandage: 0, + sushi: 0, + roti: 0, + //meracik + ramuan: 0, + lastramuanclaim: 0, + gems: 0, + cupon: 0, + lastgemsclaim: 0, + eleksirb: 0, + penduduk: 0, + archer: 0, + shadow: 0, + laststringclaim: 0, + lastpotionclaim: 0, + lastswordclaim: 0, + lastweaponclaim: 0, + lastironclaim: 0, + lastmancingclaim: 0, + anakpancingan: 0, + //mancing + as: 0, + paus: 0, + kepiting: 0, + gurita: 0, + cumi: 0, + buntal: 0, + dory: 0, + lumba: 0, + lobster: 0, + hiu: 0, + lele: 0, + nila: 0, + bawal: 0, + udang: 0, + ikan: 0, + orca: 0, + banteng: 0, + harimau: 0, + gajah: 0, + kambing: 0, + panda: 0, + buaya: 0, + kerbau : 0, + sapi: 0, + monyet : 0, + babihutan: 0, + babi: 0, + ayam: 0, + apel: 20, + ayamb: 0, + ayamg: 0, + ssapi: 0, + sapir: 0, + leleb: 0, + leleg: 0, + esteh: 0, + pet: 0, + potion: 0, + sampah: 0, + kucing: 0, + kucinglastclaim: 0, + kucingexp: 0, + kuda: 0, + kudalastclaim: 0, + rubah: 0, + rubahlastclaim: 0, + rubahexp: 0, + anjing: 0, + anjinglastclaim: 0, + anjingexp: 0, + naga: 0, + nagalastclaim: 0, + griffin: 0, + griffinlastclaim: 0, + centaur: 0, + fightnaga: 0, + centaurlastclaim: 0, + serigala: 0, + serigalalastclaim: 0, + serigalaexp: 0, + phonix: 0, + phonixlastclaim: 0, + phonixexp : 0, + makanannaga: 0, + makananphonix: 0, + makanancentaur: 0, + makananserigala: 0, + + Banneduser: false, + BannedReason: '', + banned: false, + bannedTime: 0, + warn: 0, + afk: -1, + afkReason: '', + anakkucing: 0, + anakkuda: 0, + anakrubah: 0, + anakanjing: 0, + makananpet: 0, + makananPet: 0, + antispam: 0, + antispamlastclaim: 0, + kayu: 0, + batu: 0, + string: 0, + umpan: 0, + armor: 0, + armordurability: 0, + weapon: 0, + weapondurability: 0, + sword: 0, + sworddurability: 0, + pickaxe: 0, + pickaxedurability: 0, + fishingrod: 0, + fishingroddurability: 0, + katana: 0, + katanadurability: 0, + bow: 0, + bowdurability: 0, + kapak: 0, + kapakdurability: 0, + axe: 0, + axedurability: 0, + pisau: 0, + pisaudurability: 0, + kerjasatu: 0, + kerjadua: 0, + kerjatiga: 0, + kerjaempat: 0, + kerjalima: 0, + kerjaenam: 0, + kerjatujuh: 0, + kerjadelapan: 0, + kerjasembilan: 0, + kerjasepuluh: 0, + kerjasebelas: 0, + kerjaduabelas: 0, + kerjatigabelas: 0, + kerjaempatbelas: 0, + kerjalimabelas: 0, + pekerjaansatu: 0, + pekerjaandua: 0, + pekerjaantiga: 0, + pekerjaanempat: 0, + pekerjaanlima: 0, + pekerjaanenam: 0, + pekerjaantujuh: 0, + pekerjaandelapan: 0, + pekerjaansembilan: 0, + pekerjaansepuluh: 0, + pekerjaansebelas: 0, + pekerjaanduabelas: 0, + pekerjaantigabelas: 0, + pekerjaanempatbelas: 0, + pekerjaanlimabelas: 0, + lastadventure: 0, + lastwar: 0, + lastberkebon: 0, + lastberburu: 0, + lastbansos: 0, + lastrampok: 0, + lastkill: 0, + lastfishing: 0, + lastdungeon: 0, + lastduel: 0, + lastmining: 0, + lasthourly: 0, + lastdagang: 0, + lasthunt: 0, + lasthun : 0, + lastweekly: 0, + lastmonthly: 0, + lastyearly: 0, + lastjb: 0, + lastrob: 0, + lastdaang: 0, + lastngojek: 0, + lastgrab: 0, + lastngocok: 0, + lastturu: 0, + lastseen: 0, + lastSetStatus: 0, + registered: false, + apel: 20, + mangga: 0, + stroberi: 0, + semangka: 0, + jeruk: 0, + semangka: 0, + name: this.getName(m.sender), + age: -1, + regTime: -1, + premiumDate: -1, + premium: false, + premiumTime: 0, + vip: 'tidak', + vipPoin: 0, + job: 'Pengangguran', + jobexp: 0, + jail: false, + penjara: false, + antarpaket: 0, + dirawat: false, + lbars: '[โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’]', + role: 'Newbie ใ‹ก', + registered: false, + name: this.getName(m.sender), + age: -1, + regTime: -1, + autolevelup: true, + lastIstigfar: 0, + + skill: "", + korps: "", + korpsgrade: "", + demon: "", + breaths: "", + magic: "", + darahiblis: 0, + demonblood: 0, + demonkill: 0, + hashirakill: 0, + alldemonkill: 0, + allhashirakill: 0, + attack: 0, + speed: 0, + strenght: 0, + defense: 0, + regeneration: 0, + ovo: 0, + dana: 0, + gopay: 0, + lastngaji: 0, + lastlonte: 0, + lastkoboy: 0, + lastdate: 0, + lasttambang: 0, + lastngepet: 0, + } + let chat = global.db.data.chats[m.chat] + if (typeof chat !== 'object') global.db.data.chats[m.chat] = {} + if (chat) { + if (!('isBanned' in chat)) chat.isBanned = false + if (!('welcome' in chat)) chat.welcome = true + if (!isNumber(chat.welcometype)) chat.welcometype = 1 + if (!('detect' in chat)) chat.detect = false + if (!('isBannedTime' in chat)) chat.isBannedTime = false + if (!('mute' in chat)) chat.mute = false + if (!('listStr' in chat)) chat.listStr = {} + if (!('sWelcome' in chat)) chat.sWelcome = 'Hai, @user!\nSelamat datang di grup @subject\n\n@desc' + if (!('sBye' in chat)) chat.sBye = 'Selamat tinggal @user!' + if (!('sPromote' in chat)) chat.sPromote = '' + if (!('sDemote' in chat)) chat.sDemote = '' + if (!('delete' in chat)) chat.delete = true + if (!('antiLink' in chat)) chat.antiLink = true + if (!('antiLinknokick' in chat)) chat.antiLinknokick = false + if (!('antiSticker' in chat)) chat.antiSticker = false + if (!('antiStickernokick' in chat)) chat.antiStickernokick = false + if (!('viewonce' in chat)) chat.viewonce = false + if (!('antiToxic' in chat)) chat.antiToxic = false + if (!isNumber(chat.expired)) chat.expired = 0 + if (!("memgc" in chat)) chat.memgc = {} + if (!('antilinkig' in chat)) chat.antilinkig = false + if (!('antilinkignokick' in chat)) chat.antilinkignokick = false + if (!('antilinkfb' in chat)) chat.antilinkfb = false + if (!('antilinkfbnokick' in chat)) chat.antilinkfbnokick = false + if (!('antilinktwit' in chat)) chat.antilinktwit = false + if (!('antilinktwitnokick' in chat)) chat.antilinktwitnokick = false + if (!('antilinkyt' in chat)) chat.antilinkyt = false + if (!('antilinkytnokick' in chat)) chat.antilinkytnokick = false + if (!('antilinktele' in chat)) chat.antilinktele = false + if (!('antilinktelenokick' in chat)) chat.antilinktelenokick = false + if (!('antilinkwame' in chat)) chat.antilinkwame = false + if (!('antilinkwamenokick' in chat)) chat.antilinkwamenokick = false + if (!('antilinkall' in chat)) chat.antilinkall = false + if (!('antilinkallnokick' in chat)) chat.antilinkallnokick = false + if (!('antilinktt' in chat)) chat.antilinktt = false + if (!('antilinkttnokick' in chat)) chat.antilinkttnokick = false + if (!('antibot' in chat)) chat.antibot = false + } else global.db.data.chats[m.chat] = { + isBanned: false, + welcome: true, + welcometype: 1, + detect: false, + isBannedTime: false, + mute: false, + listStr: {}, + sWelcome: 'Hai, @user!\nSelamat datang di grup @subject\n\n@desc', + sBye: 'Selamat tinggal @user!', + sPromote: '', + sDemote: '', + delete: false, + antiLink: false, + antiLinknokick: false, + antiSticker: false, + antiStickernokick: false, + viewonce: false, + antiToxic: true, + antilinkig: false, + antilinkignokick: false, + antilinkyt: false, + antilinkytnokick: false, + antilinktwit: false, + antilinktwitnokick: false, + antilinkfb: false, + antilinkfbnokick: false, + antilinkall: false, + antilinkallnokick: false, + antilinkwame: false, + antilinkwamenokick: false, + antilinktele: false, + antilinktelenokick: false, + antilinktt: false, + antilinkttnokick: false, + antibot: false, + rpg: false, + } + let memgc = global.db.data.chats[m.chat].memgc[m.sender] + if (typeof memgc !== 'object') global.db.data.chats[m.chat].memgc[m.sender] = {} + if (memgc) { + if (!('blacklist' in memgc)) memgc.blacklist = false + if (!('banned' in memgc)) memgc.banned = false + if (!isNumber(memgc.bannedTime)) memgc.bannedTime = 0 + if (!isNumber(memgc.chat)) memgc.chat = 0 + if (!isNumber(memgc.chatTotal)) memgc.chatTotal = 0 + if (!isNumber(memgc.command)) memgc.command = 0 + if (!isNumber(memgc.commandTotal)) memgc.commandTotal = 0 + if (!isNumber(memgc.lastseen)) memgc.lastseen = 0 + } else global.db.data.chats[m.chat].memgc[m.sender] = { + blacklist: false, + banned: false, + bannedTime: 0, + chat: 0, + chatTotal: 0, + command: 0, + commandTotal: 0, + lastseen: 0 + } + } catch (e) { + console.error(e) + } + if (opts['nyimak']) return + if (!m.fromMe && opts['self']) return + if (opts['pconly'] && m.chat.endsWith('g.us')) return + if (opts['gconly'] && !m.chat.endsWith('g.us')) return + if (opts['swonly'] && m.chat !== 'status@broadcast') return + if (typeof m.text !== 'string') m.text = '' + if (opts['queque'] && m.text) { + this.msgqueque.push(m.id || m.key.id) + await delay(this.msgqueque.length * 1000) + } + for (let name in global.plugins) { + let plugin = global.plugins[name] + if (!plugin) continue + if (plugin.disabled) continue + if (!plugin.all) continue + if (typeof plugin.all !== 'function') continue + try { + await plugin.all.call(this, m, chatUpdate) + } catch (e) { + if (typeof e === 'string') continue + console.error(e) + } + } + if (m.id.startsWith('BAE5') && m.id.length === 16 || m.isBaileys && m.fromMe) return + m.exp += Math.ceil(Math.random() * 10) + + let usedPrefix + let _user = global.db.data && global.db.data.users && global.db.data.users[m.sender] + + let isROwner = [global.conn.user.jid, ...global.owner].map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').includes(m.sender) + let isOwner = isROwner || m.fromMe + let isMods = isOwner || global.mods.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').includes(m.sender) + let isPrems = isROwner || (db.data.users[m.sender].premiumTime > 0 || db.data.users[m.sender].premium) + let groupMetadata = (m.isGroup ? (conn.chats[m.chat] || {}).metadata : {}) || {} + let participants = (m.isGroup ? groupMetadata.participants : []) || [] + let user = (m.isGroup ? participants.find(u => conn.decodeJid(u.id) === m.sender) : {}) || {} // User Data + let bot = (m.isGroup ? participants.find(u => conn.decodeJid(u.id) == this.user.jid) : {}) || {} // Your Data + let isAdmin = user && user.admin || false // Is User Admin? + let isBotAdmin = bot && bot.admin || false // Are you Admin? + for (let name in global.plugins) { + let plugin = global.plugins[name] + if (!plugin) continue + if (plugin.disabled) continue + if (!opts['restrict']) if (plugin.tags && plugin.tags.includes('admin')) { + // global.dfail('restrict', m, this) + continue + } + const str2Regex = str => str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') + let _prefix = plugin.customPrefix ? plugin.customPrefix : conn.prefix ? conn.prefix : global.prefix + let match = (_prefix instanceof RegExp ? // RegExp Mode? + [[_prefix.exec(m.text), _prefix]] : + Array.isArray(_prefix) ? // Array? + _prefix.map(p => { + let re = p instanceof RegExp ? // RegExp in Array? + p : + new RegExp(str2Regex(p)) + return [re.exec(m.text), re] + }) : + typeof _prefix === 'string' ? // String? + [[new RegExp(str2Regex(_prefix)).exec(m.text), new RegExp(str2Regex(_prefix))]] : + [[[], new RegExp]] + ).find(p => p[1]) + if (typeof plugin.before === 'function') if (await plugin.before.call(this, m, { + match, + conn: this, + participants, + groupMetadata, + user, + bot, + isROwner, + isOwner, + isAdmin, + isBotAdmin, + isPrems, + chatUpdate, + })) continue + if (typeof plugin !== 'function') continue + if ((usedPrefix = (match[0] || '')[0])) { + let noPrefix = m.text.replace(usedPrefix, '') + let [command, ...args] = noPrefix.trim().split` `.filter(v => v) + args = args || [] + let _args = noPrefix.trim().split` `.slice(1) + let text = _args.join` ` + command = (command || '').toLowerCase() + let fail = plugin.fail || global.dfail // When failed + let isAccept = plugin.command instanceof RegExp ? // RegExp Mode? + plugin.command.test(command) : + Array.isArray(plugin.command) ? // Array? + plugin.command.some(cmd => cmd instanceof RegExp ? // RegExp in Array? + cmd.test(command) : + cmd === command + ) : + typeof plugin.command === 'string' ? // String? + plugin.command === command : + false + + if (!isAccept) continue + m.plugin = name + if (m.chat in global.db.data.chats || m.sender in global.db.data.users) { + let chat = global.db.data.chats[m.chat] + let user = global.db.data.users[m.sender] + if (name != 'group-modebot.js' && name != 'owner-unbanchat.js' && name != 'owner-exec.js' && name != 'owner-exec2.js' && name != 'tool-delete.js' && (chat?.isBanned || chat?.mute)) + return + if (name != 'unbanchat.js' && chat && chat.isBanned) return // Except this + if (name != 'unbanuser.js' && user && user.banned) return + if (m.isGroup) { + chat.memgc[m.sender].command++ + chat.memgc[m.sender].commandTotal++ + chat.memgc[m.sender].lastCmd = Date.now() + } + user.command++ + user.commandTotal++ + user.lastCmd = Date.now() + } + + if (plugin.rowner && plugin.owner && !(isROwner || isOwner)) { // Both Owner + fail('owner', m, this) + continue + } + if (plugin.rowner && !isROwner) { // Real Owner + fail('rowner', m, this) + continue + } + if (plugin.owner && !isOwner) { // Number Owner + fail('owner', m, this) + continue + } + if (plugin.mods && !isMods) { // Moderator + fail('mods', m, this) + continue + } + if (plugin.premium && !isPrems) { // Premium + fail('premium', m, this) + continue + } + if (plugin.group && !m.isGroup) { // Group Only + fail('group', m, this) + continue + } else if (plugin.botAdmin && !isBotAdmin) { // You Admin + fail('botAdmin', m, this) + continue + } else if (plugin.admin && !isAdmin) { // User Admin + fail('admin', m, this) + continue + } + if (plugin.private && m.isGroup) { // Private Chat Only + fail('private', m, this) + continue + } + if (plugin.register == true && _user.registered == false) { // Butuh daftar? + fail('unreg', m, this) + continue + } + m.isCommand = true + let xp = 'exp' in plugin ? parseInt(plugin.exp) : 17 // XP Earning per command + if (xp > 200) m.reply('Ngecit -_-') // Hehehe + else m.exp += xp + if (!isPrems && plugin.limit && global.db.data.users[m.sender].limit < plugin.limit * 1) { + this.reply(m.chat, `Limit anda habis, silahkan beli melalui *${usedPrefix}buy* atau beli di *${usedPrefix}shop*`, m) + continue // Limit habis + } + if (plugin.level > _user.level) { + this.reply(m.chat, `diperlukan level ${plugin.level} untuk menggunakan perintah ini. Level kamu ${_user.level}\m gunakan .levelup untuk menaikan level!`, m) + continue // If the level has not been reached + } + let extra = { + match, + usedPrefix, + noPrefix, + _args, + args, + command, + text, + conn: this, + participants, + groupMetadata, + user, + bot, + isROwner, + isOwner, + isAdmin, + isBotAdmin, + isPrems, + chatUpdate, + } + try { + await plugin.call(this, m, extra) + if (!isPrems) m.limit = m.limit || plugin.limit || false + } catch (e) { + // Error occured + m.error = e + console.error(e) + if (e) { + let text = util.format(e) + for (let key of Object.values(APIKeys)) + text = text.replace(new RegExp(key, 'g'), '#HIDDEN#') + if (e.name) + for (let jid of owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != this.user.jid)) { + let data = (await this.onWhatsApp(jid))[0] || {} + if (data.exists) + m.reply(`*Plugin:* ${m.plugin}\n*Sender:* @${m.sender.split`@`[0]}\n*Chat:* ${m.chat}\n*Chat Name:* ${await this.getName(m.chat)}\n*Command:* ${usedPrefix}${command} ${args.join(' ')}\n\n\`\`\`${text}\`\`\``.trim(), data.jid, { mentions: [m.sender] }) + } + m.reply(text) + } + } finally { + // m.reply(util.format(_user)) + if (typeof plugin.after === 'function') { + try { + await plugin.after.call(this, m, extra) + } catch (e) { + console.error(e) + } + } + if (m.limit) m.reply(+ m.limit + ' Limit terpakai') + } + break + } + } + } catch (e) { + console.error(e) + } finally { + //conn.sendPresenceUpdate('composing', m.chat) // kalo pengen auto vn hapus // di baris dekat conn + //console.log(global.db.data.users[m.sender]) + let user, stats = global.db.data.stats + if (m) { + if (m.sender && (user = global.db.data.users[m.sender])) { + user.exp += m.exp + user.limit -= m.limit * 1 + } + + let stat + if (m.plugin) { + let now = + new Date + if (m.plugin in stats) { + stat = stats[m.plugin] + if (!isNumber(stat.total)) stat.total = 1 + if (!isNumber(stat.success)) stat.success = m.error != null ? 0 : 1 + if (!isNumber(stat.last)) stat.last = now + if (!isNumber(stat.lastSuccess)) stat.lastSuccess = m.error != null ? 0 : now + } else stat = stats[m.plugin] = { + total: 1, + success: m.error != null ? 0 : 1, + last: now, + lastSuccess: m.error != null ? 0 : now + } + stat.total += 1 + stat.last = now + if (m.error == null) { + stat.success += 1 + stat.lastSuccess = now + } + } + } + + try { + require('./lib/print')(m, this) + } catch (e) { + console.log(m, m.quoted, e) + } + if (opts['autoread']) await this.readMessages([m.key]) + } + }, + + async participantsUpdate({ id, participants, action }) { + if (opts['self']) return + // if (id in conn.chats) return // First login will spam + if (global.isInit) return + let chat = db.data.chats[id] || {} + let text = '' + switch (action) { + case 'add': + case 'remove': + case 'leave': + case 'invite': + case 'invite_v4': + if (chat.welcome) { + let groupMetadata = await this.groupMetadata(id) || (conn.chats[id] || {}).metadata + for (let user of participants) { + let pp = 'https://btch.pages.dev/file/70e8de9b1879568954f09.jpg' + try { + pp = await this.profilePictureUrl(user, 'image') + } catch (e) { + } finally { + text = (action === 'add' ? (chat.sWelcome || this.welcome || conn.welcome || 'Welcome, @user!').replace('@subject', await this.getName(id)).replace('@desc', groupMetadata.desc ? groupMetadata.desc.toString() : '') : + (chat.sBye || this.bye || conn.bye || 'Bye, @user!')).replace('@user', '@' + user.split('@')[0]) + this.sendMessage(id, { + text: text, + contextInfo: { + mentionedJid: [user], + externalAdReply: { + title: global.wm, + body: '', + thumbnailUrl: pp, + sourceUrl: 'https://chat.whatsapp.com/KIcqnzY4NJMHXPTz8Xopvd', + mediaType: 1, + renderLargerThumbnail: true + }}}, { quoted: null }) + } + } + } + break + case 'promote': + text = (chat.sPromote || this.spromote || conn.spromote || '@user ```is now Admin```') + case 'demote': + if (!text) text = (chat.sDemote || this.sdemote || conn.sdemote || '@user ```is no longer Admin```') + text = text.replace('@user', '@' + participants[0].split('@')[0]) + if (chat.detect) this.sendMessage(id, text, { + contextInfo: { + mentionedJid: this.parseMention(text) + } + }) + break + } + }, + async delete({ remoteJid, fromMe, id, participant }) { + /*if (fromMe) return + let chats = Object.entries(conn.chats).find(([user, data]) => data.messages && data.messages[id]) + if (!chats) return + let msg = JSON.parse(chats[1].messages[id]) + let chat = global.db.data.chats[msg.key.remoteJid] || {} + if (chat.delete) return + await this.reply(msg.key.remoteJid, ` +Terdeteksi @${participant.split`@`[0]} telah menghapus pesan +Untuk mematikan fitur ini, ketik +*.enable delete* +`.trim(), msg, { + mentions: [participant] + }) + this.copyNForward(msg.key.remoteJid, msg).catch(e => console.log(e, msg))*/ + } +} + +global.dfail = (type, m, conn) => { + let msg = { + rowner: 'Perintah ini hanya dapat digunakan oleh _*OWWNER!1!1!*_', + owner: 'Perintah ini hanya dapat digunakan oleh _*Owner Bot*_!', + mods: 'Perintah ini hanya dapat digunakan oleh _*Moderator*_ !', + premium: 'Perintah ini hanya untuk member _*Premium*_ !', + group: 'Perintah ini hanya dapat digunakan di grup!', + private: 'Perintah ini hanya dapat digunakan di Chat Pribadi!', + admin: 'Perintah ini hanya untuk *Admin* grup!', + botAdmin: 'Jadikan bot sebagai *Admin* untuk menggunakan perintah ini!', + unreg: 'Silahkan daftar untuk menggunakan fitur ini dengan cara mengetik:\n\n*#daftar nama.umur*\n\nContoh: *#daftar Mansur.16*', + restrict: 'Fitur ini di *disable*!' + }[type] + if (msg) return m.reply(msg) +} + +let fs = require('fs') +let chalk = require('chalk') +let file = require.resolve(__filename) +fs.watchFile(file, () => { + fs.unwatchFile(file) + console.log(chalk.redBright("Update 'handler.js'")) + delete require.cache[file] + if (global.reloadHandler) console.log(global.reloadHandler()) +}) diff --git a/heroku.yml b/heroku.yml new file mode 100644 index 0000000000000000000000000000000000000000..e7e4ff526d230e76e5c0379845b111b05dd4e194 --- /dev/null +++ b/heroku.yml @@ -0,0 +1,3 @@ +build: + docker: + web: Dockerfile diff --git a/index.js b/index.js new file mode 100644 index 0000000000000000000000000000000000000000..063b1e3b1f8a9d88888e4b2ee2f26f83544555f7 --- /dev/null +++ b/index.js @@ -0,0 +1,121 @@ +const cluster = require('cluster'); +const { spawn } = require('child_process'); +const path = require('path'); +const fs = require('fs'); +const os = require('os'); +const express = require('express'); +const app = express(); + +// Tetapkan port ke 7860 +const PORT = 7860; + +app.get('/', (req, res) => { + res.setHeader('Content-Type', 'application/json'); + const data = { + status: 'true', + message: 'Bot Successfully Activated!', + author: 'rizki' + }; + const result = { + response: data + }; + res.send(JSON.stringify(result, null, 2)); +}); + +// Mulai server pada port 7860 +app.listen(PORT, () => { + console.log('\x1b[33m%s\x1b[0m', `๐ŸŒ Server berjalan di port ${PORT}`); +}); + +let isRunning = false; + +function start(file) { + if (isRunning) return; + isRunning = true; + + const args = [path.join(__dirname, file), ...process.argv.slice(2)]; + const p = spawn(process.argv[0], args, { + stdio: ["inherit", "inherit", "inherit", "ipc"], + }); + + p.on("message", (data) => { + console.log('\x1b[36m%s\x1b[0m', `๐ŸŸข RECEIVED ${data}`); + switch (data) { + case "reset": + p.kill(); + isRunning = false; + start.apply(this, arguments); + break; + case "uptime": + p.send(process.uptime()); + break; + } + }); + + p.on("exit", (code) => { + isRunning = false; + console.error('\x1b[31m%s\x1b[0m', `Exited with code: ${code}`); + start('main.js'); + + if (code === 0) return; + + fs.watchFile(args[0], () => { + fs.unwatchFile(args[0]); + console.error('\x1b[31m%s\x1b[0m', `File ${args[0]} has been modified. Script will restart...`); + start("main.js"); + }); + }); + + p.on("error", (err) => { + console.error('\x1b[31m%s\x1b[0m', `Error: ${err}`); + p.kill(); + isRunning = false; + console.error('\x1b[31m%s\x1b[0m', `Error occurred. Script will restart...`); + start("main.js"); + }); + + const pluginsFolder = path.join(__dirname, "plugins"); + + fs.readdir(pluginsFolder, (err, files) => { + if (err) { + console.error('\x1b[31m%s\x1b[0m', `Error reading plugins folder: ${err}`); + return; + } + console.log('\x1b[33m%s\x1b[0m', `๐ŸŸก Found ${files.length} plugins in folder ${pluginsFolder}`); + try { + require.resolve('@adiwajshing/baileys'); + console.log('\x1b[33m%s\x1b[0m', `๐ŸŸก Baileys library version ${require('@adiwajshing/baileys/package.json').version} is installed`); + } catch (e) { + console.error('\x1b[31m%s\x1b[0m', `โŒ Baileys library is not installed`); + } + }); + + console.log(`๐Ÿ–ฅ๏ธ \x1b[33m${os.type()}\x1b[0m, \x1b[33m${os.release()}\x1b[0m - \x1b[33m${os.arch()}\x1b[0m`); + const ramInGB = os.totalmem() / (1024 * 1024 * 1024); + console.log(`๐Ÿ’พ \x1b[33mTotal RAM: ${ramInGB.toFixed(2)} GB\x1b[0m`); + const freeRamInGB = os.freemem() / (1024 * 1024 * 1024); + console.log(`๐Ÿ’ฝ \x1b[33mFree RAM: ${freeRamInGB.toFixed(2)} GB\x1b[0m`); + console.log('\x1b[33m%s\x1b[0m', `๐Ÿ“ƒ Script by BOTCAHX`); + + setInterval(() => {}, 1000); +} + +start("main.js"); + +const tmpDir = './tmp'; +if (!fs.existsSync(tmpDir)) { + fs.mkdirSync(tmpDir); + console.log('\x1b[33m%s\x1b[0m', `๐Ÿ“ Created directory ${tmpDir}`); +} + +process.on('unhandledRejection', (reason) => { + console.error('\x1b[31m%s\x1b[0m', `Unhandled promise rejection: ${reason}`); + console.error('\x1b[31m%s\x1b[0m', 'Unhandled promise rejection. Script will restart...'); + start('main.js'); +}); + +process.on('exit', (code) => { + console.error(`Exited with code: ${code}`); + console.error('Script will restart...'); + start('main.js'); +}); \ No newline at end of file diff --git a/lib/cloudDBAdapter.js b/lib/cloudDBAdapter.js new file mode 100644 index 0000000000000000000000000000000000000000..bf89d2b872a3ff51512e91e89123072dc945e541 --- /dev/null +++ b/lib/cloudDBAdapter.js @@ -0,0 +1,58 @@ +const got = require('got') + +const stringify = obj => JSON.stringify(obj, null, 2) +const parse = str => JSON.parse(str, (_, v) => { + if ( + v !== null && + typeof v === 'object' && + 'type' in v && + v.type === 'Buffer' && + 'data' in v && + Array.isArray(v.data)) { + return Buffer.from(v.data) + } + return v +}) +class CloudDBAdapter { + constructor(url, { + serialize = stringify, + deserialize = parse, + fetchOptions = {} + } = {}) { + this.url = url + this.serialize = serialize + this.deserialize = deserialize + this.fetchOptions = fetchOptions + } + + async read() { + try { + let res = await got(this.url, { + method: 'GET', + headers: { + 'Accept': 'application/json;q=0.9,text/plain' + }, + ...this.fetchOptions + }) + if (res.statusCode !== 200) throw res.statusMessage + return this.deserialize(res.body) + } catch (e) { + return null + } + } + + async write(obj) { + let res = await got(this.url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + ...this.fetchOptions, + body: this.serialize(obj) + }) + if (res.statusCode !== 200) throw res.statusMessage + return res.body + } +} + +module.exports = CloudDBAdapter \ No newline at end of file diff --git a/lib/cluster.js b/lib/cluster.js new file mode 100644 index 0000000000000000000000000000000000000000..2453283d78dbcb207f20446c2b554449f92eeaef --- /dev/null +++ b/lib/cluster.js @@ -0,0 +1,36 @@ +const cluster = require('cluster') +const os = require('os') +const path = require('path') +const { connectionOptions } = require('../main') +const { makeWASocket } = require('./simple') + +var conn +module.exports = { + Cluster() { + if (cluster.isMaster || !cluster.isWorker) { + if (!os.cpus().length <= 1) throw new Error(`Requires at least 1 cores, but you only have ${os.cpus().length} cores`) + cluster.setupMaster({ + exec: path.join(__dirname, './cluster.js') + }) + // for (let i = 0; i < 3; i++) + cluster.fork() + console.log(cluster.workers) + } else { + // console.log(cluster.workers) + // if (cluster.worker.id == 1) this.baileys() + } + }, + baileys() { + conn = makeWASocket(connectionOptions) + for (let event of Object.keys(conn.ev._events)) { + conn.ev.on(event, (...updates) => { + event, updates + }) + } + }, + convert() { + + } +} + +if (cluster.isWorker) module.exports.Cluster() \ No newline at end of file diff --git a/lib/color.js b/lib/color.js new file mode 100644 index 0000000000000000000000000000000000000000..f4f56651bd79e26e949ec99c94d1d39e55b2c343 --- /dev/null +++ b/lib/color.js @@ -0,0 +1,14 @@ +const chalk = require('chalk') + +const color = (text, color) => { + return !color ? chalk.green(text) : chalk.keyword(color)(text) +} + +const bgcolor = (text, bgcolor) => { + return !bgcolor ? chalk.green(text) : chalk.bgKeyword(bgcolor)(text) +} + +module.exports = { + color, + bgcolor +} diff --git a/lib/converter.js b/lib/converter.js new file mode 100644 index 0000000000000000000000000000000000000000..5c1d7dfdd2c65a1d6817c109f5f0e5eea138f4b4 --- /dev/null +++ b/lib/converter.js @@ -0,0 +1,84 @@ +const fs = require('fs') +const path = require('path') +const { spawn } = require('child_process') + +function ffmpeg(buffer, args = [], ext = '', ext2 = '') { + return new Promise(async (resolve, reject) => { + try { + let tmp = path.join(__dirname, '../tmp', + new Date + '.' + ext) + let out = tmp + '.' + ext2 + await fs.promises.writeFile(tmp, buffer) + spawn('ffmpeg', [ + '-y', + '-i', tmp, + ...args, + out + ]) + .on('error', reject) + .on('close', async (code) => { + try { + await fs.promises.unlink(tmp) + if (code !== 0) return reject(code) + resolve({ data: await fs.promises.readFile(out), filename: out }) + // await fs.promises.unlink(out) + } catch (e) { + reject(e) + } + }) + } catch (e) { + reject(e) + } + }) +} + +/** + * Convert Audio to Playable WhatsApp Audio + * @param {Buffer} buffer Audio Buffer + * @param {String} ext File Extension + */ +function toPTT(buffer, ext) { + return ffmpeg(buffer, [ + '-vn', + '-c:a', 'libopus', + '-b:a', '128k', + '-vbr', 'on', + ], ext, 'ogg') +} + +/** + * Convert Audio to Playable WhatsApp PTT + * @param {Buffer} buffer Audio Buffer + * @param {String} ext File Extension + */ +function toAudio(buffer, ext) { + return ffmpeg(buffer, [ + '-vn', + '-c:a', 'libopus', + '-b:a', '128k', + '-vbr', 'on', + '-compression_level', '10' + ], ext, 'opus') +} + +/** + * Convert Audio to Playable WhatsApp Video + * @param {Buffer} buffer Video Buffer + * @param {String} ext File Extension + */ +function toVideo(buffer, ext) { + return ffmpeg(buffer, [ + '-c:v', 'libx264', + '-c:a', 'aac', + '-ab', '128k', + '-ar', '44100', + '-crf', '32', + '-preset', 'slow' + ], ext, 'mp4') +} + +module.exports = { + toAudio, + toPTT, + toVideo, + ffmpeg, +} \ No newline at end of file diff --git a/lib/database.js b/lib/database.js new file mode 100644 index 0000000000000000000000000000000000000000..02e6328ac655d12ec276c30e9655596fb40be183 --- /dev/null +++ b/lib/database.js @@ -0,0 +1,71 @@ +const path = require('path') +const _fs = require('fs') +const { promises: fs } = _fs + +class Database { + /** + * Create new Database + * @param {String} filepath Path to specified json database + * @param {...any} args JSON.stringify arguments + */ + constructor(filepath, ...args) { + this.file = path.resolve(filepath) + this.logger = console + + this._load() + + this._jsonargs = args + this._state = false + this._queue = [] + this._interval = setInterval(async () => { + if (!this._state && this._queue && this._queue[0]) { + this._state = true + await this[this._queue.shift()]().catch(this.logger.error) + this._state = false + } + }, 1000) + + } + + get data() { + return this._data + } + + set data(value) { + this._data = value + this.save() + } + + /** + * Queue Load + */ + load() { + this._queue.push('_load') + } + + /** + * Queue Save + */ + save() { + this._queue.push('_save') + } + + _load() { + try { + return this._data = _fs.existsSync(this.file) ? JSON.parse(_fs.readFileSync(this.file)) : {} + } catch (e) { + this.logger.error(e) + return this._data = {} + } + } + + async _save() { + let dirname = path.dirname(this.file) + if (!_fs.existsSync(dirname)) await fs.mkdir(dirname, { recursive: true }) + await fs.writeFile(this.file, JSON.stringify(this._data, ...this._jsonargs)) + return this.file + } +} + +module.exports = Database + diff --git a/lib/exif.js b/lib/exif.js new file mode 100644 index 0000000000000000000000000000000000000000..778561d8b06016102d69dba97d5b859078890fc5 --- /dev/null +++ b/lib/exif.js @@ -0,0 +1,116 @@ +const fs = require('fs') +const { tmpdir } = require("os") +const Crypto = require("crypto") +const ff = require('fluent-ffmpeg') +const webp = require("node-webpmux") +const path = require("path") + + +async function imageToWebp (media) { + + const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.jpg`) + + fs.writeFileSync(tmpFileIn, media) + + await new Promise((resolve, reject) => { + ff(tmpFileIn) + .on("error", reject) + .on("end", () => resolve(true)) + .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(tmpFileOut) + }) + + const buff = fs.readFileSync(tmpFileOut) + fs.unlinkSync(tmpFileOut) + fs.unlinkSync(tmpFileIn) + return buff +} + +async function videoToWebp (media) { + + const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.mp4`) + + fs.writeFileSync(tmpFileIn, media) + + await new Promise((resolve, reject) => { + ff(tmpFileIn) + .on("error", reject) + .on("end", () => resolve(true)) + .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", + "-loop", + "0", + "-ss", + "00:00:00", + "-t", + "00:00:06", + "-preset", + "default", + "-an", + "-vsync", + "0" + ]) + .toFormat("webp") + .save(tmpFileOut) + }) + + const buff = fs.readFileSync(tmpFileOut) + fs.unlinkSync(tmpFileOut) + fs.unlinkSync(tmpFileIn) + return buff +} + +async function writeExifImg (media, metadata) { + let wMedia = await imageToWebp(media) + const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + fs.writeFileSync(tmpFileIn, wMedia) + + if (metadata.packname || metadata.author) { + const img = new webp.Image() + const json = { "sticker-pack-id": `https://github.com/BOTCAHX/RTXZY-MD`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] } + const 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]) + const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8") + const exif = Buffer.concat([exifAttr, jsonBuff]) + exif.writeUIntLE(jsonBuff.length, 14, 4) + await img.load(tmpFileIn) + fs.unlinkSync(tmpFileIn) + img.exif = exif + await img.save(tmpFileOut) + return tmpFileOut + } +} + +async function writeExifVid (media, metadata) { + let wMedia = await videoToWebp(media) + const tmpFileIn = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + const tmpFileOut = path.join(tmpdir(), `${Crypto.randomBytes(6).readUIntLE(0, 6).toString(36)}.webp`) + fs.writeFileSync(tmpFileIn, wMedia) + + if (metadata.packname || metadata.author) { + const img = new webp.Image() + const json = { "sticker-pack-id": `https://github.com/BOTCAHX/RTXZY-MD`, "sticker-pack-name": metadata.packname, "sticker-pack-publisher": metadata.author, "emojis": metadata.categories ? metadata.categories : [""] } + const 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]) + const jsonBuff = Buffer.from(JSON.stringify(json), "utf-8") + const exif = Buffer.concat([exifAttr, jsonBuff]) + exif.writeUIntLE(jsonBuff.length, 14, 4) + await img.load(tmpFileIn) + fs.unlinkSync(tmpFileIn) + img.exif = exif + await img.save(tmpFileOut) + return tmpFileOut + } +} + +module.exports = { imageToWebp, videoToWebp, writeExifImg, writeExifVid } diff --git a/lib/functions.js b/lib/functions.js new file mode 100644 index 0000000000000000000000000000000000000000..368f330bc95bd2bc0516292b13262c5dc3c66759 --- /dev/null +++ b/lib/functions.js @@ -0,0 +1,149 @@ +const fetch = require('node-fetch') +const axios = require('axios') +const cfonts = require('cfonts') +const spin = require('spinnies') +const Crypto = require('crypto') + +const wait = async (media) => new Promise(async (resolve, reject) => { + const attachmentData = `data:image/jpeg;base64,${media.toString('base64')}` + const response = await fetch("https://trace.moe/api/search",{method: "POST",body: JSON.stringify({ image: attachmentData }),headers: { "Content-Type": "application/json" }}); + if (!response.ok) reject(`Gambar tidak ditemukan!`); + const result = await response.json() + try { + const { is_adult, title, title_chinese, title_romaji, title_english, episode, season, similarity, filename, at, tokenthumb, anilist_id } = result.docs[0] + let belief = () => similarity < 0.89 ? "Saya memiliki keyakinan rendah dalam hal ini : " : "" + let ecch = () => is_adult ? "Iya" : "Tidak" + resolve({video: await getBuffer(`https://media.trace.moe/video/${anilist_id}/${encodeURIComponent(filename)}?t=${at}&token=${tokenthumb}`), teks: `${belief()} +~> Ecchi : *${ecch()}* +~> Judul Jepang : *${title}* +~> Ejaan Judul : *${title_romaji}* +~> Judul Inggris : *${title_english}* +~> Episode : *${episode}* +~> Season : *${season}*`}); + } catch (e) { + console.log(e) + reject(`Saya tidak tau ini anime apa`) + } +}) + +const simih = async (text) => { + try { + const sami = await fetch(`https://simsumi.herokuapp.com/api?text=${text}`, {method: 'GET'}) + const res = await sami.json() + return res.success + } catch { + return 'Simi ga tau apa yang anda ngomong, bahasa alien yah kak?' + } +} + +const h2k = (number) => { + var SI_POSTFIXES = ["", " K", " M", " G", " T", " P", " E"] + var tier = Math.log10(Math.abs(number)) / 3 | 0 + if(tier == 0) return number + var postfix = SI_POSTFIXES[tier] + var scale = Math.pow(10, tier * 3) + var scaled = number / scale + var formatted = scaled.toFixed(1) + '' + if (/\.0$/.test(formatted)) + formatted = formatted.substr(0, formatted.length - 2) + return formatted + postfix +} + +const getBuffer = async (url, options) => { + try { + options ? options : {} + const res = await axios({ + method: "get", + url, + headers: { + 'DNT': 1, + 'Upgrade-Insecure-Request': 1 + }, + ...options, + responseType: 'arraybuffer' + }) + return res.data + } catch (e) { + console.log(`Error : ${e}`) + } +} + +const randomBytes = (length) => { + return Crypto.randomBytes(length) +} + +const generateMessageID = () => { + return randomBytes(10).toString('hex').toUpperCase() +} + +const getGroupAdmins = (participants) => { + admins = [] + for (let i of participants) { + i.isAdmin ? admins.push(i.jid) : '' + } + return admins +} + +const getRandom = (ext) => { + return `${Math.floor(Math.random() * 10000)}${ext}` +} + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} + +const spinner = { + "interval": 120, + "frames": [ + "๐Ÿ•", + "๐Ÿ•‘", + "๐Ÿ•’", + "๐Ÿ•“", + "๐Ÿ•”", + "๐Ÿ••", + "๐Ÿ•–", + "๐Ÿ•—", + "๐Ÿ•˜", + "๐Ÿ•™", + "๐Ÿ•š", + "๐Ÿ•›" + ]} + +let globalSpinner; + + +const getGlobalSpinner = (disableSpins = false) => { + if(!globalSpinner) globalSpinner = new spin({ color: 'blue', succeedColor: 'green', spinner, disableSpins}); + return globalSpinner; +} + +spins = getGlobalSpinner(false) + +const start = (id, text) => { + spins.add(id, {text: text}) + /*setTimeout(() => { + spins.succeed('load-spin', {text: 'Suksess'}) + }, Number(wait) * 1000)*/ + } +const info = (id, text) => { + spins.update(id, {text: text}) +} +const success = (id, text) => { + spins.succeed(id, {text: text}) + + } + +const close = (id, text) => { + spins.fail(id, {text: text}) +} + +const banner = cfonts.render(('LOADING...'), { + font: 'chrome', + color: 'candy', + align: 'center', + gradient: ["red","yellow"], + lineHeight: 3 + }); + + +module.exports = { wait, simih, getBuffer, h2k, generateMessageID, getGroupAdmins, getRandom, start, info, success, banner, close, pickRandom } diff --git a/lib/gdrive.js b/lib/gdrive.js new file mode 100644 index 0000000000000000000000000000000000000000..7d8ce8e80b0ba8b8c97a0e70ad75b012329a585b --- /dev/null +++ b/lib/gdrive.js @@ -0,0 +1,75 @@ +let path = require('path') +let fs = require('fs').promises +let { promisify } = require('util') +let { google } = require('googleapis') + + +// If modifying these scopes, delete token.json. +const SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'] +// The file token.json stores the user's access and refresh tokens, and is +// created automatically when the authorization flow completes for the first +// time. +const TOKEN_PATH = path.join(__dirname, '..', 'token.json') +let + +class GoogleAuth extends EventEmitter { + constructor() { + super() + } + + async authorize(credentials) { + let token + const { client_secret, client_id } = credentials + const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, `http://localhost:${port}`) + try { + token = JSON.parse(await fs.readFile(TOKEN_PATH)) + } catch (e) { + const authUrl = oAuth2Client.generateAuthUrl({ + access_type: 'offline', + scope: SCOPES + }) + this.emit('auth', authUrl) + let code = await promisify(this.once).bind(this)('token') + token = await oAuth2Client.getToken(code) + await fs.writeFile(TOKEN_PATH, JSON.stringify(token)) + } finally { + await oAuth2Client.setCredentials(token) + } + } + + token(code) { + this.emit('token', code) + } +} + +class GoogleDrive extends GoogleAuth { + constructor() { + super() + this.path = '/drive/api' + } + + async getFolderID(path) { + + } + + async infoFile(path) { + + } + + async folderList(path) { + + } + + async downloadFile(path) { + + } + + async uploadFile(path) { + + } +} + +module.exports = { + GoogleAuth, + GoogleDrive, +} diff --git a/lib/levelling.js b/lib/levelling.js new file mode 100644 index 0000000000000000000000000000000000000000..7577d100b5955a2db1462e3039cde74f34733605 --- /dev/null +++ b/lib/levelling.js @@ -0,0 +1,50 @@ +module.exports = { + /** + * Growth rate + * `2.576652002695681` + */ + growth: Math.pow(Math.PI / Math.E, 1.618) * Math.E * .75, + /** + * get XP range at specified level + * @param {Number} level + * @param {Number} multiplier + */ + xpRange(level, multiplier = global.multiplier || 1) { + if (level < 0) throw new TypeError('level cannot be negative value') + level = Math.floor(level) + let min = level === 0 ? 0 : Math.round(Math.pow(level, this.growth) * multiplier) + 1 + let max = Math.round(Math.pow(++level, this.growth) * multiplier) + return { + min, + max, + xp: max - min + } + }, + /** + * get level by xp + * @param {Number} xp + * @param {Number} multiplier + */ + findLevel(xp, multiplier = global.multiplier || 1) { + if (xp === Infinity) return Infinity + if (isNaN(xp)) return NaN + if (xp <= 0) return -1 + let level = 0 + do level++ + while (this.xpRange(level, multiplier).min <= xp) + return --level + }, + /** + * is able to level up? + * @param {Number} level + * @param {Number} xp + * @param {Number} multiplier + */ + canLevelUp(level, xp, multiplier = global.multiplier || 1) { + if (level < 0) return false + if (xp === Infinity) return true + if (isNaN(xp)) return false + if (xp <= 0) return false + return level < this.findLevel(xp, multiplier) + } +} diff --git a/lib/logs.js b/lib/logs.js new file mode 100644 index 0000000000000000000000000000000000000000..42791961f6d14f7fcdbecdb82bef7a8b8d2c440d --- /dev/null +++ b/lib/logs.js @@ -0,0 +1,19 @@ +let stdouts = [] +module.exports = (maxLength = 200) => { + let oldWrite = process.stdout.write.bind(process.stdout) + module.exports.disable = () => { + module.exports.isModified = false + return process.stdout.write = oldWrite + } + process.stdout.write = (chunk, encoding, callback) => { + stdouts.push(Buffer.from(chunk, encoding)) + oldWrite(chunk, encoding, callback) + if (stdouts.length > maxLength) stdouts.shift() + } + module.exports.isModified = true + return module.exports +} + +module.exports.isModified = false +module.exports.logs = () => Buffer.concat(stdouts) + diff --git a/lib/lowdb/Low.d.ts b/lib/lowdb/Low.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..f6aaca289d7aa4dc8c6ce89b90c00e976812613f --- /dev/null +++ b/lib/lowdb/Low.d.ts @@ -0,0 +1,11 @@ +export interface Adapter { + read: () => Promise; + write: (data: T) => Promise; +} +export declare class Low { + adapter: Adapter; + data: T | null; + constructor(adapter: Adapter); + read(): Promise; + write(): Promise; +} diff --git a/lib/lowdb/Low.js b/lib/lowdb/Low.js new file mode 100644 index 0000000000000000000000000000000000000000..a9ea7784f905a730b8f0c27b08b433ef8cd46ac7 --- /dev/null +++ b/lib/lowdb/Low.js @@ -0,0 +1,21 @@ +const { MissingAdapterError } = require('./MissingAdapterError.js'); +class Low { + constructor(adapter) { + this.data = null; + if (adapter) { + this.adapter = adapter; + } + else { + throw new MissingAdapterError(); + } + } + async read() { + this.data = await this.adapter.read(); + } + async write() { + if (this.data) { + await this.adapter.write(this.data); + } + } +} +module.exports = { Low }; diff --git a/lib/lowdb/LowSync.d.ts b/lib/lowdb/LowSync.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a9e43a6b579e3298243d7a02a3f22de6f447d476 --- /dev/null +++ b/lib/lowdb/LowSync.d.ts @@ -0,0 +1,11 @@ +export interface SyncAdapter { + read: () => T | null; + write: (data: T) => void; +} +export declare class LowSync { + adapter: SyncAdapter; + data: T | null; + constructor(adapter: SyncAdapter); + read(): void; + write(): void; +} diff --git a/lib/lowdb/LowSync.js b/lib/lowdb/LowSync.js new file mode 100644 index 0000000000000000000000000000000000000000..a44a6e41675ce551378a07159666d76c325173cf --- /dev/null +++ b/lib/lowdb/LowSync.js @@ -0,0 +1,21 @@ +const { MissingAdapterError } = require('./MissingAdapterError.js'); +class LowSync { + constructor(adapter) { + this.data = null; + if (adapter) { + this.adapter = adapter; + } + else { + throw new MissingAdapterError(); + } + } + read() { + this.data = this.adapter.read(); + } + write() { + if (this.data !== null) { + this.adapter.write(this.data); + } + } +} +module.exports = { LowSync }; diff --git a/lib/lowdb/MissingAdapterError.d.ts b/lib/lowdb/MissingAdapterError.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..d78d4b40b185af39e8eea394547a8f862bd02f5d --- /dev/null +++ b/lib/lowdb/MissingAdapterError.d.ts @@ -0,0 +1,3 @@ +export declare class MissingAdapterError extends Error { + constructor(); +} diff --git a/lib/lowdb/MissingAdapterError.js b/lib/lowdb/MissingAdapterError.js new file mode 100644 index 0000000000000000000000000000000000000000..5e17e16a4b7e6bc288f2168e6891d821fee1dbf8 --- /dev/null +++ b/lib/lowdb/MissingAdapterError.js @@ -0,0 +1,7 @@ +class MissingAdapterError extends Error { + constructor() { + super(); + this.message = 'Missing Adapter'; + } +} +module.exports = { MissingAdapterError }; diff --git a/lib/lowdb/adapters/JSONFile.d.ts b/lib/lowdb/adapters/JSONFile.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e7e24c2a9a1538ce75f0d63099aa15667fa2b1a8 --- /dev/null +++ b/lib/lowdb/adapters/JSONFile.d.ts @@ -0,0 +1,7 @@ +import { Adapter } from '../Low.js'; +export declare class JSONFile implements Adapter { + private adapter; + constructor(filename: string); + read(): Promise; + write(obj: T): Promise; +} diff --git a/lib/lowdb/adapters/JSONFile.js b/lib/lowdb/adapters/JSONFile.js new file mode 100644 index 0000000000000000000000000000000000000000..fa57e2d7d9d39783627b19dde85e825820318321 --- /dev/null +++ b/lib/lowdb/adapters/JSONFile.js @@ -0,0 +1,19 @@ +const { TextFile } = require('./TextFile.js'); +class JSONFile { + constructor(filename) { + this.adapter = new TextFile(filename); + } + async read() { + const data = await this.adapter.read(); + if (data === null) { + return null; + } + else { + return JSON.parse(data); + } + } + write(obj) { + return this.adapter.write(JSON.stringify(obj, null, 2)); + } +} +module.exports = { JSONFile }; diff --git a/lib/lowdb/adapters/JSONFileSync.d.ts b/lib/lowdb/adapters/JSONFileSync.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..13df096127b36709116646b594245aa64a47b4f3 --- /dev/null +++ b/lib/lowdb/adapters/JSONFileSync.d.ts @@ -0,0 +1,7 @@ +import { SyncAdapter } from '../LowSync.js'; +export declare class JSONFileSync implements SyncAdapter { + private adapter; + constructor(filename: string); + read(): T | null; + write(obj: T): void; +} diff --git a/lib/lowdb/adapters/JSONFileSync.js b/lib/lowdb/adapters/JSONFileSync.js new file mode 100644 index 0000000000000000000000000000000000000000..c5f9777bf8affd52e786558e7055b1722201945b --- /dev/null +++ b/lib/lowdb/adapters/JSONFileSync.js @@ -0,0 +1,19 @@ +const { TextFileSync } = require('./TextFileSync.js'); +class JSONFileSync { + constructor(filename) { + this.adapter = new TextFileSync(filename); + } + read() { + const data = this.adapter.read(); + if (data === null) { + return null; + } + else { + return JSON.parse(data); + } + } + write(obj) { + this.adapter.write(JSON.stringify(obj, null, 2)); + } +} +module.exports = { JSONFileSync }; diff --git a/lib/lowdb/adapters/LocalStorage.d.ts b/lib/lowdb/adapters/LocalStorage.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..4ed765b0e1232980fe4bcea42ae0cc69c0e72e88 --- /dev/null +++ b/lib/lowdb/adapters/LocalStorage.d.ts @@ -0,0 +1,7 @@ +import { SyncAdapter } from '../LowSync.js'; +export declare class LocalStorage implements SyncAdapter { + private key; + constructor(key: string); + read(): T | null; + write(obj: T): void; +} diff --git a/lib/lowdb/adapters/LocalStorage.js b/lib/lowdb/adapters/LocalStorage.js new file mode 100644 index 0000000000000000000000000000000000000000..003ab265764dfb6ad1060abe6c30c3ef2ea0b844 --- /dev/null +++ b/lib/lowdb/adapters/LocalStorage.js @@ -0,0 +1,16 @@ +class LocalStorage { + constructor(key) { + this.key = key; + } + read() { + const value = localStorage.getItem(this.key); + if (value === null) { + return null; + } + return JSON.parse(value); + } + write(obj) { + localStorage.setItem(this.key, JSON.stringify(obj)); + } +} +module.exports = { LocalStorage }; diff --git a/lib/lowdb/adapters/Memory.d.ts b/lib/lowdb/adapters/Memory.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..6b53dfd74892ea7c61e145ea4da8e7483c41770d --- /dev/null +++ b/lib/lowdb/adapters/Memory.d.ts @@ -0,0 +1,6 @@ +import { Adapter } from '../Low.js'; +export declare class Memory implements Adapter { + private data; + read(): Promise; + write(obj: T): Promise; +} diff --git a/lib/lowdb/adapters/Memory.js b/lib/lowdb/adapters/Memory.js new file mode 100644 index 0000000000000000000000000000000000000000..16e14679314c4ee732e3f02c72034b329590ce09 --- /dev/null +++ b/lib/lowdb/adapters/Memory.js @@ -0,0 +1,13 @@ +class Memory { + constructor() { + this.data = null; + } + read() { + return Promise.resolve(this.data); + } + write(obj) { + this.data = obj; + return Promise.resolve(); + } +} +module.exports = { Memory }; diff --git a/lib/lowdb/adapters/MemorySync.d.ts b/lib/lowdb/adapters/MemorySync.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..1b38a9d04fc4baff651ac86d9b2f4a8f110ce4e6 --- /dev/null +++ b/lib/lowdb/adapters/MemorySync.d.ts @@ -0,0 +1,6 @@ +import { SyncAdapter } from '../LowSync.js'; +export declare class MemorySync implements SyncAdapter { + private data; + read(): T | null; + write(obj: T): void; +} diff --git a/lib/lowdb/adapters/MemorySync.js b/lib/lowdb/adapters/MemorySync.js new file mode 100644 index 0000000000000000000000000000000000000000..960e1d9cbc54c15dfd9085aa7ac5101e4fa3ff58 --- /dev/null +++ b/lib/lowdb/adapters/MemorySync.js @@ -0,0 +1,12 @@ +class MemorySync { + constructor() { + this.data = null; + } + read() { + return this.data || null; + } + write(obj) { + this.data = obj; + } +} +module.exports = { MemorySync }; diff --git a/lib/lowdb/adapters/TextFile.d.ts b/lib/lowdb/adapters/TextFile.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ff9229e7fa0df8ccdc582c8a5cd4bc0cee3e20f --- /dev/null +++ b/lib/lowdb/adapters/TextFile.d.ts @@ -0,0 +1,8 @@ +import { Adapter } from '../Low.js'; +export declare class TextFile implements Adapter { + private filename; + private writer; + constructor(filename: string); + read(): Promise; + write(str: string): Promise; +} diff --git a/lib/lowdb/adapters/TextFile.js b/lib/lowdb/adapters/TextFile.js new file mode 100644 index 0000000000000000000000000000000000000000..c1bbafafc474d35f6be74fdf359c52cc0c9b1058 --- /dev/null +++ b/lib/lowdb/adapters/TextFile.js @@ -0,0 +1,25 @@ +const fs = require('fs'); +const { Writer } = require('steno'); +class TextFile { + constructor(filename) { + this.filename = filename; + this.writer = new Writer(filename); + } + async read() { + let data; + try { + data = await fs.promises.readFile(this.filename, 'utf-8'); + } + catch (e) { + if (e.code === 'ENOENT') { + return null; + } + throw e; + } + return data; + } + write(str) { + return this.writer.write(str); + } +} +module.exports = { TextFile }; \ No newline at end of file diff --git a/lib/lowdb/adapters/TextFileSync.d.ts b/lib/lowdb/adapters/TextFileSync.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..ec1c6d58bb6bda871eea54c314f97feb01319916 --- /dev/null +++ b/lib/lowdb/adapters/TextFileSync.d.ts @@ -0,0 +1,8 @@ +import { SyncAdapter } from '../LowSync.js'; +export declare class TextFileSync implements SyncAdapter { + private tempFilename; + private filename; + constructor(filename: string); + read(): string | null; + write(str: string): void; +} diff --git a/lib/lowdb/adapters/TextFileSync.js b/lib/lowdb/adapters/TextFileSync.js new file mode 100644 index 0000000000000000000000000000000000000000..ecacb3ef9b35f04223dd679c7465d445f637271e --- /dev/null +++ b/lib/lowdb/adapters/TextFileSync.js @@ -0,0 +1,26 @@ +const fs = require('fs'); +const path = require('path'); +class TextFileSync { + constructor(filename) { + this.filename = filename; + this.tempFilename = path.join(path.dirname(filename), `.${path.basename(filename)}.tmp`); + } + read() { + let data; + try { + data = fs.readFileSync(this.filename, 'utf-8'); + } + catch (e) { + if (e.code === 'ENOENT') { + return null; + } + throw e; + } + return data; + } + write(str) { + fs.writeFileSync(this.tempFilename, str); + fs.renameSync(this.tempFilename, this.filename); + } +} +module.exports = { TextFileSync }; diff --git a/lib/lowdb/index.d.ts b/lib/lowdb/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..083a9bfa8b7d09df5199d9d1a134cac32e01314c --- /dev/null +++ b/lib/lowdb/index.d.ts @@ -0,0 +1,9 @@ +export * from './adapters/JSONFile.js'; +export * from './adapters/JSONFileSync.js'; +export * from './adapters/LocalStorage.js'; +export * from './adapters/Memory.js'; +export * from './adapters/MemorySync.js'; +export * from './adapters/TextFile.js'; +export * from './adapters/TextFileSync.js'; +export * from './Low.js'; +export * from './LowSync.js'; diff --git a/lib/lowdb/index.js b/lib/lowdb/index.js new file mode 100644 index 0000000000000000000000000000000000000000..11c194ee98e1669c2a8bd59d1fe1c9b61c0a1324 --- /dev/null +++ b/lib/lowdb/index.js @@ -0,0 +1,11 @@ +module.exports = { + ...require('./adapters/JSONFile.js'), + ...require('./adapters/JSONFileSync.js'), + ...require('./adapters/LocalStorage.js'), + ...require('./adapters/Memory.js'), + ...require('./adapters/MemorySync.js'), + ...require('./adapters/TextFile.js'), + ...require('./adapters/TextFileSync.js'), + ...require('./Low.js'), + ...require('./LowSync.js'), +} \ No newline at end of file diff --git a/lib/mongoDB.js b/lib/mongoDB.js new file mode 100644 index 0000000000000000000000000000000000000000..cc07fe5a91245e830bde3c97841b075ca7863c90 --- /dev/null +++ b/lib/mongoDB.js @@ -0,0 +1,73 @@ +const mongoose = require('mongoose'); +const { Schema } = mongoose; + +module.exports = class mongoDB { + constructor(url, options = { useNewUrlParser: true, useUnifiedTopology: true }) { + this.url = url; + this.data = this._data = this._schema = this._model = {}; + this.db = null; // Inisialisasi db sebagai null + this.options = options; + } + + async read() { + // Menghubungkan ke database + try { + this.db = await mongoose.connect(this.url, { ...this.options }); + this.connection = mongoose.connection; + + // Mendefinisikan schema + this._schema = new Schema({ + data: { + type: Object, + required: true, + default: {} + } + }); + + // Mencoba untuk mendefinisikan model + try { + this._model = mongoose.model('data', this._schema); + } catch (error) { + // Jika model sudah ada, ambil model yang ada + this._model = mongoose.model('data'); + } + + // Mencari data yang ada + this._data = await this._model.findOne({}); + if (!this._data) { + this.data = {}; + await this.write(this.data); + this._data = await this._model.findOne({}); + } else { + this.data = this._data.data; + } + return this.data; + } catch (error) { + console.error('Error connecting to MongoDB:', error); + throw error; // Melemparkan kesalahan agar dapat ditangani di tempat lain + } + } + + async write(data) { + if (!data) return null; // Kembalikan null jika tidak ada data + + if (!this._data) { + // Jika tidak ada data sebelumnya, buat dokumen baru + const newData = new this._model({ data }); + return await newData.save(); + } + + // Jika ada data, perbarui dokumen yang ada + try { + const docs = await this._model.findById(this._data._id); + if (!docs) throw new Error('Document not found'); + + // Memperbarui data + docs.data = { ...docs.data, ...data }; // Menggabungkan data lama dan baru + return await docs.save(); + } catch (error) { + console.error('Error writing to MongoDB:', error); + throw error; // Melemparkan kesalahan agar dapat ditangani di tempat lain + } + } +}; \ No newline at end of file diff --git a/lib/myfunc.js b/lib/myfunc.js new file mode 100644 index 0000000000000000000000000000000000000000..08ff78c0de5c4030164d6e13a6f03a242c29798f --- /dev/null +++ b/lib/myfunc.js @@ -0,0 +1,307 @@ +/** + * Create By Dika Ardnt. + * Contact Me on wa.me/6288292024190 + * Follow https://github.com/DikaArdnt +*/ + +const { proto } = require('@adiwajshing/baileys') +const chalk = require('chalk') +const fs = require('fs') +const Crypto = require('crypto') +const axios = require('axios') +const moment = require('moment-timezone') +const { sizeFormatter } = require('human-readable') +const util = require('util') +const jimp = require('jimp') +const { defaultMaxListeners } = require('stream') + + +const unixTimestampSeconds = (date = new Date()) => Math.floor(date.getTime() / 1000) + +exports.unixTimestampSeconds = unixTimestampSeconds + +exports.generateMessageTag = (epoch) => { + let tag = (0, exports.unixTimestampSeconds)().toString(); + if (epoch) + tag += '.--' + epoch; // attach epoch if provided + return tag; +} + +exports.processTime = (timestamp, now) => { + return moment.duration(now - moment(timestamp * 1000)).asSeconds() +} + +exports.getRandom = (ext) => { + return `${Math.floor(Math.random() * 10000)}${ext}` +} + +exports.getBuffer = async (url, options) => { + try { + options ? options : {} + const res = await axios({ + method: "get", + url, + headers: { + 'DNT': 1, + 'Upgrade-Insecure-Request': 1 + }, + ...options, + responseType: 'arraybuffer' + }) + return res.data + } catch (e) { + return err + } +} + +exports.fetchJson = async (url, options) => { + try { + options ? options : {} + const res = await axios({ + method: 'GET', + url: url, + headers: { + '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' + }, + ...options + }) + return res.data + } catch (err) { + return err + } +} + +exports.runtime = function(seconds) { + seconds = Number(seconds); + var d = Math.floor(seconds / (3600 * 24)); + var h = Math.floor(seconds % (3600 * 24) / 3600); + var m = Math.floor(seconds % 3600 / 60); + var s = Math.floor(seconds % 60); + var dDisplay = d > 0 ? d + (d == 1 ? " day, " : " days, ") : ""; + var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : ""; + var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : ""; + var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : ""; + return dDisplay + hDisplay + mDisplay + sDisplay; +} + +exports.clockString = function(seconds) { + let h = isNaN(seconds) ? '--' : Math.floor(seconds % (3600 * 24) / 3600) + let m = isNaN(seconds) ? '--' : Math.floor(seconds % 3600 / 60) + let s = isNaN(seconds) ? '--' : Math.floor(seconds % 60) + return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') +} + +exports.sleep = async (ms) => { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +exports.isUrl = (url) => { + return url.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)/, 'gi')) +} + +exports.getTime = (format, date) => { + if (date) { + return moment(date).locale('id').format(format) + } else { + return moment.tz('Asia/Jakarta').locale('id').format(format) + } +} + +exports.formatDate = (n, locale = 'id') => { + let d = new Date(n) + return d.toLocaleDateString(locale, { + weekday: 'long', + day: 'numeric', + month: 'long', + year: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric' + }) +} + +exports.tanggal = (numer) => { + myMonths = ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"]; + myDays = ['Minggu','Senin','Selasa','Rabu','Kamis','Jumโ€™at','Sabtu']; + var tgl = new Date(numer); + var day = tgl.getDate() + bulan = tgl.getMonth() + var thisDay = tgl.getDay(), + thisDay = myDays[thisDay]; + var yy = tgl.getYear() + var year = (yy < 1000) ? yy + 1900 : yy; + const time = moment.tz('Asia/Jakarta').format('DD/MM HH:mm:ss') + let d = new Date + let locale = 'id' + let gmt = new Date(0).getTime() - new Date('1 January 1970').getTime() + let weton = ['Pahing', 'Pon','Wage','Kliwon','Legi'][Math.floor(((d * 1) + gmt) / 84600000) % 5] + + return`${thisDay}, ${day} - ${myMonths[bulan]} - ${year}` +} + +exports.formatp = sizeFormatter({ + std: 'JEDEC', //'SI' = default | 'IEC' | 'JEDEC' + decimalPlaces: 2, + keepTrailingZeroes: false, + render: (literal, symbol) => `${literal} ${symbol}B`, +}) + +exports.jsonformat = (string) => { + return JSON.stringify(string, null, 2) +} + +function delay(ms) { + return new Promise((resolve, reject) => setTimeout(resolve, ms)) +} + +function format(...args) { + return util.format(...args) +} + +exports.logic = (check, inp, out) => { + if (inp.length !== out.length) throw new Error('Input and Output must have same length') + for (let i in inp) + if (util.isDeepStrictEqual(check, inp[i])) return out[i] + return null +} + +exports.generateProfilePicture = async (buffer) => { + const jimp = await jimp_1.read(buffer) + const min = jimp.getWidth() + const max = jimp.getHeight() + const cropped = jimp.crop(0, 0, min, max) + return { + img: await cropped.scaleToFit(720, 720).getBufferAsync(jimp_1.MIME_JPEG), + preview: await cropped.scaleToFit(720, 720).getBufferAsync(jimp_1.MIME_JPEG) + } +} + +exports.parseMention = (text = '') => { + return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') +} + +exports.getGroupAdmins = (participantes) => { + var admins = [] + for (let i of participantes) { + i.admin === "admin" ? admins.push(i.id) : '' + } + return admins +} + +/** + * Serialize Message + * @param {WAConnection} conn + * @param {Object} m + * @param {store} store + */ +exports.smsg = (conn, m, store) => { + if (!m) return m + let M = proto.WebMessageInfo + if (m.key) { + m.id = m.key.id + m.isBaileys = m.id.startsWith('BAE5') && m.id.length === 16 + m.chat = m.key.remoteJid + m.fromMe = m.key.fromMe + m.isGroup = m.chat.endsWith('@g.us') + m.sender = m.fromMe ? (conn.user.id.split(":")[0]+'@s.whatsapp.net' || conn.user.id) : (m.key.participant || m.key.remoteJid) + } + if (m.message) { + m.mtype = Object.keys(m.message)[0] + m.body = m.message.conversation || m.message[m.mtype].caption || m.message[m.mtype].text || (m.mtype == 'listResponseMessage') && m.message[m.mtype].singleSelectReply.selectedRowId || (m.mtype == 'buttonsResponseMessage') && m.message[m.mtype].selectedButtonId || m.mtype + m.msg = m.message[m.mtype] + if (m.mtype === 'ephemeralMessage') { + exports.smsg(hisoka, m.msg) + m.mtype = m.msg.mtype + m.msg = m.msg.msg + } + let quoted = m.quoted = m.msg.contextInfo ? m.msg.contextInfo.quotedMessage : null + m.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] + if (m.quoted) { + let type = Object.keys(m.quoted)[0] + m.quoted = m.quoted[type] + if (['productMessage'].includes(type)) { + type = Object.keys(m.quoted)[0] + m.quoted = m.quoted[type] + } + if (typeof m.quoted === 'string') m.quoted = { + text: m.quoted + } + m.quoted.mtype = type + m.quoted.id = m.msg.contextInfo.stanzaId + m.quoted.chat = m.msg.contextInfo.remoteJid || m.chat + m.quoted.isBaileys = m.quoted.id ? m.quoted.id.startsWith('BAE5') && m.quoted.id.length === 16 : false + m.quoted.sender = m.msg.contextInfo.participant.split(":")[0] || m.msg.contextInfo.participant + m.quoted.fromMe = m.quoted.sender === (conn.user && conn.user.id) + m.quoted.text = m.quoted.text || m.quoted.caption || '' + m.quoted.mentionedJid = m.msg.contextInfo ? m.msg.contextInfo.mentionedJid : [] + m.getQuotedObj = m.getQuotedMessage = async () => { + if (!m.quoted.id) return false + let q = await store.loadMessage(m.chat, m.quoted.id, conn) + return exports.smsg(conn, q, store) + } + let vM = m.quoted.fakeObj = M.fromObject({ + key: { + remoteJid: m.quoted.chat, + fromMe: m.quoted.fromMe, + id: m.quoted.id + }, + message: quoted, + ...(m.isGroup ? { participant: m.quoted.sender } : {}) + }) + + /** + * + * @returns + */ + m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key }) + + /** + * + * @param {*} jid + * @param {*} forceForward + * @param {*} options + * @returns + */ + m.quoted.copyNForward = (jid, forceForward = false, options = {}) => conn.copyNForward(jid, vM, forceForward, options) + + /** + * + * @returns + */ + m.quoted.download = () => conn.downloadMediaMessage(m.quoted) + } + } + if (m.msg.url) m.download = () => conn.downloadMediaMessage(m.msg) + m.text = (m.mtype == 'listResponseMessage' ? m.msg.singleSelectReply.selectedRowId : '') || m.msg.text || m.msg.caption || m.msg || '' + /** + * Reply to this message + * @param {String|Object} text + * @param {String|false} chatId + * @param {Object} options + */ + m.reply = (text, chatId, options) => conn.sendMessage(chatId ? chatId : m.chat, { text: text }, { quoted: m, detectLinks: false, thumbnail: global.thumb, ...options }) + /** + * Copy this message + */ + m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m))) + + /** + * + * @param {*} jid + * @param {*} forceForward + * @param {*} options + * @returns + */ + m.copyNForward = (jid = m.chat, forceForward = false, options = {}) => conn.copyNForward(jid, m, forceForward, options) + + return m +} + + +let file = require.resolve(__filename) +fs.watchFile(file, () => { + fs.unwatchFile(file) + console.log(chalk.redBright(`Update ${__filename}`)) + delete require.cache[file] + require(file) +}) diff --git a/lib/print.js b/lib/print.js new file mode 100644 index 0000000000000000000000000000000000000000..8f58cb11281893d2352b1ff103074e1f4d0eedc6 --- /dev/null +++ b/lib/print.js @@ -0,0 +1,93 @@ +let { WAMessageStubType } = require('@adiwajshing/baileys') +let urlRegex = require('url-regex-safe')({ strict: false }) +let PhoneNumber = require('awesome-phonenumber') +let terminalImage = global.opts['img'] ? require('terminal-image') : '' +let chalk = require('chalk') +let fs = require('fs') + +module.exports = async function (m, conn = { user: {} }) { + let _name = await conn.getName(m.sender) + let sender = PhoneNumber('+' + m.sender.replace('@s.whatsapp.net', '')).getNumber('international') + (_name ? ' ~' + _name : '') + let chat = await conn.getName(m.chat) + // let ansi = '\x1b[' + let img + try { + if (global.opts['img']) + img = /sticker|image/gi.test(m.mtype) ? await terminalImage.buffer(await m.download()) : false + } catch (e) { + console.error(e) + } + let filesize = (m.msg ? + m.msg.vcard ? + m.msg.vcard.length : + m.msg.fileLength ? + m.msg.fileLength.low || m.msg.fileLength : + m.msg.axolotlSenderKeyDistributionMessage ? + m.msg.axolotlSenderKeyDistributionMessage.length : + m.text ? + m.text.length : + 0 + : m.text ? m.text.length : 0) || 0 + let user = global.DATABASE.data.users[m.sender] + let me = PhoneNumber('+' + (conn.user && conn.user.jid).replace('@s.whatsapp.net', '')).getNumber('international') + console.log(`โ–ฃโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ยทยทยท +โ”‚ ${chalk.redBright('%s')}\nโ”‚โฐใ…ค${chalk.black(chalk.bgYellow('%s'))}\nโ”‚๐Ÿ“‘ใ…ค${chalk.black(chalk.bgGreen('%s'))}\nโ”‚๐Ÿ“Šใ…ค${chalk.magenta('%s [%s %sB]')} +โ”‚๐Ÿ“คใ…ค${chalk.green('%s')}\nโ”‚๐Ÿ“ƒใ…ค${chalk.yellow('%s%s')}\nโ”‚๐Ÿ“ฅใ…ค${chalk.green('%s')}\nโ”‚๐Ÿ’ฌใ…ค${chalk.black(chalk.bgYellow('%s'))} +โ–ฃโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ยทยทยท +`.trim(), + me + ' ~' + conn.user.name, + (m.messageTimestamp ? new Date(1000 * (m.messageTimestamp.low || m.messageTimestamp)) : new Date).toTimeString(), + m.messageStubType ? WAMessageStubType[m.messageStubType] : '', + filesize, + filesize === 0 ? 0 : (filesize / 1009 ** Math.floor(Math.log(filesize) / Math.log(1000))).toFixed(1), + ['', ...'KMGTP'][Math.floor(Math.log(filesize) / Math.log(1000))] || '', + sender, + m ? m.exp : '?', + user ? '|' + user.exp + '|' + user.limit : '' + ('|' + user.level), + m.chat + (chat ? ' ~' + chat : ''), + m.mtype ? m.mtype.replace(/message$/i, '').replace('audio', m.msg.ptt ? 'PTT' : 'audio').replace(/^./, v => v.toUpperCase()) : '' + ) + if (img) console.log(img.trimEnd()) + if (typeof m.text === 'string' && m.text) { + let log = m.text.replace(/\u200e+/g, '') + let mdRegex = /(?<=(?:^|[\s\n])\S?)(?:([*_~])(.+?)\1|```((?:.||[\n\r])+?)```)(?=\S?(?:[\s\n]|$))/g + let mdFormat = (depth = 4) => (_, type, text, monospace) => { + let types = { + _: 'italic', + '*': 'bold', + '~': 'strikethrough' + } + text = text || monospace + let formatted = !types[type] || depth < 1 ? text : chalk[types[type]](text.replace(mdRegex, mdFormat(depth - 1))) + // console.log({ depth, type, formatted, text, monospace }, formatted) + return formatted + } + if (log.length < 4096) + log = log.replace(urlRegex, (url, i, text) => { + let end = url.length + i + return i === 0 || end === text.length || (/^\s$/.test(text[end]) && /^\s$/.test(text[i - 1])) ? chalk.blueBright(url) : url + }) + log = log.replace(mdRegex, mdFormat(4)) + if (m.mentionedJid) for (let user of m.mentionedJid) log = log.replace('@' + user.split`@`[0], chalk.blueBright('@' + await conn.getName(user))) + console.log(m.error != null ? chalk.red(log) : m.isCommand ? chalk.yellow(log) : log) + } + if (m.messageStubParameters) console.log(m.messageStubParameters.map(jid => { + jid = conn.decodeJid(jid) + let name = conn.getName(jid) + return chalk.gray(PhoneNumber('+' + jid.replace('@s.whatsapp.net', '')).getNumber('international') + (name ? ' ~' + name : '')) + }).join(', ')) + if (/document/i.test(m.mtype)) console.log(`๐Ÿ“„ ${m.msg.filename || m.msg.displayName || 'Document'}`) + else if (/ContactsArray/i.test(m.mtype)) console.log(`๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ ${' ' || ''}`) + else if (/contact/i.test(m.mtype)) console.log(`๐Ÿ‘จ ${m.msg.displayName || ''}`) + else if (/audio/i.test(m.mtype)) (s = m.msg.seconds, console.log(`${m.msg.ptt ? '๐ŸŽค (PTT ' : '๐ŸŽต ('}AUDIO) ${Math.floor(s / 60).toString().padStart(2, 0)}:${(s % 60).toString().padStart(2, 0)}`)) + + console.log() + // if (m.quoted) console.log(m.msg.contextInfo) +} + +let file = require.resolve(__filename) +fs.watchFile(file, () => { + fs.unwatchFile(file) + console.log(chalk.redBright("Update 'lib/print.js'")) + delete require.cache[file] +}) diff --git a/lib/scrape.js b/lib/scrape.js new file mode 100644 index 0000000000000000000000000000000000000000..a57266cedcca2b4fecfeb538f6106d7870713746 --- /dev/null +++ b/lib/scrape.js @@ -0,0 +1,254 @@ +const cheerio = require('cheerio') +const fetch = require('node-fetch') +const axios = require("axios") +const qs = require("qs") + +function quotes(input) { + return new Promise((resolve, reject) => { + fetch('https://jagokata.com/kata-bijak/kata-' + input.replace(/\s/g, '_') + '.html?page=1') + .then(res => res.text()) + .then(res => { + const $ = cheerio.load(res) + data = [] + $('div[id="main"]').find('ul[id="citatenrijen"] > li').each(function (index, element) { + x = $(this).find('div[class="citatenlijst-auteur"] > a').text().trim() + y = $(this).find('span[class="auteur-beschrijving"]').text().trim() + z = $(element).find('q[class="fbquote"]').text().trim() + data.push({ author: x, bio: y, quote: z }) + }) + data.splice(2, 1) + if (data.length == 0) return resolve({ creator: 'stikerin', status: false }) + resolve({ creator: 'stikerin', status: true, data }) + }).catch(reject) + }) +} + +function joox(query) { + return new Promise((resolve, reject) => { + const time = Math.floor(new Date() / 1000) + axios.get('http://api.joox.com/web-fcgi-bin//web_search?lang=id&country=id&type=0&search_input=' + query + '&pn=1&sin=0&ein=29&_=' + time) + .then(({ data }) => { + let result = [] + let hasil = [] + let promoses = [] + let ids = [] + data.itemlist.forEach(result => { + ids.push(result.songid) + }); + for (let i = 0; i < data.itemlist.length; i++) { + const get = 'http://api.joox.com/web-fcgi-bin/web_get_songinfo?songid=' + ids[i] + promoses.push( + axios.get(get, { + headers: { + Cookie: 'wmid=142420656; user_type=1; country=id; session_key=2a5d97d05dc8fe238150184eaf3519ad;' + } + }) + .then(({ data }) => { + const res = JSON.parse(data.replace('MusicInfoCallback(', '').replace('\n)', '')) + hasil.push({ + lagu: res.msong, + album: res.malbum, + penyanyi: res.msinger, + publish: res.public_time, + img: res.imgSrc, + mp3: res.mp3Url + }) + Promise.all(promoses).then(() => resolve({ + creator: "ariffb", + status: true, + data: hasil, + })) + }).catch(reject) + ) + } + }).catch(reject) + }) +} + +function tiktok(url) { + return new Promise(async (resolve, reject) => { + axios.get('https://ttdownloader.com/', { + headers: { + "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", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "cookie": "PHPSESSID=9ut8phujrprrmll6oc3bist01t; popCookie=1; _ga=GA1.2.1068750365.1625213061; _gid=GA1.2.842420949.1625213061" + } + }) + .then(({ data }) => { + const $ = cheerio.load(data) + let token = $('#token').attr('value') + let config = { + 'url': url, + 'format': '', + 'token': token + } + axios('https://ttdownloader.com/req/', { + method: 'POST', + data: new URLSearchParams(Object.entries(config)), + headers: { + "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", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "cookie": "PHPSESSID=9ut8phujrprrmll6oc3bist01t; popCookie=1; _ga=GA1.2.1068750365.1625213061; _gid=GA1.2.842420949.1625213061" + } + }) + .then(({ data }) => { + const $ = cheerio.load(data) + resolve({ + nowm: $('div:nth-child(2) > div.download > a').attr('href'), + wm: $('div:nth-child(3) > div.download > a').attr('href'), + audio: $('div:nth-child(4) > div.download > a').attr('href') + }) + }) + }) + .catch(reject) + }) +} + +function twitter(url) { + return new Promise((resolve, reject) => { + let params = new URLSearchParams() + params.append('URL', url) + fetch('https://twdown.net/download.php', { method: 'POST', body: params }) + .then(res => res.text()) + .then(res => { + const $ = cheerio.load(res); + data = [] + $('div.container').find('tbody > tr > td').each(function (index, element) { + x = $(this).find('a').attr('href') + if (x !== '#') { + if (typeof x !== 'undefined') { + data.push({ url: x }) + } + } + }) + if (data.length == 0) return resolve({ status: false }) + resolve({ status: true, data }) + }).catch(reject) + }) +} + +function igdl(url) { + return new Promise(async (resolve, reject) => { + axios.request({ + url: 'https://www.instagramsave.com/download-instagram-videos.php', + method: 'GET', + headers: { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg" + } + }) + .then(({ data }) => { + const $ = cheerio.load(data) + const token = $('#token').attr('value') + let config = { + headers: { + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"', + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + }, + data: { + 'url': url, + 'action': 'post', + 'token': token + } + } + axios.post('https://www.instagramsave.com/system/action.php', qs.stringify(config.data), { headers: config.headers }) + .then(({ data }) => { + resolve(data.medias) + }) + }) + .catch(reject) + }) +} + +function igstory(username) { + return new Promise(async (resolve, reject) => { + axios.request({ + url: 'https://www.instagramsave.com/instagram-story-downloader.php', + method: 'GET', + headers: { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg" + } + }) + .then(({ data }) => { + const $ = cheerio.load(data) + const token = $('#token').attr('value') + let config = { + headers: { + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"', + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + }, + data: { + 'url': 'https://www.instagram.com/' + username, + 'action': 'story', + 'token': token + } + } + axios.post('https://www.instagramsave.com/system/action.php', qs.stringify(config.data), { headers: config.headers }) + .then(({ data }) => { + resolve(data.medias) + }) + }) + .catch(reject) + }) +} + +function pin(url) { + return new Promise(async (resolve, reject) => { + let form = new URLSearchParams() + form.append('url', url) + let html = await (await fetch('https://pinterestvideodownloader.com/', { method: 'POST', body: form })).text() + $ = cheerio.load(html) + let data = [] + $('table > tbody > tr').each(function (i, e) { + if ($($(e).find('td')[0]).text() != '') data.push({ + url: $($(e).find('td')[0]).find('a').attr('href') + }) + }) + if (data.length == 0) return resolve({ status: false }) + resolve({ status: true, data }) + }) +} + + +let is = { + headers: { + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"', + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + } +} + +function _token(host) { + return new Promise(async (resolve, reject) => { + axios.request({ + url: host, method: 'GET', headers: { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "cookie": "PHPSESSID=ugpgvu6fgc4592jh7ht9d18v49; _ga=GA1.2.1126798330.1625045680; _gid=GA1.2.1475525047.1625045680; __gads=ID=92b58ed9ed58d147-221917af11ca0021:T=1625045679:RT=1625045679:S=ALNI_MYnQToDW3kOUClBGEzULNjeyAqOtg" + } + }).then(({ data }) => { + let $ = cheerio.load(data) + let token = $('#token').attr('value') + resolve(token) + }) + }) +} + +function facebook(url) { + return new Promise(async (resolve, reject) => { + let host = 'https://aiovideodl.ml/' + let form = { data: { 'url': url, 'token': (await _token(host)) } } + axios.post(host + '/system/action.php', qs.stringify(form.data), { headers: is.headers }) + .then(({ data }) => { + if (data.links.lenght == 0) return resolve({ creator: '@neoxrs โ€“ Wildan Izzudin', status: false }) + resolve({ creator: '@neoxrs โ€“ Wildan Izzudin', status: true, data: data.links }) + }) + }) +} + +module.exports = { facebook, quotes, igdl, igstory, tiktok, twitter, joox, pin } diff --git a/lib/simple.js b/lib/simple.js new file mode 100644 index 0000000000000000000000000000000000000000..f99beae2aef1efbc7c888a4c384fd78de764a803 --- /dev/null +++ b/lib/simple.js @@ -0,0 +1,1638 @@ +const { imageToWebp, videoToWebp, writeExifImg, writeExifVid } = require('../lib/exif') +const { + default: makeWASocket, + makeWALegacySocket, + extractMessageContent, + makeInMemoryStore, + proto, + prepareWAMessageMedia, + downloadContentFromMessage, + getBinaryNodeChild, + jidDecode, + areJidsSameUser, + generateForwardMessageContent, + generateWAMessageFromContent, + WAMessageStubType, + WA_DEFAULT_EPHEMERAL, +} = require('@adiwajshing/baileys') +const { toAudio, toPTT, toVideo } = require('./converter') +const chalk = require('chalk') +const fetch = require('node-fetch') +const FileType = require('file-type') +const PhoneNumber = require('awesome-phonenumber') +const fs = require('fs') +const path = require('path') +const jimp = require('jimp') +const pino = require('pino') +const util = require('util') +const store = makeInMemoryStore({ logger: pino().child({ level: 'silent', stream: 'store' }) }) + + +exports.makeWASocket = (connectionOptions, options = {}) => { + let conn = (opts['legacy'] ? makeWALegacySocket : makeWASocket)(connectionOptions) + // conn.ws.on('CB:stream:error', (stream) => { + // const { code } = stream || {} + // if (code == '401') conn.ev.emit('connection.update', { + // connection: 'logged Out', + // lastDisconnect: { + // error: { + // output: { + // statusCode: DisconnectReason.loggedOut + // } + // }, + // date: new Date() + // } + // }) + // }) + conn.decodeJid = (jid) => { + if (!jid) return jid + if (/:\d+@/gi.test(jid)) { + const decode = jidDecode(jid) || {} + return decode.user && decode.server && decode.user + '@' + decode.server || jid + } else return jid + } + if (conn.user && conn.user.id) conn.user.jid = conn.decodeJid(conn.user.id) + if (!conn.chats) conn.chats = {} + + function updateNameToDb(contacts) { + if (!contacts) return + for (const contact of contacts) { + const id = conn.decodeJid(contact.id) + if (!id) continue + let chats = conn.chats[id] + if (!chats) chats = conn.chats[id] = { id } + conn.chats[id] = { + ...chats, + ...({ + ...contact, id, ...(id.endsWith('@g.us') ? + { subject: contact.subject || chats.subject || '' } : + { name: contact.notify || chats.name || chats.notify || '' }) + } || {}) + } + } + } + + + conn.ev.on('contacts.upsert', updateNameToDb) + conn.ev.on('groups.update', updateNameToDb) + conn.ev.on('chats.set', async ({ chats }) => { + for (const { id, name, readOnly } of chats) { + id = conn.decodeJid(id) + if (!id) continue + const isGroup = id.endsWith('@g.us') + let chats = conn.chats[id] + if (!chats) chats = conn.chats[id] = { id } + chats.isChats = !readOnly + if (name) chats[isGroup ? 'subject' : 'name'] = name + if (isGroup) { + const metadata = await conn.groupMetadata(id).catch(_ => null) + if (!metadata) continue + chats.subject = name || metadata.subject + chats.metadata = metadata + } + } + }) + conn.ev.on('group-participants.update', async function updateParticipantsToDb({ id, participants, action }) { + id = conn.decodeJid(id) + if (!(id in conn.chats)) conn.chats[id] = { id } + conn.chats[id].isChats = true + const groupMetadata = await conn.groupMetadata(id).catch(_ => null) + if (!groupMetadata) return + conn.chats[id] = { + ...conn.chats[id], + subject: groupMetadata.subject, + metadata: groupMetadata + } + }) + + conn.ev.on('groups.update', async function groupUpdatePushToDb(groupsUpdates) { + for (const update of groupsUpdates) { + const id = conn.decodeJid(update.id) + if (!id) continue + const isGroup = id.endsWith('@g.us') + if (!isGroup) continue + let chats = conn.chats[id] + if (!chats) chats = conn.chats[id] = { id } + chats.isChats = true + const metadata = await conn.groupMetadata(id).catch(_ => null) + if (!metadata) continue + chats.subject = metadata.subject + chats.metadata = metadata + } + }) + conn.ev.on('chats.upsert', async function chatsUpsertPushToDb(chatsUpsert) { + console.log({ chatsUpsert }) + const { id, name } = chatsUpsert + if (!id) return + let chats = conn.chats[id] = { ...conn.chats[id], ...chatsUpsert, isChats: true } + const isGroup = id.endsWith('@g.us') + if (isGroup) { + const metadata = await conn.groupMetadata(id).catch(_ => null) + if (metadata) { + chats.subject = name || metadata.subject + chats.metadata = metadata + } + const groups = await conn.groupFetchAllParticipating().catch(_ => ({})) || {} + for (const group in groups) conn.chats[group] = { id: group, subject: groups[group].subject, isChats: true, metadata: groups[group] } + } + }) + conn.ev.on('presence.update', async function presenceUpdatePushToDb({ id, presences }) { + const sender = Object.keys(presences)[0] || id + const _sender = conn.decodeJid(sender) + const presence = presences[sender]['lastKnownPresence'] || 'composing' + let chats = conn.chats[_sender] + if (!chats) chats = conn.chats[_sender] = { id: sender } + chats.presences = presence + if (id.endsWith('@g.us')) { + let chats = conn.chats[id] + if (!chats) { + const metadata = await conn.groupMetadata(id).catch(_ => null) + if (metadata) chats = conn.chats[id] = { id, subject: metadata.subject, metadata } + } + chats.isChats = true + } + }) + + conn.logger = { + ...conn.logger, + info(...args) { console.log(chalk.bold.rgb(57, 183, 16)(`INFO [${chalk.rgb(255, 255, 255)(new Date())}]:`), chalk.cyan(util.format(...args))) }, + error(...args) { console.log(chalk.bold.rgb(247, 38, 33)(`ERROR [${chalk.rgb(255, 255, 255)(new Date())}]:`), chalk.rgb(255, 38, 0)(util.format(...args))) }, + warn(...args) { console.log(chalk.bold.rgb(239, 225, 3)(`WARNING [${chalk.rgb(255, 255, 255)(new Date())}]:`), chalk.keyword('orange')(util.format(...args))) } + } + + + /** + * getBuffer hehe + * @param {fs.PathLike} path + * @param {Boolean} returnFilename + */ + conn.getFile = async (PATH, returnAsFilename) => { + let res, filename + let data = Buffer.isBuffer(PATH) ? PATH : /^data:.*?\/.*?;base64,/i.test(PATH) ? Buffer.from(PATH.split`,`[1], 'base64') : /^https?:\/\//.test(PATH) ? await (res = await fetch(PATH)).buffer() : fs.existsSync(PATH) ? (filename = PATH, fs.readFileSync(PATH)) : typeof PATH === 'string' ? PATH : Buffer.alloc(0) + if (!Buffer.isBuffer(data)) throw new TypeError('Result is not a buffer') + let type = await FileType.fromBuffer(data) || { + mime: 'application/octet-stream', + ext: '.bin' + } + if (data && returnAsFilename && !filename) (filename = path.join(__dirname, '../tmp/' + new Date * 1 + '.' + type.ext), await fs.promises.writeFile(filename, data)) + return { + res, + filename, + ...type, + data + } + } + + /** + * waitEvent + * @param {Partial|String} eventName + * @param {Boolean} is + * @param {Number} maxTries + * @returns + */ + conn.waitEvent = (eventName, is = () => true, maxTries = 25) => { + return new Promise((resolve, reject) => { + let tries = 0 + let on = (...args) => { + if (++tries > maxTries) reject('Max tries reached') + else if (is()) { + conn.ev.off(eventName, on) + resolve(...args) + } + } + conn.ev.on(eventName, on) + }) + } + + conn.delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) + + /** + * + * @param {String} text + * @returns + */ + conn.filter = (text) => { + let mati = ["q", "w", "r", "t", "y", "p", "s", "d", "f", "g", "h", "j", "k", "l", "z", "x", "c", "v", "b", "n", "m"] + if (/[aiueo][aiueo]([qwrtypsdfghjklzxcvbnm])?$/i.test(text)) return text.substring(text.length - 1) + else { + let res = Array.from(text).filter(v => mati.includes(v)) + let resu = res[res.length - 1] + for (let huruf of mati) { + if (text.endsWith(huruf)) { + resu = res[res.length - 2] + } + } + let misah = text.split(resu) + return resu + misah[misah.length - 1] + } + } + + /** + * ms to date + * @param {String} ms + */ + conn.msToDate = (ms) => { + let days = Math.floor(ms / (24 * 60 * 60 * 1000)); + let daysms = ms % (24 * 60 * 60 * 1000); + let hours = Math.floor((daysms) / (60 * 60 * 1000)); + let hoursms = ms % (60 * 60 * 1000); + let minutes = Math.floor((hoursms) / (60 * 1000)); + let minutesms = ms % (60 * 1000); + let sec = Math.floor((minutesms) / (1000)); + return days + " Hari " + hours + " Jam " + minutes + " Menit"; + // +minutes+":"+sec; + } + + /** + * isi + */ + conn.rand = async (isi) => { + return isi[Math.floor(Math.random() * isi.length)] + } + + /** + * For Resize the Image By Aine + * @param {Buffer} image + * @param {String} ukuran height + * @param {String} ukuran weight + * @returns + */ + + conn.resize = async (buffer, uk1, uk2) => { + return new Promise(async(resolve, reject) => { + var baper = await jimp.read(buffer); + var ab = await baper.resize(uk1, uk2).getBufferAsync(jimp.MIME_JPEG) + resolve(ab) + }) + } + + /** + * Send Media All Type + * @param {String} jid + * @param {String|Buffer} path + * @param {Object} quoted + * @param {Object} options + */ + conn.sendMedia = async (jid, path, quoted, options = {}) => { + let { ext, mime, data } = await conn.getFile(path) + messageType = mime.split("/")[0] + pase = messageType.replace('application', 'document') || messageType + return await conn.sendMessage(jid, { [`${pase}`]: data, mimetype: mime, ...options }, { quoted }) + } + + /** + * Send Media/File with Automatic Type Specifier + * @param {String} jid + * @param {String|Buffer} path + * @param {String} filename + * @param {String} caption + * @param {proto.WebMessageInfo} quoted + * @param {Boolean} ptt + * @param {Object} options + */ + conn.getFile = async (PATH, returnAsFilename) => { + let res, filename + let data = Buffer.isBuffer(PATH) ? PATH : /^data:.*?\/.*?;base64,/i.test(PATH) ? Buffer.from(PATH.split`,`[1], 'base64') : /^https?:\/\//.test(PATH) ? await (res = await fetch(PATH)).buffer() : fs.existsSync(PATH) ? (filename = PATH, fs.readFileSync(PATH)) : typeof PATH === 'string' ? PATH : Buffer.alloc(0) + if (!Buffer.isBuffer(data)) throw new TypeError('Result is not a buffer') + let type = await FileType.fromBuffer(data) || { + mime: 'application/octet-stream', + ext: '.bin' + } + if (data && returnAsFilename && !filename) (filename = path.join(__dirname, '../tmp/' + new Date * 1 + '.' + type.ext), await fs.promises.writeFile(filename, data)) + return { + res, + filename, + ...type, + data + } + } + /** + * Send Media/File with Automatic Type Specifier + * @param {String} jid + * @param {String|Buffer} path + * @param {String} filename + * @param {String} caption + * @param {Object} quoted + * @param {Boolean} ptt + * @param {Object} options + */ + conn.sendFile = async (jid, path, filename = '', caption = '', quoted, ptt = false, options = {}) => { + let type = await conn.getFile(path, true) + let { res, data: file, filename: pathFile } = type + if (res && res.status !== 200 || file.length <= 65536) { + try { throw { json: JSON.parse(file.toString()) } } + catch (e) { if (e.json) throw e.json } + } + let opt = { filename } + if (quoted) opt.quoted = quoted + if (!type) if (options.asDocument) options.asDocument = true + let mtype = '', mimetype = type.mime + if (/webp/.test(type.mime)) mtype = 'sticker' + else if (/image/.test(type.mime)) mtype = 'image' + else if (/video/.test(type.mime)) mtype = 'video' + else if (/audio/.test(type.mime)) ( + convert = await (ptt ? toPTT : toAudio)(file, type.ext), + file = convert.data, + pathFile = convert.filename, + mtype = 'audio', + mimetype = 'audio/ogg; codecs=opus' + ) + else mtype = 'document' + return await conn.sendMessage(jid, { + ...options, + caption, + ptt, + [mtype]: { url: pathFile }, + mimetype + }, { + ...opt, + ...options + }) + } + //Wm Sticker + conn.sendImageAsSticker = async (jid, path, quoted, options = {}) => { + let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await fetch(path)).buffer() : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) + let buffer + if (options && (options.packname || options.author)) { + buffer = await writeExifImg(buff, options) + } else { + buffer = await imageToWebp(buff) + } + + await conn.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted }) + return buffer + } + conn.sendVideoAsSticker = async (jid, path, quoted, options = {}) => { + let buff = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (await fetch(path)).buffer() : fs.existsSync(path) ? fs.readFileSync(path) : Buffer.alloc(0) + let buffer + if (options && (options.packname || options.author)) { + buffer = await writeExifVid(buff, options) + } else { + buffer = await videoToWebp(buff) + } + + await conn.sendMessage(jid, { sticker: { url: buffer }, ...options }, { quoted }) + return buffer + } + /** + * Send Contact + * @param {String} jid + * @param {String[][]} data + * @param {proto.WebMessageInfo} quoted + * @param {Object} options + */ + conn.sendContact = async (jid, data, quoted, options) => { + let contacts = [] + for (let [number, name] of data) { + number = number.replace(/[^0-9]/g, '') + let njid = number + '@s.whatsapp.net' + let biz = await conn.getBusinessProfile(njid) || {} + // N:;${name.replace(/\n/g, '\\n').split(' ').reverse().join(';')};;; + let vcard = ` +BEGIN:VCARD +VERSION:3.0 +FN:${name.replace(/\n/g, '\\n')} +item1.TEL;waid=${number}:${PhoneNumber('+' + number).getNumber('international')} +item1.X-ABLabel:Ponsel${biz.description ? ` +PHOTO;BASE64:${(await conn.getFile(await conn.profilePictureUrl(njid)).catch(_ => ({})) || {}).data?.toString('base64')} +X-WA-BIZ-DESCRIPTION:${(biz.description || '').replace(/\n/g, '\\n')} +X-WA-BIZ-NAME:${(((conn.chats[njid] || {}) || { vname: conn.chats[njid]?.name }).vname || conn.getName(njid) || name).replace(/\n/, '\\n')} +`.trim() : ''} +END:VCARD +`.trim() + contacts.push({ vcard, displayName: name }) + + } + return await conn.sendMessage(jid, { + contacts: { + ...options, + displayName: (contacts.length > 1 ? `${contacts.length} kontak` : contacts[0].displayName) || null, + contacts, + }, + quoted, ...options + }) + } + + /** + * Reply to a message + * @param {String} jid + * @param {String|Object} text + * @param {Object} quoted + * @param {Object} options + */ + conn.reply = (jid, text = '', quoted, options) => { + return Buffer.isBuffer(text) ? this.sendFile(jid, text, 'file', '', quoted, false, options) : conn.sendMessage(jid, { ...options, text, mentions: conn.parseMention(text) }, { quoted, ...options, mentions: conn.parseMention(text) }) + } + + conn.decodeJid = (jid) => { + if (!jid) return jid + if (/:\d+@/gi.test(jid)) { + let decode = jidDecode(jid) || {} + return decode.user && decode.server && decode.user + '@' + decode.server || jid + } else return jid + } + + /** + * + * @param {*} jid + * @param {*} text + * @param {*} quoted + * @param {*} options + * @returns + */ + conn.sendText = (jid, text, quoted = '', options) => conn.sendMessage(jid, { text: text, ...options }, { quoted }) + + /** + * sendGroupV4Invite + * @param {String} jid + * @param {*} participant + * @param {String} inviteCode + * @param {Number} inviteExpiration + * @param {String} groupName + * @param {String} caption + * @param {*} options + * @returns + */ + conn.sendGroupV4Invite = async (jid, participant, inviteCode, inviteExpiration, groupName = 'unknown subject', caption = 'Invitation to join my WhatsApp group', options = {}) => { + let msg = proto.Message.fromObject({ + groupInviteMessage: proto.GroupInviteMessage.fromObject({ + inviteCode, + inviteExpiration: parseInt(inviteExpiration) || + new Date(new Date + (3 * 86400000)), + groupJid: jid, + groupName: groupName ? groupName : this.getName(jid), + caption + }) + }) + let message = await this.prepareMessageFromContent(participant, msg, options) + await this.relayWAMessage(message) + return message + } + + /** + * send Button + * @param {String} jid + * @param {String} contentText + * @param {String} footer + * @param {Buffer|String} buffer + * @param {String[]} buttons + * @param {proto.WebMessageInfo} quoted + * @param {Object} options + */ + conn.sendButton = async (jid, contentText, footer, buffer, buttons, quoted, options) => { + if (buffer) try { buffer = (await conn.getFile(buffer)).data } catch { buffer = null } + let message = { + ...options, + ...(buffer ? { caption: contentText || '' } : { text: contentText || '' }), + footer, + buttons: buttons.map(btn => { + return { + buttonId: btn[1] || btn[0] || '', + buttonText: { + displayText: btn[0] || btn[1] || '' + } + } + }), + ...(buffer ? { image: buffer } : {}) + } + return await conn.sendMessage(jid, message, { + quoted, + upload: conn.waUploadToServer, + ...options + }) + } + + conn.sendBut = async(jid, content, footer, button1, row1, quoted) => { + const buttons = [ + {buttonId: row1, buttonText: {displayText: button1}, type: 1} + ] +const buttonMessage = { + text: content, + footer: footer, + buttons: buttons, + headerType: 1, + mentions: conn.parseMention(footer+content) +} +return await conn.sendMessage(jid, buttonMessage, {quoted}) + } + + conn.send2But = async(jid, content, footer, button1, row1, button2, row2, quoted) => { + const buttons = [ + { buttonId: row1, buttonText: { displayText: button1 }, type: 1 }, + { buttonId: row2, buttonText: { displayText: button2 }, type: 1 } + ] +const buttonMessage = { + text: content, + footer: footer, + buttons: buttons, + headerType: 1 +} +return await conn.sendMessage(jid, buttonMessage, {quoted}) + } + + conn.send3But = async(jid, content, footer,button1, row1, button2, row2, button3, row3, quoted) => { + const buttons = [ + { buttonId: row1, buttonText: { displayText: button1 }, type: 1 }, + { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }, + { buttonId: row3, buttonText: { displayText: button3 }, type: 1 } + ] +const buttonMessage = { + text: content, + footer: footer, + buttons: buttons, + headerType: 1 +} +return await conn.sendMessage(jid, buttonMessage, {quoted}) + } + conn.send4But = async(jid, content, footer,button1, row1, button2, row2, button3, row3, button4, row4, quoted) => { + const buttons = [ + { buttonId: row1, buttonText: { displayText: button1 }, type: 1 }, + { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }, + { buttonId: row3, buttonText: { displayText: button3 }, type: 1 }, + { buttonId: row4, buttonText: { displayText: button4 }, type: 1 } + ] +const buttonMessage = { + text: content, + footer: footer, + buttons: buttons, + headerType: 1 +} +return await conn.sendMessage(jid, buttonMessage, {quoted}) +} + /** + * send Button Img + * @param {String} jid + * @param {String} contentText + * @param {String} footer + * @param {Buffer|String} buffer + * @param {String[]} buttons + * @param {Object} quoted + * @param {Object} options + */ + conn.sendButtonImg = async (jid, buffer, contentText, footerText, button1, id1, quoted, options) => { + let type = await conn.getFile(buffer) + let { res, data: file } = type + if (res && res.status !== 200 || file.length <= 65536) { + try { throw { json: JSON.parse(file.toString()) } } + catch (e) { if (e.json) throw e.json } + } + const buttons = [ + { buttonId: id1, buttonText: { displayText: button1 }, type: 1 } + ] + + const buttonMessage = { + image: file, + fileLength: 887890909999999, + caption: contentText, + footer: footerText, + mentions: await conn.parseMention(contentText + footerText), + ...options, + buttons: buttons, + headerType: 4 + } + + return await conn.sendMessage(jid, buttonMessage, { quoted, ephemeralExpiration: 86400, contextInfo: { mentionedJid: conn.parseMention(contentText + footerText) }, ...options }) + } + conn.send2ButtonImg = async (jid, buffer, contentText, footerText, button1, id1, button2, id2, quoted, options) => { + let type = await conn.getFile(buffer) + let { res, data: file } = type + if (res && res.status !== 200 || file.length <= 65536) { + try { throw { json: JSON.parse(file.toString()) } } + catch (e) { if (e.json) throw e.json } + } + const buttons = [ + { buttonId: id1, buttonText: { displayText: button1 }, type: 1 }, + { buttonId: id2, buttonText: { displayText: button2 }, type: 1 } + ] + + const buttonMessage = { + image: file, + fileLength: 887890909999999, + caption: contentText, + footer: footerText, + mentions: await conn.parseMention(contentText + footerText), + ...options, + buttons: buttons, + headerType: 4 + } + + return await conn.sendMessage(jid, buttonMessage, { quoted, ephemeralExpiration: 86400, contextInfo: { mentionedJid: conn.parseMention(contentText + footerText) }, ...options }) + } + conn.send3ButtonImg = async (jid, buffer, contentText, footerText, button1, id1, button2, id2, button3, id3, quoted, options) => { + let type = await conn.getFile(buffer) + let { res, data: file } = type + if (res && res.status !== 200 || file.length <= 65536) { + try { throw { json: JSON.parse(file.toString()) } } + catch (e) { if (e.json) throw e.json } + } + const buttons = [ + { buttonId: id1, buttonText: { displayText: button1 }, type: 1 }, + { buttonId: id2, buttonText: { displayText: button2 }, type: 1 }, + { buttonId: id3, buttonText: { displayText: button3 }, type: 1 } + ] + + const buttonMessage = { + image: file, + fileLength: 887890909999999, + caption: contentText, + footer: footerText, + mentions: await conn.parseMention(contentText + footerText), + ...options, + buttons: buttons, + headerType: 4 + } + + return await conn.sendMessage(jid, buttonMessage, { quoted, ephemeralExpiration: 86400, contextInfo: { mentionedJid: conn.parseMention(contentText + footerText) }, ...options }) + } + + conn.sendH3Button = async (jid, content, displayText, link, displayCall, number, quickReplyText, id, quickReplyText2, id2, quickReplyText3, id3, quoted) => { + let template = generateWAMessageFromContent(jid, proto.Message.fromObject({ + templateMessage: { + hydratedTemplate: { + hydratedContentText: content, + hydratedButtons: [{ + urlButton: { + displayText: displayText, + url: link + } + }, { + callButton: { + displayText: displayCall, + phoneNumber: number + } + }, + { + quickReplyButton: { + displayText: quickReplyText, + id: id, + } + + }, + { + quickReplyButton: { + displayText: quickReplyText2, + id: id2, + } + }, + { + quickReplyButton: { + displayText: quickReplyText3, + id: id3, + } + }] + } + } + }), { userJid: conn.user.jid, quoted: quoted}); + return await conn.relayMessage( + jid, + template.message, + { messageId: template.key.id } + ) + } + + conn.cMod = (jid, message, text = '', sender = conn.user.jid, options = {}) => { + let copy = message.toJSON() + let mtype = Object.keys(copy.message)[0] + let isEphemeral = false // mtype === 'ephemeralMessage' + if (isEphemeral) { + mtype = Object.keys(copy.message.ephemeralMessage.message)[0] + } + let msg = isEphemeral ? copy.message.ephemeralMessage.message : copy.message + let content = msg[mtype] + if (typeof content === 'string') msg[mtype] = text || content + else if (content.caption) content.caption = text || content.caption + else if (content.text) content.text = text || content.text + if (typeof content !== 'string') msg[mtype] = { ...content, ...options } + if (copy.participant) sender = copy.participant = sender || copy.participant + else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant + if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid + else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid + copy.key.remoteJid = jid + copy.key.fromMe = areJidsSameUser(sender, conn.user.id) || false + return proto.WebMessageInfo.fromObject(copy) + } + conn.sendHButtonLoc = async (jid, buffer, content, footer, distek, link1, quick1, id1,quoted) => { + let template = generateWAMessageFromContent(jid, proto.Message.fromObject({ + templateMessage: { + hydratedTemplate: { + hydratedContentText: content, + mentions: conn.parseMention(content + footer), + locationMessage: { + jpegThumbnail: buffer }, + hydratedFooterText: footer, + mentions: conn.parseMention(content + footer), + hydratedButtons: [{ + urlButton: { + displayText: distek, + url: link1 + } + }, { + quickReplyButton: { + displayText:quick1, + id: id1 + } + }], mentions: conn.parseMention(content + footer) + } + } + }), { userJid: conn.user.jid, quoted: quoted, mentions: conn.parseMention(content + footer)}); + return await conn.relayMessage( + jid, + template.message, + { messageId: template.key.id } + ) + } + + conn.sendHButt = async (jid, content, distek, link, discall, number, retek, id,quoted) => { + let template = generateWAMessageFromContent(jid, proto.Message.fromObject({ + templateMessage: { + hydratedTemplate: { + hydratedContentText: content, + hydratedButtons: [{ + urlButton: { + displayText: distek, + url: link + } + }, { + callButton: { + displayText: discall, + phoneNumber: number + } + }, + { + quickReplyButton: { + displayText:retek, + id: id + } + } + ] + } + } + }), { userJid: conn.user.jid, quoted: quoted}); + return await conn.relayMessage( + jid, + template.message, + { messageId: template.key.id } + ) + } + conn.sendButtonLoc= async (jid, buffer, content, footer, button1, row1, quoted, options = {}) => { + let buttons = [{buttonId: row1, buttonText: {displayText: button1}, type: 1}] + let buttonMessage = { + location: { jpegThumbnail: buffer }, + caption: content, + footer: footer, + buttons: buttons, + headerType: 6 +} + return await conn.sendMessage(jid, buttonMessage, { + quoted, + upload: conn.waUploadToServer, + ...options + }) + } + conn.send2ButtonLoc= async (jid, buffer, content, footer, button1, row1, button2, row2, quoted, options = {}) => { + let buttons = [{buttonId: row1, buttonText: {displayText: button1}, type: 1}, + { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }] + let buttonMessage = { + location: { jpegThumbnail: buffer }, + caption: content, + footer: footer, + buttons: buttons, + headerType: 6 +} + return await conn.sendMessage(jid, buttonMessage, { + quoted, + upload: conn.waUploadToServer, + ...options + }) + } + conn.send3ButtonLoc= async (jid, buffer, content, footer, button1, row1, button2, row2, quoted, options = {}) => { + let buttons = [{buttonId: row1, buttonText: {displayText: button1}, type: 1}, + { buttonId: row2, buttonText: { displayText: button2 }, type: 1 }, + { buttonId: row3, buttonText: { displayText: button3 }, type: 1 } + ] + let buttonMessage = { + location: { jpegThumbnail: buffer }, + caption: content, + footer: footer, + buttons: buttons, + headerType: 6 +} + return await conn.sendMessage(jid, buttonMessage, { + quoted, + upload: conn.waUploadToServer, + ...options + }) + } + /** + * send Button Vid + * @param {String} jid + * @param {String} contentText + * @param {String} footer + * @param {Buffer|String} buffer + * @param {String} buttons1 + * @param {String} row1 + * @param {Object} quoted + * @param {Object} options + */ + conn.sendButtonVid = async (jid, buffer, contentText, footerText, button1, id1, quoted, options) => { + let type = await conn.getFile(buffer) + let { res, data: file } = type + if (res && res.status !== 200 || file.length <= 65536) { + try { throw { json: JSON.parse(file.toString()) } } + catch (e) { if (e.json) throw e.json } + } + let buttons = [ + { buttonId: id1, buttonText: { displayText: button1 }, type: 1 } + ] + const buttonMessage = { + video: file, + fileLength: 887890909999999, + caption: contentText, + footer: footerText, + mentions: await conn.parseMention(contentText), + ...options, + buttons: buttons, + headerType: 4 + } + return await conn.sendMessage(jid, buttonMessage, { + quoted, + ephemeralExpiration: 86400, + ...options + }) + } + /** + * cMod + * @param {String} jid + * @param {*} message + * @param {String} text + * @param {String} sender + * @param {*} options + * @returns + */ + + conn.cMod = async (jid, message, text = '', sender = conn.user.jid, options = {}) => { + if (options.mentions && !Array.isArray(options.mentions)) options.mentions = [options.mentions] + let copy = message.toJSON() + delete copy.message.messageContextInfo + delete copy.message.senderKeyDistributionMessage + let mtype = Object.keys(copy.message)[0] + let msg = copy.message + let content = msg[mtype] + if (typeof content === 'string') msg[mtype] = text || content + else if (content.caption) content.caption = text || content.caption + else if (content.text) content.text = text || content.text + if (typeof content !== 'string') { + msg[mtype] = { ...content, ...options } + msg[mtype].contextInfo = { + ...(content.contextInfo || {}), + mentionedJid: options.mentions || content.contextInfo?.mentionedJid || [] + } + } + if (copy.participant) sender = copy.participant = sender || copy.participant + else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant + if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid + else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid + copy.key.remoteJid = jid + copy.key.fromMe = areJidsSameUser(sender, conn.user.id) || false + return proto.WebMessageInfo.fromObject(copy) + } + + /** + * cMods + * @param {String} jid + * @param {proto.WebMessageInfo} message + * @param {String} text + * @param {String} sender + * @param {*} options + * @returns + */ + conn.cMods = (jid, message, text = '', sender = conn.user.jid, options = {}) => { + let copy = message.toJSON() + let mtype = Object.keys(copy.message)[0] + let isEphemeral = false // mtype === 'ephemeralMessage' + if (isEphemeral) { + mtype = Object.keys(copy.message.ephemeralMessage.message)[0] + } + let msg = isEphemeral ? copy.message.ephemeralMessage.message : copy.message + let content = msg[mtype] + if (typeof content === 'string') msg[mtype] = text || content + else if (content.caption) content.caption = text || content.caption + else if (content.text) content.text = text || content.text + if (typeof content !== 'string') msg[mtype] = { ...content, ...options } + if (copy.participant) sender = copy.participant = sender || copy.participant + else if (copy.key.participant) sender = copy.key.participant = sender || copy.key.participant + if (copy.key.remoteJid.includes('@s.whatsapp.net')) sender = sender || copy.key.remoteJid + else if (copy.key.remoteJid.includes('@broadcast')) sender = sender || copy.key.remoteJid + copy.key.remoteJid = jid + copy.key.fromMe = areJidsSameUser(sender, conn.user.id) || false + return proto.WebMessageInfo.fromObject(copy) + } + + + + /** + * Exact Copy Forward + * @param {String} jid + * @param {proto.WebMessageInfo} message + * @param {Boolean|Number} forwardingScore + * @param {Object} options + */ + conn.copyNForward = async (jid, message, forwardingScore = true, options = {}) => { + let m = generateForwardMessageContent(message, !!forwardingScore) + let mtype = Object.keys(m)[0] + if (forwardingScore && typeof forwardingScore == 'number' && forwardingScore > 1) m[mtype].contextInfo.forwardingScore += forwardingScore + m = generateWAMessageFromContent(jid, m, { ...options, userJid: conn.user.id }) + await conn.relayMessage(jid, m.message, { messageId: m.key.id, additionalAttributes: { ...options } }) + return m + } + + /** + * Fake Replies + * @param {String} jid + * @param {String|Object} text + * @param {String} fakeJid + * @param {String} fakeText + * @param {String} fakeGroupJid + * @param {String} options + */ + conn.fakeReply = async (jid, text = '', fakeJid = this.user.jid, fakeText = '', fakeGroupJid, options) => { + return conn.reply(jid, text, { key: { fromMe: areJidsSameUser(fakeJid, conn.user.id), participant: fakeJid, ...(fakeGroupJid ? { remoteJid: fakeGroupJid } : {}) }, message: { conversation: fakeText }, ...options }) + } + + conn.loadMessage = conn.loadMessage || (async (messageID) => { + return Object.entries(conn.chats) + .filter(([_, { messages }]) => typeof messages === 'object') + .find(([_, { messages }]) => Object.entries(messages) + .find(([k, v]) => (k === messageID || v.key?.id === messageID))) + ?.[1].messages?.[messageID] + }) + + /** + * Download media message + * @param {Object} m + * @param {String} type + * @param {fs.PathLike|fs.promises.FileHandle} filename + * @returns {Promise} + */ + conn.downloadM = async (m, type, saveToFile) => { + if (!m || !(m.url || m.directPath)) return Buffer.alloc(0) + const stream = await downloadContentFromMessage(m, type) + let buffer = Buffer.from([]) + for await (const chunk of stream) { + buffer = Buffer.concat([buffer, chunk]) + } + if (saveToFile) var { filename } = await conn.getFile(buffer, true) + return saveToFile && fs.existsSync(filename) ? filename : buffer + } + + + conn.downloadAndSaveMediaMessage = async (message, filename, attachExtension = true) => { + let quoted = message.msg ? message.msg : message + let mime = (message.msg || message).mimetype || '' + let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0] + const stream = await downloadContentFromMessage(quoted, messageType) + let buffer = Buffer.from([]) + for await(const chunk of stream) { + buffer = Buffer.concat([buffer, chunk]) + } + let type = await FileType.fromBuffer(buffer) + trueFileName = attachExtension ? (filename + '.' + type.ext) : filename + // save to file + await fs.writeFileSync(trueFileName, buffer) + return trueFileName + } + + + /** + * parseMention(s) + * @param {string} text + * @returns {string[]} + */ + conn.parseMention = (text = '') => { + return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') + } + /** + * Read message + * @param {String} jid + * @param {String|undefined|null} participant + * @param {String} messageID + */ + conn.chatRead = async (jid, participant = conn.user.jid, messageID) => { + return await conn.sendReadReceipt(jid, participant, [messageID]) + } + + /** + * Parses string into mentionedJid(s) + * @param {String} text + */ + conn.parseMention = (text = '') => { + return [...text.matchAll(/@([0-9]{5,16}|0)/g)].map(v => v[1] + '@s.whatsapp.net') + } + + conn.sendTextWithMentions = async (jid, text, quoted, options = {}) => conn.sendMessage(jid, { text: text, contextInfo: { mentionedJid: [...text.matchAll(/@(\d{0,16})/g)].map(v => v[1] + '@s.whatsapp.net') }, ...options }, { quoted }) + + /** + * Get name from jid + * @param {String} jid + * @param {Boolean} withoutContact + */ + conn.getName = (jid = '', withoutContact = false) => { + jid = conn.decodeJid(jid) + withoutContact = this.withoutContact || withoutContact + let v + if (jid.endsWith('@g.us')) return new Promise(async (resolve) => { + v = conn.chats[jid] || {} + if (!(v.name || v.subject)) v = await conn.groupMetadata(jid) || {} + resolve(v.name || v.subject || PhoneNumber('+' + jid.replace('@s.whatsapp.net', '')).getNumber('international')) + }) + else v = jid === '0@s.whatsapp.net' ? { + jid, + vname: 'WhatsApp' + } : areJidsSameUser(jid, conn.user.id) ? + conn.user : + (conn.chats[jid] || {}) + return (withoutContact ? '' : v.name) || v.subject || v.vname || v.notify || v.verifiedName || PhoneNumber('+' + jid.replace('@s.whatsapp.net', '')).getNumber('international') + } + + /** + * to process MessageStubType + * @param {proto.WebMessageInfo} m + */ + conn.processMessageStubType = async(m) => { + /** + * to process MessageStubType + * @param {import('@adiwajshing/baileys').proto.WebMessageInfo} m + */ + if (!m.messageStubType) return + const chat = conn.decodeJid(m.key.remoteJid || m.message?.senderKeyDistributionMessage?.groupId || '') + if (!chat || chat === 'status@broadcast') return + const emitGroupUpdate = (update) => { + conn.ev.emit('groups.update', [{ id: chat, ...update }]) + } + switch (m.messageStubType) { + case WAMessageStubType.REVOKE: + case WAMessageStubType.GROUP_CHANGE_INVITE_LINK: + emitGroupUpdate({ revoke: m.messageStubParameters[0] }) + break + case WAMessageStubType.GROUP_CHANGE_ICON: + emitGroupUpdate({ icon: m.messageStubParameters[0] }) + break + default: { + console.log({ + messageStubType: m.messageStubType, + messageStubParameters: m.messageStubParameters, + type: WAMessageStubType[m.messageStubType] + }) + break + } + } + const isGroup = chat.endsWith('@g.us') + if (!isGroup) return + let chats = conn.chats[chat] + if (!chats) chats = conn.chats[chat] = { id: chat } + chats.isChats = true + const metadata = await conn.groupMetadata(chat).catch(_ => null) + if (!metadata) return + chats.subject = metadata.subject + chats.metadata = metadata + } + conn.insertAllGroup = async() => { + const groups = await conn.groupFetchAllParticipating().catch(_ => null) || {} + for (const group in groups) conn.chats[group] = { ...(conn.chats[group] || {}), id: group, subject: groups[group].subject, isChats: true, metadata: groups[group] } + return conn.chats + } + + /*conn.processMessageStubType = async (m) => { + if (!m.messageStubType) return + const mtype = Object.keys(m.message || {})[0] + const chat = conn.decodeJid(m.key.remoteJid || m.message[mtype] && m.message[mtype].groupId || '') + const isGroup = chat.endsWith('@g.us') + if (!isGroup) return + let chats = conn.chats[chat] + if (!chats) chats = conn.chats[chat] = { id: chat } + chats.isChats = true + const metadata = await conn.groupMetadata(chat).catch(_ => null) + if (!metadata) return + chats.subject = metadata.subject + chats.metadata = metadata + }*/ + + /** + * pushMessage + * @param {proto.WebMessageInfo[]} m + */ + conn.pushMessage = async(m) => { + /** + * pushMessage + * @param {import('@adiwajshing/baileys').proto.WebMessageInfo[]} m + */ + if (!m) return + if (!Array.isArray(m)) m = [m] + for (const message of m) { + try { + // if (!(message instanceof proto.WebMessageInfo)) continue // https://github.com/adiwajshing/Baileys/pull/696/commits/6a2cb5a4139d8eb0a75c4c4ea7ed52adc0aec20f + if (!message) continue + if (message.messageStubType && message.messageStubType != WAMessageStubType.CIPHERTEXT) conn.processMessageStubType(message).catch(console.error) + const _mtype = Object.keys(message.message || {}) + const mtype = (!['senderKeyDistributionMessage', 'messageContextInfo'].includes(_mtype[0]) && _mtype[0]) || + (_mtype.length >= 3 && _mtype[1] !== 'messageContextInfo' && _mtype[1]) || + _mtype[_mtype.length - 1] + const chat = conn.decodeJid(message.key.remoteJid || message.message?.senderKeyDistributionMessage?.groupId || '') + if (message.message?.[mtype]?.contextInfo?.quotedMessage) { + /** + * @type {import('@adiwajshing/baileys').proto.IContextInfo} + */ + let context = message.message[mtype].contextInfo + let participant = conn.decodeJid(context.participant) + const remoteJid = conn.decodeJid(context.remoteJid || participant) + /** + * @type {import('@adiwajshing/baileys').proto.IMessage} + * + */ + let quoted = message.message[mtype].contextInfo.quotedMessage + if ((remoteJid && remoteJid !== 'status@broadcast') && quoted) { + let qMtype = Object.keys(quoted)[0] + if (qMtype == 'conversation') { + quoted.extendedTextMessage = { text: quoted[qMtype] } + delete quoted.conversation + qMtype = 'extendedTextMessage' + } + + if (!quoted[qMtype].contextInfo) quoted[qMtype].contextInfo = {} + quoted[qMtype].contextInfo.mentionedJid = context.mentionedJid || quoted[qMtype].contextInfo.mentionedJid || [] + const isGroup = remoteJid.endsWith('g.us') + if (isGroup && !participant) participant = remoteJid + const qM = { + key: { + remoteJid, + fromMe: areJidsSameUser(conn.user.jid, remoteJid), + id: context.stanzaId, + participant, + }, + message: JSON.parse(JSON.stringify(quoted)), + ...(isGroup ? { participant } : {}) + } + let qChats = conn.chats[participant] + if (!qChats) qChats = conn.chats[participant] = { id: participant, isChats: !isGroup } + if (!qChats.messages) qChats.messages = {} + if (!qChats.messages[context.stanzaId] && !qM.key.fromMe) qChats.messages[context.stanzaId] = qM + let qChatsMessages + if ((qChatsMessages = Object.entries(qChats.messages)).length > 40) qChats.messages = Object.fromEntries(qChatsMessages.slice(30, qChatsMessages.length)) // maybe avoid memory leak + } + } + if (!chat || chat === 'status@broadcast') continue + const isGroup = chat.endsWith('@g.us') + let chats = conn.chats[chat] + if (!chats) { + if (isGroup) await conn.insertAllGroup().catch(console.error) + chats = conn.chats[chat] = { id: chat, isChats: true, ...(conn.chats[chat] || {}) } + } + let metadata, sender + if (isGroup) { + if (!chats.subject || !chats.metadata) { + metadata = await conn.groupMetadata(chat).catch(_ => ({})) || {} + if (!chats.subject) chats.subject = metadata.subject || '' + if (!chats.metadata) chats.metadata = metadata + } + sender = conn.decodeJid(message.key?.fromMe && conn.user.id || message.participant || message.key?.participant || chat || '') + if (sender !== chat) { + let chats = conn.chats[sender] + if (!chats) chats = conn.chats[sender] = { id: sender } + if (!chats.name) chats.name = message.pushName || chats.name || '' + } + } else if (!chats.name) chats.name = message.pushName || chats.name || '' + if (['senderKeyDistributionMessage', 'messageContextInfo'].includes(mtype)) continue + chats.isChats = true + if (!chats.messages) chats.messages = {} + const fromMe = message.key.fromMe || areJidsSameUser(sender || chat, conn.user.id) + if (!['protocolMessage'].includes(mtype) && !fromMe && message.messageStubType != WAMessageStubType.CIPHERTEXT && message.message) { + delete message.message.messageContextInfo + delete message.message.senderKeyDistributionMessage + chats.messages[message.key.id] = JSON.parse(JSON.stringify(message, null, 2)) + let chatsMessages + if ((chatsMessages = Object.entries(chats.messages)).length > 40) chats.messages = Object.fromEntries(chatsMessages.slice(30, chatsMessages.length)) + } + } catch (e) { + console.error(e) + } + } + } + + /*conn.pushMessage = async (m) => { + if (!m) return + if (!Array.isArray(m)) m = [m] + for (const message of m) { + try { + // if (!(message instanceof proto.WebMessageInfo)) continue // https://github.com/adiwajshing/Baileys/pull/696/commits/6a2cb5a4139d8eb0a75c4c4ea7ed52adc0aec20f + if (!message) continue + if (message.messageStubType) conn.processMessageStubType(message).catch(console.error) + let mtype = Object.keys(message.message || {}) + mtype = mtype[mtype[0] === 'messageContextInfo' && mtype.length == 2 ? 1 : 0] + const chat = conn.decodeJid(message.key.remoteJid || message.message[mtype] && message.message[mtype].groupId || '') + const isGroup = chat.endsWith('@g.us') + let chats = conn.chats[chat] + if (!chats) { + if (isGroup) { + const groups = await conn.groupFetchAllParticipating().catch(_ => ({})) + for (const group in groups) conn.chats[group] = { id: group, subject: groups[group].subject, isChats: true, metadata: groups[group] } + } + chats = conn.chats[chat] = { id: chat, ...(conn.chats[chat] || {}) } + } + let metadata, sender + if (isGroup) { + if (!chats.subject || !chats.metadata) { + metadata = await conn.groupMetadata(chat).catch(_ => ({})) || {} + if (!chats.subject) chats.subject = metadata.subject || '' + if (!chats.metadata) chats.metadata = metadata + } + sender = conn.decodeJid(message.fromMe && conn.user.id || message.participant || message.key.participant || chat || '') + if (sender !== chat) { + let chats = conn.chats[sender] + if (!chats) chats = conn.chats[sender] = { id: sender } + if (!chats.name) chats.name = message.pushName || chats.name || '' + } + } else { + if (!chats.name) chats.name = message.pushName || chats.name || '' + } + if (['senderKeyDistributionMessage', 'protocolMessage'].includes(mtype)) continue + chats.isChats = true + const fromMe = message.key.fromMe || areJidsSameUser(chat, conn.user.id) + if (!chats.messages) chats.messages = {} + if (!fromMe) chats.messages[message.key.id] = JSON.parse(JSON.stringify(message, null, 2)) + } catch (e) { + console.error(e) + } + } + }*/ + + /** + * + * @param {...any} args + * @returns + */ + conn.format = (...args) => { + return util.format(...args) + } + + /** + * + * @param {String} url + * @param {Object} options + * @returns + */ + conn.getBuffer = async (url, options) => { + try { + options ? options : {} + const res = await axios({ + method: "get", + url, + headers: { + 'DNT': 1, + 'Upgrade-Insecure-Request': 1 + }, + ...options, + responseType: 'arraybuffer' + }) + return res.data + } catch (e) { + console.log(`Error : ${e}`) + } + } + + /** + * Serialize Message, so it easier to manipulate + * @param {Object} m + */ + conn.serializeM = (m) => { + return exports.smsg(conn, m) + } + + Object.defineProperty(conn, 'name', { + value: 'WASocket', + configurable: true, + }) + return conn +} +/** + * Serialize Message + * @param {ReturnType} conn + * @param {proto.WebMessageInfo} m + * @param {Boolean} hasParent + */ + exports.smsg = (conn, m, hasParent) => { + if (!m) return m + let M = proto.WebMessageInfo + m = M.fromObject(m) + if (m.key) { + m.id = m.key.id + m.isBaileys = m.id && m.id.length === 22 || m.id.startsWith('3EB0') && m.id.length === 22 || false + m.chat = conn.decodeJid(m.key.remoteJid || message.message?.senderKeyDistributionMessage?.groupId || '') + m.isGroup = m.chat.endsWith('@g.us') + m.sender = conn.decodeJid(m.key.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '') + m.fromMe = m.key.fromMe || areJidsSameUser(m.sender, conn.user.id) + } + if (m.message) { + let mtype = Object.keys(m.message) + m.mtype = (!['senderKeyDistributionMessage', 'messageContextInfo'].includes(mtype[0]) && mtype[0]) || // Sometimes message in the front + (mtype.length >= 3 && mtype[1] !== 'messageContextInfo' && mtype[1]) || // Sometimes message in midle if mtype length is greater than or equal to 3! + mtype[mtype.length - 1] // common case + m.msg = m.message[m.mtype] + if (m.chat == 'status@broadcast' && ['protocolMessage', 'senderKeyDistributionMessage'].includes(m.mtype)) m.chat = (m.key.remoteJid !== 'status@broadcast' && m.key.remoteJid) || m.sender + if (m.mtype == 'protocolMessage' && m.msg.key) { + if (m.msg.key.remoteJid == 'status@broadcast') m.msg.key.remoteJid = m.chat + if (!m.msg.key.participant || m.msg.key.participant == 'status_me') m.msg.key.participant = m.sender + m.msg.key.fromMe = conn.decodeJid(m.msg.key.participant) === conn.decodeJid(conn.user.id) + if (!m.msg.key.fromMe && m.msg.key.remoteJid === conn.decodeJid(conn.user.id)) m.msg.key.remoteJid = m.sender + } + m.text = m.msg.text || m.msg.caption || m.msg.contentText || m.msg || '' + if (typeof m.text !== 'string') { + if ([ + 'protocolMessage', + 'messageContextInfo', + 'stickerMessage', + 'audioMessage', + 'senderKeyDistributionMessage' + ].includes(m.mtype)) m.text = '' + else m.text = m.text.selectedDisplayText || m.text.hydratedTemplate?.hydratedContentText || m.text + } + m.mentionedJid = m.msg?.contextInfo?.mentionedJid?.length && m.msg.contextInfo.mentionedJid || [] + let quoted = m.quoted = m.msg?.contextInfo?.quotedMessage ? m.msg.contextInfo.quotedMessage : null + if (m.quoted) { + let type = Object.keys(m.quoted)[0] + m.quoted = m.quoted[type] + if (typeof m.quoted === 'string') m.quoted = { text: m.quoted } + m.quoted.mtype = type + m.quoted.id = m.msg.contextInfo.stanzaId + m.quoted.chat = conn.decodeJid(m.msg.contextInfo.remoteJid || m.chat || m.sender) + m.quoted.isBaileys = m.quoted.id && m.quoted.id.length === 22 || false + m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant) + m.quoted.fromMe = m.quoted.sender === conn.user.jid + m.quoted.text = m.quoted.text || m.quoted.caption || m.quoted.contentText || '' + m.quoted.name = conn.getName(m.quoted.sender) + m.quoted.mentionedJid = m.quoted.contextInfo?.mentionedJid?.length && m.quoted.contextInfo.mentionedJid || [] + let vM = m.quoted.fakeObj = M.fromObject({ + key: { + fromMe: m.quoted.fromMe, + remoteJid: m.quoted.chat, + id: m.quoted.id + }, + message: quoted, + ...(m.isGroup ? { participant: m.quoted.sender } : {}) + }) + m.getQuotedObj = m.getQuotedMessage = async () => { + if (!m.quoted.id) return null + let q = M.fromObject(await conn.loadMessage(m.quoted.id) || vM) + return exports.smsg(conn, q) + } + if (m.quoted.url || m.quoted.directPath) m.quoted.download = (saveToFile = false) => conn.downloadM(m.quoted, m.quoted.mtype.replace(/message/i, ''), saveToFile) + + +/*exports.smsg = (conn, m, hasParent) => { + if (!m) return m + let M = proto.WebMessageInfo + m = M.fromObject(m) + if (m.key) { + m.id = m.key.id + m.isBaileys = m.id && m.id.length === 16 || m.id.startsWith('3EB0') && m.id.length === 12 || false + let mtype = Object.keys(m.message || {})[0] + m.chat = conn.decodeJid(m.key.remoteJid || m.message[mtype] && m.message[mtype].groupId || '') + m.isGroup = m.chat.endsWith('@g.us') + m.sender = conn.decodeJid(m.fromMe && conn.user.id || m.participant || m.key.participant || m.chat || '') + m.fromMe = m.key.fromMe || areJidsSameUser(m.sender, conn.user.id) + } + if (m.message) { + let mtype = Object.keys(m.message) + m.mtype = mtype[mtype[0] === 'messageContextInfo' && mtype.length == 2 ? 1 : 0] + m.msg = m.message[m.mtype] + if (m.chat == 'status@broadcast' && ['protocolMessage', 'senderKeyDistributionMessage'].includes(m.mtype)) m.chat = m.sender + // if (m.mtype === 'ephemeralMessage') { + // exports.smsg(conn, m.msg) + // m.mtype = m.msg.mtype + // m.msg = m.msg.msg + // } + if (m.mtype == 'protocolMessage' && m.msg.key) { + if (m.msg.key.remoteJid == 'status@broadcast') m.msg.key.remoteJid = m.chat + if (!m.msg.key.participant || m.msg.key.participant == 'status_me') m.msg.key.participant = m.sender + m.msg.key.fromMe = conn.decodeJid(m.msg.key.participant) === conn.decodeJid(conn.user.id) + if (!m.msg.key.fromMe && m.msg.key.remoteJid === conn.decodeJid(conn.user.id)) m.msg.key.remoteJid = m.sender + } + m.text = m.msg.text || m.msg.caption || m.msg.contentText || m.msg || '' + m.mentionedJid = m.msg && m.msg.contextInfo && m.msg.contextInfo.mentionedJid && m.msg.contextInfo.mentionedJid.length && m.msg.contextInfo.mentionedJid || [] + let quoted = m.quoted = m.msg && m.msg.contextInfo && m.msg.contextInfo.quotedMessage ? m.msg.contextInfo.quotedMessage : null + if (m.quoted) { + let type = Object.keys(m.quoted)[0] + m.quoted = m.quoted[type] + if (typeof m.quoted === 'string') m.quoted = { text: m.quoted } + m.quoted.mtype = type + m.quoted.id = m.msg.contextInfo.stanzaId + m.quoted.chat = conn.decodeJid(m.msg.contextInfo.remoteJid || m.chat || m.sender) + m.quoted.isBaileys = m.quoted.id && m.quoted.id.length === 16 || false + m.quoted.sender = conn.decodeJid(m.msg.contextInfo.participant) + m.quoted.fromMe = m.quoted.sender === conn.user.jid + m.quoted.text = m.quoted.text || m.quoted.caption || '' + m.quoted.name = conn.getName(m.quoted.sender) + m.quoted.mentionedJid = m.quoted.contextInfo && m.quoted.contextInfo.mentionedJid && m.quoted.contextInfo.mentionedJid.length && m.quoted.contextInfo.mentionedJid || [] + let vM = m.quoted.fakeObj = M.fromObject({ + key: { + fromMe: m.quoted.fromMe, + remoteJid: m.quoted.chat, + id: m.quoted.id + }, + message: quoted, + ...(m.isGroup ? { participant: m.quoted.sender } : {}) + }) + m.getQuotedObj = m.getQuotedMessage = () => { + if (!m.quoted.id) return false + let q = M.fromObject(((conn.chats[m.quoted.chat] || {}).messages || {})[m.quoted.id]) + return exports.smsg(conn, q ? q : vM) + } + + if (m.quoted.url || m.quoted.directPath) m.quoted.download = (saveToFile = false) => conn.downloadM(m.quoted, m.quoted.mtype.replace(/message/i, ''), saveToFile)*/ + + /** + * Reply to quoted message + * @param {String|Object} text + * @param {String|false} chatId + * @param {Object} options + */ + m.quoted.reply = (text, chatId, options) => conn.reply(chatId ? chatId : m.chat, text, vM, options) + + /** + * Copy quoted message + */ + m.quoted.copy = () => exports.smsg(conn, M.fromObject(M.toObject(vM))) + + /** + * Forward quoted message + * @param {String} jid + * @param {Boolean} forceForward + */ + m.quoted.forward = (jid, forceForward = false) => conn.forwardMessage(jid, vM, forceForward) + + /** + * Exact Forward quoted message + * @param {String} jid + * @param {Boolean|Number} forceForward + * @param {Object} options + */ + m.quoted.copyNForward = (jid, forceForward = true, options = {}) => conn.copyNForward(jid, vM, forceForward, options) + + /** + * Modify quoted Message + * @param {String} jid + * @param {String} text + * @param {String} sender + * @param {Object} options + */ + m.quoted.cMod = (jid, text = '', sender = m.quoted.sender, options = {}) => conn.cMod(jid, vM, text, sender, options) + + /** + * Delete quoted message + */ + m.quoted.delete = () => conn.sendMessage(m.quoted.chat, { delete: vM.key }) + } + } + m.name = m.pushName || conn.getName(m.sender) + if (m.msg && m.msg.url) m.download = (saveToFile = false) => conn.downloadM(m.msg, m.mtype.replace(/message/i, ''), saveToFile) + /** + * Reply to this message + * @param {String|Object} text + * @param {String|false} chatId + * @param {Object} options + */ + m.reply = (text, chatId, options) => conn.reply(chatId ? chatId : m.chat, text, m, options) + + /** + * Copy this message + */ + m.copy = () => exports.smsg(conn, M.fromObject(M.toObject(m))) + + /** + * Forward this message + * @param {String} jid + * @param {Boolean} forceForward + */ + m.forward = (jid = m.chat, forceForward = false) => conn.copyNForward(jid, m, forceForward, options) + + /** + * Exact Forward this message + * @param {String} jid + * @param {Boolean} forceForward + * @param {Object} options + */ + m.copyNForward = (jid = m.chat, forceForward = true, options = {}) => conn.copyNForward(jid, m, forceForward, options) + + /** + * Modify this Message + * @param {String} jid + * @param {String} text + * @param {String} sender + * @param {Object} options + */ + m.cMod = (jid, text = '', sender = m.sender, options = {}) => conn.cMod(jid, m, text, sender, options) + + /** + * Delete this message + */ + m.delete = () => conn.sendMessage(m.chat, { delete: m.key }) + + try { + if (m.msg && m.mtype == 'protocolMessage') conn.ev.emit('message.delete', m.msg.key) + } catch (e) { + console.error(e) + } + return m +} + +exports.logic = (check, inp, out) => { + if (inp.length !== out.length) throw new Error('Input and Output must have same length') + for (let i in inp) if (util.isDeepStrictEqual(check, inp[i])) return out[i] + return null +} + +exports.protoType = () => { + Buffer.prototype.toArrayBuffer = function toArrayBufferV2() { + const ab = new ArrayBuffer(this.length); + const view = new Uint8Array(ab); + for (let i = 0; i < this.length; ++i) { + view[i] = this[i]; + } + return ab; + } + /** + * @returns {ArrayBuffer} + */ + Buffer.prototype.toArrayBufferV2 = function toArrayBuffer() { + return this.buffer.slice(this.byteOffset, this.byteOffset + this.byteLength) + } + /** + * @returns {Buffer} + */ + ArrayBuffer.prototype.toBuffer = function toBuffer() { + return Buffer.from(new Uint8Array(this)) + } + // /** + // * @returns {String} + // */ + // Buffer.prototype.toUtilFormat = ArrayBuffer.prototype.toUtilFormat = Object.prototype.toUtilFormat = Array.prototype.toUtilFormat = function toUtilFormat() { + // return util.format(this) + // } + Uint8Array.prototype.getFileType = ArrayBuffer.prototype.getFileType = Buffer.prototype.getFileType = async function getFileType() { + return await fileTypeFromBuffer(this) + } + /** + * @returns {Boolean} + */ + String.prototype.isNumber = Number.prototype.isNumber = isNumber + /** + * + * @returns {String} + */ + String.prototype.capitalize = function capitalize() { + return this.charAt(0).toUpperCase() + this.slice(1, this.length) + } + /** + * @returns {String} + */ + String.prototype.capitalizeV2 = function capitalizeV2() { + const str = this.split(' ') + return str.map(v => v.capitalize()).join(' ') + } + String.prototype.decodeJid = function decodeJid() { + if (/:\d+@/gi.test(this)) { + const decode = jidDecode(this) || {} + return (decode.user && decode.server && decode.user + '@' + decode.server || this).trim() + } else return this.trim() + } + /** + * number must be milliseconds + * @returns {string} + */ + Number.prototype.toTimeString = function toTimeString() { + // const milliseconds = this % 1000 + const seconds = Math.floor((this / 1000) % 60) + const minutes = Math.floor((this / (60 * 1000)) % 60) + const hours = Math.floor((this / (60 * 60 * 1000)) % 24) + const days = Math.floor((this / (24 * 60 * 60 * 1000))) + return ( + (days ? `${days} day(s) ` : '') + + (hours ? `${hours} hour(s) ` : '') + + (minutes ? `${minutes} minute(s) ` : '') + + (seconds ? `${seconds} second(s)` : '') + ).trim() + } + Number.prototype.getRandom = String.prototype.getRandom = Array.prototype.getRandom = getRandom +} + +function isNumber() { + const int = parseInt(this) + return typeof int === 'number' && !isNaN(int) +} + +function getRandom() { + if (Array.isArray(this) || this instanceof String) return this[Math.floor(Math.random() * this.length)] + return Math.floor(Math.random() * this) +} + +function rand(isi) { + return isi[Math.floor(Math.random() * isi.length)] +} diff --git a/lib/sticker.js b/lib/sticker.js new file mode 100644 index 0000000000000000000000000000000000000000..3fdd324f937ab22645e70cf975736baf8577ee52 --- /dev/null +++ b/lib/sticker.js @@ -0,0 +1,209 @@ +const fs = require('fs') +const path = require('path') +const crypto = require('crypto') +const fetch = require('node-fetch') +const { ffmpeg } = require('./converter') +const { spawn } = require('child_process') +const uploadFile = require('./uploadFile') +const { fromBuffer } = require('file-type') +const uploadImage = require('./uploadImage') + +const tmp = path.join(__dirname, '../tmp') +/** + * Image to Sticker + * @param {Buffer} img Image Buffer + * @param {String} url Image URL + */ +function sticker2(img, url) { + return new Promise(async (resolve, reject) => { + try { + if (url) { + let res = await fetch(url) + if (res.status !== 200) throw await res.text() + img = await res.buffer() + } + let inp = path.join(tmp, +new Date + '.jpeg') + await fs.promises.writeFile(inp, img) + let ff = spawn('ffmpeg', [ + '-y', + '-i', inp, + '-vf', 'scale=512:512:flags=lanczos:force_original_aspect_ratio=decrease,format=rgba,pad=512:512:(ow-iw)/2:(oh-ih)/2:color=#00000000,setsar=1', + '-f', 'png', + '-' + ]) + ff.on('error', reject) + ff.on('close', async () => { + await fs.promises.unlink(inp) + }) + let bufs = [] + const [_spawnprocess, ..._spawnargs] = [...(module.exports.support.gm ? ['gm'] : module.exports.magick ? ['magick'] : []), 'convert', 'png:-', 'webp:-'] + let im = spawn(_spawnprocess, _spawnargs) + im.on('error', e => conn.reply(m.chat, util.format(e), m)) + im.stdout.on('data', chunk => bufs.push(chunk)) + ff.stdout.pipe(im.stdin) + im.on('exit', () => { + resolve(Buffer.concat(bufs)) + }) + } catch (e) { + reject(e) + } + }) +} + +async function canvas(code, type = 'png', quality = 0.92) { + let res = await fetch('https://nurutomo.herokuapp.com/api/canvas?' + queryURL({ + type, + quality + }), { + method: 'POST', + headers: { + 'Content-Type': 'text/plain', + 'Content-Length': code.length + }, + body: code + }) + let image = await res.buffer() + return image +} + +function queryURL(queries) { + return new URLSearchParams(Object.entries(queries)) +} + +/** + * Image to Sticker + * @param {Buffer} img Image Buffer + * @param {String} url Image URL + */ +async function sticker1(img, url) { + url = url ? url : await uploadImage(img) + let { + mime + } = url ? { mime: 'image/jpeg' } : await fromBuffer(img) + let sc = `let im = await loadImg('data:${mime};base64,'+(await window.loadToDataURI('${url}'))) +c.width = c.height = 512 +let max = Math.max(im.width, im.height) +let w = 512 * im.width / max +let h = 512 * im.height / max +ctx.drawImage(im, 256 - w / 2, 256 - h / 2, w, h) +` + return await canvas(sc, 'webp') +} + +/** + * Image/Video to Sticker + * @param {Buffer} img Image/Video Buffer + * @param {String} url Image/Video URL + * @param {String} packname EXIF Packname + * @param {String} author EXIF Author + */ +async function sticker3(img, url, packname, author) { + url = url ? url : await uploadFile(img) + let res = await fetch('https://api.xteam.xyz/sticker/wm?' + new URLSearchParams(Object.entries({ + url, + packname, + author + }))) + return await res.buffer() +} + +/** + * Image to Sticker + * @param {Buffer} img Image/Video Buffer + * @param {String} url Image/Video URL + */ +async function sticker4(img, url) { + if (url) { + let res = await fetch(url) + if (res.status !== 200) throw await res.text() + img = await res.buffer() + } + return await ffmpeg(img, [ + '-vf', 'scale=512:512:flags=lanczos:force_original_aspect_ratio=decrease,format=rgba,pad=512:512:(ow-iw)/2:(oh-ih)/2:color=#00000000,setsar=1' + ], 'jpeg', 'webp') +} + + +async function sticker5(img, url, packname, author, categories = ['']) { + const WSF = require('wa-sticker-formatter') + const stickerMetadata = { + type: 'full', + pack: packname, + author, + categories, + } + return await new WSF.Sticker(img ? img : url, stickerMetadata).build() +} + + +/** + * Add WhatsApp JSON Exif Metadata + * Taken from https://github.com/pedroslopez/whatsapp-web.js/pull/527/files + * @param {Buffer} webpSticker + * @param {String} packname + * @param {String} author + * @param {String} categories + * @param {Object} extra + * @returns + */ +async function addExif(webpSticker, packname, author, categories = [''], extra = {}) { + const webp = require('node-webpmux') // Optional Feature + const img = new webp.Image(); + const stickerPackId = crypto.randomBytes(32).toString('hex'); + const json = { 'sticker-pack-id': stickerPackId, 'sticker-pack-name': packname, 'sticker-pack-publisher': author, 'emojis': categories, ...extra }; + 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]); + let jsonBuffer = Buffer.from(JSON.stringify(json), 'utf8'); + let exif = Buffer.concat([exifAttr, jsonBuffer]); + exif.writeUIntLE(jsonBuffer.length, 14, 4); + await img.loadBuffer(webpSticker) + img.exif = exif + return await img.saveBuffer() +} + +module.exports = { + /** + * Image/Video to Sticker + * @param {Buffer} img Image/Video Buffer + * @param {String} url Image/Video URL + * @param {...String} + */ + async sticker(img, url, ...args) { + let lastError + for (let func of [ + sticker3, // sticker5, + this.support.ffmpeg && this.support.ffmpegWebp && sticker4, + this.support.ffmpeg && (this.support.convert || this.support.magick || this.support.gm) && sticker2, + sticker1 + ].filter(f => f)) { + try { + let stiker = await func(img, url, ...args) + if (stiker.includes('RIFF')) { + try { + return await addExif(stiker, ...args) + } catch (e) { + return stiker + } + } + throw stiker.toString() + } catch (err) { + lastError = err + } + } + return lastError + }, + sticker1, + sticker2, + sticker3, + sticker4, + sticker5, + addExif, + support: { + ffmpeg: true, + ffprobe: true, + ffmpegWebp: true, + convert: true, + magick: false, + gm: false, + find: false + } +} \ No newline at end of file diff --git a/lib/tictactoe.d.ts b/lib/tictactoe.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..68531871b314b9fec958fb699070acdfd0dac860 --- /dev/null +++ b/lib/tictactoe.d.ts @@ -0,0 +1,15 @@ +export declare class TicTacToe { + /* X PlayerName */ + playerX: string; + /* Y PlayerName */ + playerY: string; + /* X if true, Y if false */ + _currentTurn: boolean; + _x: number; + _y: number; + _turns: number; + constructor(playerX: string, playerY: string); + get board(): number; + turn(player, index: number): boolean; + turn(player, x: number, y: number): boolean; +} diff --git a/lib/tictactoe.js b/lib/tictactoe.js new file mode 100644 index 0000000000000000000000000000000000000000..e904fc59de63152bcb453bfadffd5abeb5cd5189 --- /dev/null +++ b/lib/tictactoe.js @@ -0,0 +1,93 @@ +class TicTacToe { + constructor(playerX = 'x', playerO = 'o') { + this.playerX = playerX + this.playerO = playerO + this._currentTurn = false + this._x = 0 + this._o = 0 + this.turns = 0 + } + + get board() { + return this._x | this._o + } + + get currentTurn() { + return this._currentTurn ? this.playerO : this.playerX + } + + get enemyTurn() { + return this._currentTurn ? this.playerX : this.playerO + } + + static check(state) { + for (let combo of [7, 56, 73, 84, 146, 273, 292, 448]) + if ((state & combo) === combo) + return !0 + return !1 + } + + /** + * ```js + * TicTacToe.toBinary(1, 2) // 0b010000000 + * ``` + */ + static toBinary(x = 0, y = 0) { + if (x < 0 || x > 2 || y < 0 || y > 2) throw new Error('invalid position') + return 1 << x + (3 * y) + } + + /** + * @param player `0` is `X`, `1` is `O` + * + * - `-3` `Game Ended` + * - `-2` `Invalid` + * - `-1` `Invalid Position` + * - ` 0` `Position Occupied` + * - ` 1` `Sucess` + * @returns {-3|-2|-1|0|1} + */ + turn(player = 0, x = 0, y) { + if (this.board === 511) return -3 + let pos = 0 + if (y == null) { + if (x < 0 || x > 8) return -1 + pos = 1 << x + } else { + if (x < 0 || x > 2 || y < 0 || y > 2) return -1 + pos = TicTacToe.toBinary(x, y) + } + if (this._currentTurn ^ player) return -2 + if (this.board & pos) return 0 + this[this._currentTurn ? '_o' : '_x'] |= pos + this._currentTurn = !this._currentTurn + this.turns++ + return 1 + } + + /** + * @returns {('X'|'O'|1|2|3|4|5|6|7|8|9)[]} + */ + static render(boardX = 0, boardO = 0) { + let x = parseInt(boardX.toString(2), 4) + let y = parseInt(boardO.toString(2), 4) * 2 + return [...(x + y).toString(4).padStart(9, '0')].reverse().map((value, index) => value == 1 ? 'X' : value == 2 ? 'O' : ++index) + } + + /** + * @returns {('X'|'O'|1|2|3|4|5|6|7|8|9)[]} + */ + render() { + return TicTacToe.render(this._x, this._o) + } + + get winner() { + let x = TicTacToe.check(this._x) + let o = TicTacToe.check(this._o) + return x ? this.playerX : o ? this.playerO : false + } +} + +new TicTacToe().turn + +module.exports = TicTacToe \ No newline at end of file diff --git a/lib/ular_tangga.js b/lib/ular_tangga.js new file mode 100644 index 0000000000000000000000000000000000000000..c8b7ba0d3a1d2acf60ebab6640d02e71bfbc9794 --- /dev/null +++ b/lib/ular_tangga.js @@ -0,0 +1,50 @@ +const fs = require('fs'); +const Jimp = require('jimp'); + +// Fungsi untuk menggambar papan permainan dengan pemain +async function drawBoard(boardImageURL, user1 = null, user2 = null, user3 = null, user4 = null, stabil_x, stabil_y) { + try { + // Load gambar papan permainan dari URL + const board = await Jimp.read(boardImageURL); + + // Lokasi pemain pada papan permainan + const playerPositions = [user1, user2, user3, user4].filter(pos => pos !== null && pos >= 1 && pos <= 100); + + // URL gambar untuk setiap pemain + const playerImageURLs = [ + "https://telegra.ph/file/30f92f923fb0484f0e4e0.png", + "https://telegra.ph/file/6e07b5f30b24baedc7822.png", + "https://telegra.ph/file/34f47137df0dc9aa9c15a.png", + "https://telegra.ph/file/860b5df98963a1f14a91c.png" + ]; + + // Gambar pion untuk setiap pemain pada posisi mereka + for (let i = 0; i < playerPositions.length; i++) { + const position = playerPositions[i]; + const row = Math.floor((position - 1) / 10); // Mulai dari bawah + const col = (row % 2 === 0) ? (position - 1) % 10 : 9 - (position - 1) % 10; + + // Posisi pion pada papan permainan + const x = col * 60 + stabil_x + const y = (9 - row) * 60 + stabil_y + + // Load gambar pemain dari URL + const playerImageURL = playerImageURLs[i]; + const playerImage = await Jimp.read(playerImageURL); + + // Resize gambar pemain menjadi 38x38 (sesuai dengan ukuran lingkaran) + playerImage.resize(50, 50); + + // Gabungkan gambar pemain dengan papan permainan + board.composite(playerImage, x - 4, y - 4, { mode: Jimp.BLEND_SOURCE_OVER }); + } + + // Mengembalikan buffer gambar + return await board.getBufferAsync(Jimp.MIME_PNG); + } catch (error) { + console.error('An error occurred:', error); + return null; + } +} + +module.exports = { drawBoard } \ No newline at end of file diff --git a/lib/uploadFile.js b/lib/uploadFile.js new file mode 100644 index 0000000000000000000000000000000000000000..4022af1aa8f7d6a951d865610d6053307140adea --- /dev/null +++ b/lib/uploadFile.js @@ -0,0 +1,90 @@ +const fetch = require('node-fetch'); +const axios = require('axios') +const FormData = require('form-data'); +const { fromBuffer } = require('file-type'); + +/** + * Upload file to https://pomf.lain.la + * @returns {string|null|(string|null)[]} + */ + +const pomf = async (buffer) => { +const { ext, mime } = (await fromBuffer(buffer)) || {}; + const form = new FormData(); + form.append("files[]", buffer, { filename: `tmp.${ext}`, contentType: mime }); + try { + const { data } = await axios.post("https://pomf.lain.la/upload.php", form, { + headers: form.getHeaders(), + }); + console.log(data); + return data.files[0].url + } catch (error) { + throw error; + } +}; + +/** + * Upload epheremal file to file.io + * `Expired in 1 day` + * `100MB Max Filesize` + * @param {Buffer} buffer File Buffer + */ +const fileIO = async (buffer) => { + const { ext } = await fromBuffer(buffer) || {}; + const form = new FormData(); + form.append('file', buffer, `tmp.${ext}`); + const res = await fetch('https://file.io/?expires=1d', { // 1 Day Expiry Date + method: 'POST', + body: form + }); + const json = await res.json(); + if (!json.success) throw json; + return json.link; +}; + +/** + * Upload file to https://8030.us.kg + * @returns {string|null|(string|null)[]} + */ +const api = async (buffer) => { + let { ext } = await fromBuffer(buffer); + let bodyForm = new FormData(); + bodyForm.append("file", buffer, "file." + ext); + let res = await fetch("https://8030.us.kg/api/upload.php", { + method: "post", + body: bodyForm, + }); + let data = await res.json(); + let resultUrl = data.result ? data.result.url : ''; + return resultUrl; +} + + +/** + * Upload file to https://file.btch.rf.gd + * @returns {string|null|(string|null)[]} + */ +const api2 = async (buffer) => { + let { ext } = await fromBuffer(buffer); + let bodyForm = new FormData(); + bodyForm.append("file", buffer, "file." + ext); + let res = await fetch("https://file.btch.rf.gd/api/upload.php", { + method: "post", + body: bodyForm, + }); + let data = await res.json(); + let resultUrl = data.result ? data.result.url : ''; + return resultUrl; +} + +module.exports = async function (inp) { + let err = false; + for (const upload of [pomf, api, api2, fileIO]) { + try { + return await upload(inp); + } catch (e) { + err = e; + } + } + if (err) throw err; +}; diff --git a/lib/uploadImage.js b/lib/uploadImage.js new file mode 100644 index 0000000000000000000000000000000000000000..76967105a31e3054a0438b204fb3d7ef55a59d7d --- /dev/null +++ b/lib/uploadImage.js @@ -0,0 +1,26 @@ +const axios = require('axios'); +const FormData = require('form-data'); +const { fromBuffer } = require('file-type'); + +/** + * Upload image to pomf.lain.la + * Supported mimetype: + * - `image/jpeg` + * - `image/jpg` + * - `image/png` + * @param {Buffer} buffer Image Buffer + */ +module.exports = async buffer => { + const { ext, mime } = (await fromBuffer(buffer)) || {}; + const form = new FormData(); + form.append("files[]", buffer, { filename: `tmp.${ext}`, contentType: mime }); + try { + const { data } = await axios.post("https://pomf.lain.la/upload.php", form, { + headers: form.getHeaders(), + }); + console.log(data); + return data.files[0].url + } catch (error) { + throw error; + } +}; diff --git a/lib/webp.js b/lib/webp.js new file mode 100644 index 0000000000000000000000000000000000000000..ab3cef0205695b76be347cb4509757f16710814d --- /dev/null +++ b/lib/webp.js @@ -0,0 +1,1497 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.constants = void 0; + +var _fs2 = _interopRequireDefault(require("fs")); + +var _util = require("util"); + +var _path = require("path"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; +} + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } +} + +function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + _next(undefined); + }); + }; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; +} + +function _classPrivateMethodGet(receiver, privateSet, fn) { + if (!privateSet.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return fn; +} + +const fs = { + read: (0, _util.promisify)(_fs2.default.read), + write: (0, _util.promisify)(_fs2.default.write), + open: (0, _util.promisify)(_fs2.default.open), + close: (0, _util.promisify)(_fs2.default.close) +}; +const nullByte = Buffer.alloc(1); +nullByte[0] = 0; +const constants = { + TYPE_LOSSY: 0, + TYPE_LOSSLESS: 1, + TYPE_EXTENDED: 2 +}; +exports.constants = constants; + +function VP8Width(data) { + let n = (data[7] << 8) | data[6]; + return n & 0b0011111111111111; +} + +function VP8Height(data) { + let n = (data[9] << 8) | data[8]; + return n & 0b0011111111111111; +} + +function VP8LWidth(data) { + let n = (data[2] << 8) | data[1]; + return (n & 0b0011111111111111) + 1; +} + +function VP8LHeight(data) { + let n = (data[4] << 16) | (data[3] << 8) | data[2]; + n = n >> 6; + return (n & 0b0011111111111111) + 1; +} + +function doesVP8LHaveAlpha(data) { + return !!(data[4] & 0b00010000); +} + +function createBasicChunk(name, data) { + let chunk = Buffer.alloc(8), + size = data.length, + out; + chunk.write(name, 0); + chunk.writeUInt32LE(size, 4); + out = [chunk, data]; + + if (size & 1) { + out[2] = nullByte; + } + + return out; +} + +var _convertToExtended = new WeakSet(); + +var _demuxFrame = new WeakSet(); + +var _readHeader = new WeakSet(); + +var _readChunkHeader = new WeakSet(); + +var _readChunkHeader_buf = new WeakSet(); + +var _readChunk_raw = new WeakSet(); + +var _readChunk_VP = new WeakSet(); + +var _readChunk_VP8_buf = new WeakSet(); + +var _readChunk_VP8L = new WeakSet(); + +var _readChunk_VP8L_buf = new WeakSet(); + +var _readChunk_VP8X = new WeakSet(); + +var _readChunk_ANIM = new WeakSet(); + +var _readChunk_ANMF = new WeakSet(); + +var _readChunk_ALPH = new WeakSet(); + +var _readChunk_ALPH_buf = new WeakSet(); + +var _readChunk_ICCP = new WeakSet(); + +var _readChunk_EXIF = new WeakSet(); + +var _readChunk_XMP = new WeakSet(); + +var _readChunk_Skip = new WeakSet(); + +var _read = new WeakSet(); + +class Image { + constructor() { + _read.add(this); + + _readChunk_Skip.add(this); + + _readChunk_XMP.add(this); + + _readChunk_EXIF.add(this); + + _readChunk_ICCP.add(this); + + _readChunk_ALPH_buf.add(this); + + _readChunk_ALPH.add(this); + + _readChunk_ANMF.add(this); + + _readChunk_ANIM.add(this); + + _readChunk_VP8X.add(this); + + _readChunk_VP8L_buf.add(this); + + _readChunk_VP8L.add(this); + + _readChunk_VP8_buf.add(this); + + _readChunk_VP.add(this); + + _readChunk_raw.add(this); + + _readChunkHeader_buf.add(this); + + _readChunkHeader.add(this); + + _readHeader.add(this); + + _demuxFrame.add(this); + + _convertToExtended.add(this); + + _defineProperty(this, "data", null); + + _defineProperty(this, "loaded", false); + + _defineProperty(this, "path", ""); + } + + clear() { + this.data = null; + this.path = ""; + this.loaded = false; + } + + get width() { + if (!this.loaded) { + return undefined; + } + + let d = this.data; + return d.extended + ? d.extended.width + : d.vp8l + ? d.vp8l.width + : d.vp8 + ? d.vp8.width + : undefined; + } + + get height() { + if (!this.loaded) { + return undefined; + } + + let d = this.data; + return d.extended + ? d.extended.height + : d.vp8l + ? d.vp8l.height + : d.vp8 + ? d.vp8.height + : undefined; + } + + get type() { + return this.loaded ? this.data.type : undefined; + } + + get hasAnim() { + return this.loaded + ? this.data.extended + ? this.data.extended.hasAnim + : false + : false; + } + + get anim() { + return this.hasAnim ? this.data.anim : undefined; + } + + get frameCount() { + return this.anim ? this.anim.frameCount : 0; + } + + get iccp() { + return this.data.extended + ? this.data.extended.hasICCP + ? this.data.iccp.raw + : undefined + : undefined; + } + + set iccp(raw) { + if (!this.data.extended) { + _classPrivateMethodGet( + this, + _convertToExtended, + _convertToExtended2 + ).call(this); + } + + if (raw === undefined) { + this.data.extended.hasICCP = false; + delete this.data.iccp; + } else { + this.data.iccp = { + raw + }; + this.data.extended.hasICCP = true; + } + } + + get exif() { + return this.data.extended + ? this.data.extended.hasEXIF + ? this.data.exif.raw + : undefined + : undefined; + } + + set exif(raw) { + if (!this.data.extended) { + _classPrivateMethodGet( + this, + _convertToExtended, + _convertToExtended2 + ).call(this); + } + + if (raw === undefined) { + this.data.extended.hasEXIF = false; + delete this.data.exif; + } else { + this.data.exif = { + raw + }; + this.data.extended.hasEXIF = true; + } + } + + get xmp() { + return this.data.extended + ? this.data.extended.hasXMP + ? this.data.xmp.raw + : undefined + : undefined; + } + + set xmp(raw) { + if (!this.data.extended) { + _classPrivateMethodGet( + this, + _convertToExtended, + _convertToExtended2 + ).call(this); + } + + if (raw === undefined) { + this.data.extended.hasXMP = false; + delete this.data.xmp; + } else { + this.data.xmp = { + raw + }; + this.data.extended.hasXMP = true; + } + } + + load(path) { + var _this = this; + + return _asyncToGenerator(function* () { + _this.path = path; + _this.data = yield _classPrivateMethodGet(_this, _read, _read2).call( + _this, + path + ); + _this.loaded = true; + })(); + } + + demuxAnim(path, frame = -1, prefix = "#FNAME#") { + var _this2 = this; + + return _asyncToGenerator(function* () { + let start = 0, + end = _this2.frameCount; + + if (end == 0) { + throw new Error("This WebP isn't an animation"); + } + + if (frame != -1) { + start = end = frame; + } + + for (let i = start; i <= end; i++) { + yield _classPrivateMethodGet(_this2, _demuxFrame, _demuxFrame2).call( + _this2, + `${path}/${prefix}_${i}.webp`.replace( + /#FNAME#/g, + (0, _path.basename)(_this2.path, ".webp") + ), + _this2.anim.frames[i] + ); + } + })(); + } + + replaceFrame(path, frame) { + var _this3 = this; + + return _asyncToGenerator(function* () { + if (!_this3.hasAnim) { + throw new Error("WebP isn't animated"); + } + + if (frame < 0 || frame >= _this3.frameCount) { + throw new Error( + `Frame index ${frame} out of bounds (0<=index<${_this3.frameCount})` + ); + } + + let r = new Image(); + yield r.load(path); + + switch (r.type) { + case constants.TYPE_LOSSY: + case constants.TYPE_LOSSLESS: + break; + + case constants.TYPE_EXTENDED: + if (r.hasAnim) { + throw new Error("Merging animations not currently supported"); + } + + break; + + default: + throw new Error("Unknown WebP type"); + } + + switch (_this3.anim.frames[frame].type) { + case constants.TYPE_LOSSY: + if (_this3.anim.frames[frame].vp8.alpha) { + delete _this3.anim.frames[frame].alph; + } + + delete _this3.anim.frames[frame].vp8; + break; + + case constants.TYPE_LOSSLESS: + delete _this3.anim.frames[frame].vp8l; + break; + + default: + throw new Error("Unknown frame type"); + } + + switch (r.type) { + case constants.TYPE_LOSSY: + _this3.anim.frames[frame].vp8 = r.data.vp8; + break; + + case constants.TYPE_LOSSLESS: + _this3.anim.frames[frame].vp8l = r.data.vp8l; + break; + + case constants.TYPE_EXTENDED: + if (r.data.vp8) { + _this3.anim.frames[frame].vp8 = r.data.vp8; + + if (r.data.vp8.alpha) { + _this3.anim.frames[frame].alph = r.data.alph; + } + } else if (r.data.vp8l) { + _this3.anim.frames[frame].vp8l = r.data.vp8l; + } + + break; + } + + _this3.anim.frames[frame].width = r.width; + _this3.anim.frames[frame].height = r.height; + })(); + } + + muxAnim({ path, bgColor = [255, 255, 255, 255], loops = 0 } = {}) { + var _this4 = this; + + return _asyncToGenerator(function* () { + return Image.muxAnim({ + path, + bgColor, + loops, + frames: _this4.frames + }); + })(); + } + + static muxAnim({ + path, + frames, + width = 0, + height = 0, + bgColor = [255, 255, 255, 255], + loops = 0, + delay = 100, + x = 0, + y = 0, + blend = true, + dispose = false + } = {}) { + return _asyncToGenerator(function* () { + let header = Buffer.alloc(12), + chunk = Buffer.alloc(18), + out = [], + img, + alpha = false, + size, + _w = 0, + _h = 0; + + let _width = width - 1, + _height = height - 1; + + if (frames.length == 0) { + throw new Error("No frames to mux"); + } else if (_width <= 0 || _width > 1 << 24) { + throw new Error("Width out of range"); + } else if (_height <= 0 || _height > 1 << 24) { + throw new Error("Height out of range"); + } else if (_height * _width > Math.pow(2, 32) - 1) { + throw new Error(`Width*height too large (${_width}, ${_height})`); + } else if (loops < 0 || loops >= 1 << 24) { + throw new Error("Loops out of range"); + } else if (delay < 0 || delay >= 1 << 24) { + throw new Error("Delay out of range"); + } else if (x < 0 || x >= 1 << 24) { + throw new Error("X out of range"); + } else if (y < 0 || y >= 1 << 24) { + throw new Error("Y out of range"); + } + + header.write("RIFF", 0); + header.write("WEBP", 8); + chunk.write("VP8X", 0); + chunk.writeUInt32LE(10, 4); + chunk[8] |= 0b00000010; + + if (width != 0) { + chunk.writeUIntLE(_width, 12, 3); + } + + if (height != 0) { + chunk.writeUIntLE(_height, 15, 3); + } + + out.push(header, chunk); + chunk = Buffer.alloc(14); + chunk.write("ANIM", 0); + chunk.writeUInt32LE(6, 4); + chunk.writeUInt8(bgColor[2], 8); + chunk.writeUInt8(bgColor[1], 9); + chunk.writeUInt8(bgColor[0], 10); + chunk.writeUInt8(bgColor[3], 11); + chunk.writeUInt16LE(loops, 12); + out.push(chunk); + + for (let i = 0, l = frames.length; i < l; i++) { + let _delay = + typeof frames[i].delay === "undefined" ? delay : frames[i].delay, + _x = typeof frames[i].x === "undefined" ? x : frames[i].x, + _y = typeof frames[i].y === "undefined" ? y : frames[i].y, + _blend = + typeof frames[i].blend === "undefined" ? blend : frames[i].blend, + _dispose = + typeof frames[i].dispose === "undefined" + ? dispose + : frames[i].dispose, + size = 16, + keepChunk = true, + imgData; + + if (delay < 0 || delay >= 1 << 24) { + throw new Error(`Delay out of range on frame ${i}`); + } else if (x < 0 || x >= 1 << 24) { + throw new Error(`X out of range on frame ${i}`); + } else if (y < 0 || y >= 1 << 24) { + throw new Error(`Y out of range on frame ${i}`); + } + + chunk = Buffer.alloc(24); + chunk.write("ANMF", 0); + chunk.writeUIntLE(_x, 8, 3); + chunk.writeUIntLE(_y, 11, 3); + chunk.writeUIntLE(_delay, 20, 3); + + if (!_blend) { + chunk[23] |= 0b00000010; + } + + if (_dispose) { + chunk[23] |= 0b00000001; + } + + if (frames[i].path) { + img = new Image(); + yield img.load(frames[i].path); + } else { + img = { + data: frames[i] + }; + } + + chunk.writeUIntLE(img.data.width - 1, 14, 3); + chunk.writeUIntLE(img.data.height - 1, 17, 3); + + switch (img.data.type) { + case constants.TYPE_LOSSY: + { + let c = img.data.vp8; + _w = c.width > _w ? c.width : _w; + _h = c.height > _h ? c.height : _h; + size += c.raw.length + 8; + imgData = createBasicChunk("VP8 ", c.raw); + } + break; + + case constants.TYPE_LOSSLESS: + { + let c = img.data.vp8l; + _w = c.width > _w ? c.width : _w; + _h = c.height > _h ? c.height : _h; + size += c.raw.length + 8; + + if (c.alpha) { + alpha = true; + } + + imgData = createBasicChunk("VP8L", c.raw); + } + break; + + case constants.TYPE_EXTENDED: + if (img.data.extended.hasAnim) { + let fr = img.data.anim.frames; + keepChunk = false; + + if (img.data.extended.hasAlpha) { + alpha = true; + } + + for (let i = 0, l = fr.length; i < l; i++) { + _w = fr[i].width + _x > _w ? fr[i].width + _x : _w; + _h = fr[i].height + _y > _h ? fr[i].height + _y : _h; + let b = Buffer.alloc(8); + b.write("ANMF", 0); + b.writeUInt32LE(fr[i].raw.length, 4); + out.push(b, fr[i].raw); + + if (fr[i].raw.length & 1) { + out.push(nullByte); + } + + b = fr[i].raw; + b.writeUIntLE(_x, 0, 3); + b.writeUIntLE(_y, 3, 3); + b.writeUIntLE(_delay, 12, 3); + + if (!_blend) { + b[15] |= 0b00000010; + } else { + b[15] &= 0b11111101; + } + + if (_dispose) { + b[15] |= 0b00000001; + } else { + b[15] &= 0b11111110; + } + } + } else { + _w = img.data.extended.width > _w ? img.data.extended.width : _w; + _h = + img.data.extended.height > _h ? img.data.extended.height : _h; + + if (img.data.vp8) { + imgData = []; + + if (img.data.alph) { + alpha = true; + imgData.push(...createBasicChunk("ALPH", img.data.alph.raw)); + size += img.data.alph.raw.length + 8; + } + + imgData.push(...createBasicChunk("VP8 ", img.data.vp8.raw)); + size += img.data.vp8.raw.length + 8; + } else if (img.data.vp8l) { + imgData = createBasicChunk("VP8L", img.data.vp8l.raw); + + if (img.data.vp8l.alpha) { + alpha = true; + } + + size += img.data.vp8l.raw.length + 8; + } + } + + break; + + default: + throw new Error("Unknown image type"); + } + + if (keepChunk) { + chunk.writeUInt32LE(size, 4); + out.push(chunk, ...imgData); + } + } + + if (width == 0) { + out[1].writeUIntLE(_w - 1, 12, 3); + } + + if (height == 0) { + out[1].writeUIntLE(_h - 1, 15, 3); + } + + size = 4; + + for (let i = 1, l = out.length; i < l; i++) { + size += out[i].length; + } + + header.writeUInt32LE(size, 4); + + if (alpha) { + out[1][8] |= 0b00010000; + } + + let fp = yield fs.open(path, "w"); + + for (let i = 0, l = out.length; i < l; i++) { + yield fs.write(fp, out[i], 0, undefined, undefined); + } + + yield fs.close(fp); + })(); + } +} + +var _convertToExtended2 = function _convertToExtended2() { + if (!this.loaded) { + throw new Error("No image loaded"); + } + + this.data.type = constants.TYPE_EXTENDED; + this.data.extended = { + hasICC: false, + hasAlpha: false, + hasEXIF: false, + hasXMP: false, + width: this.vp8 ? this.vp8.width : this.vp8l ? this.vp8l.width : 1, + height: this.vp8 ? this.vp8.height : this.vp8l ? this.vp8l.height : 1 + }; +}; + +var _demuxFrame2 = /*#__PURE__*/ (function () { + var _demuxFrame3 = _asyncToGenerator(function* (path, frame) { + let header = Buffer.alloc(12), + size, + chunk, + out = []; + header.write("RIFF", 0); + header.write("WEBP", 8); + out.push(header); + + if ( + this.data.extended.hasICC || + this.data.extended.hasEXIF || + this.data.extended.hasXMP || + (frame.vp8 && frame.vp8.alpha) + ) { + chunk = Buffer.alloc(18); + chunk.write("VP8X", 0); + chunk.writeUInt32LE(10, 4); + + if (this.data.extended.hasICC) { + chunk[8] |= 0b00100000; + } + + if ((frame.vp8l && frame.vp8l.alpha) || (frame.vp8 && frame.vp8.alpha)) { + chunk[8] |= 0b00010000; + } + + if (this.data.extended.hasEXIF) { + chunk[8] |= 0b00001000; + } + + if (this.data.extended.hasXMP) { + chunk[8] |= 0b00000100; + } + + chunk.writeUIntLE(frame.width - 1, 12, 3); + chunk.writeUIntLE(frame.height - 1, 15, 3); + out.push(chunk); + + if (this.data.extended.hasICC) { + out.push(...createBasicChunk("ICCP", this.data.extended.icc.raw)); + } + } + + if (frame.vp8l) { + out.push(...createBasicChunk("VP8L", frame.vp8l.raw)); + } else if (frame.vp8) { + if (frame.vp8.alpha) { + out.push(...createBasicChunk("ALPH", frame.alph.raw)); + } + + out.push(...createBasicChunk("VP8 ", frame.vp8.raw)); + } else { + throw new Error("Frame has no VP8/VP8L?"); + } + + if (this.type == constants.TYPE_EXTENDED) { + if (this.data.extended.hasEXIF) { + out.push(...createBasicChunk("EXIF", this.data.extended.exif.raw)); + } + + if (this.data.extended.hasXMP) { + out.push(...createBasicChunk("XMP ", this.data.extended.xmp.raw)); + } + } + + size = 4; + + for (let i = 1, l = out.length; i < l; i++) { + size += out[i].length; + } + + header.writeUInt32LE(size, 4); + let fp = yield fs.open(path, "w"); + + for (let i = 0, l = out.length; i < l; i++) { + yield fs.write(fp, out[i], 0, undefined, undefined); + } + + yield fs.close(fp); + }); + + function _demuxFrame2(_x2, _x3) { + return _demuxFrame3.apply(this, arguments); + } + + return _demuxFrame2; +})(); + +var _readHeader2 = /*#__PURE__*/ (function () { + var _readHeader3 = _asyncToGenerator(function* (fd) { + let buf = Buffer.alloc(12); + let { bytesRead } = yield fs.read(fd, buf, 0, 12, undefined); + + if (bytesRead != 12) { + throw new Error("Reached end of file while reading header"); + } + + if (buf.toString("utf8", 0, 4) != "RIFF") { + throw new Error("Bad header (not RIFF)"); + } + + if (buf.toString("utf8", 8, 12) != "WEBP") { + throw new Error("Bad header (not WEBP)"); + } + + return { + fileSize: buf.readUInt32LE(4) + }; + }); + + function _readHeader2(_x4) { + return _readHeader3.apply(this, arguments); + } + + return _readHeader2; +})(); + +var _readChunkHeader2 = /*#__PURE__*/ (function () { + var _readChunkHeader3 = _asyncToGenerator(function* (fd) { + let buf = Buffer.alloc(8); + let { bytesRead } = yield fs.read(fd, buf, 0, 8, undefined); + + if (bytesRead == 0) { + return { + fourCC: "\x00\x00\x00\x00", + size: 0 + }; + } else if (bytesRead < 8) { + throw new Error("Reached end of file while reading chunk header"); + } + + return { + fourCC: buf.toString("utf8", 0, 4), + size: buf.readUInt32LE(4) + }; + }); + + function _readChunkHeader2(_x5) { + return _readChunkHeader3.apply(this, arguments); + } + + return _readChunkHeader2; +})(); + +var _readChunkHeader_buf2 = function _readChunkHeader_buf2(buf, cursor) { + if (cursor >= buf.length) { + return { + fourCC: "\x00\x00\x00\x00", + size: 0 + }; + } + + return { + fourCC: buf.toString("utf8", cursor, cursor + 4), + size: buf.readUInt32LE(cursor + 4) + }; +}; + +var _readChunk_raw2 = /*#__PURE__*/ (function () { + var _readChunk_raw3 = _asyncToGenerator(function* (n, fd, size) { + let buf = Buffer.alloc(size), + discard = Buffer.alloc(1); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error(`Reached end of file while reading ${n} chunk`); + } + + if (size & 1) { + yield fs.read(fd, discard, 0, 1, undefined); + } + + return { + raw: buf + }; + }); + + function _readChunk_raw2(_x6, _x7, _x8) { + return _readChunk_raw3.apply(this, arguments); + } + + return _readChunk_raw2; +})(); + +var _readChunk_VP2 = /*#__PURE__*/ (function () { + var _readChunk_VP3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size), + discard = Buffer.alloc(1); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while reading VP8 chunk"); + } + + if (size & 1) { + yield fs.read(fd, discard, 0, 1, undefined); + } + + return { + raw: buf, + width: VP8Width(buf, 8), + height: VP8Height(buf, 8) + }; + }); + + function _readChunk_VP2(_x9, _x10) { + return _readChunk_VP3.apply(this, arguments); + } + + return _readChunk_VP2; +})(); + +var _readChunk_VP8_buf2 = function _readChunk_VP8_buf2(buf, size, cursor) { + if (cursor >= buf.length) { + throw new Error("Reached end of buffer while reading VP8 chunk"); + } + + let raw = buf.slice(cursor, cursor + size); + return { + raw, + width: VP8Width(raw), + height: VP8Height(raw) + }; +}; + +var _readChunk_VP8L2 = /*#__PURE__*/ (function () { + var _readChunk_VP8L3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size), + discard = Buffer.alloc(1); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while reading VP8L chunk"); + } + + if (size & 1) { + yield fs.read(fd, discard, 0, 1, undefined); + } + + return { + raw: buf, + alpha: doesVP8LHaveAlpha(buf, 0), + width: VP8LWidth(buf), + height: VP8LHeight(buf) + }; + }); + + function _readChunk_VP8L2(_x11, _x12) { + return _readChunk_VP8L3.apply(this, arguments); + } + + return _readChunk_VP8L2; +})(); + +var _readChunk_VP8L_buf2 = function _readChunk_VP8L_buf2(buf, size, cursor) { + if (cursor >= buf.length) { + throw new Error("Reached end of buffer while reading VP8L chunk"); + } + + let raw = buf.slice(cursor, cursor + size); + return { + raw, + alpha: doesVP8LHaveAlpha(raw), + width: VP8LWidth(raw), + height: VP8LHeight(raw) + }; +}; + +var _readChunk_VP8X2 = /*#__PURE__*/ (function () { + var _readChunk_VP8X3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while reading VP8X chunk"); + } + + return { + raw: buf, + hasICC: !!(buf[0] & 0b00100000), + hasAlpha: !!(buf[0] & 0b00010000), + hasEXIF: !!(buf[0] & 0b00001000), + hasXMP: !!(buf[0] & 0b00000100), + hasAnim: !!(buf[0] & 0b00000010), + width: buf.readUIntLE(4, 3) + 1, + height: buf.readUIntLE(7, 3) + 1 + }; + }); + + function _readChunk_VP8X2(_x13, _x14) { + return _readChunk_VP8X3.apply(this, arguments); + } + + return _readChunk_VP8X2; +})(); + +var _readChunk_ANIM2 = /*#__PURE__*/ (function () { + var _readChunk_ANIM3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while reading ANIM chunk"); + } + + return { + raw: buf, + bgColor: buf.slice(0, 4), + loopCount: buf.readUInt16LE(4) + }; + }); + + function _readChunk_ANIM2(_x15, _x16) { + return _readChunk_ANIM3.apply(this, arguments); + } + + return _readChunk_ANIM2; +})(); + +var _readChunk_ANMF2 = /*#__PURE__*/ (function () { + var _readChunk_ANMF3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size), + discard = Buffer.alloc(1); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while reading ANMF chunk"); + } + + if (size & 1) { + yield fs.read(fd, discard, 0, 1, undefined); + } + + let out = { + raw: buf, + x: buf.readUIntLE(0, 3), + y: buf.readUIntLE(3, 3), + width: buf.readUIntLE(6, 3) + 1, + height: buf.readUIntLE(9, 3) + 1, + duration: buf.readUIntLE(12, 3), + blend: !(buf[15] & 0b00000010), + dispose: !!(buf[15] & 0b00000001) + }; + let keepLooping = true, + cursor = 16; + + while (keepLooping) { + let header = _classPrivateMethodGet( + this, + _readChunkHeader_buf, + _readChunkHeader_buf2 + ).call(this, buf, cursor), + t; + + cursor += 8; + + switch (header.fourCC) { + case "VP8 ": + if (!out.vp8) { + out.type = constants.TYPE_LOSSY; + out.vp8 = _classPrivateMethodGet( + this, + _readChunk_VP8_buf, + _readChunk_VP8_buf2 + ).call(this, buf, header.size, cursor); + } + + break; + + case "VP8L": + if (!out.vp8l) { + out.type = constants.TYPE_LOSSLESS; + out.vp8l = _classPrivateMethodGet( + this, + _readChunk_VP8L_buf, + _readChunk_VP8L_buf2 + ).call(this, buf, header.size, cursor); + } + + break; + + case "ALPH": + if (out.vp8) { + out.alph = _classPrivateMethodGet( + this, + _readChunk_ALPH_buf, + _readChunk_ALPH_buf2 + ).call(this, buf, header.size, cursor); + out.vp8.alpha = true; + } + + break; + + case "\x00\x00\x00\x00": + default: + keepLooping = false; + break; + } + + cursor += header.size + 1; + + if (header.size & 1) { + cursor++; + } + + if (cursor >= buf.length) { + keepLooping = false; + } + } + + return out; + }); + + function _readChunk_ANMF2(_x17, _x18) { + return _readChunk_ANMF3.apply(this, arguments); + } + + return _readChunk_ANMF2; +})(); + +var _readChunk_ALPH2 = /*#__PURE__*/ (function () { + var _readChunk_ALPH3 = _asyncToGenerator(function* (fd, size) { + return _classPrivateMethodGet(this, _readChunk_raw, _readChunk_raw2).call( + this, + "ALPH", + fd, + size + ); + }); + + function _readChunk_ALPH2(_x19, _x20) { + return _readChunk_ALPH3.apply(this, arguments); + } + + return _readChunk_ALPH2; +})(); + +var _readChunk_ALPH_buf2 = function _readChunk_ALPH_buf2(buf, size, cursor) { + if (cusor >= buf.length) { + throw new Error("Reached end of buffer while reading ALPH chunk"); + } + + return { + raw: buf.slice(cursor, cursor + size) + }; +}; + +var _readChunk_ICCP2 = /*#__PURE__*/ (function () { + var _readChunk_ICCP3 = _asyncToGenerator(function* (fd, size) { + return _classPrivateMethodGet(this, _readChunk_raw, _readChunk_raw2).call( + this, + "ICCP", + fd, + size + ); + }); + + function _readChunk_ICCP2(_x21, _x22) { + return _readChunk_ICCP3.apply(this, arguments); + } + + return _readChunk_ICCP2; +})(); + +var _readChunk_EXIF2 = /*#__PURE__*/ (function () { + var _readChunk_EXIF3 = _asyncToGenerator(function* (fd, size) { + return _classPrivateMethodGet(this, _readChunk_raw, _readChunk_raw2).call( + this, + "EXIF", + fd, + size + ); + }); + + function _readChunk_EXIF2(_x23, _x24) { + return _readChunk_EXIF3.apply(this, arguments); + } + + return _readChunk_EXIF2; +})(); + +var _readChunk_XMP2 = /*#__PURE__*/ (function () { + var _readChunk_XMP3 = _asyncToGenerator(function* (fd, size) { + return _classPrivateMethodGet(this, _readChunk_raw, _readChunk_raw2).call( + this, + "XML", + fd, + size + ); + }); + + function _readChunk_XMP2(_x25, _x26) { + return _readChunk_XMP3.apply(this, arguments); + } + + return _readChunk_XMP2; +})(); + +var _readChunk_Skip2 = /*#__PURE__*/ (function () { + var _readChunk_Skip3 = _asyncToGenerator(function* (fd, size) { + let buf = Buffer.alloc(size), + discard = Buffer.alloc(1); + let { bytesRead } = yield fs.read(fd, buf, 0, size, undefined); + + if (bytesRead != size) { + throw new Error("Reached end of file while skipping chunk"); + } + + if (size & 1) { + yield fs.read(fd, discard, 0, 1, undefined); + } + }); + + function _readChunk_Skip2(_x27, _x28) { + return _readChunk_Skip3.apply(this, arguments); + } + + return _readChunk_Skip2; +})(); + +var _read2 = /*#__PURE__*/ (function () { + var _read3 = _asyncToGenerator(function* (path) { + let fd = yield fs.open(path, "r"), + out = {}, + keepLooping = true, + first = true; + let { fileSize } = yield _classPrivateMethodGet( + this, + _readHeader, + _readHeader2 + ).call(this, fd); + + while (keepLooping) { + let { fourCC, size } = yield _classPrivateMethodGet( + this, + _readChunkHeader, + _readChunkHeader2 + ).call(this, fd); + + switch (fourCC) { + case "VP8 ": + if (!out.vp8) { + out.vp8 = yield _classPrivateMethodGet( + this, + _readChunk_VP, + _readChunk_VP2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + if (first) { + out.type = constants.TYPE_LOSSY; + keepLooping = false; + } + + break; + + case "VP8L": + if (!out.vp8l) { + out.vp8l = yield _classPrivateMethodGet( + this, + _readChunk_VP8L, + _readChunk_VP8L2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + if (first) { + out.type = constants.TYPE_LOSSLESS; + keepLooping = false; + } + + break; + + case "VP8X": + if (!out.extended) { + out.type = constants.TYPE_EXTENDED; + out.extended = yield _classPrivateMethodGet( + this, + _readChunk_VP8X, + _readChunk_VP8X2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "ANIM": + if (!out.anim) { + let { raw, bgColor, loopCount } = yield _classPrivateMethodGet( + this, + _readChunk_ANIM, + _readChunk_ANIM2 + ).call(this, fd, size); + out.anim = { + backgroundColor: [bgColor[2], bgColor[1], bgColor[0], bgColor[3]], + loopCount, + frames: [] + }; + out.anim.raw = raw; + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "ANMF": + { + let f = yield _classPrivateMethodGet( + this, + _readChunk_ANMF, + _readChunk_ANMF2 + ).call(this, fd, size); + out.anim.frames.push(f); + } + break; + + case "ALPH": + if (!out.alph) { + out.alph = yield _classPrivateMethodGet( + this, + _readChunk_ALPH, + _readChunk_ALPH2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "ICCP": + if (!out.iccp) { + out.iccp = yield _classPrivateMethodGet( + this, + _readChunk_ICCP, + _readChunk_ICCP2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "EXIF": + if (!out.exif) { + out.exif = yield _classPrivateMethodGet( + this, + _readChunk_EXIF, + _readChunk_EXIF2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "XMP ": + if (!out.xmp) { + out.xmp = yield _classPrivateMethodGet( + this, + _readChunk_XMP, + _readChunk_XMP2 + ).call(this, fd, size); + } else { + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + } + + break; + + case "\x00\x00\x00\x00": + keepLooping = false; + break; + + default: + yield _classPrivateMethodGet( + this, + _readChunk_Skip, + _readChunk_Skip2 + ).call(this, fd, size); + break; + } + + first = false; + } + + if (out.type == constants.TYPE_EXTENDED && out.extended.hasAnim) { + out.anim.frameCount = out.anim.frames.length; + } + + return out; + }); + + function _read2(_x29) { + return _read3.apply(this, arguments); + } + + return _read2; +})(); + +var _default = { + TYPE_LOSSY: constants.TYPE_LOSSY, + TYPE_LOSSLESS: constants.TYPE_LOSSLESS, + TYPE_EXTENDED: constants.TYPE_EXTENDED, + Image +}; +exports.default = _default; diff --git a/lib/webp2mp4.js b/lib/webp2mp4.js new file mode 100644 index 0000000000000000000000000000000000000000..467bb77a4e19624c4d07a67203352d7b32e96b3d --- /dev/null +++ b/lib/webp2mp4.js @@ -0,0 +1,63 @@ +const fetch = require('node-fetch') +const FormData = require('form-data') +const { JSDOM } = require('jsdom') + +async function webp2mp4(source) { + let form = new FormData + let isUrl = typeof source === 'string' && /https?:\/\//.test(source) + form.append('new-image-url', isUrl ? source : '') + form.append('new-image', isUrl ? '' : source, 'image.webp') + let res = await fetch('https://s6.ezgif.com/webp-to-mp4', { + method: 'POST', + body: form + }) + let html = await res.text() + let { document } = new JSDOM(html).window + let form2 = new FormData + let obj = {} + for (let input of document.querySelectorAll('form input[name]')) { + obj[input.name] = input.value + form2.append(input.name, input.value) + } + let res2 = await fetch('https://ezgif.com/webp-to-mp4/' + obj.file, { + method: 'POST', + body: form2 + }) + let html2 = await res2.text() + let { document: document2 } = new JSDOM(html2).window + return new URL(document2.querySelector('div#output > p.outfile > video > source').src, res2.url).toString() +} + +async function webp2png(source) { + let form = new FormData + let isUrl = typeof source === 'string' && /https?:\/\//.test(source) + form.append('new-image-url', isUrl ? source : '') + form.append('new-image', isUrl ? '' : source, 'image.webp') + let res = await fetch('https://s6.ezgif.com/webp-to-png', { + method: 'POST', + body: form + }) + let html = await res.text() + let { document } = new JSDOM(html).window + let form2 = new FormData + let obj = {} + for (let input of document.querySelectorAll('form input[name]')) { + obj[input.name] = input.value + form2.append(input.name, input.value) + } + let res2 = await fetch('https://ezgif.com/webp-to-png/' + obj.file, { + method: 'POST', + body: form2 + }) + let html2 = await res2.text() + let { document: document2 } = new JSDOM(html2).window + return new URL(document2.querySelector('div#output > p.outfile > img').src, res2.url).toString() +} + +if (require.main === module) { + // TODO: Test + webp2mp4('https://mathiasbynens.be/demo/animated-webp-supported.webp').then(console.error) + webp2png('https://mathiasbynens.be/demo/animated-webp-supported.webp').then(console.error) +} else { + module.exports = { webp2mp4, webp2png } +} diff --git a/lib/welcome.js b/lib/welcome.js new file mode 100644 index 0000000000000000000000000000000000000000..c98876ebb650a89b61a175b4ea65db17f89b74d7 --- /dev/null +++ b/lib/welcome.js @@ -0,0 +1,114 @@ +const { DOMImplementation, XMLSerializer } = require('xmldom'); +const JsBarcode = require('jsbarcode') +const { JSDOM } = require('jsdom') +const fs = require('fs') +const path = require('path') +const cp = require('child_process') + +const src = path.join(__dirname, '..', 'src') +const _svg = fs.readFileSync(path.join(src, 'welcome.svg'), 'utf-8') +const barcode = data => { + const xmlSerializer = new XMLSerializer(); + const document = new DOMImplementation().createDocument('http://www.w3.org/1999/xhtml', 'html', null); + const svgNode = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + + JsBarcode(svgNode, data, { + xmlDocument: document, + }); + + return xmlSerializer.serializeToString(svgNode); +} +const imageSetter = (img, value) => img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', value) +const textSetter = (el, value) => el.textContent = value + +let { document: svg } = new JSDOM(_svg).window +/** + * Generate SVG Welcome + * @param {object} param0 + * @param {string} param0.wid + * @param {string} param0.pp + * @param {string} param0.name + * @param {string} param0.text + * @param {string} param0.background + * @returns {string} + */ +const genSVG = async ({ + wid = '', + pp = path.join(src, 'avatar_contact.png'), + title = '', + name = '', + text = '', + background = '' +} = {}) => { + let el = { + code: ['#_1661899539392 > g:nth-child(6) > image', imageSetter, toBase64(await toImg(barcode(wid.replace(/[^0-9]/g, '')), 'png'), 'image/png')], + pp: ['#_1661899539392 > g:nth-child(3) > image', imageSetter, pp], + text: ['#_1661899539392 > text.fil1.fnt0', textSetter, text], + title: ['#_1661899539392 > text.fil2.fnt1', textSetter, title], + name: ['#_1661899539392 > text.fil2.fnt2', textSetter, name], + bg: ['#_1661899539392 > g:nth-child(2) > image', imageSetter, background], + } + for (let [selector, set, value] of Object.values(el)) { + set(svg.querySelector(selector), value) + } + return svg.body.innerHTML +} + +const toImg = (svg, format = 'png') => new Promise((resolve, reject) => { + if (!svg) return resolve(Buffer.alloc(0)) + let bufs = [] + let im = cp.spawn('magick', ['convert', 'svg:-', format + ':-']) + im.on('error', e => reject(e)) + im.stdout.on('data', chunk => bufs.push(chunk)) + im.stdin.write(Buffer.from(svg)) + im.stdin.end() + im.on('close', code => { + if (code !== 0) reject(code) + resolve(Buffer.concat(bufs)) + }) +}) + +const toBase64 = (buffer, mime) => `data:${mime};base64,${buffer.toString('base64')}` + +/** + * Render SVG Welcome + * @param {object} param0 + * @param {string} param0.wid + * @param {string} param0.pp + * @param {string} param0.name + * @param {string} param0.text + * @param {string} param0.background + * @returns {Promise} + */ +const render = async ({ + wid = '', + pp = toBase64(fs.readFileSync(path.join(src, 'avatar_contact.png')), 'image/png'), + name = '', + title = '', + text = '', + background = toBase64(fs.readFileSync(path.join(src, 'Aesthetic', 'Aesthetic_000.jpeg')), 'image/jpeg'), +} = {}, format = 'png') => { + let svg = await genSVG({ + wid, pp, name, text, background, title + }) + return await toImg(svg, format) +} + +if (require.main === module) { + render({ + wid: '1234567890', + // pp: '', + name: 'John Doe', + text: 'Lorem ipsum\ndot sit color', + title: 'grup testing' + // background: '' + }, 'jpg').then(result => { + // console.log(result) + process.stdout.write(result) + }) + // toImg(barcode('test')).then(result => { + // // console.log(result) + // process.stdout.write(result) + + // }) +} else module.exports = render diff --git a/lib/werewolf.js b/lib/werewolf.js new file mode 100644 index 0000000000000000000000000000000000000000..0c6dfda4bac04e76bb5e4618413b1a6fa4c2c7cb --- /dev/null +++ b/lib/werewolf.js @@ -0,0 +1,1239 @@ +let toMs = require("ms"); +let jimp = require("jimp"); + +let thumb1 = + "https://user-images.githubusercontent.com/72728486/235344562-4677d2ad-48ee-419d-883f-e0ca9ba1c7b8.jpg"; +let thumb2 = + "https://user-images.githubusercontent.com/72728486/235344861-acdba7d1-8fce-41b8-adf6-337c818cda2b.jpg"; +let thumb3 = + "https://user-images.githubusercontent.com/72728486/235316834-f9f84ba0-8df3-4444-81d8-db5270995e6d.jpg"; +let thumb4 = + "https://user-images.githubusercontent.com/72728486/235354619-6ad1cabd-216c-4c7c-b7c2-3a564836653a.jpg"; +let thumb5 = + "https://user-images.githubusercontent.com/72728486/235365156-cfab66ce-38b2-4bc7-90d7-7756fc320e06.jpg"; +let thumb6 = + "https://user-images.githubusercontent.com/72728486/235365148-35b8def7-c1a2-451d-a2f2-6b6a911b37db.jpg"; + +const resize = async (image, width, height) => { + const read = await jimp.read(image); + const data = await read.resize(width, height).getBufferAsync(jimp.MIME_JPEG); + return data; +}; +var a; +var b; +var d; +var e; +var f; +var textnya; +var idd; +var room; + +async function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function emoji_role(role) { + if (role === "warga") { + return "๐Ÿ‘ฑโ€โ™‚๏ธ"; + } else if (role === "seer") { + return "๐Ÿ‘ณ"; + } else if (role === "guardian") { + return "๐Ÿ‘ผ"; + } else if (role === "sorcerer") { + return "๐Ÿ”ฎ"; + } else if (role === "werewolf") { + return "๐Ÿบ"; + } else { + return ""; + } +} + +const findObject = (obj = {}, key, value) => { + const result = []; + const recursiveSearch = (obj = {}) => { + if (!obj || typeof obj !== "object") { + return; + } + if (obj[key] === value) { + result.push(obj); + } + Object.keys(obj).forEach(function(k) { + recursiveSearch(obj[k]); + }); + }; + recursiveSearch(obj); + return result; +}; + +// sessions +const sesi = (from, data) => { + if (!data[from]) return false; + return data[from]; +}; + +// check sessions +const playerOnGame = (sender, data) => { + let result = findObject(data, "id", sender); + let index = false; + if (result.length === 0) { + return index; + } else { + index = true; + } + return index; +}; + +// in room +const playerOnRoom = (sender, from, data) => { + let result = findObject(data, "id", sender); + let index = false; + if (result.length > 0 && result[0].sesi === from) { + index = true; + } else { + return index; + } + return index; +}; + +// get data player +const dataPlayer = (sender, data) => { + let result = findObject(data, "id", sender); + let index = false; + if (result.length > 0 && result[0].id === sender) { + index = result[0]; + } else { + return index; + } + return index; +}; + +// get data player by id +const dataPlayerById = (id, data) => { + let result = findObject(data, "number", id); + let index = false; + if (result.length > 0 && result[0].number === id) { + index = result[0]; + } else { + return index; + } + return index; +}; + +// keluar game +const playerExit = (from, id, data) => { + room = sesi(from, data); + if (!room) return false; + const indexPlayer = room.player.findIndex((i) => i.id === id); + room.player.splice(indexPlayer, 1); +}; + +// get player id +const getPlayerById = (from, sender, id, data) => { + room = sesi(from, data); + if (!room) return false; + const indexPlayer = room.player.findIndex((i) => i.number === id); + if (indexPlayer === -1) return false; + return { + index: indexPlayer, + sesi: room.player[indexPlayer].sesi, + db: room.player[indexPlayer], + }; +}; + +// get player id 2 +const getPlayerById2 = (sender, id, data) => { + let result = findObject(data, "id", sender); + if (result.length > 0 && result[0].id === sender) { + let from = result[0].sesi; + room = sesi(from, data); + if (!room) return false; + const indexPlayer = room.player.findIndex((i) => i.number === id); + if (indexPlayer === -1) return false; + return { + index: indexPlayer, + sesi: room.player[indexPlayer].sesi, + db: room.player[indexPlayer], + }; + } +}; + +// werewolf kill +const killWerewolf = (sender, id, data) => { + let result = getPlayerById2(sender, id, data); + if (!result) return false; + let { + index, + sesi, + db + } = result; + if (data[sesi].player[index].number === id) { + if (db.effect.includes("guardian")) { + data[sesi].guardian.push(parseInt(id)); + data[sesi].dead.push(parseInt(id)); + } else if (!db.effect.includes("guardian")) { + data[sesi].dead.push(parseInt(id)); + } + } +}; + +// seer dreamy +const dreamySeer = (sender, id, data) => { + let result = getPlayerById2(sender, id, data); + if (!result) return false; + let { + index, + sesi, + db + } = result; + if (data[sesi].player[index].role === "werewolf") { + data[sesi].seer = true; + } + return data[sesi].player[index].role; +}; + +// seer dreamy +const sorcerer = (sender, id, data) => { + let result = getPlayerById2(sender, id, data); + if (!result) return false; + let { + index, + sesi, + db + } = result; + return data[sesi].player[index].role; +}; + +// guardian protect +const protectGuardian = (sender, id, data) => { + let result = getPlayerById2(sender, id, data); + if (!result) return false; + let { + index, + sesi, + db + } = result; + data[sesi].player[index].effect.push("guardian"); +}; + +// pengacakan role +const roleShuffle = (array) => { + let currentIndex = array.length, + randomIndex; + while (currentIndex != 0) { + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex--; + [array[currentIndex], array[randomIndex]] = [ + array[randomIndex], + array[currentIndex], + ]; + } + return array; +}; + +// memberikan role ke player +const roleChanger = (from, id, role, data) => { + room = sesi(from, data); + if (!room) return false; + var index = room.player.findIndex((i) => i.id === id); + if (index === -1) return false; + room.player[index].role = role; +}; + +// memberikan peran ke semua player +const roleAmount = (from, data) => { + const result = sesi(from, data); + if (!result) return false; + if (result.player.length == 4) { + return { + werewolf: 1, + seer: 1, + guardian: 1, + warga: 1, + sorcere: 0, + }; + } else if (result.player.length == 5) { + return { + werewolf: 1, + seer: 1, + guardian: 1, + warga: 3, + sorcere: 0, + }; + } else if (result.player.length == 6) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 2, + sorcere: 0, + }; + } else if (result.player.length == 7) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 3, + sorcere: 0, + }; + } else if (result.player.length == 8) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 4, + sorcere: 0, + }; + } else if (result.player.length == 9) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 4, + sorcere: 1, + }; + } else if (result.player.length == 10) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 5, + sorcere: 1, + }; + } else if (result.player.length == 11) { + return { + werewolf: 2, + seer: 1, + guardian: 2, + warga: 5, + sorcere: 1, + }; + } else if (result.player.length == 12) { + return { + werewolf: 2, + seer: 1, + guardian: 2, + warga: 6, + sorcere: 1, + }; + } else if (result.player.length == 13) { + return { + werewolf: 2, + seer: 1, + guardian: 1, + warga: 7, + sorcere: 1, + }; + } else if (result.player.length == 14) { + return { + werewolf: 2, + seer: 2, + guardian: 2, + warga: 7, + sorcere: 1, + }; + } else if (result.player.length == 15) { + return { + werewolf: 3, + seer: 2, + guardian: 3, + warga: 6, + sorcere: 1, + }; + } +}; + +const roleGenerator = (from, data) => { + room = sesi(from, data); + if (!room) return false; + var role = roleAmount(from, data); + for (var i = 0; i < role.werewolf; i++) { + var player = room.player.filter((x) => x.role === false); + var list = roleShuffle(player); + if (list.length === 0) return false; + var random = Math.floor(Math.random() * list.length); + roleChanger(from, list[random].id, "werewolf", data); + } + for (var i = 0; i < role.seer; i++) { + var player = room.player.filter((x) => x.role === false); + var list = roleShuffle(player); + if (list.length === 0) return false; + var random = Math.floor(Math.random() * list.length); + roleChanger(from, list[random].id, "seer", data); + } + for (var i = 0; i < role.guardian; i++) { + var player = room.player.filter((x) => x.role === false); + var list = roleShuffle(player); + if (list.length === 0) return false; + var random = Math.floor(Math.random() * list.length); + roleChanger(from, list[random].id, "guardian", data); + } + for (var i = 0; i < role.warga; i++) { + var player = room.player.filter((x) => x.role === false); + var list = roleShuffle(player); + if (list.length === 0) return false; + var random = Math.floor(Math.random() * list.length); + roleChanger(from, list[random].id, "warga", data); + } + for (var i = 0; i < role.sorcere; i++) { + var player = room.player.filter((x) => x.role === false); + var list = roleShuffle(player); + if (list.length === 0) return false; + var random = Math.floor(Math.random() * list.length); + roleChanger(from, list[random].id, "sorcerer", data); + } + shortPlayer(from, data); +}; + +// add cooldown +const addTimer = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.cooldown = Date.now() + toMs(90 + "s"); +}; + +// merubah status room, dalam permainan +const startGame = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.status = true; +}; + +// rubah hari +const changeDay = (from, data) => { + room = sesi(from, data); + if (!room) return false; + if (room.time === "pagi") { + room.time = "voting"; + } else if (room.time === "malem") { + room.time = "pagi"; + room.day += 1; + } else if (room.time === "voting") { + room.time = "malem"; + } +}; + +// hari voting +const dayVoting = (from, data) => { + room = sesi(from, data); + if (!room) return false; + if (room.time === "malem") { + room.time = "voting"; + } else if (room.time === "pagi") { + room.time = "voting"; + } +}; + +// voting +const vote = (from, id, sender, data) => { + room = sesi(from, data); + if (!room) return false; + const idGet = room.player.findIndex((i) => i.id === sender); + if (idGet === -1) return false; + const indexPlayer = room.player.findIndex((i) => i.number === id); + if (indexPlayer === -1) return false; + if (idGet !== -1) { + room.player[idGet].isvote = true; + } + room.player[indexPlayer].vote += 1; +}; + +// hasil voting +const voteResult = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.player.sort((a, b) => (a.vote < b.vote ? 1 : -1)); + if (room.player[0].vote === 0) return 0; + if (room.player[0].vote === room.player[1].vote) return 1; + return room.player[0]; +}; + +// vote killing +const voteKill = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.player.sort((a, b) => (a.vote < b.vote ? 1 : -1)); + if (room.player[0].vote === 0) return 0; + if (room.player[0].vote === room.player[1].vote) return 1; + room.player[0].isdead = true; +}; + +// voting reset +const resetVote = (from, data) => { + room = sesi(from, data); + if (!room) return false; + for (let i = 0; i < room.player.length; i++) { + room.player[i].vote = 0; + } +}; + +const voteDone = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.voting = false; +}; + +const voteStart = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.voting = true; +}; + +// clear vote +const clearAllVote = (from, data) => { + room = sesi(from, data); + if (!room) return false; + for (let i = 0; i < room.player.length; i++) { + room.player[i].vote = 0; + room.player[i].isvote = false; + } +}; + +// clearAll +const clearAll = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.dead = []; + room.seer = false; + room.guardian = []; + room.voting = false; +}; + +// clear all status player +const clearAllSTATUS = (from, data) => { + room = sesi(from, data); + if (!room) return false; + for (let i = 0; i < room.player.length; i++) { + room.player[i].effect = []; + } +}; + +const skillOn = (from, data) => { + room = sesi(from, data); + if (!room) return false; + for (let i = 0; i < room.player.length; i++) { + room.player[i].status = false; + } +}; + +const skillOff = (from, data) => { + room = sesi(from, data); + if (!room) return false; + for (let i = 0; i < room.player.length; i++) { + room.player[i].status = true; + } +}; + +const playerHidup = (data) => { + const hasil = data.player.filter((x) => x.isdead === false); + return hasil.length; +}; + +const playerMati = (data) => { + const hasil = data.player.filter((x) => x.isdead === true); + return hasil.length; +}; + +// get player win +const getWinner = (from, data) => { + room = sesi(from, data); + if (!room) return false; + var ww = 0; + var orang_baek = 0; + for (let i = 0; i < room.player.length; i++) { + if (room.player[i].isdead === false) { + if ( + room.player[i].role === "werewolf" || + room.player[i].role === "sorcerer" + ) { + ww += 1; + } else if ( + room.player[i].role === "warga" || + room.player[i].role === "guardian" || + room.player[i].role === "seer" + ) { + orang_baek += 1; + } + } + } + if (room.voting) { + b = voteResult(from, data); + if (b != 0 && b != 1) { + if (b.role === "werewolf" || b.role === "sorcerer") { + ww -= 1; + } else if ( + b.role === "warga" || + b.role === "seer" || + b.role === "guardian" + ) { + orang_baek -= 1; + } + } + } + if (ww === 0) { + room.iswin = true; + return { + voting: room.voting, + status: true + }; + } else if (ww === orang_baek) { + room.iswin = false; + return { + voting: room.voting, + status: false + }; + } else if (orang_baek === 0) { + room.iswin = false; + return { + voting: room.voting, + status: false + }; + } else { + return { + voting: room.voting, + status: null + }; + } +}; + +// shorting +const shortPlayer = (from, data) => { + room = sesi(from, data); + if (!room) return false; + room.player.sort((a, b) => a.number - b.number); +}; + +// werewolf killing +const killww = (from, id, data) => { + room = sesi(from, data); + if (!room) return false; + for (let j = 0; j < room.dead.length; j++) { + idd = getPlayerById(from, room.player[0].id, room.dead[j], data); + if (!idd) return false; + if (room.player[idd.index].effect.includes("guardian")) return; + room.player[idd.index].isdead = true; + } +}; + +const pagii = (data) => { + if (data.dead.length < 1) { + return `*โŒ‚ W E R E W O L F - G A M E*\n\nMentari telah terbit, tidak ada korban berjatuhan malam ini, warga kembali melakukan aktifitasnya seperti biasa.\n90 detik tersisa sebelum waktu penentuan, para warga dipersilahkan untuk berdiskusi\n*Hari ke ${data.day}*`; + } else { + a = ""; + d = ""; + e = []; + f = []; + for (let i = 0; i < data.dead.length; i++) { + b = data.player.findIndex((x) => x.number === data.dead[i]); + if (data.player[b].effect.includes("guardian")) { + e.push(data.player[b].id); + } else { + f.push(data.player[b].id); + } + } + for (let i = 0; i < f.length; i++) { + if (i === f.length - 1) { + if (f.length > 1) { + a += ` dan @${f[i].replace("@s.whatsapp.net", "")}`; + } else { + a += `@${f[i].replace("@s.whatsapp.net", "")}`; + } + } else if (i === f.length - 2) { + a += `@${f[i].replace("@s.whatsapp.net", "")}`; + } else { + a += `@${f[i].replace("@s.whatsapp.net", "")}, `; + } + } + for (let i = 0; i < e.length; i++) { + if (i === e.length - 1) { + if (e.length > 1) { + d += ` dan @${e[i].replace("@s.whatsapp.net", "")}`; + } else { + d += `@${e[i].replace("@s.whatsapp.net", "")}`; + } + } else if (i === e.length - 2) { + d += `@${e[i].replace("@s.whatsapp.net", "")}`; + } else { + d += `@${e[i].replace("@s.whatsapp.net", "")}, `; + } + } + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nPagi telah tiba, warga desa menemukan ${ + data.dead.length > 1 ? "beberapa" : "1" + } mayat di tumpukan puing dan darah berceceran. ${a ? a + " telah mati! " : ""}${ + d.length > 1 + ? ` ${d} hampir dibunuh, namun *Guardian Angel* berhasil melindunginya.` + : "" + }\n\nTak terasa hari sudah siang, matahari tepat di atas kepala, terik panas matahari membuat suasana menjadi riuh, warga desa mempunyai 90 detik untuk berdiskusi\n*Hari ke ${ + data.day + }*`; + return textnya; + } +}; + +async function pagi(conn, x, data) { + skillOff(x.room, data) + let ment = []; + for (let i = 0; i < x.player.length; i++) { + ment.push(x.player[i].id); + } + shortPlayer(x.room, data); + killww(x.room, x.dead, data); + shortPlayer(x.room, data); + changeDay(x.room, data); + return await conn.sendMessage(x.room, { + text: pagii(x), + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb1, 300, 175), + sourceUrl: "", + mediaUrl: thumb1, + }, + mentionedJid: ment, + }, + }); +} + +async function voting(conn, x, data) { + let row = []; + let ment = []; + voteStart(x.room, data) + textnya = + "*โŒ‚ W E R E W O L F - G A M E*\n\nSenja telah tiba. Seluruh warga berkumpul di balai desa untuk memilih siapa yang akan dieksekusi. Sebagian warga terlihat sibuk menyiapkan alat penyiksaan untuk malam ini. Kalian mempunyai waktu selama 90 detik untuk memilih! Hati-hati, ada penghianat diantara kalian!\n\n*L I S T - P L A Y E R*:\n"; + shortPlayer(x.room, data); + for (let i = 0; i < x.player.length; i++) { + textnya += `(${x.player[i].number}) @${x.player[i].id.replace( + "@s.whatsapp.net", + "" + )} ${x.player[i].isdead === true ? "โ˜ ๏ธ" : ""}\n`; + ment.push(x.player[i].id); + } + textnya += "\nketik *.ww vote nomor* untuk voting player"; + dayVoting(x.room, data); + clearAll(x.room, data); + clearAllSTATUS(x.room, data); + return await conn.sendMessage(x.room, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb2, 300, 175), + sourceUrl: "", + mediaUrl: thumb2, + }, + mentionedJid: ment, + }, + }); +} + +async function malam(conn, x, data) { + var hasil_vote = voteResult(x.room, data); + if (hasil_vote === 0) { + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nTerlalu bimbang menentukan pilihan. Warga pun pulang ke rumah masing-masing, tidak ada yang dieksekusi hari ini. Bulan bersinar terang, malam yang mencekam telah datang. Semoga tidak ada yang mati malam ini. Pemain malam hari: kalian punya 90 detik untuk beraksi!`; + return conn + .sendMessage(x.room, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb3, 300, 175), + sourceUrl: "", + mediaUrl: thumb3, + }, + }, + }) + .then(() => { + changeDay(x.room, data); + voteDone(x.room, data); + resetVote(x.room, data); + clearAllVote(x.room, data); + if (getWinner(x.room, data).status != null) + return win(x, 1, conn, data); + }); + } else if (hasil_vote === 1) { + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nWarga desa telah memilih, namun hasilnya seri.\n\nBintang memancarkan cahaya indah malam ini, warga desa beristirahat di kediaman masing masing. Pemain malam hari: kalian punya 90 detik untuk beraksi!`; + let ment = []; + return conn + .sendMessage(x.room, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb3, 300, 175), + sourceUrl: "", + mediaUrl: thumb3, + }, + mentionedJid: ment, + }, + }) + .then(() => { + changeDay(x.room, data); + voteDone(x.room, data); + resetVote(x.room, data); + clearAllVote(x.room, data); + if (getWinner(x.room, data).status != null) + return win(x, 1, conn, data); + }); + } else if (hasil_vote != 0 && hasil_vote != 1) { + if (hasil_vote.role === "werewolf") { + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nWarga desa telah memilih dan sepakat @${hasil_vote.id.replace( + "@s.whatsapp.net", + "" + )} dieksekusi mati.\n\n@${hasil_vote.id.replace( + "@s.whatsapp.net", + "" + )} adalah ${hasil_vote.role} ${emoji_role(hasil_vote.role)}`; + voteKill(x.room, data); + let ment = []; + ment.push(hasil_vote.id); + return await conn + .sendMessage(x.room, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb4, 300, 175), + sourceUrl: "", + mediaUrl: thumb4, + }, + mentionedJid: ment, + }, + }) + .then(() => { + changeDay(x.room, data); + voteDone(x.room, data); + resetVote(x.room, data); + clearAllVote(x.room, data); + if (getWinner(x.room, data).status != null) + return win(x, 1, conn, data); + }); + } else { + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nWarga desa telah memilih dan sepakat @${hasil_vote.id.replace( + "@s.whatsapp.net", + "" + )} dieksekusi mati.\n\n@${hasil_vote.id.replace( + "@s.whatsapp.net", + "" + )} adalah ${hasil_vote.role} ${emoji_role( + hasil_vote.role + )}\n\nBulan bersinar terang malam ini, warga desa beristirahat di kediaman masing masing. Pemain malam hari: kalian punya 90 detik untuk beraksi!`; + voteKill(x.room, data); + let ment = []; + ment.push(hasil_vote.id); + return await conn + .sendMessage(x.room, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb4, 300, 175), + sourceUrl: "", + mediaUrl: thumb4, + }, + mentionedJid: ment, + }, + }) + .then(() => { + changeDay(x.room, data); + voteDone(x.room, data); + resetVote(x.room, data); + clearAllVote(x.room, data); + if (getWinner(x.room, data).status != null) + return win(x, 1, conn, data); + }); + } + } +} + +async function skill(conn, x, data) { + skillOn(x.room, data) + if (getWinner(x.room, data).status != null || x.win != null) { + return win(x, 1, conn, data); + } else { + if (!x) return; + if (!x.player) return; + if (x.win != null) return; + let tok1 = "\n"; + let tok2 = "\n"; + let membernya = []; + shortPlayer(x.room, data); + for (let i = 0; i < x.player.length; i++) { + tok1 += `(${x.player[i].number}) @${x.player[i].id.replace( + "@s.whatsapp.net", + "" + )}${x.player[i].isdead === true ? " โ˜ ๏ธ" : ""}\n`; + membernya.push(x.player[i].id); + } + for (let i = 0; i < x.player.length; i++) { + tok2 += `(${x.player[i].number}) @${x.player[i].id.replace( + "@s.whatsapp.net", + "" + )} ${ + x.player[i].role === "werewolf" || x.player[i].role === "sorcerer" + ? `${x.player[i].isdead === true ? ` โ˜ ๏ธ` : ` ${x.player[i].role}`}` + : " " + }\n`; + membernya.push(x.player[i].id); + } + for (let i = 0; i < x.player.length; i++) { + if (x.player[i].role === "werewolf") { + if (x.player[i].isdead != true) { + textnya = `Silahkan pilih salah satu orang yang ingin kamu makan pada malam hari ini\n*LIST PLAYER*:\n${tok2}\n\nKetik *.wwpc kill nomor* untuk membunuh player`; + + await conn.sendMessage(x.player[i].id, { + text: textnya, + mentions: membernya, + }); + } + } else if (x.player[i].role === "warga") { + if (x.player[i].isdead != true) { + textnya = `*โŒ‚ W E R E W O L F - G A M E*\n\nSebagai seorang warga berhati-hatilah, mungkin kamu adalah target selanjutnya.\n*LIST PLAYER*:${tok1}`; + await conn.sendMessage(x.player[i].id, { + text: textnya, + mentions: membernya, + }); + } + } else if (x.player[i].role === "seer") { + if (x.player[i].isdead != true) { + textnya = `Baiklah, siapa yang ingin kamu lihat peran nya kali ini.\n*LIST PLAYER*:${tok1}\n\nKetik *.wwpc dreamy nomor* untuk melihat role player`; + + await conn.sendMessage(x.player[i].id, { + text: textnya, + mentions: membernya, + }); + } + } else if (x.player[i].role === "guardian") { + if (x.player[i].isdead != true) { + textnya = `Kamu adalah seorang*Guardian*, lindungi para warga, silahkan pilih salah 1 player yang ingin kamu lindungi\n*LIST PLAYER*:${tok1}\n\nKetik *.wwpc deff nomor* untuk melindungi player`; + + await conn.sendMessage(x.player[i].id, { + text: textnya, + mentions: membernya, + }); + } + } else if (x.player[i].role === "sorcerer") { + if (x.player[i].isdead != true) { + textnya = `Baiklah, lihat apa yang bisa kamu buat, silakan pilih 1 orang yang ingin kamu buka identitasnya\n*LIST PLAYER*:${tok2}\n\nKetik *.wwpc sorcerer nomor* untuk melihat role player`; + + await conn.sendMessage(x.player[i].id, { + text: textnya, + mentions: membernya, + }); + } + } + } + } +} + +async function win(x, t, conn, data) { + const sesinya = x.room; + if (getWinner(x.room, data).status === false || x.iswin === false) { + textnya = `*W E R E W O L F - W I N*\n\nTEAM WEREWOLF\n\n`; + let ment = []; + for (let i = 0; i < x.player.length; i++) { + if (x.player[i].role === "sorcerer" || x.player[i].role === "werewolf") { + textnya += `${x.player[i].number}) @${x.player[i].id.replace( + "@s.whatsapp.net", + "" + )}\n *Role* : ${x.player[i].role}\n\n`; + ment.push(x.player[i].id); + } + } + return await conn + .sendMessage(sesinya, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb5, 300, 175), + sourceUrl: "", + mediaUrl: thumb5, + }, + mentionedJid: ment, + }, + }) + .then(() => { + delete data[x.room]; + }); + } else if (getWinner(x.room, data).status === true) { + textnya = `*T E A M - W A R G A - W I N*\n\nTEAM WARGA\n\n`; + let ment = []; + for (let i = 0; i < x.player.length; i++) { + if ( + x.player[i].role === "warga" || + x.player[i].role === "guardian" || + x.player[i].role === "seer" + ) { + textnya += `${x.player[i].number}) @${x.player[i].id.replace( + "@s.whatsapp.net", + "" + )}\n *Role* : ${x.player[i].role}\n\n`; + ment.push(x.player[i].id); + } + } + return await conn.sendMessage(sesinya, { + text: textnya, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb6, 300, 175), + sourceUrl: "", + mediaUrl: thumb5, + }, + mentionedJid: ment, + }, + }); + } +} + +// playing +async function run(conn, id, data) { + while (getWinner(id, data).status === null) { + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await pagi(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await voting(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await malam(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await skill(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) break; + } + await win(sesi(id, data), 1, conn, data); +} + +async function run_vote(conn, id, data) { + while (getWinner(id, data).status === null) { + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await voting(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await malam(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await skill(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await pagi(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) break; + } + await win(sesi(id, data), 1, conn, data); +} + +async function run_malam(conn, id, data) { + while (getWinner(id, data).status === null) { + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await skill(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await pagi(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await voting(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await malam(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) break; + } + await win(sesi(id, data), 1, conn, data); +} + +async function run_pagi(conn, id, data) { + while (getWinner(id, data).status === null) { + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await pagi(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await voting(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await malam(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await skill(conn, sesi(id, data), data); + } + if (getWinner(id, data).status != null) { + win(getWinner(id, data), 1, conn, data); + break; + } else { + await sleep(90000); + } + if (getWinner(id, data).status != null) break; + } + await win(sesi(id, data), 1, conn, data); +} + +module.exports = { + emoji_role, + sesi, + playerOnGame, + playerOnRoom, + playerExit, + dataPlayer, + dataPlayerById, + getPlayerById, + getPlayerById2, + killWerewolf, + killww, + dreamySeer, + sorcerer, + protectGuardian, + roleShuffle, + roleChanger, + roleAmount, + roleGenerator, + addTimer, + startGame, + playerHidup, + playerMati, + vote, + voteResult, + clearAllVote, + getWinner, + win, + pagi, + malam, + skill, + voteStart, + voteDone, + voting, + run, + run_vote, + run_malam, + run_pagi, +}; diff --git a/main.js b/main.js new file mode 100644 index 0000000000000000000000000000000000000000..28c86e0dcc55242d4c631f10689a33508d4449cc --- /dev/null +++ b/main.js @@ -0,0 +1 @@ +function _0x481f(_0x2d9a8c,_0x5cf6ea){const _0x5b4026=_0x5b40();return _0x481f=function(_0x481fd1,_0x38e3d2){_0x481fd1=_0x481fd1-0x1a5;let _0x18b451=_0x5b4026[_0x481fd1];return _0x18b451;},_0x481f(_0x2d9a8c,_0x5cf6ea);}function _0x5b40(){const _0x1ccc65=['-filter_complex','blue','resolve','freeze','catch','649pMZqFi','node-fetch','test','close','API','sessions','loadDatabase','info','stdin','requestPairingCode','demote','prefix','warn','authState','Your\x20Pairing\x20Code\x20:\x20','handler','statusCode','color','fromEntries','write','./config','-loglevel','syntax\x20error\x20while\x20loading\x20\x27','-type','@user\x20sekarang\x20admin!','localeCompare','6nYWQcq','all','readyState','chain','deleted\x20plugin\x20\x27','welcome','12GrZzCc','existsSync','ffprobe','reload','filter','--code','4cZEekY','loggedOut','bgWhite','version','forEach','Ubuntu','readdirSync',',\x20isLatest:\x20','entries','bye','question','slice','-amin','--mobile','read','294362uFQyXl','-hide_banner','creds','log','bind','--\x20using\x20WA\x20v','watch','done','child_process','stdout','parse','includes','--version','chalk','tmp','readline','match','23543741rBCtpZ','readFileSync','./lib/lowdb','some','cache','bgGreen','conn','201960bAkgyp','timestamp','listMessage','32oPHpYQ','Stickers\x20may\x20not\x20work\x20without\x20imagemagick\x20if\x20libwebp\x20on\x20ffmpeg\x20doesnt\x20isntalled\x20(pkg\x20install\x20imagemagick)','error','black','argv','object','APIs','219231MqxGxn','Selamat\x20datang\x20@user\x20di\x20group\x20@subject\x20utamakan\x20baca\x20desk\x20ya\x20\x0a@desc','data','2036529vvzxWV','credsUpdate','group-participants.update','1154705hQLQSN','connectionUpdate','createInterface','convert','CONNECTING','tmpdir','\x20--','white','blueBright','lowdb','connection.update','participantsUpdate','makeWASocket','replace','READ','onDelete','lodash','https://raw.githubusercontent.com/WhiskeySockets/Baileys/master/src/Defaults/baileys-version.json','./sessions/creds.json','./lib/simple','requiring\x20new\x20plugin\x20\x27','-delete','creds.update','spawn','env','@adiwajshing/baileys','yargs/yargs','pino','support','ENTER\x20A\x20VALID\x20NUMBER\x20START\x20WITH\x20REGION\x20CODE.\x20Example\x20:\x2062xxx:\x0a','re\x20-\x20require\x20plugin\x20\x27','ffmpeg','reloadHandler','--\x20WARNING:\x20creds.json\x20is\x20broken,\x20please\x20delete\x20it\x20first\x20--','join','--\x20Please\x20wait,\x20generating\x20code...\x20--','yellow','keys','exit','isInit','plugins','off','length','find','then','โ€ŽxzXZ/i!#$%+ยฃยขโ‚ฌยฅ^ยฐ=ยถโˆ†ร—รทฯ€โˆšโœ“ยฉยฎ:;?&.\x5c-','magick','delete','12945632nCBsAm','connect','\x5c$&','APIKeys','messages.upsert','buttonsMessage','silent','logger','52hYQNfE','isBuffer','PORT','Stickers\x20may\x20not\x20animated\x20without\x20libwebp\x20on\x20ffmpeg\x20(--enable-ibwebp\x20while\x20compiling\x20ffmpeg)','templateMessage','output','--pairing'];_0x5b40=function(){return _0x1ccc65;};return _0x5b40();}(function(_0x56617c,_0x4d141e){const _0x54a23f=_0x481f,_0x5ac6cc=_0x56617c();while(!![]){try{const _0x4128ec=parseInt(_0x54a23f(0x1fe))/0x1*(parseInt(_0x54a23f(0x1ef))/0x2)+parseInt(_0x54a23f(0x220))/0x3*(parseInt(_0x54a23f(0x1bd))/0x4)+-parseInt(_0x54a23f(0x226))/0x5+-parseInt(_0x54a23f(0x1e3))/0x6*(parseInt(_0x54a23f(0x1b5))/0x7)+-parseInt(_0x54a23f(0x219))/0x8*(-parseInt(_0x54a23f(0x223))/0x9)+parseInt(_0x54a23f(0x216))/0xa*(-parseInt(_0x54a23f(0x1c9))/0xb)+-parseInt(_0x54a23f(0x1e9))/0xc*(-parseInt(_0x54a23f(0x20f))/0xd);if(_0x4128ec===_0x4d141e)break;else _0x5ac6cc['push'](_0x5ac6cc['shift']());}catch(_0x5446a3){_0x5ac6cc['push'](_0x5ac6cc['shift']());}}}(_0x5b40,0xefff1),((async()=>{const _0x2cbaaa=_0x481f;require(_0x2cbaaa(0x1dd));const {useMultiFileAuthState:_0x533881,DisconnectReason:_0x53ced4,generateForwardMessageContent:_0x23bf46,prepareWAMessageMedia:_0x901b1,generateWAMessageFromContent:_0x5042cb,generateMessageID:_0x54905c,downloadContentFromMessage:_0x347add,makeInMemoryStore:_0x30e0b3,jidDecode:_0x4612e5,PHONENUMBER_MCC:_0x26ff49,fetchLatestBaileysVersion:_0x1785e0,proto:_0x2d6734}=require(_0x2cbaaa(0x23f)),_0x49398d=require(_0x2cbaaa(0x241)),_0x524852=require('ws'),_0x680a27=require('path'),_0x32f29f=require('fs'),_0x276499=require(_0x2cbaaa(0x240)),_0xc1204a=require(_0x2cbaaa(0x206)),_0x1ecbca=require(_0x2cbaaa(0x236)),_0x392d82=require('syntax-error'),_0x2a59f1=require(_0x2cbaaa(0x241)),_0x470804=require('os'),_0x58b12a=require(_0x2cbaaa(0x1ca)),_0x88dc80=require(_0x2cbaaa(0x20b));let _0x23c5c6=require(_0x2cbaaa(0x239));var _0x563417;try{_0x563417=require(_0x2cbaaa(0x22f));}catch(_0x3b3723){_0x563417=require(_0x2cbaaa(0x211));}const {Low:_0x133260,JSONFile:_0x2627b5}=_0x563417,_0x27d6e2=require('./lib/mongoDB'),_0x196326=require(_0x2cbaaa(0x20d)),_0x2ab022=process[_0x2cbaaa(0x21d)]['includes'](_0x2cbaaa(0x1ee))||process['argv'][_0x2cbaaa(0x209)](_0x2cbaaa(0x1c3)),_0x4c1105=process[_0x2cbaaa(0x21d)][_0x2cbaaa(0x209)](_0x2cbaaa(0x1fc)),_0x47ba5e=_0x196326[_0x2cbaaa(0x228)]({'input':process[_0x2cbaaa(0x1d1)],'output':process[_0x2cbaaa(0x207)]}),_0x3bc568=_0x5317ce=>new Promise(_0x55cf2f=>_0x47ba5e[_0x2cbaaa(0x1f9)](_0x5317ce,_0x55cf2f));global[_0x2cbaaa(0x1cd)]=(_0x453b31,_0x5ea4d0='/',_0x1d2fe3={},_0x1bc09b)=>(_0x453b31 in global[_0x2cbaaa(0x21f)]?global[_0x2cbaaa(0x21f)][_0x453b31]:_0x453b31)+_0x5ea4d0+(_0x1d2fe3||_0x1bc09b?'?'+new URLSearchParams(Object[_0x2cbaaa(0x1f7)]({..._0x1d2fe3,..._0x1bc09b?{[_0x1bc09b]:global[_0x2cbaaa(0x1b8)][_0x453b31 in global['APIs']?global['APIs'][_0x453b31]:_0x453b31]}:{}})):''),global['timestamp']={'start':new Date()};const _0x410e4c=process[_0x2cbaaa(0x23e)][_0x2cbaaa(0x1bf)]||0xbb8;global['opts']=new Object(_0x276499(process[_0x2cbaaa(0x21d)][_0x2cbaaa(0x1fa)](0x2))['exitProcess'](![])[_0x2cbaaa(0x208)]()),global[_0x2cbaaa(0x1d4)]=new RegExp('^['+(opts[_0x2cbaaa(0x1d4)]||_0x2cbaaa(0x1b2))['replace'](/[|\\{}()[\]^$+*?.\-\^]/g,_0x2cbaaa(0x1b7))+']'),global['db']=new _0x133260(/https?:\/\//[_0x2cbaaa(0x1cb)](opts['db']||'')?new cloudDBAdapter(opts['db']):/mongodb/[_0x2cbaaa(0x1cb)](opts['db'])?new _0x27d6e2(opts['db']):new _0x2627b5((opts['_'][0x0]?opts['_'][0x0]+'_':'')+'database.json')),global['DATABASE']=global['db'],global[_0x2cbaaa(0x1cf)]=async function _0x4cc2a4(){const _0x379258=_0x2cbaaa;if(global['db']['READ'])return new Promise(_0x189c0c=>setInterval(function(){const _0x14b2d3=_0x481f;!global['db'][_0x14b2d3(0x234)]?(clearInterval(this),_0x189c0c(global['db'][_0x14b2d3(0x222)]==null?global['loadDatabase']():global['db'][_0x14b2d3(0x222)])):null;},0x1*0x3e8));if(global['db'][_0x379258(0x222)]!==null)return;global['db'][_0x379258(0x234)]=!![],await global['db'][_0x379258(0x1fd)](),global['db'][_0x379258(0x234)]=![],global['db']['data']={'users':{},'chats':{},'stats':{},'msgs':{},'sticker':{},...global['db'][_0x379258(0x222)]||{}},global['db'][_0x379258(0x1e6)]=_0x1ecbca[_0x379258(0x1e6)](global['db'][_0x379258(0x222)]);},loadDatabase();const _0x515740=''+(opts['_'][0x0]||_0x2cbaaa(0x1ce));global[_0x2cbaaa(0x1ac)]=!_0x32f29f[_0x2cbaaa(0x1ea)](_0x515740);const {state:_0x5193b2,saveState:_0x1bd7c8,saveCreds:_0x31aff6}=await _0x533881(_0x515740),{version:_0x5a53bc,isLatest:_0x59dded}=await _0x1785e0();console[_0x2cbaaa(0x201)](_0x88dc80['magenta'](_0x2cbaaa(0x203)+_0x5a53bc['join']('.')+_0x2cbaaa(0x1f6)+_0x59dded+_0x2cbaaa(0x22c)));const _0x12181b={'printQRInTerminal':!_0x2ab022,'syncFullHistory':!![],'markOnlineOnConnect':!![],'connectTimeoutMs':0xea60,'defaultQueryTimeoutMs':0x0,'keepAliveIntervalMs':0x2710,'generateHighQualityLinkPreview':!![],'patchMessageBeforeSending':_0x5826df=>{const _0x108a11=_0x2cbaaa,_0x328020=!!(_0x5826df[_0x108a11(0x1ba)]||_0x5826df[_0x108a11(0x1c1)]||_0x5826df[_0x108a11(0x218)]);return _0x328020&&(_0x5826df={'viewOnceMessage':{'message':{'messageContextInfo':{'deviceListMetadataVersion':0x2,'deviceListMetadata':{}},..._0x5826df}}}),_0x5826df;},'auth':_0x5193b2,'browser':[_0x2cbaaa(0x1f4),'Chrome','20.0.04'],'logger':_0x49398d({'level':_0x2cbaaa(0x1bb)}),'version':(await(await _0x58b12a(_0x2cbaaa(0x237)))['json']())[_0x2cbaaa(0x1f2)]};global[_0x2cbaaa(0x215)]=_0x23c5c6[_0x2cbaaa(0x232)](_0x12181b);if(!opts[_0x2cbaaa(0x1cb)]){if(global['db'])setInterval(async()=>{const _0x7aabbb=_0x2cbaaa;if(global['db'][_0x7aabbb(0x222)])await global['db'][_0x7aabbb(0x1dc)]();if(!opts[_0x7aabbb(0x20c)]&&(global[_0x7aabbb(0x242)]||{})['find'])tmp=[_0x470804[_0x7aabbb(0x22b)](),_0x7aabbb(0x20c)],tmp[_0x7aabbb(0x1f3)](_0x400962=>_0xc1204a[_0x7aabbb(0x23d)](_0x7aabbb(0x1b0),[_0x400962,_0x7aabbb(0x1fb),'3',_0x7aabbb(0x1e0),'f',_0x7aabbb(0x23b)]));},0x1e*0x3e8);}async function _0x478e67(_0x219e74){const _0x33abb9=_0x2cbaaa,{connection:_0x4b1c77,lastDisconnect:_0x514321}=_0x219e74;global[_0x33abb9(0x217)][_0x33abb9(0x1b6)]=new Date();_0x514321&&_0x514321['error']&&_0x514321['error'][_0x33abb9(0x1c2)]&&_0x514321['error'][_0x33abb9(0x1c2)][_0x33abb9(0x1d9)]!==_0x53ced4[_0x33abb9(0x1f0)]&&conn['ws'][_0x33abb9(0x1e5)]!==_0x524852[_0x33abb9(0x22a)]&&console[_0x33abb9(0x201)](global[_0x33abb9(0x1a5)](!![]));if(global['db'][_0x33abb9(0x222)]==null)await loadDatabase();}(_0x2ab022||_0x4c1105)&&_0x32f29f[_0x2cbaaa(0x1ea)](_0x2cbaaa(0x238))&&!conn[_0x2cbaaa(0x1d6)][_0x2cbaaa(0x200)]['registered']&&(console[_0x2cbaaa(0x201)](_0x88dc80[_0x2cbaaa(0x1a9)](_0x2cbaaa(0x1a6))),process[_0x2cbaaa(0x1ab)](0x0));if(_0x2ab022&&!conn[_0x2cbaaa(0x1d6)]['creds']['registered']){if(_0x4c1105)throw new Error('Cannot\x20use\x20pairing\x20code\x20with\x20mobile\x20api');const {registration:_0x2598d5}={'registration':{}};let _0x25d10d='';do{_0x25d10d=await _0x3bc568(_0x88dc80[_0x2cbaaa(0x22e)](_0x2cbaaa(0x243)));}while(!Object[_0x2cbaaa(0x1aa)](_0x26ff49)[_0x2cbaaa(0x212)](_0x4141a0=>_0x25d10d['startsWith'](_0x4141a0)));_0x47ba5e['close'](),_0x25d10d=_0x25d10d[_0x2cbaaa(0x233)](/\D/g,''),console[_0x2cbaaa(0x201)](_0x88dc80[_0x2cbaaa(0x1f1)](_0x88dc80[_0x2cbaaa(0x1c5)](_0x2cbaaa(0x1a8)))),setTimeout(async()=>{const _0x334585=_0x2cbaaa;let _0x1198cf=await conn[_0x334585(0x1d2)](_0x25d10d);_0x1198cf=_0x1198cf?.[_0x334585(0x20e)](/.{1,4}/g)?.[_0x334585(0x1a7)]('-')||_0x1198cf,console['log'](_0x88dc80[_0x334585(0x21c)](_0x88dc80[_0x334585(0x214)](_0x334585(0x1d7))),_0x88dc80[_0x334585(0x21c)](_0x88dc80[_0x334585(0x22d)](_0x1198cf)));},0xbb8);}process['on']('uncaughtException',console[_0x2cbaaa(0x21b)]);const _0x28dbc1=_0x30060a=>{const _0x59cfa4=_0x2cbaaa;_0x30060a=require[_0x59cfa4(0x1c6)](_0x30060a);let _0x5db7b4,_0x2a1668=0x0;do{if(_0x30060a in require[_0x59cfa4(0x213)])delete require[_0x59cfa4(0x213)][_0x30060a];_0x5db7b4=require(_0x30060a),_0x2a1668++;}while((!_0x5db7b4||(Array['isArray'](_0x5db7b4)||_0x5db7b4 instanceof String)?!(_0x5db7b4||[])[_0x59cfa4(0x1af)]:typeof _0x5db7b4==_0x59cfa4(0x21e)&&!Buffer[_0x59cfa4(0x1be)](_0x5db7b4)?!Object[_0x59cfa4(0x1aa)](_0x5db7b4||{})[_0x59cfa4(0x1af)]:!![])&&_0x2a1668<=0xa);return _0x5db7b4;};let _0x4dd1f2=!![];global[_0x2cbaaa(0x1a5)]=function(_0x530614){const _0x507ca1=_0x2cbaaa;let _0x4f81f4=_0x28dbc1('./handler');if(_0x530614){try{global['conn']['ws']['close']();}catch{}global[_0x507ca1(0x215)]={...global[_0x507ca1(0x215)],..._0x23c5c6[_0x507ca1(0x232)](_0x12181b)};}return!_0x4dd1f2&&(conn['ev'][_0x507ca1(0x1ae)](_0x507ca1(0x1b9),conn[_0x507ca1(0x1d8)]),conn['ev'][_0x507ca1(0x1ae)](_0x507ca1(0x225),conn[_0x507ca1(0x231)]),conn['ev'][_0x507ca1(0x1ae)]('message.delete',conn[_0x507ca1(0x235)]),conn['ev'][_0x507ca1(0x1ae)](_0x507ca1(0x230),conn[_0x507ca1(0x227)]),conn['ev']['off'](_0x507ca1(0x23c),conn[_0x507ca1(0x224)])),conn[_0x507ca1(0x1e8)]=_0x507ca1(0x221),conn[_0x507ca1(0x1f8)]='Selamat\x20tinggal\x20@user\x20๐Ÿ‘‹',conn['promote']=_0x507ca1(0x1e1),conn[_0x507ca1(0x1d3)]='@user\x20sekarang\x20bukan\x20admin!',conn[_0x507ca1(0x1d8)]=_0x4f81f4[_0x507ca1(0x1d8)]['bind'](conn),conn['participantsUpdate']=_0x4f81f4[_0x507ca1(0x231)][_0x507ca1(0x202)](conn),conn[_0x507ca1(0x235)]=_0x4f81f4[_0x507ca1(0x1b4)][_0x507ca1(0x202)](conn),conn['connectionUpdate']=_0x478e67['bind'](conn),conn['credsUpdate']=_0x31aff6[_0x507ca1(0x202)](conn),conn['ev']['on'](_0x507ca1(0x1b9),conn[_0x507ca1(0x1d8)]),conn['ev']['on']('group-participants.update',conn[_0x507ca1(0x231)]),conn['ev']['on']('message.delete',conn[_0x507ca1(0x235)]),conn['ev']['on'](_0x507ca1(0x230),conn[_0x507ca1(0x227)]),conn['ev']['on'](_0x507ca1(0x23c),conn[_0x507ca1(0x224)]),_0x4dd1f2=![],!![];};let _0xfbc211=_0x680a27[_0x2cbaaa(0x1a7)](__dirname,_0x2cbaaa(0x1ad)),_0x38c1fe=_0x1ca55d=>/\.js$/[_0x2cbaaa(0x1cb)](_0x1ca55d);global[_0x2cbaaa(0x1ad)]={};for(let _0x2dbb31 of _0x32f29f[_0x2cbaaa(0x1f5)](_0xfbc211)[_0x2cbaaa(0x1ed)](_0x38c1fe)){try{global[_0x2cbaaa(0x1ad)][_0x2dbb31]=require(_0x680a27[_0x2cbaaa(0x1a7)](_0xfbc211,_0x2dbb31));}catch(_0x198e42){conn['logger'][_0x2cbaaa(0x21b)](_0x198e42),delete global[_0x2cbaaa(0x1ad)][_0x2dbb31];}}console[_0x2cbaaa(0x201)](Object[_0x2cbaaa(0x1aa)](global[_0x2cbaaa(0x1ad)])),global[_0x2cbaaa(0x1ec)]=(_0x3113db,_0x35b4ad)=>{const _0x44998a=_0x2cbaaa;if(_0x38c1fe(_0x35b4ad)){let _0x40f89c=_0x680a27[_0x44998a(0x1a7)](_0xfbc211,_0x35b4ad);if(_0x40f89c in require[_0x44998a(0x213)]){delete require['cache'][_0x40f89c];if(_0x32f29f[_0x44998a(0x1ea)](_0x40f89c))conn['logger'][_0x44998a(0x1d0)](_0x44998a(0x244)+_0x35b4ad+'\x27');else return conn[_0x44998a(0x1bc)][_0x44998a(0x1d5)](_0x44998a(0x1e7)+_0x35b4ad+'\x27'),delete global['plugins'][_0x35b4ad];}else conn[_0x44998a(0x1bc)]['info'](_0x44998a(0x23a)+_0x35b4ad+'\x27');let _0x411a74=_0x392d82(_0x32f29f[_0x44998a(0x210)](_0x40f89c),_0x35b4ad);if(_0x411a74)conn['logger'][_0x44998a(0x21b)](_0x44998a(0x1df)+_0x35b4ad+'\x27\x0a'+_0x411a74);else try{global['plugins'][_0x35b4ad]=require(_0x40f89c);}catch(_0x9093fd){conn[_0x44998a(0x1bc)][_0x44998a(0x21b)](_0x9093fd);}finally{global['plugins']=Object[_0x44998a(0x1db)](Object[_0x44998a(0x1f7)](global[_0x44998a(0x1ad)])['sort'](([_0x510347],[_0x59a90c])=>_0x510347[_0x44998a(0x1e2)](_0x59a90c)));}}},Object[_0x2cbaaa(0x1c7)](global[_0x2cbaaa(0x1ec)]),_0x32f29f[_0x2cbaaa(0x204)](_0x680a27[_0x2cbaaa(0x1a7)](__dirname,'plugins'),global['reload']),global['reloadHandler']();async function _0x5adff5(){const _0x16186c=_0x2cbaaa;let _0x547272=await Promise[_0x16186c(0x1e4)]([_0xc1204a[_0x16186c(0x23d)](_0x16186c(0x245)),_0xc1204a[_0x16186c(0x23d)](_0x16186c(0x1eb)),_0xc1204a['spawn'](_0x16186c(0x245),[_0x16186c(0x1ff),_0x16186c(0x1de),_0x16186c(0x21b),_0x16186c(0x1c4),_0x16186c(0x1da),'-frames:v','1','-f','webp','-']),_0xc1204a[_0x16186c(0x23d)](_0x16186c(0x229)),_0xc1204a[_0x16186c(0x23d)]('magick'),_0xc1204a[_0x16186c(0x23d)]('gm'),_0xc1204a[_0x16186c(0x23d)](_0x16186c(0x1b0),[_0x16186c(0x20a)])]['map'](_0x568faa=>{return Promise['race']([new Promise(_0xefe56c=>{const _0xe8e291=_0x481f;_0x568faa['on'](_0xe8e291(0x1cc),_0x2e4897=>{_0xefe56c(_0x2e4897!==0x7f);});}),new Promise(_0x465155=>{const _0x503eb2=_0x481f;_0x568faa['on'](_0x503eb2(0x21b),_0x2285de=>_0x465155(![]));})]);})),[_0x56d1f2,_0xf82eba,_0x493eb5,_0x5d3325,_0x297d5e,_0x1d4e33,_0x776094]=_0x547272;console['log'](_0x547272);let _0x2db56a=global[_0x16186c(0x242)]={'ffmpeg':_0x56d1f2,'ffprobe':_0xf82eba,'ffmpegWebp':_0x493eb5,'convert':_0x5d3325,'magick':_0x297d5e,'gm':_0x1d4e33,'find':_0x776094};Object[_0x16186c(0x1c7)](global[_0x16186c(0x242)]);if(!_0x2db56a[_0x16186c(0x245)])conn[_0x16186c(0x1bc)][_0x16186c(0x1d5)]('Please\x20install\x20ffmpeg\x20for\x20sending\x20videos\x20(pkg\x20install\x20ffmpeg)');if(_0x2db56a[_0x16186c(0x245)]&&!_0x2db56a['ffmpegWebp'])conn['logger'][_0x16186c(0x1d5)](_0x16186c(0x1c0));if(!_0x2db56a[_0x16186c(0x229)]&&!_0x2db56a[_0x16186c(0x1b3)]&&!_0x2db56a['gm'])conn[_0x16186c(0x1bc)][_0x16186c(0x1d5)](_0x16186c(0x21a));}_0x5adff5()[_0x2cbaaa(0x1b1)](()=>conn['logger'][_0x2cbaaa(0x1d0)]('Quick\x20Test\x20Done'))[_0x2cbaaa(0x1c8)](_0x2cbaaa(0x205));})())); diff --git a/media/sticker/emror.webp b/media/sticker/emror.webp new file mode 100644 index 0000000000000000000000000000000000000000..7d13ff13010f3da6005519af2a7414a51f0d4c09 Binary files /dev/null and b/media/sticker/emror.webp differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..bbccd94e130fc796c5ebdf76c76a1466d551d2ad --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11062 @@ +{ + "name": "rtxzy", + "version": "8.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rtxzy", + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "@adiwajshing/baileys": "npm:@whiskeysockets/baileys@6.7.8", + "@adiwajshing/keyed-db": "^0.2.4", + "@bochilteam/scraper": "^3.0.0", + "@vitalets/google-translate-api": "^9.0.0", + "async": "^3.2.4", + "awesome-phonenumber": "^2.64.0", + "axios": "^0.27.2", + "base64-to-image": "^1.0.2", + "btch-downloader": "^2.8.0", + "chalk": "^4.1.2", + "cheerio": "^1.0.0-rc.12", + "colors": "1.4.0", + "didyoumean": "^1.2.2", + "express": "^4.18.2", + "file-type": "^16.5.3", + "form-data": "^4.0.0", + "google-it": "^1.6.3", + "human-readable": "^0.2.1", + "javascript-obfuscator": "^4.0.2", + "jsdom": "^20.0.0", + "link-preview-js": "^3.0.4", + "lodash": "^4.17.21", + "lowdb": "^2.1.0", + "moment-timezone": "^0.5.37", + "mongoose": "^6.0.14", + "node-fetch": "^2.6.9", + "node-gtts": "2.0.2", + "node-os-utils": "^1.3.7", + "node-webpmux": "^3.1.3", + "nodemon": "^2.0.20", + "ocr-space-api-wrapper": "^2.2.0", + "os": "^0.1.2", + "perf_hooks": "^0.0.1", + "qrcode": "^1.5.0", + "qrcode-terminal": "^0.12.0", + "readline": "^1.3.0", + "sharp": "^0.32.6", + "similarity": "^1.2.1", + "socket.io": "^4.5.1", + "syntax-error": "^1.4.0", + "terminal-image": "^2.0.0", + "tiktokdl": "^0.0.5", + "url": "^0.11.0", + "url-regex": "^5.0.0", + "url-regex-safe": "^2.1.0", + "util": "^0.12.4", + "wa-sticker-formatter": "^4.3.2", + "yargs": "^17.5.1", + "yt-search": "^2.10.3", + "ytdl-core": "npm:@distube/ytdl-core" + } + }, + "node_modules/@adiwajshing/baileys": { + "name": "@whiskeysockets/baileys", + "version": "6.7.8", + "resolved": "https://registry.npmjs.org/@whiskeysockets/baileys/-/baileys-6.7.8.tgz", + "integrity": "sha512-2e3j+LiFeouNkssvKEgdKlZxfLK9SqJjHqn/TewJD7NC77z5MBb+CVKRCnEqJzqfT/5d00oKHPK3I57cRFeUgw==", + "dependencies": { + "@adiwajshing/keyed-db": "^0.2.4", + "@hapi/boom": "^9.1.3", + "async-lock": "^1.4.1", + "audio-decode": "^2.1.3", + "axios": "^1.6.0", + "cache-manager": "^5.7.6", + "futoin-hkdf": "^1.5.1", + "libphonenumber-js": "^1.10.20", + "libsignal": "github:WhiskeySockets/libsignal-node", + "lodash": "^4.17.21", + "music-metadata": "^7.12.3", + "node-cache": "^5.1.2", + "pino": "^7.0.0", + "protobufjs": "^7.2.4", + "uuid": "^10.0.0", + "ws": "^8.13.0" + }, + "peerDependencies": { + "jimp": "^0.16.1", + "link-preview-js": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "sharp": "^0.32.6" + }, + "peerDependenciesMeta": { + "jimp": { + "optional": true + }, + "link-preview-js": { + "optional": true + }, + "qrcode-terminal": { + "optional": true + }, + "sharp": { + "optional": true + } + } + }, + "node_modules/@adiwajshing/baileys/node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@adiwajshing/keyed-db": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@adiwajshing/keyed-db/-/keyed-db-0.2.4.tgz", + "integrity": "sha512-yprSnAtj80/VKuDqRcFFLDYltoNV8tChNwFfIgcf6PGD4sjzWIBgs08pRuTqGH5mk5wgL6PBRSsMCZqtZwzFEw==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "optional": true, + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.709.0.tgz", + "integrity": "sha512-I5a8ilF+jKAz6fmOOuHy2UEcod9ikRGBjACcC6ayxs4z4VqTnWynD6ALKvtUR3lk1Ur6nzAG1tTm/qAYKKmyBg==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.709.0", + "@aws-sdk/client-sts": "3.709.0", + "@aws-sdk/core": "3.709.0", + "@aws-sdk/credential-provider-node": "3.709.0", + "@aws-sdk/middleware-host-header": "3.709.0", + "@aws-sdk/middleware-logger": "3.709.0", + "@aws-sdk/middleware-recursion-detection": "3.709.0", + "@aws-sdk/middleware-user-agent": "3.709.0", + "@aws-sdk/region-config-resolver": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@aws-sdk/util-endpoints": "3.709.0", + "@aws-sdk/util-user-agent-browser": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.709.0", + "@smithy/config-resolver": "^3.0.13", + "@smithy/core": "^2.5.5", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/hash-node": "^3.0.11", + "@smithy/invalid-dependency": "^3.0.11", + "@smithy/middleware-content-length": "^3.0.13", + "@smithy/middleware-endpoint": "^3.2.5", + "@smithy/middleware-retry": "^3.0.30", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/protocol-http": "^4.1.8", + "@smithy/smithy-client": "^3.5.0", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.30", + "@smithy/util-defaults-mode-node": "^3.0.30", + "@smithy/util-endpoints": "^2.1.7", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.709.0.tgz", + "integrity": "sha512-Qxeo8cN0jNy6Wnbqq4wucffAGJM6sJjofoTgNtPA6cC7sPYx7aYC6OAAAo6NaMRY+WywOKdS9Wgjx2QYRxKx7w==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.709.0", + "@aws-sdk/middleware-host-header": "3.709.0", + "@aws-sdk/middleware-logger": "3.709.0", + "@aws-sdk/middleware-recursion-detection": "3.709.0", + "@aws-sdk/middleware-user-agent": "3.709.0", + "@aws-sdk/region-config-resolver": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@aws-sdk/util-endpoints": "3.709.0", + "@aws-sdk/util-user-agent-browser": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.709.0", + "@smithy/config-resolver": "^3.0.13", + "@smithy/core": "^2.5.5", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/hash-node": "^3.0.11", + "@smithy/invalid-dependency": "^3.0.11", + "@smithy/middleware-content-length": "^3.0.13", + "@smithy/middleware-endpoint": "^3.2.5", + "@smithy/middleware-retry": "^3.0.30", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/protocol-http": "^4.1.8", + "@smithy/smithy-client": "^3.5.0", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.30", + "@smithy/util-defaults-mode-node": "^3.0.30", + "@smithy/util-endpoints": "^2.1.7", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.709.0.tgz", + "integrity": "sha512-1w6egz17QQy661lNCRmZZlqIANEbD6g2VFAQIJbVwSiu7brg+GUns+mT1eLLLHAMQc1sL0Ds8/ybSK2SrgGgIA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.709.0", + "@aws-sdk/credential-provider-node": "3.709.0", + "@aws-sdk/middleware-host-header": "3.709.0", + "@aws-sdk/middleware-logger": "3.709.0", + "@aws-sdk/middleware-recursion-detection": "3.709.0", + "@aws-sdk/middleware-user-agent": "3.709.0", + "@aws-sdk/region-config-resolver": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@aws-sdk/util-endpoints": "3.709.0", + "@aws-sdk/util-user-agent-browser": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.709.0", + "@smithy/config-resolver": "^3.0.13", + "@smithy/core": "^2.5.5", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/hash-node": "^3.0.11", + "@smithy/invalid-dependency": "^3.0.11", + "@smithy/middleware-content-length": "^3.0.13", + "@smithy/middleware-endpoint": "^3.2.5", + "@smithy/middleware-retry": "^3.0.30", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/protocol-http": "^4.1.8", + "@smithy/smithy-client": "^3.5.0", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.30", + "@smithy/util-defaults-mode-node": "^3.0.30", + "@smithy/util-endpoints": "^2.1.7", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.709.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/client-sso/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.709.0.tgz", + "integrity": "sha512-cBAvlPg6yslXNL385UUGFPw+XY+lA9BzioNdIFkMo3fEUlTShogTtiWz4LsyLHoN6LhKojssP9DSmmWKWjCZIw==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.709.0", + "@aws-sdk/core": "3.709.0", + "@aws-sdk/credential-provider-node": "3.709.0", + "@aws-sdk/middleware-host-header": "3.709.0", + "@aws-sdk/middleware-logger": "3.709.0", + "@aws-sdk/middleware-recursion-detection": "3.709.0", + "@aws-sdk/middleware-user-agent": "3.709.0", + "@aws-sdk/region-config-resolver": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@aws-sdk/util-endpoints": "3.709.0", + "@aws-sdk/util-user-agent-browser": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.709.0", + "@smithy/config-resolver": "^3.0.13", + "@smithy/core": "^2.5.5", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/hash-node": "^3.0.11", + "@smithy/invalid-dependency": "^3.0.11", + "@smithy/middleware-content-length": "^3.0.13", + "@smithy/middleware-endpoint": "^3.2.5", + "@smithy/middleware-retry": "^3.0.30", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/protocol-http": "^4.1.8", + "@smithy/smithy-client": "^3.5.0", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.30", + "@smithy/util-defaults-mode-node": "^3.0.30", + "@smithy/util-endpoints": "^2.1.7", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/core": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.709.0.tgz", + "integrity": "sha512-7kuSpzdOTAE026j85wq/fN9UDZ70n0OHw81vFqMWwlEFtm5IQ/MRCLKcC4HkXxTdfy1PqFlmoXxWqeBa15tujw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.709.0", + "@smithy/core": "^2.5.5", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/property-provider": "^3.1.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/signature-v4": "^4.2.4", + "@smithy/smithy-client": "^3.5.0", + "@smithy/types": "^3.7.2", + "@smithy/util-middleware": "^3.0.11", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.709.0.tgz", + "integrity": "sha512-WLzDcYo7pob8fPeeOhgVqYuV21uUKWb1RobITQzZhv0ZSToIl1KjuyRQsznC23Sot9CFl+0V2QLFFNwRiIuH7w==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.709.0.tgz", + "integrity": "sha512-ZMAp9LSikvHDFVa84dKpQmow6wsg956Um20cKuioPpX2GGreJFur7oduD+tRJT6FtIOHn+64YH+0MwiXLhsaIQ==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.709.0.tgz", + "integrity": "sha512-lIS7XLwCOyJnLD70f+VIRr8DNV1HPQe9oN6aguYrhoczqz7vDiVZLe3lh714cJqq9rdxzFypK5DqKHmcscMEPQ==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/property-provider": "^3.1.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/smithy-client": "^3.5.0", + "@smithy/types": "^3.7.2", + "@smithy/util-stream": "^3.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.709.0.tgz", + "integrity": "sha512-qCF8IIGcPoUp+Ib3ANhbF5gElxFd+kIrtv2/1tKdvhudMANstQbMiWV0LTH47ZZR6c3as4iSrm09NZnpEoD/pA==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.709.0", + "@aws-sdk/credential-provider-env": "3.709.0", + "@aws-sdk/credential-provider-http": "3.709.0", + "@aws-sdk/credential-provider-process": "3.709.0", + "@aws-sdk/credential-provider-sso": "3.709.0", + "@aws-sdk/credential-provider-web-identity": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@smithy/credential-provider-imds": "^3.2.8", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.709.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.709.0.tgz", + "integrity": "sha512-4HRX9KYWPSjO5O/Vg03YAsebKpvTjTvpK1n7zHYBmlLMBLxUrVsL1nNKKC5p2/7OW3RL8XR1ki3QkoV7kGRxUQ==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.709.0", + "@aws-sdk/credential-provider-http": "3.709.0", + "@aws-sdk/credential-provider-ini": "3.709.0", + "@aws-sdk/credential-provider-process": "3.709.0", + "@aws-sdk/credential-provider-sso": "3.709.0", + "@aws-sdk/credential-provider-web-identity": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@smithy/credential-provider-imds": "^3.2.8", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.709.0.tgz", + "integrity": "sha512-IAC+jPlGQII6jhIylHOwh3RgSobqlgL59nw2qYTURr8hMCI0Z1p5y2ee646HTVt4WeCYyzUAXfxr6YI/Vitv+Q==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.709.0.tgz", + "integrity": "sha512-rYdTDOxazS2GdGScelsRK5CAkktRLCCdRjlwXaxrcW57j749hEqxcF5uTv9RD6WBwInfedcSywErNZB+hylQlg==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso": "3.709.0", + "@aws-sdk/core": "3.709.0", + "@aws-sdk/token-providers": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.709.0.tgz", + "integrity": "sha512-2lbDfE0IQ6gma/7BB2JpkjW5G0wGe4AS0x80oybYAYYviJmUtIR3Cn2pXun6bnAWElt4wYKl4su7oC36rs5rNA==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.709.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.709.0.tgz", + "integrity": "sha512-v1OfAWhYhAz7XPtjWlQ3jDLZHCpuNrLP2bRWTEjRty8yZLN92ANehincULUGvUNszFO8rfpq2g4dmtk8XmqTzA==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.709.0", + "@aws-sdk/client-sso": "3.709.0", + "@aws-sdk/client-sts": "3.709.0", + "@aws-sdk/core": "3.709.0", + "@aws-sdk/credential-provider-cognito-identity": "3.709.0", + "@aws-sdk/credential-provider-env": "3.709.0", + "@aws-sdk/credential-provider-http": "3.709.0", + "@aws-sdk/credential-provider-ini": "3.709.0", + "@aws-sdk/credential-provider-node": "3.709.0", + "@aws-sdk/credential-provider-process": "3.709.0", + "@aws-sdk/credential-provider-sso": "3.709.0", + "@aws-sdk/credential-provider-web-identity": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@smithy/credential-provider-imds": "^3.2.8", + "@smithy/property-provider": "^3.1.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.709.0.tgz", + "integrity": "sha512-8gQYCYAaIw4lOCd5WYdf15Y/61MgRsAnrb2eiTl+icMlUOOzl8aOl5iDwm/Idp0oHZTflwxM4XSvGXO83PRWcw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.709.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.709.0.tgz", + "integrity": "sha512-jDoGSccXv9zebnpUoisjWd5u5ZPIalrmm6TjvPzZ8UqzQt3Beiz0tnQwmxQD6KRc7ADweWP5Ntiqzbw9xpVajg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.709.0", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.709.0.tgz", + "integrity": "sha512-PObL/wLr4lkfbQ0yXUWaoCWu/jcwfwZzCjsUiXW/H6hW9b/00enZxmx7OhtJYaR6xmh/Lcx5wbhIoDCbzdv0tw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.709.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.709.0.tgz", + "integrity": "sha512-ooc9ZJvgkjPhi9q05XwSfNTXkEBEIfL4hleo5rQBKwHG3aTHvwOM7LLzhdX56QZVa6sorPBp6fwULuRDSqiQHw==", + "optional": true, + "dependencies": { + "@aws-sdk/core": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@aws-sdk/util-endpoints": "3.709.0", + "@smithy/core": "^2.5.5", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.709.0.tgz", + "integrity": "sha512-/NoCAMEVKAg3kBKOrNtgOfL+ECt6nrl+L7q2SyYmrcY4tVCmwuECVqewQaHc03fTnJijfKLccw0Fj+6wOCnB6w==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.709.0", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/types": "^3.7.2", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.709.0.tgz", + "integrity": "sha512-q5Ar6k71nci43IbULFgC8a89d/3EHpmd7HvBzqVGRcHnoPwh8eZDBfbBXKH83NGwcS1qPSRYiDbVfeWPm4/1jA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.709.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.709.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/types": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.709.0.tgz", + "integrity": "sha512-ArtLTMxgjf13Kfu3gWH3Ez9Q5TkDdcRZUofpKH3pMGB/C6KAbeSCtIIDKfoRTUABzyGlPyCrZdnFjKyH+ypIpg==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/types/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.709.0.tgz", + "integrity": "sha512-Mbc7AtL5WGCTKC16IGeUTz+sjpC3ptBda2t0CcK0kMVw3THDdcSq6ZlNKO747cNqdbwUvW34oHteUiHv4/z88Q==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.709.0", + "@smithy/types": "^3.7.2", + "@smithy/util-endpoints": "^2.1.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.693.0.tgz", + "integrity": "sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.709.0.tgz", + "integrity": "sha512-/rL2GasJzdTWUURCQKFldw2wqBtY4k4kCiA2tVZSKg3y4Ey7zO34SW8ebaeCE2/xoWOyLR2/etdKyphoo4Zrtg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.709.0", + "@smithy/types": "^3.7.2", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.709.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.709.0.tgz", + "integrity": "sha512-trBfzSCVWy7ILgqhEXgiuM7hfRCw4F4a8IK90tjk9YL0jgoJ6eJuOp7+DfCtHJaygoBxD3cdMFkOu+lluFmGBA==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.709.0", + "@aws-sdk/types": "3.709.0", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/@bochilteam/scraper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@bochilteam/scraper/-/scraper-3.0.0.tgz", + "integrity": "sha512-vqV7KkV+zyjFpSYplwRz0NIFt/pxUAF/zDnUogr280ZnWK9nQqt+mfV8J3TLUjUbV6HxSrsbltUAM6n1ff94Sg==", + "deprecated": "New major 5.x version release!!!", + "dependencies": { + "cheerio": "^1.0.0-rc.10", + "form-data": "^4.0.0", + "got": "^11.8.3", + "human-readable": "^0.2.1", + "similarity": "^1.2.1", + "zod": "^3.17.3" + }, + "engines": { + "node": ">= 12.20" + }, + "optionalDependencies": { + "ws": "^8.4.2" + } + }, + "node_modules/@eshaz/web-worker": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@eshaz/web-worker/-/web-worker-1.2.2.tgz", + "integrity": "sha512-WxXiHFmD9u/owrzempiDlBB1ZYqiLnm9s6aPc8AlFQalq2tKmqdmMr9GXOupDgzXtqnBipj8Un0gkIm7Sjf8mw==" + }, + "node_modules/@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@javascript-obfuscator/escodegen": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.3.0.tgz", + "integrity": "sha512-QVXwMIKqYMl3KwtTirYIA6gOCiJ0ZDtptXqAv/8KWLG9uQU2fZqTVy7a/A5RvcoZhbDoFfveTxuGxJ5ibzQtkw==", + "dependencies": { + "@javascript-obfuscator/estraverse": "^5.3.0", + "esprima": "^4.0.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/@javascript-obfuscator/estraverse": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.4.0.tgz", + "integrity": "sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@jimp/bmp": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.13.tgz", + "integrity": "sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "bmp-js": "^0.1.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/core": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.13.tgz", + "integrity": "sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^16.5.4", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@jimp/core/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@jimp/custom": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz", + "integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.16.13" + } + }, + "node_modules/@jimp/gif": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.13.tgz", + "integrity": "sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/jpeg": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.13.tgz", + "integrity": "sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "jpeg-js": "^0.4.2" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz", + "integrity": "sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz", + "integrity": "sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.13.tgz", + "integrity": "sha512-RNave7EFgZrb5V5EpdvJGAEHMnDAJuwv05hKscNfIYxf0kR3KhViBTDy+MoTnMlIvaKFULfwIgaZWzyhuINMzA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.13.tgz", + "integrity": "sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.13.tgz", + "integrity": "sha512-QayTXw4tXMwU6q6acNTQrTTFTXpNRBe+MgTGMDU0lk+23PjlFCO/9sacflelG8lsp7vNHhAxFeHptDMAksEYzg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.13.tgz", + "integrity": "sha512-BSsP71GTNaqWRcvkbWuIVH+zK7b3TSNebbhDkFK0fVaUTzHuKMS/mgY4hDZIEVt7Rf5FjadAYtsujHN9w0iSYA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz", + "integrity": "sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.13.tgz", + "integrity": "sha512-qt9WKq8vWrcjySa9DyQ0x/RBMHQeiVjdVSY1SJsMjssPUf0pS74qorcuAkGi89biN3YoGUgPkpqECnAWnYwgGA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.13.tgz", + "integrity": "sha512-5/N3yJggbWQTlGZHQYJPmQXEwR52qaXjEzkp1yRBbtdaekXE3BG/suo0fqeoV/csf8ooI78sJzYmIrxNoWVtgQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.13.tgz", + "integrity": "sha512-2rZmTdFbT/cF9lEZIkXCYO0TsT114Q27AX5IAo0Sju6jVQbvIk1dFUTnwLDadTo8wkJlFzGqMQ24Cs8cHWOliA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.13.tgz", + "integrity": "sha512-EmcgAA74FTc5u7Z+hUO/sRjWwfPPLuOQP5O64x5g4j0T12Bd29IgsYZxoutZo/rb3579+JNa/3wsSEmyVv1EpA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-gaussian": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.13.tgz", + "integrity": "sha512-A1XKfGQD0iDdIiKqFYi8nZMv4dDVYdxbrmgR7y/CzUHhSYdcmoljLIIsZZM3Iks/Wa353W3vtvkWLuDbQbch1w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.13.tgz", + "integrity": "sha512-xFMrIn7czEZbdbMzZWuaZFnlLGJDVJ82y5vlsKsXRTG2kcxRsMPXvZRWHV57nSs1YFsNqXSbrC8B98n0E32njQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.13.tgz", + "integrity": "sha512-wLRYKVBXql2GAYgt6FkTnCfE+q5NomM7Dlh0oIPGAoMBWDyTx0eYutRK6PlUrRK2yMHuroAJCglICTbxqGzowQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.13.tgz", + "integrity": "sha512-3tfad0n9soRna4IfW9NzQdQ2Z3ijkmo21DREHbE6CGcMIxOSvfRdSvf1qQPApxjTSo8LTU4MCi/fidx/NZ0GqQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.13.tgz", + "integrity": "sha512-0m6i3p01PGRkGAK9r53hDYrkyMq+tlhLOIbsSTmZyh6HLshUKlTB7eXskF5OpVd5ZUHoltlNc6R+ggvKIzxRFw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "load-bmfont": "^1.4.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz", + "integrity": "sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz", + "integrity": "sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz", + "integrity": "sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.13.tgz", + "integrity": "sha512-nmu5VSZ9hsB1JchTKhnnCY+paRBnwzSyK5fhkhtQHHoFD5ArBQ/5wU8y6tCr7k/GQhhGq1OrixsECeMjPoc8Zw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.13.tgz", + "integrity": "sha512-+3zArBH0OE3Rhjm4HyAokMsZlIq5gpQec33CncyoSwxtRBM2WAhUVmCUKuBo+Lr/2/4ISoY4BWpHKhMLDix6cA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.13.tgz", + "integrity": "sha512-CJLdqODEhEVs4MgWCxpWL5l95sCBlkuSLz65cxEm56X5akIsn4LOlwnKoSEZioYcZUBvHhCheH67AyPTudfnQQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.16.13", + "@jimp/plugin-blur": "^0.16.13", + "@jimp/plugin-circle": "^0.16.13", + "@jimp/plugin-color": "^0.16.13", + "@jimp/plugin-contain": "^0.16.13", + "@jimp/plugin-cover": "^0.16.13", + "@jimp/plugin-crop": "^0.16.13", + "@jimp/plugin-displace": "^0.16.13", + "@jimp/plugin-dither": "^0.16.13", + "@jimp/plugin-fisheye": "^0.16.13", + "@jimp/plugin-flip": "^0.16.13", + "@jimp/plugin-gaussian": "^0.16.13", + "@jimp/plugin-invert": "^0.16.13", + "@jimp/plugin-mask": "^0.16.13", + "@jimp/plugin-normalize": "^0.16.13", + "@jimp/plugin-print": "^0.16.13", + "@jimp/plugin-resize": "^0.16.13", + "@jimp/plugin-rotate": "^0.16.13", + "@jimp/plugin-scale": "^0.16.13", + "@jimp/plugin-shadow": "^0.16.13", + "@jimp/plugin-threshold": "^0.16.13", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.13.tgz", + "integrity": "sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "pngjs": "^3.3.3" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png/node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.13.tgz", + "integrity": "sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/types": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.13.tgz", + "integrity": "sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.16.13", + "@jimp/gif": "^0.16.13", + "@jimp/jpeg": "^0.16.13", + "@jimp/png": "^0.16.13", + "@jimp/tiff": "^0.16.13", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/utils": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.13.tgz", + "integrity": "sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.9.tgz", + "integrity": "sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/abort-controller/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/config-resolver": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.13.tgz", + "integrity": "sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^3.1.12", + "@smithy/types": "^3.7.2", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/core": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.5.tgz", + "integrity": "sha512-G8G/sDDhXA7o0bOvkc7bgai6POuSld/+XhNnWAbpQTpLv2OZPvyqQ58tLPPlz0bSNsXktldDDREIv1LczFeNEw==", + "optional": true, + "dependencies": { + "@smithy/middleware-serde": "^3.0.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-stream": "^3.3.2", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.8.tgz", + "integrity": "sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^3.1.12", + "@smithy/property-provider": "^3.1.11", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.2.tgz", + "integrity": "sha512-R7rU7Ae3ItU4rC0c5mB2sP5mJNbCfoDc8I5XlYjIZnquyUwec7fEo78F6DA3SmgJgkU1qTMcZJuGblxZsl10ZA==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/fetch-http-handler/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/hash-node": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.11.tgz", + "integrity": "sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/invalid-dependency": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.11.tgz", + "integrity": "sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/invalid-dependency/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/is-array-buffer/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/middleware-content-length": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.13.tgz", + "integrity": "sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.5.tgz", + "integrity": "sha512-VhJNs/s/lyx4weiZdXSloBgoLoS8osV0dKIain8nGmx7of3QFKu5BSdEuk1z/U8x9iwes1i+XCiNusEvuK1ijg==", + "optional": true, + "dependencies": { + "@smithy/core": "^2.5.5", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", + "@smithy/util-middleware": "^3.0.11", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/middleware-retry": { + "version": "3.0.30", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.30.tgz", + "integrity": "sha512-6323RL2BvAR3VQpTjHpa52kH/iSHyxd/G9ohb2MkBk2Ucu+oMtRXT8yi7KTSIS9nb58aupG6nO0OlXnQOAcvmQ==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^3.1.12", + "@smithy/protocol-http": "^4.1.8", + "@smithy/service-error-classification": "^3.0.11", + "@smithy/smithy-client": "^3.5.0", + "@smithy/types": "^3.7.2", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.11.tgz", + "integrity": "sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-serde/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/middleware-stack": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.11.tgz", + "integrity": "sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-stack/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/node-config-provider": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.12.tgz", + "integrity": "sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==", + "optional": true, + "dependencies": { + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-config-provider/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/node-http-handler": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.2.tgz", + "integrity": "sha512-t4ng1DAd527vlxvOfKFYEe6/QFBcsj7WpNlWTyjorwXXcKw3XlltBGbyHfSJ24QT84nF+agDha9tNYpzmSRZPA==", + "optional": true, + "dependencies": { + "@smithy/abort-controller": "^3.1.9", + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-http-handler/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/property-provider": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.11.tgz", + "integrity": "sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/property-provider/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/protocol-http/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/querystring-builder": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz", + "integrity": "sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-builder/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/querystring-parser": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.11.tgz", + "integrity": "sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-parser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/service-error-classification": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz", + "integrity": "sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.12.tgz", + "integrity": "sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/signature-v4": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", + "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/smithy-client": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.5.0.tgz", + "integrity": "sha512-Y8FeOa7gbDfCWf7njrkoRATPa5eNLUEjlJS5z5rXatYuGkCb80LbHcu8AQR8qgAZZaNHCLyo2N+pxPsV7l+ivg==", + "optional": true, + "dependencies": { + "@smithy/core": "^2.5.5", + "@smithy/middleware-endpoint": "^3.2.5", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-stream": "^3.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/smithy-client/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/types/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/url-parser": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.11.tgz", + "integrity": "sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==", + "optional": true, + "dependencies": { + "@smithy/querystring-parser": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/url-parser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-base64/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-body-length-browser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-body-length-node/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "optional": true, + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-buffer-from/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-config-provider/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.30", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.30.tgz", + "integrity": "sha512-nLuGmgfcr0gzm64pqF2UT4SGWVG8UGviAdayDlVzJPNa6Z4lqvpDzdRXmLxtOdEjVlTOEdpZ9dd3ZMMu488mzg==", + "optional": true, + "dependencies": { + "@smithy/property-provider": "^3.1.11", + "@smithy/smithy-client": "^3.5.0", + "@smithy/types": "^3.7.2", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.30", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.30.tgz", + "integrity": "sha512-OD63eWoH68vp75mYcfYyuVH+p7Li/mY4sYOROnauDrtObo1cS4uWfsy/zhOTW8F8ZPxQC1ZXZKVxoxvMGUv2Ow==", + "optional": true, + "dependencies": { + "@smithy/config-resolver": "^3.0.13", + "@smithy/credential-provider-imds": "^3.2.8", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/property-provider": "^3.1.11", + "@smithy/smithy-client": "^3.5.0", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-endpoints": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.7.tgz", + "integrity": "sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^3.1.12", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-endpoints/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-middleware": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", + "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", + "optional": true, + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-middleware/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-retry": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz", + "integrity": "sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==", + "optional": true, + "dependencies": { + "@smithy/service-error-classification": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-retry/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-stream": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.2.tgz", + "integrity": "sha512-sInAqdiVeisUGYAv/FrXpmJ0b4WTFmciTRqzhb7wVuem9BHvhIG7tpiYHLDWrl2stOokNZpTTGqz3mzB2qFwXg==", + "optional": true, + "dependencies": { + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/types": "^3.7.2", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "optional": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-uri-escape/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-utf8/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "optional": true + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@thi.ng/bitstream": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@thi.ng/bitstream/-/bitstream-2.4.5.tgz", + "integrity": "sha512-pbwFt/ZaXbzZFRj6p2rFaDKfX2XR2Tf5deDExP40BtPIY8WT3Qrk6yTLmwos9hxdKfv308gYLSAnOTsGl5+r5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/postspectacular" + }, + { + "type": "patreon", + "url": "https://patreon.com/thing_umbrella" + } + ], + "dependencies": { + "@thi.ng/errors": "^2.5.19" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@thi.ng/errors": { + "version": "2.5.19", + "resolved": "https://registry.npmjs.org/@thi.ng/errors/-/errors-2.5.19.tgz", + "integrity": "sha512-3+agBHA+jPM90BLj+wmptHZGGl6yMT+MYEbeTFWMDZuDBVhtzreQsLjYCRa3elZt8LMqTWcCTURmgLO7bJRQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/postspectacular" + }, + { + "type": "patreon", + "url": "https://patreon.com/thing_umbrella" + } + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/http-errors": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz", + "integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "node_modules/@types/node": { + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/validator": { + "version": "13.12.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", + "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@vitalets/google-translate-api": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@vitalets/google-translate-api/-/google-translate-api-9.2.0.tgz", + "integrity": "sha512-w98IPWGuexlGmh8Y19AxF6cgWT0U5JLevVNDKEuFpTWtBC9z3YtDWKTDxF3nPP1k9bWicuB1V7I7YfHoZiDScw==", + "dependencies": { + "@types/http-errors": "^1.8.2", + "http-errors": "^2.0.0", + "node-fetch": "^2.6.7" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@wasm-audio-decoders/common": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/common/-/common-9.0.5.tgz", + "integrity": "sha512-b9JNh9sPAvn8PVIizNh9D60WkfQong/u9ea873H47u7zvVDLctxYIp2aZw9CQqXaQdk7JB3MoU5UHiseO40swg==", + "dependencies": { + "@eshaz/web-worker": "1.2.2", + "simple-yenc": "^1.0.4" + } + }, + "node_modules/@wasm-audio-decoders/flac": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/flac/-/flac-0.2.5.tgz", + "integrity": "sha512-8M//CgB3PlkWwn47KcwD0tO6DZBA7/AGG0ukHSG0G97UbNEUNINvKDWAKPVWznzHsqeBP6axw+K/38dzng64JA==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5", + "codec-parser": "2.5.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/@wasm-audio-decoders/ogg-vorbis": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/ogg-vorbis/-/ogg-vorbis-0.1.16.tgz", + "integrity": "sha512-HcEx4LPZbbzjhs9bTXgMaXLVCSMSo/egY9paJxAnE9tsYbvseAaGtVddLYktl3Qi/G+nW/ZzUXg4144izJjqCw==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5", + "codec-parser": "2.5.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-path/-/app-path-4.0.0.tgz", + "integrity": "sha512-mgBO9PZJ3MpbKbwFTljTi36ZKBvG5X/fkVR1F85ANsVcVllEb+C0LGNdJfGUm84GpC4xxgN6HFkmkMU8VEO4mA==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-range": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", + "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" + }, + "node_modules/async.parallellimit": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.parallellimit/-/async.parallellimit-0.5.2.tgz", + "integrity": "sha512-4Di2nFsb3jL7aUIICvRSvtw/oynpMIx0JrwYn5hqJI661Dd+mYBi2ElOukOQgRHihU1SCTapb86Vx/Snva5M1w==", + "dependencies": { + "async.util.eachoflimit": "0.5.2", + "async.util.parallel": "0.5.2" + } + }, + "node_modules/async.util.eachoflimit": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.eachoflimit/-/async.util.eachoflimit-0.5.2.tgz", + "integrity": "sha512-oZksH0sBW0AEOJKgBCQ79io9DZruoRBLTAea/Ik36pejR7pDpByvtXeuJsoZdPwSVslsrQcsUfucbUaiXYBnAQ==", + "dependencies": { + "async.util.keyiterator": "0.5.2", + "async.util.noop": "0.5.2", + "async.util.once": "0.5.2", + "async.util.onlyonce": "0.5.2" + } + }, + "node_modules/async.util.isarray": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.isarray/-/async.util.isarray-0.5.2.tgz", + "integrity": "sha512-wbUzlrwON8RUgi+v/rhF0U99Ce8Osjcn+JP/mFNg6ymvShcobAOvE6cvLajSY5dPqKCOE1xfdhefgBif11zZgw==" + }, + "node_modules/async.util.isarraylike": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.isarraylike/-/async.util.isarraylike-0.5.2.tgz", + "integrity": "sha512-DbFpsz3ZFNkohAW8IpGTlm8gotU32zpqe3Y2XkEA/G3XNO6rmUTKPpo7XgXUruoI+AsGi8+0zWpJHe7t1sLiAg==", + "dependencies": { + "async.util.isarray": "0.5.2" + } + }, + "node_modules/async.util.keyiterator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.keyiterator/-/async.util.keyiterator-0.5.2.tgz", + "integrity": "sha512-cktrETawCwgu13y3KZs2uMGFnNHc+IjKPZsavtRaoCjLELkePb2co4zrr+ghPvEqLXZIJPTKqC2HFZgJTssMVw==", + "dependencies": { + "async.util.isarraylike": "0.5.2", + "async.util.keys": "0.5.2" + } + }, + "node_modules/async.util.keys": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.keys/-/async.util.keys-0.5.2.tgz", + "integrity": "sha512-umCOCRCRYwIC2Ho3fbuhKwIIe7OhQsVoVKGoF5GoQiGJUmjP4TG0Bmmcdpm7yW/znoIGKpnjKzVQz0niH4tfqw==" + }, + "node_modules/async.util.noop": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.noop/-/async.util.noop-0.5.2.tgz", + "integrity": "sha512-AdwShXwE0KoskgqVJAck8zcM32nIHj3AC8ZN62ZaR5srhrY235Nw18vOJZWxcOfhxdVM0hRVKM8kMx7lcl7cCQ==" + }, + "node_modules/async.util.once": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.once/-/async.util.once-0.5.2.tgz", + "integrity": "sha512-YQ5WPzDTt2jlblUDkq2I5RV/KiAJErJ4/0cEFhYPaZzqIuF/xDzdGvnEKe7UeuoMszsVPeajzcpKgkbwdb9MUA==" + }, + "node_modules/async.util.onlyonce": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz", + "integrity": "sha512-UgQvkU9JZ+I0Cm1f56XyGXcII+J3d/5XWUuHpcevlItuA3WFSJcqZrsyAUck2FkRSD8BwYQX1zUTDp3SJMVESg==" + }, + "node_modules/async.util.parallel": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.parallel/-/async.util.parallel-0.5.2.tgz", + "integrity": "sha512-0bEvwmQ8fxsTYNwacw5iq0i3PvGryRkXxZ01Rvox21izdMdls9IH2rAZjfunbgI8j6nFRyIdCmMINQ9kka99ow==", + "dependencies": { + "async.util.isarraylike": "0.5.2", + "async.util.noop": "0.5.2", + "async.util.restparam": "0.5.2" + } + }, + "node_modules/async.util.restparam": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.restparam/-/async.util.restparam-0.5.2.tgz", + "integrity": "sha512-Q9Z+zgmtMxFX5i7CnBvNOkgrL5hptztCqwarQluyNudUUk4iCmyjmsQl8MuQEjNh3gGqP5ayvDaextL1VXXgIg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/audio-buffer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/audio-buffer/-/audio-buffer-5.0.0.tgz", + "integrity": "sha512-gsDyj1wwUp8u7NBB+eW6yhLb9ICf+0eBmDX8NGaAS00w8/fLqFdxUlL5Ge/U8kB64DlQhdonxYC59dXy1J7H/w==" + }, + "node_modules/audio-decode": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/audio-decode/-/audio-decode-2.2.2.tgz", + "integrity": "sha512-xyh7z6dpRT+5Ez4ggV2cEkSShkDvvIBBmVPR3kYY7uIBqRO1BGNjofip6JnjBnvezhrU3ypBGZjepyKFDZWnDw==", + "dependencies": { + "@wasm-audio-decoders/flac": "^0.2.4", + "@wasm-audio-decoders/ogg-vorbis": "^0.1.15", + "audio-buffer": "^5.0.0", + "audio-type": "^2.2.1", + "mpg123-decoder": "^1.0.0", + "node-wav": "^0.0.2", + "ogg-opus-decoder": "^1.6.12", + "qoa-format": "^1.0.1" + } + }, + "node_modules/audio-type": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/audio-type/-/audio-type-2.2.1.tgz", + "integrity": "sha512-En9AY6EG1qYqEy5L/quryzbA4akBpJrnBZNxeKTqGHC2xT9Qc4aZ8b7CcbOMFTTc/MGdoNyp+SN4zInZNKxMYA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/awesome-phonenumber": { + "version": "2.73.0", + "resolved": "https://registry.npmjs.org/awesome-phonenumber/-/awesome-phonenumber-2.73.0.tgz", + "integrity": "sha512-zirkzWFUheNnnPY1QE05PQd+5drn+5kVy76gZ3WyXnLwzXOguw6sqksyZGO1qyNnYj3Y/SDITXnS/TCk/hJXpQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", + "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.5.2.tgz", + "integrity": "sha512-QK6bePvszntxgPKdVXciYzjlWv2Ry1mQuUqyUUzd27G7eLupl6d0K5AGJfnfyFAdgy5tRolHP/zbaUMslLceOg==", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64-to-image": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-to-image/-/base64-to-image-1.0.2.tgz", + "integrity": "sha512-6tYtXV9NId5tKs304trKlzQD47rrHOIgX/V1+AR6hAKhLRdCeJlHeva0v/ONGy5VVgaPlVlTE7PhnrULELshrg==" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/boolstring": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/boolstring/-/boolstring-1.0.2.tgz", + "integrity": "sha512-0JLNSmZUv1m/O8sVayFm2t0naiOXwQ9O2Gq9u1eoIkhvu6U5NQER/e3k4BGpjZ33G775lWMT7TzJ7r5VtmEnbQ==" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/btch-downloader": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/btch-downloader/-/btch-downloader-2.8.2.tgz", + "integrity": "sha512-L1ib30ZJ2UvgWpik+JiQhmDEvOxZc/772jxIBpb5tVhPgQsD/61oy0jrbsuuqxUG+ldBPPou7Gxj1xZC4GJe7A==", + "dependencies": { + "axios": "^1.4.0", + "cheerio": "^1.0.0-rc.12", + "got": "^10.0.0", + "qs": "^6.10.3" + } + }, + "node_modules/btch-downloader/node_modules/@sindresorhus/is": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", + "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/btch-downloader/node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/btch-downloader/node_modules/cacheable-lookup": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", + "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", + "dependencies": { + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/btch-downloader/node_modules/decompress-response": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/btch-downloader/node_modules/got": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", + "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", + "dependencies": { + "@sindresorhus/is": "^2.0.0", + "@szmarczak/http-timer": "^4.0.0", + "@types/cacheable-request": "^6.0.1", + "cacheable-lookup": "^2.0.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^5.0.0", + "lowercase-keys": "^2.0.0", + "mimic-response": "^2.1.0", + "p-cancelable": "^2.0.0", + "p-event": "^4.0.0", + "responselike": "^2.0.0", + "to-readable-stream": "^2.0.0", + "type-fest": "^0.10.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/btch-downloader/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/btch-downloader/node_modules/type-fest": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", + "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cache-manager": { + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-5.7.6.tgz", + "integrity": "sha512-wBxnBHjDxF1RXpHCBD6HGvKER003Ts7IIm0CHpggliHzN1RZditb7rXoduE1rplc2DEFYKxhLKgFuchXMJje9w==", + "dependencies": { + "eventemitter3": "^5.0.1", + "lodash.clonedeep": "^4.5.0", + "lru-cache": "^10.2.2", + "promise-coalesce": "^1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/centra": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz", + "integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==", + "dependencies": { + "follow-redirects": "^1.15.6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chance": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.9.tgz", + "integrity": "sha512-TfxnA/DcZXRTA4OekA2zL9GH8qscbbl6X0ZqU4tXhGveVY/mXWvEQLt5GwZcYXTEyEFflVtj+pG8nc8EwSm1RQ==" + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/class-validator": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", + "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "dependencies": { + "@types/validator": "^13.11.8", + "libphonenumber-js": "^1.10.53", + "validator": "^13.9.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.2.0.tgz", + "integrity": "sha512-AqfwItf/UqGif3FBErI3NHX04v5ywJtGYlL5z4OqWR50u7g+Fz3Xw2qcCIbKVPrqtJCBwSOkDgnSlHbcpwDKHw==", + "dependencies": { + "ansi-regex": "^2.1.1", + "d": "1", + "es5-ext": "^0.10.12", + "es6-iterator": "2", + "memoizee": "^0.4.3", + "timers-ext": "0.1" + } + }, + "node_modules/cli-color/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/codec-parser": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/codec-parser/-/codec-parser-2.5.0.tgz", + "integrity": "sha512-Ru9t80fV8B0ZiixQl8xhMTLru+dzuis/KQld32/x5T/+3LwZb0/YvQdSKytX9JqCnRdiupvAvyYJINKrXieziQ==" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/curve25519-js": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/curve25519-js/-/curve25519-js-0.0.4.tgz", + "integrity": "sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w==" + }, + "node_modules/cycled": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cycled/-/cycled-1.2.0.tgz", + "integrity": "sha512-/BOOCEohSBflVHHtY/wUc1F6YDYPqyVs/A837gDoq4H1pm72nU/yChyGt91V4ML+MbbAmHs8uo2l1yJkkTIUdg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dasu": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/dasu/-/dasu-0.4.3.tgz", + "integrity": "sha512-AFwspl5k7V8MW8H7tyIGJ0gtOauUg7JC+DgiRFUIXvPNNDFXTMtvnCkZY0macN6JLGqBjNP38WVnQN7Iv3RSlg==" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/decode-gif": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/decode-gif/-/decode-gif-1.0.1.tgz", + "integrity": "sha512-L0MT527mwlkil9TiN1xwnJXzUxCup55bUT91CPmQlc9zYejXJ8xp17d5EVnwM80JOIGImBUk1ptJQ+hDihyzwg==", + "dependencies": { + "array-range": "^1.0.1", + "omggif": "^1.0.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delay": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/delay/-/delay-4.4.1.tgz", + "integrity": "sha512-aL3AhqtfhOlT/3ai6sWXeqwnw63ATNpnUiN4HL7x9q+My5QtHlO3OIkasmug9LKzpheLdmUKGRKnYXYAS7FQkQ==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fake-useragent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fake-useragent/-/fake-useragent-1.0.1.tgz", + "integrity": "sha512-BOQh1TM//DhrVaeZ+b3w3s4E40rfYcDTn5aoSM2w1xVsZVGglNOzPR5H8KDO8NmF8sT4ppxyb4/MHGIHfZsVDA==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fluent-ffmpeg": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz", + "integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==", + "dependencies": { + "async": "^0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fluent-ffmpeg/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, + "node_modules/fluent-ffmpeg/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/futoin-hkdf": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz", + "integrity": "sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", + "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gifwrap": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz", + "integrity": "sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/google-it": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/google-it/-/google-it-1.6.4.tgz", + "integrity": "sha512-iM/31cWQ0wLcBngHSR3l6OwtkqYP93kiQWF74YqyHte/sJ5BFQ60IzCckuetu0LH4//mxYqFlH30nhNuBX/udw==", + "dependencies": { + "cheerio": "^1.0.0-rc.11", + "colors": "^1.4.0", + "command-line-args": "^5.0.0", + "ora": "^4.0.3", + "request": "^2.88.0" + }, + "bin": { + "google-it": "lib/app.js" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-encoding-sniffer/node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-cookie-agent": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/http-cookie-agent/-/http-cookie-agent-6.0.7.tgz", + "integrity": "sha512-+Q2kuUy5Nifb78MMbUxRsslFSGwrckleoCp97RF8KbW0dgmp4MyFxtz9WnRlaRFheL4afuc+1J1vWzD1dH8C5w==", + "dependencies": { + "agent-base": "^7.1.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/3846masa" + }, + "peerDependencies": { + "tough-cookie": "^4.0.0 || ^5.0.0", + "undici": "^5.11.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "undici": { + "optional": true + } + } + }, + "node_modules/http-cookie-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/human-readable": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/human-readable/-/human-readable-0.2.1.tgz", + "integrity": "sha512-uFtz4WZlB1M5xI45MZ5AjyAzfrrgLOdty4363Jd0LQ5NGXa+UiKaD0EQXQeDfCinodrpePFk/vKjzBlDTZdZQQ==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/human-time": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/human-time/-/human-time-0.0.2.tgz", + "integrity": "sha512-sbYI90YhYmstslPTb70BLGjy6mdESa0lxL7uDR4fIVAx9Iobz8fLEqi7FqF4Q/6vblrzZALg//MsYJlIPBU8SA==" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/image-q": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", + "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", + "dependencies": { + "@types/node": "16.9.1" + } + }, + "node_modules/image-q/node_modules/@types/node": { + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/install-artifact-from-github": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/install-artifact-from-github/-/install-artifact-from-github-1.3.5.tgz", + "integrity": "sha512-gZHC7f/cJgXz7MXlHFBxPVMsvIbev1OQN1uKQYKVJDydGNm9oYf9JstbU4Atnh/eSvk41WtEovoRm+8IF686xg==", + "bin": { + "install-from-cache": "bin/install-from-cache.js", + "save-to-github-cache": "bin/save-to-github-cache.js" + } + }, + "node_modules/inversify": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.1.tgz", + "integrity": "sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==" + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/iterm2-version": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/iterm2-version/-/iterm2-version-5.0.0.tgz", + "integrity": "sha512-WdLXcMYvN3SXT6vEtuW78vnZs4pVWm2nBnb4VKjOPPXmdlR1xTHmBgqKacOzAe4RXOiY/V+0u/0zsU3LoGQoBg==", + "dependencies": { + "app-path": "^4.0.0", + "plist": "^3.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/javascript-obfuscator": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-4.1.1.tgz", + "integrity": "sha512-gt+KZpIIrrxXHEQGD8xZrL8mTRwRY0U76/xz/YX0gZdPrSqQhT/c7dYLASlLlecT3r+FxE7je/+C0oLnTDCx4A==", + "hasInstallScript": true, + "dependencies": { + "@javascript-obfuscator/escodegen": "2.3.0", + "@javascript-obfuscator/estraverse": "5.4.0", + "acorn": "8.8.2", + "assert": "2.0.0", + "chalk": "4.1.2", + "chance": "1.1.9", + "class-validator": "0.14.1", + "commander": "10.0.0", + "eslint-scope": "7.1.1", + "eslint-visitor-keys": "3.3.0", + "fast-deep-equal": "3.1.3", + "inversify": "6.0.1", + "js-string-escape": "1.0.1", + "md5": "2.3.0", + "mkdirp": "2.1.3", + "multimatch": "5.0.0", + "opencollective-postinstall": "2.0.3", + "process": "0.11.10", + "reflect-metadata": "0.1.13", + "source-map-support": "0.5.21", + "string-template": "1.0.0", + "stringz": "2.1.0", + "tslib": "2.5.0" + }, + "bin": { + "javascript-obfuscator": "bin/javascript-obfuscator" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/javascript-obfuscator" + } + }, + "node_modules/jimp": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.13.tgz", + "integrity": "sha512-Bxz8q7V4rnCky9A0ktTNGA9SkNFVWRHodddI/DaAWZJzF7sVUlFYKQ60y9JGqrKpi48ECA/TnfMzzc5C70VByA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.16.13", + "@jimp/plugins": "^0.16.13", + "@jimp/types": "^0.16.13", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/jsonpath-plus": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-5.0.7.tgz", + "integrity": "sha512-7TS6wsiw1s2UMK/A6nA4n0aUJuirCVhJ87nWX5je5MPOl0z5VTr2qs7nMP8NZ2ed3rlt6kePTqddgVPE9F0i0w==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/keypress": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", + "integrity": "sha512-HjorDJFNhnM4SicvaUXac0X77NiskggxJdesG72+O5zBKpSqKFCrqmndKVqpu3pFqkla0St6uGk8Ju0sCurrmg==" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levenshtein-edit-distance": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/levenshtein-edit-distance/-/levenshtein-edit-distance-2.0.5.tgz", + "integrity": "sha512-Yuraz7QnMX/JENJU1HA6UtdsbhRzoSFnGpVGVryjQgHtl2s/YmVgmNYkVs5yzVZ9aAvQR9wPBUH3lG755ylxGA==", + "bin": { + "levenshtein-edit-distance": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.16.tgz", + "integrity": "sha512-Noyazmt0yOvnG0OeRY45Cd1ur8G7Z0HWVkuCuKe+yysGNxPQwBAODBQQ40j0AIagi9ZWurfmmZWNlpg4h4W+XQ==" + }, + "node_modules/libsignal": { + "name": "@whiskeysockets/libsignal-node", + "version": "2.0.1", + "resolved": "git+ssh://git@github.com/WhiskeySockets/libsignal-node.git#1bd9275d9e621d2ba899087ebdf548b3a5a4f05e", + "dependencies": { + "curve25519-js": "^0.0.4", + "protobufjs": "6.8.8" + } + }, + "node_modules/libsignal/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/libsignal/node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/libsignal/node_modules/protobufjs": { + "version": "6.8.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", + "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "@types/node": "^10.1.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/link-preview-js": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/link-preview-js/-/link-preview-js-3.0.12.tgz", + "integrity": "sha512-MVfFA4Bbb+sWg/TSZPMEMgjs/WYw8Sah/ILMUy4qElu9mmtHDb1cxxm2F+SivHKtBapJQLKW4qnKh45Q+629Cg==", + "dependencies": { + "abort-controller": "^3.0.0", + "cheerio": "1.0.0-rc.11", + "cross-fetch": "3.1.5", + "url": "0.11.0" + } + }, + "node_modules/link-preview-js/node_modules/cheerio": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", + "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/link-preview-js/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/link-preview-js/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, + "node_modules/link-preview-js/node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/load-bmfont": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.2.tgz", + "integrity": "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==", + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^3.7.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "node_modules/load-bmfont/node_modules/phin": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/phin/-/phin-3.7.1.tgz", + "integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==", + "dependencies": { + "centra": "^2.7.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lowdb": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-2.1.0.tgz", + "integrity": "sha512-F4Go8/V37gAidTR3c5poyjprOpZSDNSLJVOmI0ny4D4q9rC37OkBhlzX0bqj7LZlT3UIj4FchmZrrSw7qY+eGQ==", + "dependencies": { + "steno": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/m3u8stream": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz", + "integrity": "sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==", + "dependencies": { + "miniget": "^4.2.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memoizee": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", + "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", + "dependencies": { + "d": "^1.0.2", + "es5-ext": "^0.10.64", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/miniget": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.3.tgz", + "integrity": "sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.3.tgz", + "integrity": "sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.2.tgz", + "integrity": "sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg==", + "dependencies": { + "bson": "^4.7.2", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "@aws-sdk/credential-providers": "^3.186.0", + "@mongodb-js/saslprep": "^1.1.0" + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.13.5.tgz", + "integrity": "sha512-podJEaIF/5N2mQymkyyUzN2NeL/68MOyYjf3O0zsgCU2B2Omnhg6NhGHVavt9ZH/VxOrwKE9XphbuHDFK+T06g==", + "dependencies": { + "bson": "^4.7.2", + "kareem": "2.5.1", + "mongodb": "4.17.2", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mpg123-decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mpg123-decoder/-/mpg123-decoder-1.0.0.tgz", + "integrity": "sha512-WV+pyuMUhRqv7s8S6p/Ii4KQHdBD1pb3yaABxcKJRsNp+HQ/Y6z2iIBIaOZu0JMHPTOoICYt0REDZ7XfLu+n/g==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multistream": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", + "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5" + } + }, + "node_modules/music-metadata": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-7.14.0.tgz", + "integrity": "sha512-xrm3w7SV0Wk+OythZcSbaI8mcr/KHd0knJieu8bVpaPfMv/Agz5EooCAPz3OR5hbYMiUG6dgAPKZKnMzV+3amA==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "content-type": "^1.0.5", + "debug": "^4.3.4", + "file-type": "^16.5.4", + "media-typer": "^1.1.0", + "strtok3": "^6.3.0", + "token-types": "^4.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/music-metadata/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/music-metadata/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-abi": { + "version": "3.71.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", + "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "node_modules/node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "dependencies": { + "clone": "2.x" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-fzf": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/node-fzf/-/node-fzf-0.5.3.tgz", + "integrity": "sha512-crN8rRfApu/GUrtKq+zJ6LueUyNAOJpFHxoT2Ru1Q+OYRa/F/H7CXvzcMrFc7D964yakYZEZ9XR3YbdSHXgyCw==", + "dependencies": { + "cli-color": "~1.2.0", + "keypress": "~0.2.1", + "minimist": "~1.2.0", + "redstar": "0.0.2", + "string-width": "~2.1.1", + "ttys": "0.0.3" + }, + "bin": { + "nfzf": "bin/cli.js" + } + }, + "node_modules/node-fzf/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/node-fzf/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/node-fzf/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/node-fzf/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/node-gtts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-gtts/-/node-gtts-2.0.2.tgz", + "integrity": "sha512-g1EVgKgUJvbLheD3378SYQpUIca6U9F2VBzMzk5WxxSWzZb+IRGVSMoVGPwvpg4buZxE/FCL13tzzg2j1FAvbQ==", + "dependencies": { + "async": "^2.4.1", + "escape-string-regexp": "^1.0.5", + "fake-useragent": "^1.0.1", + "multistream": "^2.1.0", + "request": "^2.81.0" + }, + "bin": { + "node-gtts": "bin.js" + } + }, + "node_modules/node-gtts/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/node-gyp": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz", + "integrity": "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-os-utils": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/node-os-utils/-/node-os-utils-1.3.7.tgz", + "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" + }, + "node_modules/node-wav": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/node-wav/-/node-wav-0.0.2.tgz", + "integrity": "sha512-M6Rm/bbG6De/gKGxOpeOobx/dnGuP0dz40adqx38boqHhlWssBJZgLCPBNtb9NkrmnKYiV04xELq+R6PFOnoLA==", + "engines": { + "node": ">=4.4.0" + } + }, + "node_modules/node-webpmux": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/node-webpmux/-/node-webpmux-3.2.0.tgz", + "integrity": "sha512-Rmc7MIS7zxDRPkfC9B15malsd1uStX2N6mYqHZNZeCJAVRDjmnxxTsyDh6POvWdNC7nmAYBW6CcHVY62DlnzRg==" + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ocr-space-api-wrapper": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/ocr-space-api-wrapper/-/ocr-space-api-wrapper-2.3.2.tgz", + "integrity": "sha512-jEeODamnR9n8puP/9pbO/hn/GAG+6Z2crPVGnv/+y1TYe0qVY/8qeqkOPO5Qm6qeFo4XRIRscWjV0X5T1S2r0w==", + "dependencies": { + "axios": "0.27.2", + "form-data": "^4.0.1" + } + }, + "node_modules/ogg-opus-decoder": { + "version": "1.6.14", + "resolved": "https://registry.npmjs.org/ogg-opus-decoder/-/ogg-opus-decoder-1.6.14.tgz", + "integrity": "sha512-RQpk9yFl/mqXFwcgf1BrEYWL92HZk++aU1fOO8mPZ1+1DUYbJdpdUQEFfbPE1xcBkRGU3p75DjEO+EDMNeikFQ==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5", + "codec-parser": "2.5.0", + "opus-decoder": "0.7.7" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" + }, + "node_modules/on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/opus-decoder": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/opus-decoder/-/opus-decoder-0.7.7.tgz", + "integrity": "sha512-KWDyCi/9aXnNN+jrjs+aaVdwiwzDdac81S9ul0iv1CTs4+5K4VDZKuJjIImrYOBA2oSNHDjVq4xzn6BE+XbI1A==", + "dependencies": { + "@wasm-audio-decoders/common": "9.0.5" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/ora": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", + "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", + "dependencies": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz", + "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.5.0" + } + }, + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/perf_hooks": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/perf_hooks/-/perf_hooks-0.0.1.tgz", + "integrity": "sha512-qG/D9iA4KDme+KF4vCObJy6Bouu3BlQnmJ8jPydVPm32NJBD9ZK1ZNgXSYaZKHkVC1sKSqUiLgFvAZPUiIEnBw==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info." + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", + "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.0.0", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.15.1" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "dependencies": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" + }, + "node_modules/pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", + "dependencies": { + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pixelmatch/node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/prebuild-install/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, + "node_modules/promise-coalesce": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/promise-coalesce/-/promise-coalesce-1.1.2.tgz", + "integrity": "sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==", + "engines": { + "node": ">=16" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qoa-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/qoa-format/-/qoa-format-1.0.1.tgz", + "integrity": "sha512-dMB0Z6XQjdpz/Cw4Rf6RiBpQvUSPCfYlQMWvmuWlWkAT7nDQD29cVZ1SwDUB6DYJSitHENwbt90lqfI+7bvMcw==", + "dependencies": { + "@thi.ng/bitstream": "^2.2.12" + } + }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/qrcode/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/qrcode/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/qrcode/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/re2": { + "version": "1.21.4", + "resolved": "https://registry.npmjs.org/re2/-/re2-1.21.4.tgz", + "integrity": "sha512-MVIfXWJmsP28mRsSt8HeL750ifb8H5+oF2UDIxGaiJCr8fkMqhLZ7kcX9ADRk2dC8qeGKedB7UVYRfBVpEiLfA==", + "hasInstallScript": true, + "dependencies": { + "install-artifact-from-github": "^1.3.5", + "nan": "^2.20.0", + "node-gyp": "^10.2.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" + }, + "node_modules/real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/redstar": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/redstar/-/redstar-0.0.2.tgz", + "integrity": "sha512-VNvLaLxMJMYiAasJX5Q/GC+Os7FXL0yPWFDuTodhR7Na9wqzrXsePPWC+EtIv4t3q5DyAK00w423xi5mQN2fqg==", + "dependencies": { + "minimatch": "~3.0.4" + } + }, + "node_modules/redstar/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/render-gif": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/render-gif/-/render-gif-2.0.4.tgz", + "integrity": "sha512-l5X7EwbEvdflnvVAzjL7njizwZN8ATqJ0rdaQ5WwMJ55vyWXIXIUE9Ut7W6hm+KE+HMYn5C0a+7t0B6JjGfxQA==", + "dependencies": { + "cycled": "^1.2.0", + "decode-gif": "^1.0.1", + "delay": "^4.3.0", + "jimp": "^0.14.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/render-gif/node_modules/@jimp/bmp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.14.0.tgz", + "integrity": "sha512-5RkX6tSS7K3K3xNEb2ygPuvyL9whjanhoaB/WmmXlJS6ub4DjTqrapu8j4qnIWmO4YYtFeTbDTXV6v9P1yMA5A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "bmp-js": "^0.1.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.14.0.tgz", + "integrity": "sha512-S62FcKdtLtj3yWsGfJRdFXSutjvHg7aQNiFogMbwq19RP4XJWqS2nOphu7ScB8KrSlyy5nPF2hkWNhLRLyD82w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^9.0.0", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/render-gif/node_modules/@jimp/custom": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.14.0.tgz", + "integrity": "sha512-kQJMeH87+kWJdVw8F9GQhtsageqqxrvzg7yyOw3Tx/s7v5RToe8RnKyMM+kVtBJtNAG+Xyv/z01uYQ2jiZ3GwA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.14.0" + } + }, + "node_modules/render-gif/node_modules/@jimp/gif": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.14.0.tgz", + "integrity": "sha512-DHjoOSfCaCz72+oGGEh8qH0zE6pUBaBxPxxmpYJjkNyDZP7RkbBkZJScIYeQ7BmJxmGN4/dZn+MxamoQlr+UYg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/jpeg": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.14.0.tgz", + "integrity": "sha512-561neGbr+87S/YVQYnZSTyjWTHBm9F6F1obYHiyU3wVmF+1CLbxY3FQzt4YolwyQHIBv36Bo0PY2KkkU8BEeeQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "jpeg-js": "^0.4.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-blit": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.14.0.tgz", + "integrity": "sha512-YoYOrnVHeX3InfgbJawAU601iTZMwEBZkyqcP1V/S33Qnz9uzH1Uj1NtC6fNgWzvX6I4XbCWwtr4RrGFb5CFrw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-blur": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.14.0.tgz", + "integrity": "sha512-9WhZcofLrT0hgI7t0chf7iBQZib//0gJh9WcQMUt5+Q1Bk04dWs8vTgLNj61GBqZXgHSPzE4OpCrrLDBG8zlhQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-circle": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.14.0.tgz", + "integrity": "sha512-o5L+wf6QA44tvTum5HeLyLSc5eVfIUd5ZDVi5iRfO4o6GT/zux9AxuTSkKwnjhsG8bn1dDmywAOQGAx7BjrQVA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-color": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.14.0.tgz", + "integrity": "sha512-JJz512SAILYV0M5LzBb9sbOm/XEj2fGElMiHAxb7aLI6jx+n0agxtHpfpV/AePTLm1vzzDxx6AJxXbKv355hBQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-contain": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.14.0.tgz", + "integrity": "sha512-RX2q233lGyaxiMY6kAgnm9ScmEkNSof0hdlaJAVDS1OgXphGAYAeSIAwzESZN4x3ORaWvkFefeVH9O9/698Evg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-cover": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.14.0.tgz", + "integrity": "sha512-0P/5XhzWES4uMdvbi3beUgfvhn4YuQ/ny8ijs5kkYIw6K8mHcl820HahuGpwWMx56DJLHRl1hFhJwo9CeTRJtQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-crop": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.14.0.tgz", + "integrity": "sha512-Ojtih+XIe6/XSGtpWtbAXBozhCdsDMmy+THUJAGu2x7ZgKrMS0JotN+vN2YC3nwDpYkM+yOJImQeptSfZb2Sug==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-displace": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.14.0.tgz", + "integrity": "sha512-c75uQUzMgrHa8vegkgUvgRL/PRvD7paFbFJvzW0Ugs8Wl+CDMGIPYQ3j7IVaQkIS+cAxv+NJ3TIRBQyBrfVEOg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-dither": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.14.0.tgz", + "integrity": "sha512-g8SJqFLyYexXQQsoh4dc1VP87TwyOgeTElBcxSXX2LaaMZezypmxQfLTzOFzZoK8m39NuaoH21Ou1Ftsq7LzVQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-fisheye": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.14.0.tgz", + "integrity": "sha512-BFfUZ64EikCaABhCA6mR3bsltWhPpS321jpeIQfJyrILdpFsZ/OccNwCgpW1XlbldDHIoNtXTDGn3E+vCE7vDg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-flip": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.14.0.tgz", + "integrity": "sha512-WtL1hj6ryqHhApih+9qZQYA6Ye8a4HAmdTzLbYdTMrrrSUgIzFdiZsD0WeDHpgS/+QMsWwF+NFmTZmxNWqKfXw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-gaussian": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.14.0.tgz", + "integrity": "sha512-uaLwQ0XAQoydDlF9tlfc7iD9drYPriFe+jgYnWm8fbw5cN+eOIcnneEX9XCOOzwgLPkNCxGox6Kxjn8zY6GxtQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-invert": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.14.0.tgz", + "integrity": "sha512-UaQW9X9vx8orQXYSjT5VcITkJPwDaHwrBbxxPoDG+F/Zgv4oV9fP+udDD6qmkgI9taU+44Fy+zm/J/gGcMWrdg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-mask": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.14.0.tgz", + "integrity": "sha512-tdiGM69OBaKtSPfYSQeflzFhEpoRZ+BvKfDEoivyTjauynbjpRiwB1CaiS8En1INTDwzLXTT0Be9SpI3LkJoEA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-normalize": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.14.0.tgz", + "integrity": "sha512-AfY8sqlsbbdVwFGcyIPy5JH/7fnBzlmuweb+Qtx2vn29okq6+HelLjw2b+VT2btgGUmWWHGEHd86oRGSoWGyEQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-print": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.14.0.tgz", + "integrity": "sha512-MwP3sH+VS5AhhSTXk7pui+tEJFsxnTKFY3TraFJb8WFbA2Vo2qsRCZseEGwpTLhENB7p/JSsLvWoSSbpmxhFAQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "load-bmfont": "^1.4.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-resize": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.14.0.tgz", + "integrity": "sha512-qFeMOyXE/Bk6QXN0GQo89+CB2dQcXqoxUcDb2Ah8wdYlKqpi53skABkgVy5pW3EpiprDnzNDboMltdvDslNgLQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-rotate": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.14.0.tgz", + "integrity": "sha512-aGaicts44bvpTcq5Dtf93/8TZFu5pMo/61lWWnYmwJJU1RqtQlxbCLEQpMyRhKDNSfPbuP8nyGmaqXlM/82J0Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-scale": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.14.0.tgz", + "integrity": "sha512-ZcJk0hxY5ZKZDDwflqQNHEGRblgaR+piePZm7dPwPUOSeYEH31P0AwZ1ziceR74zd8N80M0TMft+e3Td6KGBHw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-shadow": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.14.0.tgz", + "integrity": "sha512-p2igcEr/iGrLiTu0YePNHyby0WYAXM14c5cECZIVnq/UTOOIQ7xIcWZJ1lRbAEPxVVXPN1UibhZAbr3HAb5BjQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugin-threshold": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.14.0.tgz", + "integrity": "sha512-N4BlDgm/FoOMV/DQM2rSpzsgqAzkP0DXkWZoqaQrlRxQBo4zizQLzhEL00T/YCCMKnddzgEhnByaocgaaa0fKw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/render-gif/node_modules/@jimp/plugins": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.14.0.tgz", + "integrity": "sha512-vDO3XT/YQlFlFLq5TqNjQkISqjBHT8VMhpWhAfJVwuXIpilxz5Glu4IDLK6jp4IjPR6Yg2WO8TmRY/HI8vLrOw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.14.0", + "@jimp/plugin-blur": "^0.14.0", + "@jimp/plugin-circle": "^0.14.0", + "@jimp/plugin-color": "^0.14.0", + "@jimp/plugin-contain": "^0.14.0", + "@jimp/plugin-cover": "^0.14.0", + "@jimp/plugin-crop": "^0.14.0", + "@jimp/plugin-displace": "^0.14.0", + "@jimp/plugin-dither": "^0.14.0", + "@jimp/plugin-fisheye": "^0.14.0", + "@jimp/plugin-flip": "^0.14.0", + "@jimp/plugin-gaussian": "^0.14.0", + "@jimp/plugin-invert": "^0.14.0", + "@jimp/plugin-mask": "^0.14.0", + "@jimp/plugin-normalize": "^0.14.0", + "@jimp/plugin-print": "^0.14.0", + "@jimp/plugin-resize": "^0.14.0", + "@jimp/plugin-rotate": "^0.14.0", + "@jimp/plugin-scale": "^0.14.0", + "@jimp/plugin-shadow": "^0.14.0", + "@jimp/plugin-threshold": "^0.14.0", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/png": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.14.0.tgz", + "integrity": "sha512-0RV/mEIDOrPCcNfXSPmPBqqSZYwGADNRVUTyMt47RuZh7sugbYdv/uvKmQSiqRdR0L1sfbCBMWUEa5G/8MSbdA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "pngjs": "^3.3.3" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/tiff": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.14.0.tgz", + "integrity": "sha512-zBYDTlutc7j88G/7FBCn3kmQwWr0rmm1e0FKB4C3uJ5oYfT8645lftUsvosKVUEfkdmOaMAnhrf4ekaHcb5gQw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/types": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.14.0.tgz", + "integrity": "sha512-hx3cXAW1KZm+b+XCrY3LXtdWy2U+hNtq0rPyJ7NuXCjU7lZR3vIkpz1DLJ3yDdS70hTi5QDXY3Cd9kd6DtloHQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.14.0", + "@jimp/gif": "^0.14.0", + "@jimp/jpeg": "^0.14.0", + "@jimp/png": "^0.14.0", + "@jimp/tiff": "^0.14.0", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/render-gif/node_modules/@jimp/utils": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.14.0.tgz", + "integrity": "sha512-MY5KFYUru0y74IsgM/9asDwb3ERxWxXEu3CRCZEvE7DtT86y1bR1XgtlSliMrptjz4qbivNGMQSvUBpEFJDp1A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/render-gif/node_modules/file-type": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", + "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/render-gif/node_modules/jimp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.14.0.tgz", + "integrity": "sha512-8BXU+J8+SPmwwyq9ELihpSV4dWPTiOKBWCEgtkbnxxAVMjXdf3yGmyaLSshBfXc8sP/JQ9OZj5R8nZzz2wPXgA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.14.0", + "@jimp/plugins": "^0.14.0", + "@jimp/types": "^0.14.0", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/render-gif/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/render-gif/node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/similarity": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/similarity/-/similarity-1.2.1.tgz", + "integrity": "sha512-lMOpWVaWrTnyL+tkvDs8oGV/KAUBQ3wfbZtdiwDcC+KYGlwO8kgtiyag1B6akAjALDMwn5rN5YHHei1hr4X7nw==", + "dependencies": { + "levenshtein-edit-distance": "^2.0.0" + }, + "bin": { + "similarity": "cli.js" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/simple-yenc": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/simple-yenc/-/simple-yenc-1.0.4.tgz", + "integrity": "sha512-5gvxpSd79e9a3V4QDYUqnqxeD4HGlhCakVpb6gMnDD7lexJggSBJRBO5h52y/iJrdXRilX9UCuDaIJhSWm5OWw==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/eshaz" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-adapter/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sonic-boom": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", + "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/steno": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/steno/-/steno-1.0.0.tgz", + "integrity": "sha512-C/KgCvEa1yWnpHmaPjAXrz1yWxh6hs+HvhqqPa71euaQmNi1wr4+WFo57VQxjKKuFl2KqS7gtlrN0oxj2noQLw==" + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, + "node_modules/streamx": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.0.tgz", + "integrity": "sha512-Qz6MsDZXJ6ur9u+b+4xCG18TluU7PGlRfXVAAjNiGsFrBUt/ioyLkxbFaKJygoPs+/kW4VyBj0bSj89Qu0IGyg==", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringz": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/stringz/-/stringz-2.1.0.tgz", + "integrity": "sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==", + "dependencies": { + "char-regex": "^1.0.2" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/term-img": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/term-img/-/term-img-6.0.0.tgz", + "integrity": "sha512-R4c+XtUiN/9lMlw+wldmxjPO/xlG3sIE79tcnE3A8CtcYMTDiOgAKy/EhroI+rmjB3cVyCkYSzTPBBjPsC7YdQ==", + "dependencies": { + "ansi-escapes": "^5.0.0", + "iterm2-version": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/term-img/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/term-img/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-image": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/terminal-image/-/terminal-image-2.0.0.tgz", + "integrity": "sha512-25HcdYC79g0rPxk9o7RIp3i0/ebP+viR6vj2Fsxh1a9pE6o7PfXz4HlmdYLGsQsmBeQNK88BA2UJo4IzBRfzaA==", + "dependencies": { + "chalk": "^4.1.1", + "jimp": "^0.16.1", + "log-update": "^4.0.0", + "render-gif": "^2.0.4", + "term-img": "^6.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-decoder": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.2.tgz", + "integrity": "sha512-/MDslo7ZyWTA2vnk1j7XoDVfXsGk3tp+zFEJHJGm0UjIlQifonVFwlVbQDFh8KJzTBnT8ie115TYqir6bclddA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thread-stream": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", + "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", + "dependencies": { + "real-require": "^0.1.0" + } + }, + "node_modules/tiktokdl": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/tiktokdl/-/tiktokdl-0.0.5.tgz", + "integrity": "sha512-LZ7W05whzNR3pEfMMJGSM5OZTX55ql/4KlU4EkpXyzlVEa+FUyNyw91Hme++qgY5kOog8bU9czQwD/0PWL5iDg==", + "dependencies": { + "axios": "^1.4.0", + "cheerio": "^1.0.0-rc.12" + } + }, + "node_modules/tiktokdl/node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/timers-ext": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", + "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", + "dependencies": { + "es5-ext": "^0.10.64", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + }, + "node_modules/tlds": { + "version": "1.255.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.255.0.tgz", + "integrity": "sha512-tcwMRIioTcF/FcxLev8MJWxCp+GUALRhFEqbDoZrnowmKSGqPrl5pqS+Sut2m8BgJ6S4FExCSSpGffZ0Tks6Aw==", + "bin": { + "tlds": "bin.js" + } + }, + "node_modules/to-readable-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", + "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/ttys": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/ttys/-/ttys-0.0.3.tgz", + "integrity": "sha512-UCqXRZS2S7U4aVB7Salj3ChPRSsb57ogJpJ1eMCvyowxFOBGsaHKcRU8bovcDwajX1mRbv0IpUnYkoG7Ieo5Zg==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/undici": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-5.0.0.tgz", + "integrity": "sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==", + "dependencies": { + "ip-regex": "^4.1.0", + "tlds": "^1.203.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/url-regex-safe": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/url-regex-safe/-/url-regex-safe-2.1.0.tgz", + "integrity": "sha512-nfrmOb62+kN4JJRkY/w9QzZeuc63/ddIFfqS9ntok0UYsJW3C5J/jGvYZecwk8V68og2zWA7fcVn4GUXIi5qbg==", + "deprecated": "Please upgrade to url-regex-safe@v3.0.0+ AND install re2 as an additional dependency in your project via `npm install re2` or `yarn add re2`.", + "dependencies": { + "ip-regex": "^4.3.0", + "re2": "^1.16.0", + "tlds": "^1.217.0" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "dependencies": { + "pako": "^1.0.5" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/wa-sticker-formatter": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/wa-sticker-formatter/-/wa-sticker-formatter-4.4.4.tgz", + "integrity": "sha512-tl2tXlu7HEs630+1LcJsdavNGEysyQV7EIe/tFsPJCEd2jteG0nGouWNUglUEjW+bDCZGXw9VpJgUtwVGIKr8w==", + "dependencies": { + "axios": "^0.21.1", + "file-type": "^16.5.3", + "fluent-ffmpeg": "^2.1.2", + "fs-extra": "^10.0.0", + "image-size": "^1.0.0", + "node-webpmux": "^3.1.0", + "sharp": "^0.30.0" + } + }, + "node_modules/wa-sticker-formatter/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/wa-sticker-formatter/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/wa-sticker-formatter/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/wa-sticker-formatter/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/wa-sticker-formatter/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wa-sticker-formatter/node_modules/sharp": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", + "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.1", + "node-addon-api": "^5.0.0", + "prebuild-install": "^7.1.1", + "semver": "^7.3.7", + "simple-get": "^4.0.1", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/wa-sticker-formatter/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/wa-sticker-formatter/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "node_modules/which-typed-array": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==" + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yt-search": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/yt-search/-/yt-search-2.12.1.tgz", + "integrity": "sha512-suEbEGqIDa7OBuZQSNabPKS4sZrHrocak7JhxSw3gagCUxPgHqyEDqyWEruvLYax2uCIQ7UhQoDVqQGOFn+jrQ==", + "dependencies": { + "async.parallellimit": "~0.5.2", + "boolstring": "~1.0.2", + "cheerio": "^1.0.0-rc.10", + "dasu": "~0.4.3", + "human-time": "0.0.2", + "jsonpath-plus": "~5.0.2", + "minimist": "~1.2.5", + "node-fzf": "~0.5.1" + }, + "bin": { + "yt-search": "bin/cli.js", + "yt-search-audio": "bin/mpv_audio.sh", + "yt-search-video": "bin/mpv_video.sh" + } + }, + "node_modules/ytdl-core": { + "name": "@distube/ytdl-core", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@distube/ytdl-core/-/ytdl-core-4.15.1.tgz", + "integrity": "sha512-10voV+ixUVQgam4/GMhjNTX/ipk9odkPnPoRaUESs5E/EW0JujwPDc815z53D86mSRlVc8esH1eiuzFnxLJKcA==", + "dependencies": { + "http-cookie-agent": "^6.0.6", + "m3u8stream": "^0.8.6", + "miniget": "^4.2.3", + "sax": "^1.4.1", + "tough-cookie": "^4.1.4", + "undici": "five" + }, + "engines": { + "node": ">=14.0" + }, + "funding": { + "url": "https://github.com/distubejs/ytdl-core?sponsor" + } + }, + "node_modules/zod": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..5d251141683adf1f88ecb1c5df5b74bbf15dc526 --- /dev/null +++ b/package.json @@ -0,0 +1,93 @@ +{ + "name": "rtxzy", + "version": "8.0.0", + "description": "Lightweight WhatsApp Bot", + "depecrated": false, + "main": "index.js", + "directories": { + "lib": "lib", + "src": "src", + "plugins": "plugins" + }, + "scripts": { + "start": "node index.js --autocleartmp --autoread", + "test": "node test.js", + "test2": "nodemon index.js --server --autocleartmp --autoread" + }, + "keywords": [ + "whatsapp-bot-md", + "whatsapp-bot", + "whatsapp", + "js-whatsapp", + "whatsapp", + "Games-wabot", + "wabot-aq", + "whiskeysockets", + "botcahx", + "baileys" + ], + "homepage": "https://github.com/BOTCAHX/RTXZY-MD", + "author": { + "name": "BOTCAHX" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/BOTCAHX/RTXZY-MD.git" + }, + "bugs": { + "url": "https://github.com/BOTCAHX/RTXZY-MD/issues" + }, + "license": "MIT", + "dependencies": { + "@adiwajshing/baileys": "npm:@whiskeysockets/baileys@6.7.8", + "@adiwajshing/keyed-db": "^0.2.4", + "@bochilteam/scraper": "^3.0.0", + "@vitalets/google-translate-api": "^9.0.0", + "javascript-obfuscator": "^4.0.2", + "async": "^3.2.4", + "awesome-phonenumber": "^2.64.0", + "axios": "^0.27.2", + "base64-to-image": "^1.0.2", + "btch-downloader": "^2.8.0", + "chalk": "^4.1.2", + "cheerio": "^1.0.0-rc.12", + "colors": "1.4.0", + "express": "^4.18.2", + "didyoumean": "^1.2.2", + "file-type": "^16.5.3", + "form-data": "^4.0.0", + "google-it": "^1.6.3", + "human-readable": "^0.2.1", + "jsdom": "^20.0.0", + "lodash": "^4.17.21", + "lowdb": "^2.1.0", + "link-preview-js": "^3.0.4", + "moment-timezone": "^0.5.37", + "mongoose": "^6.0.14", + "node-fetch": "^2.6.9", + "node-gtts": "2.0.2", + "node-os-utils": "^1.3.7", + "node-webpmux": "^3.1.3", + "nodemon": "^2.0.20", + "ocr-space-api-wrapper": "^2.2.0", + "os": "^0.1.2", + "perf_hooks": "^0.0.1", + "qrcode": "^1.5.0", + "qrcode-terminal": "^0.12.0", + "readline": "^1.3.0", + "similarity": "^1.2.1", + "sharp": "^0.32.6", + "socket.io": "^4.5.1", + "syntax-error": "^1.4.0", + "tiktokdl": "^0.0.5", + "terminal-image": "^2.0.0", + "url": "^0.11.0", + "url-regex": "^5.0.0", + "url-regex-safe": "^2.1.0", + "util": "^0.12.4", + "wa-sticker-formatter": "^4.3.2", + "yargs": "^17.5.1", + "ytdl-core": "npm:@distube/ytdl-core", + "yt-search": "^2.10.3" + } +} diff --git a/plugins/_AI-bardimg.js b/plugins/_AI-bardimg.js new file mode 100644 index 0000000000000000000000000000000000000000..c380d528e037845d753ed33b3de41a1ba32fa15a --- /dev/null +++ b/plugins/_AI-bardimg.js @@ -0,0 +1,27 @@ +const fetch = require('node-fetch'); +const uploader = require('../lib/uploadImage'); + +let handler = async (m, { conn, text, command, usedPrefix }) => { + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || q.mediaType || '' + if (/image/g.test(mime) && !/webp/g.test(mime)) { + let buffer = await q.download() + await m.reply(wait) + try { + let media = await uploader(buffer) + let json = await (await fetch(`https://api.botcahx.eu.org/api/search/bard-img?url=${media}&text=${text}&apikey=${btc}`)).json() + conn.sendMessage(m.chat, { text: json.result }, { quoted: m }) + } catch (err) { + throw `${eror}` + } + } else { + throw `Reply image with command ${usedPrefix + command} pertanyaan` + } +} + +handler.help = ['bardimg','geminiimg'] +handler.tags = ['tools'] +handler.command = /^(bardimg|bardimage|geminiimg)$/i +handler.limit = true; + +module.exports = handler diff --git a/plugins/_AI-bing.js b/plugins/_AI-bing.js new file mode 100644 index 0000000000000000000000000000000000000000..036dd631ed865984bebc593d66f96e0f274695f2 --- /dev/null +++ b/plugins/_AI-bing.js @@ -0,0 +1,68 @@ +const fetch = require('node-fetch'); + +let handler = async (m, { + conn, + text, + usedPrefix, + command +}) => { + if (command == 'bing') { + if (!text) throw `Example : ${usedPrefix + command} siapa presiden Indonesia?`; + try { + m.reply(wait) + let response = await fetch('https://api.botcahx.eu.org/api/search/bing-chat', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + text: text, + apikey: btc + }) + }) + .then(res => res.json()); + + await conn.reply(m.chat, response.message, m); + } catch (e) { + console.log(e); + throw `*Error:* ${eror}`; + } + } + if (command == 'bingimg') { + if (!text) throw `Contoh: ${usedPrefix + command} anak berlari menggunakan pakaian merah 3d animation`; + try { + m.reply(wait) + let response = await fetch('https://api.botcahx.eu.org/api/search/bing-img', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + text: text, + apikey: btc + }) + }) + .then(res => res.json()); + + for (let i = 0; i < 4; i++) { + let img = response.result[i] + await sleep(3000) + await conn.sendFile(m.chat, img, 'bing_img.png', `*PROMPT:* ${text}`, m) + } + } catch (error) { + throw `${eror}` + } + } +} + +handler.command = handler.help = ['bing', 'bingimg'] + +//handler.command = handler.help = ['bing'] +handler.tags = ['tools'] +handler.limit = true + +module.exports = handler + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/plugins/_AI-blackbox.js b/plugins/_AI-blackbox.js new file mode 100644 index 0000000000000000000000000000000000000000..755460d63d5126ee866347660ce2ce32240c2d51 --- /dev/null +++ b/plugins/_AI-blackbox.js @@ -0,0 +1,98 @@ +const fetch = require("node-fetch"); +const uploadFile = require('../lib/uploadFile.js'); + +let previousMessages = []; + +const handler = async (m, { text, usedPrefix, command, conn }) => { + if (!text) throw `Mana textnya?`; + + try { + // Pastikan minimal ada teks atau pesan yang di-quote + if (!text && !m.quoted && !m.mtype.includes('imageMessage')) { + throw "Masukkan pertanyaan atau kirim gambar untuk deskripsi!\n\n*Contoh:* Siapa presiden Indonesia?"; + } + + // Kirim pesan loading + let { key } = await conn.sendMessage(m.chat, { + text: "...", + }); + + let imgUrl = null; + + // Jika ada gambar pada pesan yang di-quote, lakukan upload + if (m.quoted && m.quoted.mtype === 'imageMessage') { + let img = await m.quoted.download(); + if (img) { + imgUrl = await uploadFile(img); + if (!imgUrl) { + throw "Gagal mengupload gambar. Pastikan proses upload berjalan dengan baik."; + } + } + } + // Jika ada gambar di pesan langsung + else if (m.mtype.includes('imageMessage')) { + let img = await m.download(); + if (img) { + imgUrl = await uploadFile(img); + if (!imgUrl) { + throw "Gagal mengupload gambar. Pastikan proses upload berjalan dengan baik."; + } + } + } + + // Tentukan endpoint berdasarkan kondisi kombinasi `text` dan `m.quoted` + let apiUrl; + if ((!text && m.quoted) || (text && m.quoted) || (text && m.mtype.includes('imageMessage'))) { + apiUrl = `https://api.ryzendesu.vip/api/ai/blackbox?chat=${encodeURIComponent(text || '')}&options=blackboxai&imageurl=${imgUrl}`; + } else if (text && !m.quoted) { + apiUrl = `https://api.ryzendesu.vip/api/ai/blackbox?chat=${encodeURIComponent(text)}&options=blackboxai`; + } + + // Fetch ke API dengan URL yang dipilih + let hasil = await fetch(apiUrl); + if (!hasil.ok) { + throw new Error("Request ke API gagal"); + } + + let result = await hasil.json(); + + // Buat respons dari hasil API + let responseMessage = result.response || "Tidak ada respons dari AI."; + + // Tambahkan informasi tambahan jika ada + if (result.additionalInfo && result.additionalInfo.length > 0) { + responseMessage += "\n\n**Informasi Tambahan:**\n"; + result.additionalInfo.forEach(info => { + responseMessage += `- [${info.title}](${info.link}): ${info.snippet}\n`; + if (info.sitelinks && info.sitelinks.length > 0) { + info.sitelinks.forEach(link => { + responseMessage += ` - [${link.title}](${link.link})\n`; + }); + } + }); + } + + // Kirim pesan respons + await conn.sendMessage(m.chat, { + text: responseMessage, + edit: key, + }); + + previousMessages.push({ role: "user", content: text || '[Image]' }); + } catch (error) { + await conn.sendMessage(m.chat, { + text: `Error: ${error.message}`, + edit: key, + }); + } +} + +handler.help = ['blackbox']; +handler.tags = ['ai']; +handler.command = /^(blackbox)$/i; + +handler.limit = 8; +handler.premium = false; +handler.register = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/_AI-openai.js b/plugins/_AI-openai.js new file mode 100644 index 0000000000000000000000000000000000000000..fbe5a69eaa3afc39e850fb885c7e020cf835a305 --- /dev/null +++ b/plugins/_AI-openai.js @@ -0,0 +1,34 @@ +const axios = require('axios'); + +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) { + return conn.sendMessage(m.chat, { text: 'Silakan kirim pertanyaan setelah perintah ini.' }, { quoted: m }); + } + + try { + const response = await axios.get(`https://api.tioo.eu.org/openai?text=${text}`); + + // Logging respons lengkap + console.log('Response from AI:', response.data); + + if (response.data && response.data.result) { + const answer = response.data.result; // Menggunakan 'result' alih-alih 'answer' + await conn.sendMessage(m.chat, { text: answer }, { quoted: m }); + } else { + await conn.sendMessage(m.chat, { text: 'Tidak ada jawaban dari AI. Silakan coba pertanyaan lain.' }, { quoted: m }); + } + } catch (error) { + console.error('Error while contacting AI:', error.message); + if (error.response) { + console.error('Response data:', error.response.data); + console.error('Response status:', error.response.status); + } + await conn.sendMessage(m.chat, { text: 'Terjadi kesalahan saat menghubungi AI. Silakan coba lagi.' }, { quoted: m }); + } +} + +handler.help = ["ai"] +handler.tags = ["ai"] +handler.command = ["ai"] +handler.limit = 20 +module.exports = handler; \ No newline at end of file diff --git a/plugins/_afk.js b/plugins/_afk.js new file mode 100644 index 0000000000000000000000000000000000000000..ceb5106a56f06236b6b5f9d5efa679817389acaa --- /dev/null +++ b/plugins/_afk.js @@ -0,0 +1,35 @@ +let handler = m => m +handler.before = m => { + let user = global.db.data.users[m.sender] + if (user.afk > -1) { + m.reply(` +Kamu berhenti AFK${user.afkReason ? ' setelah ' + user.afkReason : ''} +Selama ${clockString(new Date - user.afk)} +`.trim()) + user.afk = -1 + user.afkReason = '' + } + let jids = [...new Set([...(m.mentionedJid || []), ...(m.quoted ? [m.quoted.sender] : [])])] + for (let jid of jids) { + let user = global.db.data.users[jid] + if (!user) continue + let afkTime = user.afk + if (!afkTime || afkTime < 0) continue + let reason = user.afkReason || '' + m.reply(` +Jangan tag dia! +Dia sedang AFK ${reason ? 'dengan alasan ' + reason : 'tanpa alasan'} +Selama ${clockString(new Date - afkTime)} +`.trim()) + } + return true +} + +module.exports = handler + +function clockString(ms) { + let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) + let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 + let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} diff --git a/plugins/_afk_afk.js b/plugins/_afk_afk.js new file mode 100644 index 0000000000000000000000000000000000000000..c15527f3258b54c2de3d2defe035d061123dabe7 --- /dev/null +++ b/plugins/_afk_afk.js @@ -0,0 +1,13 @@ +let handler = async (m, { text }) => { +let user = global.db.data.users[m.sender] +user.afk = + new Date +user.afkReason = text +m.reply(`@${m.sender.split`@`[0]} sekarang AFK ${text ? '\nDengan Alasan : ' + text : 'Tanpa Alasan'} +`) +} +handler.help = ['afk [alasan]'] +handler.tags = ['main'] +handler.command = /^afk$/i + +module.exports = handler +//@${who.split`@`[0]} /////@${m.sender.split`@`[0] \ No newline at end of file diff --git a/plugins/_anti+212.js b/plugins/_anti+212.js new file mode 100644 index 0000000000000000000000000000000000000000..70aef6bb3619c9a7e639e557077d4402df6f33ff --- /dev/null +++ b/plugins/_anti+212.js @@ -0,0 +1,13 @@ +let handler = m => m + +handler.before = async function (m) { + if (m.sender.startsWith('212' || '212')) { + global.db.data.users[m.sender].banned = false + } + + if (m.sender.startsWith('265' || '265')) { + global.db.data.users[m.sender].banned = false + } + } + +module.exports = handler \ No newline at end of file diff --git a/plugins/_anti_luar.js b/plugins/_anti_luar.js new file mode 100644 index 0000000000000000000000000000000000000000..0f617f593f3fd94366d60d5956978bb7c74074fb --- /dev/null +++ b/plugins/_anti_luar.js @@ -0,0 +1,22 @@ +let handler = m => m + +handler.before = async function (m) { + if (m.sender.startsWith('212' || '212')) { + global.db.data.users[m.sender].banned = true +conn.reply('see u next time') +conn.groupParticipantsUpdate(m.chat, [m.sender], "remove") + } + + if (m.sender.startsWith('265' || '265')) { + global.db.data.users[m.sender].banned = true +conn.reply('see u next time') +conn.groupParticipantsUpdate(m.chat, [m.sender], "remove") + } + if (m.sender.startsWith('92' || '92')) { + global.db.data.users[m.sender].banned = true +conn.reply('see u next time') +conn.groupParticipantsUpdate(m.chat, [m.sender], "remove") + } + } + +module.exports = handler \ No newline at end of file diff --git a/plugins/_anticall.js b/plugins/_anticall.js new file mode 100644 index 0000000000000000000000000000000000000000..c5d9d5146e3d33350a4901fac4fa7e85fa3f4962 --- /dev/null +++ b/plugins/_anticall.js @@ -0,0 +1,28 @@ +const { WAMessageStubType } = require('@adiwajshing/baileys') +var { format } = require('util'); + +let handler = m => m + +const isNumber = x => typeof x === 'number' && !isNaN(x) +const delay = ms => isNumber(ms) && new Promise(resolve => setTimeout(function () { + clearTimeout(this) + resolve() +}, ms)) + +const setting = { + anticall: true +} + +handler.all = async function (m) { + if (m.fromMe && m.isBaileys) return !0 + let text; + if (!setting.anticall) return + + if (m.messageStubType === (WAMessageStubType.CALL_MISSED_VOICE || WAMessageStubType.CALL_MISSED_VIDEO)) { + await this.reply(m.chat, '*Your number is blocked!*\nSee you next time๐Ÿ‘‹', null) + await delay(1000) + await this.updateBlockStatus(m.chat, "block") + } +} + +module.exports = handler diff --git a/plugins/_antilink.js b/plugins/_antilink.js new file mode 100644 index 0000000000000000000000000000000000000000..9d5ddcab4ca803e839b19b60a670288093c5073f --- /dev/null +++ b/plugins/_antilink.js @@ -0,0 +1,23 @@ +let handler = m => m + +let linkRegex = /chat.whatsapp.com\/([0-9A-Za-z]{20,24})/i +handler.before = async function (m, { user, isBotAdmin, isAdmin }) { + if ((m.isBaileys && m.fromMe) || m.fromMe || !m.isGroup) return true + let chat = global.db.data.chats[m.chat] + let isGroupLink = linkRegex.exec(m.text) + + if (chat.antiLink && isGroupLink) { + await m.reply(`*ใ€Œ ANTI LINK ใ€*\n\nDetected *${await conn.getName(m.sender)}* you have sent the group link!\n\nSorry you will be kicked from this group byee!`) + if (isAdmin) return m.reply('*Eh sorry you admins, you will not be kicked. hehe..*') + if (!isBotAdmin) return m.reply('*Bots are not admins, how can they kick people _-*') + let linkGC = ('https://chat.whatsapp.com/' + await conn.groupInviteCode(m.chat)) + let isLinkconnGc = new RegExp(linkGC, 'i') + let isgclink = isLinkconnGc.test(m.text) + if (isgclink) return m.reply('*ใ€Œ ANTI LINK ใ€*\n\nOrder denied, bot will not kick you.\nBecause the group link itself') + await conn.sendMessage(m.chat, { delete: m.key }) + await conn.groupParticipantsUpdate(m.chat, [m.sender], "remove") + } + return true +} + +module.exports = handler diff --git a/plugins/_antilink_del_msg.js b/plugins/_antilink_del_msg.js new file mode 100644 index 0000000000000000000000000000000000000000..4329b867c9213eae5b87b55a20bf61f30edc615b --- /dev/null +++ b/plugins/_antilink_del_msg.js @@ -0,0 +1,23 @@ +/** // Untuk delete pesan link Groupp + +let handler = async (m, { conn, command, text }) => { + await conn.sendMessage(m.chat, { delete: m.key}) +} +handler.customPrefix = /(https?:\/\/)?(www\.)?(chat.whatsapp.com\/invite\/)?([0-9A-Za-z]{20,24})/ig +handler.command = new RegExp() + +module.exports = handler + +**/ + +/** // Untuk delete semua pesan berawalan https + +let handler = async (m, { conn, command, text }) => { + await conn.sendMessage(m.chat, { delete: m.key}) +} +handler.customPrefix = /(https?:\/\/)?[\da-z\.-]+\.[a-z\.]{2,6}(\/([^\s]*))?/ig +handler.command = new RegExp() + +module.exports = handler + +**/ diff --git a/plugins/_autobio.js b/plugins/_autobio.js new file mode 100644 index 0000000000000000000000000000000000000000..9b9ca991593199286c3d8d77c08513f42dc6ef54 --- /dev/null +++ b/plugins/_autobio.js @@ -0,0 +1,22 @@ +module.exports = { + before: async function all(m) { + if (global.autobio) { + setInterval(async () => { + let uptime = process.uptime() * 1000; + let bio = `๐Ÿค– Aktif Selama: ${clockString(uptime)} | ๐Ÿ’Œ by: ${wm}`; + await this.updateProfileStatus(bio).catch(_ => _); + }, 60000); + } + } +} + +function clockString(ms) { + let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000); + let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60; + let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60; + return [h, m, s].map(v => v.toString().padStart(2, '0')).join(':'); +} + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)]; +} diff --git a/plugins/_autoblok.js b/plugins/_autoblok.js new file mode 100644 index 0000000000000000000000000000000000000000..f11239d8bcdbd4657a4e9a32836037483f426a4e --- /dev/null +++ b/plugins/_autoblok.js @@ -0,0 +1,19 @@ +let handler = m => m + +handler.before = async function (m) { + if (m.sender.startsWith('212' || '212')) { + global.db.data.users[m.sender].banned = true + } + + if (m.sender.startsWith('91' || '91')) { + global.db.data.users[m.sender].banned = true + } + + if (m.sender.startsWith('263' || '263')) { + + global.db.data.users[m.sender].banned = true + + } +} + +module.exports = handler diff --git a/plugins/_autodetectporn.js b/plugins/_autodetectporn.js new file mode 100644 index 0000000000000000000000000000000000000000..0e0930d5f5b78aeeef2c485ebaf9761db0f48247 --- /dev/null +++ b/plugins/_autodetectporn.js @@ -0,0 +1,37 @@ +let fetch = require('node-fetch'); +let uploader = require('../lib/uploadImage'); + + +let handler = m => m; + +handler.before = async function(m, { conn }) { + let q = m.quoted ? m.quoted : m; + let mime = (q.msg || q).mimetype || ''; + + if (!global.antiporn) return; + if (!/image/.test(mime)) return; + + try { + let media = await q.download(); + let url = await uploader(media); + + const response = await fetch(`https://api.betabotz.eu.org/api/tools/nsfw-detect?url=${url}&apikey=${lann}`); + const res = await response.json(); + + if (res.result.labelName === 'Porn') { + await conn.sendMessage(m.chat, { + delete: { + remoteJid: m.chat, + fromMe: false, + id: m.key.id, + participant: m.key.participant + } + }); + m.reply('โš ๏ธantiporn detectedโš ๏ธ'); + } + } catch (e) { + console.log(e); + } +}; + +module.exports = handler; diff --git a/plugins/_autoreact.js b/plugins/_autoreact.js new file mode 100644 index 0000000000000000000000000000000000000000..7e732159d04d8fccfadc268744b98264e2c94dd1 --- /dev/null +++ b/plugins/_autoreact.js @@ -0,0 +1,19 @@ +let handler = async (m, { conn, text }) => { + + conn.sendMessage(m.chat, { + react: { + text: `${pickRandom(['๐Ÿ˜จ','๐Ÿ˜…','๐Ÿ˜‚','๐Ÿ˜ณ','๐Ÿ˜Ž', '๐Ÿฅต', '๐Ÿ˜ฑ', '๐Ÿฆ', '๐Ÿ™„', '๐Ÿค','๐Ÿ—ฟ','๐Ÿฆ','๐Ÿคจ','๐Ÿฅด','๐Ÿ˜','๐Ÿ‘†','๐Ÿ˜”', '๐Ÿ‘€','๐Ÿ‘Ž'])}`, + key: m.key, + }}) + + } +handler.customPrefix = /(bile?k|ban?h|cum?|knt?l|y?|mmk|p|b(a|i)?c?(o|i)?(t|d)?|wibu|p(a)?nt(e)?k|pepe?k|owner)/i +handler.command = new RegExp + +handler.mods = false + +module.exports = handler + + function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] + } \ No newline at end of file diff --git a/plugins/_autoresponlink.js b/plugins/_autoresponlink.js new file mode 100644 index 0000000000000000000000000000000000000000..bf6b539fa1827bd2b462c9fd970421f47c750b0d --- /dev/null +++ b/plugins/_autoresponlink.js @@ -0,0 +1,17 @@ +let fs = require('fs') +let handler = m => m + +handler.all = async function (m, { isBlocked }) { + if (isBlocked) return + if ((m.mtype === 'groupInviteMessage' || m.text.startsWith('Undangan untuk bergabung') || m.text.startsWith('Invitation to join') || m.text.startsWith('Buka tautan ini')) && !m.isBaileys && !m.isGroup) { + let teks = `Invite Group +โ€ข 30 Day / Rp 10k +Jika berminat hubungi: @${global.owner[0]} untuk order:) +` + this.reply(m.chat, teks, m) + const data = global.owner.filter(([id, isCreator]) => id && isCreator) + this.sendContact(m.chat, data.map(([id, name]) => [id, name]), m) + } +} + +module.exports = handler \ No newline at end of file diff --git a/plugins/_autosholat.js b/plugins/_autosholat.js new file mode 100644 index 0000000000000000000000000000000000000000..bee4603084195ce52aad15fe2c6421d5ea85bfc6 --- /dev/null +++ b/plugins/_autosholat.js @@ -0,0 +1,47 @@ +module.exports = { +before: async function (m) { + this.autosholat = this.autosholat || {} + let who = m.mentionedJid && m.mentionedJid[0] ? m.mentionedJid[0] : m.fromMe ? this.user.jid : m.sender + let id = m.chat + let jadwalSholat = { + Fajr: "04:49", + Sunrise: "06:04", + Dhuhr: "12:06", + Asr: "15:21", + Sunset: "18:08", + Maghrib: "18:08", + Isha: "19:38", + Imsak: "04:39", + Midnight: "00:06", + Firstthird: "22:07", + Lastthird: "02:06" + } + const date = new Date((new Date).toLocaleString("en-US", { + timeZone: "Asia/Jakarta" + })); + const hours = date.getHours(); + const minutes = date.getMinutes(); + const timeNow = `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}`; + let isActive = Object.values(this.autosholat).includes(true); + if (id in this.autosholat && isActive) { + return false + } + + for (const [sholat, waktu] of Object.entries(jadwalSholat)) { + if (timeNow === waktu && !(id in this.autosholat)) { + let caption = `Hai kak @${who.split`@`[0]},\nWaktu *${sholat}* telah tiba, ambilah air wudhu dan segeralah shalat.\n\n*${waktu}*\n_untuk wilayah Jakarta dan sekitarnya._` + this.autosholat[id] = [ + this.reply(m.chat, caption, null, { + contextInfo: { + mentionedJid: [who] + } + }), + setTimeout(() => { + delete this.autosholat[id] + }, 57000) + ] + } + } +}, +disabled: false +} diff --git a/plugins/_autothanks.js b/plugins/_autothanks.js new file mode 100644 index 0000000000000000000000000000000000000000..84007a8733866707e1fb1105964b87f27da68169 --- /dev/null +++ b/plugins/_autothanks.js @@ -0,0 +1,19 @@ +/** !! THIS CODE GENERATE BY RODOTZBOT !! **/ + +let handler = async (m, { conn }) => { + let thanksWords = ['terima kasih', 'thanks', 'makasi', 'makasih', 'thank you', 'tq', 'ty'] + let isThanks = false + thanksWords.forEach((thanksWord) => { + if (m.text.toLowerCase().includes(thanksWord)) { + isThanks = true + } + }) + if (isThanks) { + let replyMessage = "Sama - sama, semoga membantumu!" + m.reply(replyMessage) + } +} + +handler.customPrefix = /^((thanks?|makasi|makasih|hatur nuhun|terima kasih|thank you|tq|ty)(\s|$))/i +handler.command = new RegExp +module.exports = handler \ No newline at end of file diff --git a/plugins/_catatan-del.js b/plugins/_catatan-del.js new file mode 100644 index 0000000000000000000000000000000000000000..b6bbfa693777ccdf4f473d20b94e0b936d38714d --- /dev/null +++ b/plugins/_catatan-del.js @@ -0,0 +1,41 @@ +let handler = async(m, {conn, command, usedPrefix, text}) => { + global.db.data.users[m.sender].catatan = global.db.data.users[m.sender].catatan || [] + let i = 0 + if (global.db.data.users[m.sender].catatan.length == 0) return m.reply('Kamu belum punya catatan!') + let txt = '๐Ÿ—’๏ธDaftar catatan๐Ÿ—’๏ธ\n\n' + for (let ct in global.db.data.users[m.sender].catatan) { + i += 1 + txt += '[' + i + ']. ' + global.db.data.users[m.sender].catatan[ct].title + '\n' + } + txt += `\nPenggunaan: ${usedPrefix}hapuscatatan 1` + if (text.length == 0) return m.reply(txt) + let catatan = global.db.data.users[m.sender].catatan + let split = text.split('|') + if (catatan.length == 0) return m.reply('Kamu belum memiliki catatan!') + let n = Number(split[0]) - 1 + if (catatan[n] == undefined) return m.reply('Catatan tidak ditemukan!') + let tmp = [] + + for (let ct in catatan) { + if(ct != n) { + tmp.push(catatan[ct]) + } else { + continue + } + } + + cdang = global.db.data.users[m.sender].catatan + global.db.data.users[m.sender].catatan = tmp + +conn.reply(m.chat, `Berhasil menghapus catatan!`, m, false, { + contextInfo: { + mentionedJid: conn.parseMention(text) + } + }) +} + +handler.help = ['hapuscatatan title'] +handler.tags = ['internet'] +handler.command = /^hapuscatatan$/i + +module.exports = handler diff --git a/plugins/_catatan-view.js b/plugins/_catatan-view.js new file mode 100644 index 0000000000000000000000000000000000000000..c4a504b181868a02592b974810a4fb7cd7b15f8e --- /dev/null +++ b/plugins/_catatan-view.js @@ -0,0 +1,29 @@ +let handler = async(m, {conn, command, usedPrefix, text}) => { + global.db.data.users[m.sender].catatan = global.db.data.users[m.sender].catatan || [] + let i = 0 + if (global.db.data.users[m.sender].catatan.length == 0) return m.reply('Kamu belum punya catatan!') + let txt = '๐Ÿ—’๏ธDaftar catatan๐Ÿ—’๏ธ\n\n' + for (let ct in global.db.data.users[m.sender].catatan) { + i += 1 + txt += '[' + i + ']. ' + global.db.data.users[m.sender].catatan[ct].title + '\n' + } + txt += `\nPenggunaan: ${usedPrefix}lihatcatatan 1\nHapus catatan: ${usedPrefix}hapuscatatan 1` + if (text.length == 0) return m.reply(txt) + let catatan = global.db.data.users[m.sender].catatan + let split = text.split('|') + if (catatan.length == 0) return m.reply('Kamu belum memiliki catatan!') + let n = Number(split[0]) - 1 + + let isi = global.db.data.users[m.sender].catatan[n] != undefined ? global.db.data.users[m.sender].catatan[n].isi : 'Catatan tidak ditemukan!' +conn.reply(m.chat, `${isi}`, m, false, { + contextInfo: { + mentionedJid: conn.parseMention(text) + } + }) +} + +handler.help = ['lihatcatatan '] +handler.tags = ['internet'] +handler.command = /^lihatcatatan$/i + +module.exports = handler diff --git a/plugins/_catatan.js b/plugins/_catatan.js new file mode 100644 index 0000000000000000000000000000000000000000..39e5102417c73a81fa480966bb7ff538973511ed --- /dev/null +++ b/plugins/_catatan.js @@ -0,0 +1,26 @@ +let handler = async(m, {conn, command, usedPrefix, text}) => { + let fail = 'format salah, example: ' +usedPrefix+command+ ' Bot|1. Masak' + global.db.data.users[m.sender].catatan = global.db.data.users[m.sender].catatan || [] + let catatan = global.db.data.users[m.sender].catatan + let split = text.split('|') + let title = split[0] + let isi = split[1] + if (catatan.includes(title)) return m.reply('Judul tidak tersedia!\n\nAlasan: Sudah digunakan') + if (!title || !isi) return m.reply(fail) + let cttn = { + 'title': title, + 'isi': isi + } + global.db.data.users[m.sender].catatan.push(cttn) + conn.reply(m.chat, `Catatan berhasil dibuat!\nUntuk melihat catatan. Ketik: ${usedPrefix}lihatcatatan`, m, false, { + contextInfo: { + mentionedJid: conn.parseMention(text) + } + }) +} + +handler.help = ['buatcatatan <title|isi>'] +handler.tags = ['internet'] +handler.command = /^buatcatatan$/i + +module.exports = handler diff --git a/plugins/_didyoumean.js b/plugins/_didyoumean.js new file mode 100644 index 0000000000000000000000000000000000000000..170c4249fc396489bf8dafca9ee5eef3ad80e1ee --- /dev/null +++ b/plugins/_didyoumean.js @@ -0,0 +1,36 @@ +// Thanks To Kasan + +let didyoumean = require('didyoumean') +let similarity = require('similarity') + +let handler = m => m + +handler.before = function (m, { match, usedPrefix, text, args }) { + if ((usedPrefix = (match[0] || '')[0])) { + let noPrefix = m.text.replace(usedPrefix, '').trim() + let args = noPrefix.trim().split` `.slice(1) + let alias = Object.values(global.plugins).filter(v => v.help && !v.disabled).map(v => v.help).flat(1) + if (alias.includes(noPrefix)) return + let mean = didyoumean(noPrefix, alias) + let sim = similarity(noPrefix, mean) + let som = sim * 100 + let tio = `โ€ข Halo Kak @${m.sender.split`@`[0]} Apakah Anda sedang mencari ${usedPrefix + mean} ? + + โ—ฆ Nama menu: *${usedPrefix + mean}* + โ—ฆ Kempiripan: *${parseInt(som)}%*` + if (mean) this.relayMessage(m.chat, { + requestPaymentMessage: { + currencyCodeIso4217: 'IDR', + requestFrom: '0@s.whatsapp.net', + noteMessage: { + extendedTextMessage: { + text: tio, + contextInfo: { + mentionedJid: [m.sender], + externalAdReply: { + showAdAttribution: true + }}}}}}, {}) + } + } + +module.exports = handler diff --git a/plugins/_enable.js b/plugins/_enable.js new file mode 100644 index 0000000000000000000000000000000000000000..9ec47a31f8119a56dffc27cadecc9e3740ae26e1 --- /dev/null +++ b/plugins/_enable.js @@ -0,0 +1,227 @@ + +let handler = async (m, { conn, usedPrefix, command, args, isOwner, isAdmin, isROwner }) => { + let isEnable = /true|enable|(turn)?on|1/i.test(command) + let chat = global.db.data.chats[m.chat] + let user = global.db.data.users[m.sender] + let type = (args[0] || '').toLowerCase() + let isAll = false + let isUser = false + switch (type) { + case 'welcome': + if (!m.isGroup) { + if (!isOwner) { + global.dfail('group', m, conn) + throw false + } + } else if (!isAdmin) { + global.dfail('admin', m, conn) + throw false + } + chat.welcome = isEnable + break + case 'detect': + if (!m.isGroup) { + if (!isOwner) { + global.dfail('group', m, conn) + throw false + } + } else if (!isAdmin) { + global.dfail('admin', m, conn) + throw false + } + chat.detect = isEnable + break + case 'delete': + if (m.isGroup) { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + } + chat.delete = isEnable + break + case 'antidelete': + if (m.isGroup) { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + } + chat.delete = !isEnable + break + case 'autodelvn': + if (m.isGroup) { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + } + chat.autodelvn = isEnable + break + case 'document': + chat.useDocument = isEnable + break + case 'public': + isAll = true + if (!isROwner) { + global.dfail('rowner', m, conn) + throw false + } + global.opts['self'] = !isEnable + break + case 'antilink': + if (m.isGroup) { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + } + chat.antiLink = isEnable + break + case 'antisticker': + if (m.isGroup) { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + } + chat.antiSticker = isEnable + break + case 'autosticker': + if (m.isGroup) { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + } + chat.stiker = isEnable + break + case 'toxic': + if (m.isGroup) { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + } + chat.antiToxic = !isEnable + break + case 'antitoxic': + if (m.isGroup) { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + } + chat.antiToxic = isEnable + break + case 'autolevelup': + isUser = true + user.autolevelup = isEnable + break + case 'mycontact': + case 'mycontacts': + case 'whitelistcontact': + case 'whitelistcontacts': + case 'whitelistmycontact': + case 'whitelistmycontacts': + if (!isOwner) { + global.dfail('owner', m, conn) + throw false + } + conn.callWhitelistMode = isEnable + break + case 'restrict': + isAll = true + if (!isROwner) { + global.dfail('rowner', m, conn) + throw false + } + global.opts['restrict'] = isEnable + break + case 'nyimak': + isAll = true + if (!isROwner) { + global.dfail('rowner', m, conn) + throw false + } + global.opts['nyimak'] = isEnable + break + case 'autoread': + isAll = true + if (!isROwner) { + global.dfail('rowner', m, conn) + throw false + } + global.opts['autoread'] = isEnable + break + case 'pconly': + case 'privateonly': + isAll = true + if (!isROwner) { + global.dfail('rowner', m, conn) + throw false + } + global.opts['pconly'] = isEnable + break + case 'gconly': + case 'grouponly': + isAll = true + if (!isROwner) { + global.dfail('rowner', m, conn) + throw false + } + global.opts['gconly'] = isEnable + break + case 'swonly': + case 'statusonly': + isAll = true + if (!isROwner) { + global.dfail('rowner', m, conn) + throw false + } + global.opts['swonly'] = isEnable + break + case 'viewonce': + if (m.isGroup) { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + } + chat.viewonce = isEnable + break + default: + if (!/[01]/.test(command)) return m.reply(` +List option: +| welcome +| delete +| public +| antilink +| antidelete +| antisticker +| autosticker +| autolevelup +| detect +| document +| whitelistmycontacts +| restrict +| nyimak +| autoread +| pconly +| gconly +| swonly +Contoh: +${usedPrefix}enable welcome +${usedPrefix}disable welcome +`.trim()) + throw false + } + m.reply(` +*${type}* berhasil di *${isEnable ? 'nyala' : 'mati'}kan* ${isAll ? 'untuk bot ini' : isUser ? '' : 'untuk chat ini'} +`.trim()) +} +handler.help = ['en', 'dis'].map(v => v + 'able <option>') +handler.tags = ['group', 'owner'] +handler.command = /^((en|dis)able|(tru|fals)e|(turn)?o(n|ff)|[01])$/i + +module.exports = handler diff --git a/plugins/_jadwalsholat.js b/plugins/_jadwalsholat.js new file mode 100644 index 0000000000000000000000000000000000000000..dfccd74519d618edaa2b360fbb40a117645b934f --- /dev/null +++ b/plugins/_jadwalsholat.js @@ -0,0 +1,34 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `Gunakan contoh: ${usedPrefix}${command} semarang`; + + try { + const res = await (await fetch(`https://api.botcahx.eu.org/api/tools/jadwalshalat?kota=${text}&apikey=${btc}`)).json(); + + if (!res.status || res.result.code !== 200) { + throw eror + } + + let timings = res.result.data[0].timings; + let jadwalSholat = Object.entries(timings) + .map(([name, time]) => `*${name}:* ${time}`) + .join('\n'); + + let message = ` +Jadwal Sholat untuk *${text}* +${jadwalSholat} +`.trim(); + + m.reply(message); + } catch (error) { + throw eror + } +}; + +handler.help = ['salat <daerah>']; +handler.tags = ['islam']; +handler.command = /^(jadwal)?s(a|o|ha|ho)lat$/i; +handler.limit = true; + +module.exports = handler; diff --git a/plugins/_list-block.js b/plugins/_list-block.js new file mode 100644 index 0000000000000000000000000000000000000000..4241c7ffb8f162ca85008398718f68c9865d522f --- /dev/null +++ b/plugins/_list-block.js @@ -0,0 +1,12 @@ +var fetch = require("node-fetch"); +var handler = async (m, { + conn + }) => { +var block = await conn.fetchBlocklist() +conn.reply(m.chat, 'List Block:\n\n' + `Total: ${block == undefined ? '*0* Diblokir' : '*' + block.length + '* Diblokir'}\n` + block.map(v => 'ไน‚ @' + v.replace(/@.+/, '')).join`\n`, m, { mentions: block }) +}; +handler.help = ['blocklist']; +handler.tags = ['info']; +handler.command = /^listbloc?k|bloc?klist|daftarbloc?k|blocks$/i +handler.owner = false; +module.exports = handler; diff --git a/plugins/anime-storyanime.js b/plugins/anime-storyanime.js new file mode 100644 index 0000000000000000000000000000000000000000..6bdd8e0d856314eb7d41e94194ab8f63793405df --- /dev/null +++ b/plugins/anime-storyanime.js @@ -0,0 +1,17 @@ +let fetch = require('node-fetch'); +let handler = async (m, { conn }) => { + try { + conn.reply(m.chat, wait, m) + let res = await fetch(`https://api.botcahx.eu.org/api/download/storyanime?apikey=${btc}`); + let json = await res.json(); + conn.sendFile(m.chat, json.result.url, 'anime_story.mp4', "*STORY ANIME*", m); + } catch (e) { + throw `*Error:* ${eror}`; + } +}; + +handler.help = ['storyanime']; +handler.tags = ['downloader']; +handler.command = /^(storyanime)$/i; +handler.limir = true +module.exports = handler; diff --git a/plugins/animeupdate.js b/plugins/animeupdate.js new file mode 100644 index 0000000000000000000000000000000000000000..6b4dc222667a789c04b82bfd0bcfb7b6bf6ca4d6 --- /dev/null +++ b/plugins/animeupdate.js @@ -0,0 +1,122 @@ +const fetch = require('node-fetch'); +const { generateWAMessageFromContent, prepareWAMessageMedia } = require('@adiwajshing/baileys'); +const { proto } = require('@adiwajshing/baileys'); + +let handler = async (m, { conn, text, usedPrefix, command }) => { + let response = await fetch("https://api.jikan.moe/v4/seasons/now?filter=tv"); + let data = await response.json(); + + // Ambil data anime dengan detail + let animeList = await Promise.all(data.data.map(async anime => { + return { + imageUrl: anime.images.jpg.large_image_url, + title: anime.title, + genres: anime.genres, + type: anime.type, + season: anime.season, + year: anime.year, + source: anime.source, + episodes: anime.episodes, + status: anime.status, + duration: anime.duration, + studios: anime.studios, + rating: anime.rating, + score: anime.score, + popularity: anime.popularity + }; + })); + + const createImageMessage = async (url) => { + const { imageMessage } = await prepareWAMessageMedia({ image: { url } }, { upload: conn.waUploadToServer }); + return imageMessage; + } + + const cards = await Promise.all(animeList.map(async (a) => { + const imageMessage = await createImageMessage(a.imageUrl); + + // Deskripsi anime yang lebih lengkap + const description = `*โ€ข Title:* ${a.title} +*โ€ข Genre:* *[ ${a.genres.map(g => g.name).join(", ")} ]* +*โ€ข Type:* ${a.type} +*โ€ข Season:* ${a.season} *[ ${a.year} ]* +*โ€ข Source:* ${a.source} +*โ€ข Total episodes:* ${a.episodes} +*โ€ข Status:* ${a.status} +*โ€ข Duration:* ${a.duration} +*โ€ข Studio:* *[ ${a.studios.map(s => s.name).join(", ")} ]* +*โ€ข Rating:* ${a.rating} +*โ€ข Score:* ${a.score}/10.0 +*โ€ข Popularity:* ${a.popularity}`; + + return { + body: proto.Message.InteractiveMessage.Body.fromObject({ + text: description, + }), + footer: proto.Message.InteractiveMessage.Footer.fromObject({ + text: "Powered by Jikan API", + }), + header: proto.Message.InteractiveMessage.Header.fromObject({ + title: '', + hasMediaAttachment: true, + imageMessage: imageMessage, + }), + nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.fromObject({ + buttons: [ + { + name: "cta_url", + buttonParamsJson: JSON.stringify({ + display_text: "Lihat Gambar", + cta_type: "1", + url: a.imageUrl + }) + } + // Tombol "SEARCH AGAIN" dihapus + ] + }) + }; + })); + + // Kirim pesan interaktif + const interactiveMessage = proto.Message.InteractiveMessage.create({ + body: proto.Message.InteractiveMessage.Body.fromObject({ + text: "List of Anime Images", + }), + footer: proto.Message.InteractiveMessage.Footer.fromObject({ + text: "Powered by Jikan API", + }), + header: proto.Message.InteractiveMessage.Header.fromObject({ + title: "Anime Carousel", + hasMediaAttachment: false, + }), + carouselMessage: proto.Message.InteractiveMessage.CarouselMessage.fromObject({ + cards: cards, + }), + }); + + const messageContent = proto.Message.fromObject({ + viewOnceMessage: { + message: { + messageContextInfo: { + deviceListMetadata: {}, + deviceListMetadataVersion: 2, + }, + interactiveMessage, + }, + }, + }); + + const msgs = await generateWAMessageFromContent(m.chat, messageContent, { + userJid: conn.user.jid, + quoted: m, + upload: conn.waUploadToServer, + }); + + await conn.relayMessage(m.chat, msgs.message, { + messageId: msgs.key.id, + }); +}; + +handler.help = ["animeupdate"]; +handler.tags = ["anime"]; +handler.command = ["animeupdate"]; +module.exports = handler; \ No newline at end of file diff --git a/plugins/donwloader-githubdl.js b/plugins/donwloader-githubdl.js new file mode 100644 index 0000000000000000000000000000000000000000..e13324b4c846b276ef3468c9fe1057611080251c --- /dev/null +++ b/plugins/donwloader-githubdl.js @@ -0,0 +1,18 @@ +let handler = async (m, { args, usedPrefix, command }) => { + +if (!args[0]) throw 'usernamenya mana om' +if (!args[1]) throw 'repo nya mana?' +if (!args[2]) throw 'masukkan nama branch' +let url = `https://github.com/${args[0]}/${args[1]}/archive/refs/heads/${args[2]}.zip` +//F +m.reply(`compressing data to file zip*`) +conn.sendFile( m.chat, url, `${args[1]} ${args[2]}.zip`, null, m) + +} +handler.help = ['githubdl'] +handler.tags = ['github'] +handler.command = /githubdl/i + +handler.limit = true + +module.exports = handler diff --git a/plugins/downloader-asupan.js b/plugins/downloader-asupan.js new file mode 100644 index 0000000000000000000000000000000000000000..d41ebc2b497e4053a918949d76a5a21aef6694b7 --- /dev/null +++ b/plugins/downloader-asupan.js @@ -0,0 +1,37 @@ +let handler = async(m, { conn }) => { + const asupan = [ + `https://api.botcahx.eu.org/api/asupan/rikagusriani?apikey=${btc}`, + `https://api.botcahx.eu.org/api/asupan/santuy?apikey=${btc}`, + `https://api.botcahx.eu.org/api/asupan/ukhty?apikey=${btc}`, + `https://api.botcahx.eu.org/api/asupan/bocil?apikey=${btc}`, + `https://api.botcahx.eu.org/api/asupan/gheayubi?apikey=${btc}`, + `https://api.botcahx.eu.org/api/asupan/natajadeh?apikey=${btc}`, + `https://api.botcahx.eu.org/api/asupan/euni?apikey=${btc}`, + `https://api.botcahx.eu.org/api/asupan/douyin?apikey=${btc}`, + `https://api.botcahx.eu.org/api/api/asupan/cecan?apikey=${btc}`, + `https://api.botcahx.eu.org/api/api/asupan/hijaber?apikey=${btc}`, + `https://api.botcahx.eu.org/api/api/asupan/asupan?apikey=${btc}`, + `https://api.botcahx.eu.org/api/api/asupan/anony?apikey=${btc}` + ] + try { + const url = pickRandom(asupan); + await conn.sendFile(m.chat, url, null, '', m); + } catch (e) { + console.log(e); + m.reply('Maaf, video asupan tidak ditemukan'); + } +} + +handler.help = ['asupan'] +handler.tags = ['downloader'] +handler.command = /^asupan$/i +handler.owner = false +handler.premium = false +handler.group = false +handler.private = false + +function pickRandom(list) { + return list[Math.floor(list.length * Math.random())] +} + +module.exports = handler diff --git a/plugins/downloader-asupantiktok.js b/plugins/downloader-asupantiktok.js new file mode 100644 index 0000000000000000000000000000000000000000..d7dd55498124fa2054c95ab5eda10d3ad75322e6 --- /dev/null +++ b/plugins/downloader-asupantiktok.js @@ -0,0 +1,110 @@ +const fetch = require('node-fetch'); + +let handler = async (m, { conn, args, usedPrefix, command }) => { + const username = [ + 'natajadeh', + 'aletaanovianda', + 'faisafch', + '0rbby', + 'cindyanastt', + 'awaa.an', + 'nadineabgail', + 'ciloqciliq', + 'carluskiey', + 'wuxiaturuxia', + 'joomblo', + 'hxszys', + 'indomeysleramu', + 'anindthrc', + 'm1cel', + 'chrislin.chrislin', + 'brocolee__', + 'dxzdaa', + 'toodlesprunky', + 'wasawho', + 'paphricia', + 'queenzlyjlita', + 'apol1yon', + 'eliceannabella', + 'aintyrbaby', + 'christychriselle', + 'natalienovita', + 'glennvmi', + '_rgtaaa', + 'felicialrnz', + 'zahraazzhri', + 'mdy.li', + 'jeyiiiii_', + 'bbytiffs', + 'irenefennn', + 'mellyllyyy', + 'xsta_xstar', + 'n0_0ella', + 'kutubuku6690', + 'cesiann', + 'gaby.rosse', + 'charrvm_', + 'bilacml04', + 'whosyoraa', + 'ishaangelica', + 'heresthekei', + 'gemoy.douyin', + 'nathasyaest', + 'jasmine.mat', + 'akuallyaa', + 'meycoco22', + 'baby_sya66', + 'knzymyln__', + 'rin.channn', + 'audicamy', + 'franzeskaedelyn', + 'shiraishi.ito', + 'itsceceh', + 'senpai_cj7', + 'miawwchu', + 'sinclareee', + 'yyourcandle', + 'sukamatchaa255', + 'tilalaamisyu', + 'cricezie', + 'nabilakhoeruniza5', + 'caca.kiyowo', + 'jennangelina_', + 'ciisel22', + 'meytwohuhuy', + 'panggilkez', + 'strangerfr0mhell', + 'deboraballtes22', + 'nabilakhoeruniza5', + 'natasya_aya22', + ]; + const pickuser = username[Math.floor(Math.random() * username.length)]; + const query = args[0] ? args[0] : pickuser; + try { + const res = await fetch(`https://api.botcahx.eu.org/api/asupan/tiktok?query=${query}&apikey=${btc}`); + const api = await res.json(); + + const video = api.result.data[0]; + const author = video.author; + const music = video.music_info; + + let capt = `ไน‚ *T I K T O K*\n\n`; + capt += ` โ—ฆ *Author* : ${author.nickname} (@${author.unique_id})\n`; + capt += ` โ—ฆ *Views* : ${video.play_count}\n`; + capt += ` โ—ฆ *Likes* : ${video.digg_count}\n`; + capt += ` โ—ฆ *Shares* : ${video.share_count}\n`; + capt += ` โ—ฆ *Comments* : ${video.comment_count}\n`; + capt += ` โ—ฆ *Duration* : ${Math.floor(video.duration / 60)} menit ${Math.floor(video.duration % 60)} detik\n`; + capt += ` โ—ฆ *Sound* : ${music.title} - ${music.author}\n`; + capt += ` โ—ฆ *Caption* : ${video.title || '-'}\n\n`; + conn.sendFile(m.chat, video.play, null, capt, m); + } catch (error) { + throw `๐Ÿšฉ *Username Tidak Ditemukan*` + } +} +handler.help = ['asupantiktok'].map(v => v + ' <username>'); +handler.tags = ['downloader']; +handler.command = /^(asupantiktok)$/i; +handler.limit = true; + +module.exports = handler; diff --git a/plugins/downloader-capcut.js b/plugins/downloader-capcut.js new file mode 100644 index 0000000000000000000000000000000000000000..5a34df243cd4d75018ef9ea1d263d222a93acc28 --- /dev/null +++ b/plugins/downloader-capcut.js @@ -0,0 +1,32 @@ +const axios = require('axios'); + +let handler = async (m, { conn, args, usedPrefix, command }) => { + if (!args[0]) { + throw `Masukan URL!\n\ncontoh:\n${usedPrefix + command} https://www.capcut.com/template-detail/7273798219329441025?template_id=7273798219329441025&share_token=1ea9b68c-aa1b-4fc4-86c2-bf2b9136b6e0&enter_from=template_detail®ion=ID&language=in&platform=copy_link&is_copy_link=1`; + } + try { + if (!args[0].match(/capcut/gi)) { + throw `URL Tidak Ditemukan!`; + } + m.reply('*Mohon tunggu..*'); + const response = await axios.get(`https://api.botcahx.eu.org/api/dowloader/capcut?url=${args[0]}&apikey=${btc}`); + const res = response.data; + const { + video_ori, + title, + digunakan, + cover, + author_profile + } = res.result; + conn.sendFile(m.chat, video_ori, 'capcut.mp4', `Title: ${title}\nDigunakan: ${digunakan}\nThumbnail: ${cover}\nProfile: ${author_profile}`, m); + } catch (e) { + console.log(e); + throw `Terjadi Kesalahan!`; + } +}; + +handler.help = handler.command = ['capcut', 'cc', 'capcutdl', 'ccdl']; +handler.tags = ['downloader']; +handler.limit = true; +handler.group = false; +module.exports = handler; diff --git a/plugins/downloader-cecan.js b/plugins/downloader-cecan.js new file mode 100644 index 0000000000000000000000000000000000000000..e92e08efe0bbe8f1cc2acc3ac76d0e86c8e8516d --- /dev/null +++ b/plugins/downloader-cecan.js @@ -0,0 +1,19 @@ +let fetch = require('node-fetch') + +let handler = async (m, { conn, command }) => { + let api1 = `https://api.botcahx.eu.org/api/cecan/${command}?apikey=${btc}` + let api2 = `https://api.betabotz.eu.org/api/cecan/${command}?apikey=${lann}` + let buffer = await fetch(api1) + .then(res => res.buffer()) + .catch(async (err) => { + console.log(`API 1 failed with error: ${err}. Trying API 2...`) + buffer = await fetch(api2).then(res => res.buffer()) + return buffer + }) + conn.sendFile(m.chat, buffer, 'hasil.jpg', `Random ${command}`, m) +} + +handler.command = ['china','vietnam','thailand','indonesia','korea','japan','malaysia','justinaxie','jeni','jiso','ryujin','rose','hijaber'] +handler.tags = ['downloader']; +handler.limit = true; +module.exports = handler; diff --git a/plugins/downloader-douyin.js b/plugins/downloader-douyin.js new file mode 100644 index 0000000000000000000000000000000000000000..57ebb44a5727f2c448b03c643c1ee17cab17e0b3 --- /dev/null +++ b/plugins/downloader-douyin.js @@ -0,0 +1,34 @@ +const axios = require('axios'); + +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) throw `Masukan URL!\n\ncontoh:\n${usedPrefix + command} https://v.douyin.com/ikq8axJ/`; + try { + if (!text.match(/douyin/gi)) throw `URL Tidak Ditemukan!`; + m.reply(wait); + const response = await axios.get(`https://api.botcahx.eu.org/api/dowloader/douyin?url=${text}&apikey=${btc}`); + const res = response.data.result; + var { video, title, title_audio, audio } = res; + let capt = `ไน‚ *D O U Y I N*\n\n`; + capt += `โ—ฆ *Title* : ${title}\n`; + capt += `โ—ฆ *Audio* : ${title_audio}\n`; + capt += `\n`; + await conn.sendFile(m.chat, video, null, capt, m); + conn.sendMessage(m.chat, { audio: { url: audio[0] }, mimetype: 'audio/mpeg' }, { quoted: m }); + } catch (e) { + console.log(e); + throw `๐Ÿšฉ ${eror}`; + } +}; +handler.help = ['douyin']; +handler.command = /^(douyin)$/i; +handler.tags = ['downloader']; +handler.limit = true; +handler.group = false; +handler.premium = false; +handler.owner = false; +handler.admin = false; +handler.botAdmin = false; +handler.fail = null; +handler.private = false; + +module.exports = handler; diff --git a/plugins/downloader-fb.js b/plugins/downloader-fb.js new file mode 100644 index 0000000000000000000000000000000000000000..84c6d4963d2380d225181d7d44254b519828bfc9 --- /dev/null +++ b/plugins/downloader-fb.js @@ -0,0 +1,37 @@ +const fetch = require("node-fetch"); + +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) throw `*โ€ข Example:* ${usedPrefix + command} *[Facebook url]*`; + m.reply("*[ PROCESSING.... ]*"); + try { + let fb = await ( + await fetch("https://skizoasia.xyz/api/fb", { + method: "POST", + body: JSON.stringify({ + url: text, + }), + headers: { + "Content-Type": "application/json", + Authorization: "Ikyskizo", + }, + }) + ).json(); + conn.sendMessage( + m.chat, + { + video: { + url: fb[0].url, + }, + caption: "*[ FACEBOOK DOWNLOADER ]*", + }, + { quoted: m }, + ); + } catch (e) { + throw "*[ ERROR CAN'T DOWNLOAD FACEBOOK ]*"; + } +}; +handler.help = ["fb", "facebook", "fbdl"].map((a) => a + " *[Facebook url]*"); +handler.tags = ["downloader"]; +handler.command = ["fb", "facebook", "fbdl"]; +handler.limit = 10 +module.exports = handler; diff --git a/plugins/downloader-gdrive.js b/plugins/downloader-gdrive.js new file mode 100644 index 0000000000000000000000000000000000000000..311dd78441a2b5f3206228663ebbb09ae1ad9fe6 --- /dev/null +++ b/plugins/downloader-gdrive.js @@ -0,0 +1,16 @@ +let fetch = require('node-fetch') + +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `*Example:* ${usedPrefix + command} https://drive.google.com/file/d/1thDYWcS5p5FFhzTpTev7RUv0VFnNQyZ4/view?usp=drivesdk` + m.reply(wait) + try { + let json = await fetch(`https://api.botcahx.eu.org/api/download/gdrive?url=${text}&apikey=${btc}`).then(res => res.json()); + conn.sendMessage(m.chat, { document: { url: json.result.data }, fileName: json.result.fileName, mimetype: json.result.mimetype }, { quoted: m }) + } catch (e) { + throw `Error: ${eror}` + } +} +handler.command = handler.help = ['gdrive','gdrivedl'] +handler.tags = ['downloader'] +handler.limit = true +module.exports = handler diff --git a/plugins/downloader-gitclone.js b/plugins/downloader-gitclone.js new file mode 100644 index 0000000000000000000000000000000000000000..f91434e1cd44e8abf6ba562828b8040b3887b290 --- /dev/null +++ b/plugins/downloader-gitclone.js @@ -0,0 +1,23 @@ +let regex = /(?:https|git)(?::\/\/|@)github\.com[\/:]([^\/:]+)\/(.+)/i +let fetch = require('node-fetch') +let handler = async (m, { args, usedPrefix, command }) => { + + if (!args[0]) throw 'link githubnya mana? contoh: https://github.com/BOTCAHX/RTXZY-MD' + + if (!regex.test(args[0])) throw 'link salah!' + + let [, user, repo] = args[0].match(regex) || [] + repo = repo.replace(/.git$/, '') + let url = `https://api.github.com/repos/${user}/${repo}/zipball` + let filename = (await fetch(url, { method: 'HEAD' })).headers.get('content-disposition').match(/attachment; filename=(.*)/)[1] + m.reply(wait) + await conn.sendMessage(m.chat, { document: { url: url }, mimetype: 'application/zip', fileName: filename.replace('.zip.zip','.zip')}, { quoted : m }) + +} +handler.help = ['gitclone <url>'] +handler.tags = ['github'] +handler.command = /gitclone/i + +handler.limit = true + +module.exports = handler diff --git a/plugins/downloader-ig.js b/plugins/downloader-ig.js new file mode 100644 index 0000000000000000000000000000000000000000..724f6e859ff835223d1c4991430708b97dd8ebc6 --- /dev/null +++ b/plugins/downloader-ig.js @@ -0,0 +1,51 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { conn, args, usedPrefix, command }) => { + if (!args[0]) throw `*Contoh:* ${usedPrefix}${command} https://www.instagram.com/p/ByxKbUSnubS/?utm_source=ig_web_copy_link`; + + if (!args[0].match(/instagram/gi)) { + throw `URL Instagram Tidak Valid!`; + } + + await m.reply("Tunggu sebentar..."); + + try { + const api = await fetch(`https://btch.us.kg/download/igdl?url=${encodeURIComponent(args[0])}`); + const res = await api.json(); + + if (!res.status || res.code !== 200 || !res.result || res.result.length === 0) { + throw `Tidak ada hasil ditemukan.`; + } + + const limitnya = 3; // Batas jumlah media yang akan dikirim + + for (let i = 0; i < Math.min(limitnya, res.result.length); i++) { + await sleep(3000); // Delay sebelum mengirim + const mediaUrl = res.result[i].url; + const mediaType = mediaUrl.endsWith('.mp4') ? 'video' : 'image'; // Cek apakah media adalah video atau gambar + + if (mediaType === 'video') { + conn.sendFile(m.chat, mediaUrl, null, `*Instagram Downloader*\n\n` + + `โ—ฆ Watermark: ${res.result[i].wm}\n` + + `โ—ฆ Thumbnail: ${res.result[i].thumbnail}`, m); + } else { + conn.sendFile(m.chat, mediaUrl, null, `*Instagram Downloader*\n\n` + + `โ—ฆ Watermark: ${res.result[i].wm}`, m); + } + } + } catch (e) { + console.error("Terjadi kesalahan:", e); // Log kesalahan + throw `Terjadi kesalahan saat mengunduh media. Silakan periksa log untuk detail.`; + } +} + +handler.help = ['instagram'].map(v => v + ' <url>'); +handler.tags = ['downloader']; +handler.command = /^(ig|instagram|igdl|instagramdl|igstory)$/i; +handler.limit = true; + +module.exports = handler; + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/plugins/downloader-likee.js b/plugins/downloader-likee.js new file mode 100644 index 0000000000000000000000000000000000000000..7f0685845a6f731383187a8974e497d020a11213 --- /dev/null +++ b/plugins/downloader-likee.js @@ -0,0 +1,27 @@ +const axios = require('axios'); + +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) throw `Masukan URL!\n\ncontoh:\n${usedPrefix + command} https://l.likee.video/v/tmj1oh`; + try { + if (!text.match(/likee/gi)) throw `URL Tidak Ditemukan!`; + m.reply(wait); + const response = await axios.get(`https://api.botcahx.eu.org/api/download/likee?url=${text}&apikey=${btc}`); + const res = response.data.result; + var { + title, + withwm, + nowm + } = res; + let capt = `ไน‚ *L I K E E V I D E O*\n\n`; + capt += `โ—ฆ *Title* : ${title}\n`; + capt += `\n`; + await conn.sendFile(m.chat, nowm, null, capt, m); + } catch (e) { + throw eror + } +}; +handler.command = handler.help = ['likee']; +handler.tags = ['downloader']; +handler.limit = true; + +module.exports = handler; diff --git a/plugins/downloader-mediafire.js b/plugins/downloader-mediafire.js new file mode 100644 index 0000000000000000000000000000000000000000..aff9faad4f2f87c1925f02f3a860ae9a5e713990 --- /dev/null +++ b/plugins/downloader-mediafire.js @@ -0,0 +1,21 @@ +let { mediafiredl } = require('@bochilteam/scraper') +let handler = async (m, { conn, args, usedPrefix, command }) => { + if (!args[0]) throw `Use example ${usedPrefix}${command} https://www.mediafire.com/file/941xczxhn27qbby/GBWA_V12.25FF-By.SamMods-.apk/file` + let res = await mediafiredl(args[0]) + let { url, url2, filename, ext, aploud, filesize, filesizeH } = res + let caption = ` +*๐Ÿ’Œ Name:* ${filename} +*๐Ÿ“Š Size:* ${filesizeH} +*๐Ÿ—‚๏ธ Extension:* ${ext} +*๐Ÿ“จ Uploaded:* ${aploud} +`.trim() + m.reply(caption) + conn.sendMessage(m.chat, { document: { url: url }, mimetype: ext, fileName: filename }, { quoted: m }) +} +handler.help = ['mediafire'].map(v => v + ' <url>') +handler.tags = ['downloader'] +handler.command = /^(mediafire|mf)$/i + +handler.limit = true + +module.exports = handler diff --git a/plugins/downloader-pinterest.js b/plugins/downloader-pinterest.js new file mode 100644 index 0000000000000000000000000000000000000000..b173e69f2fa04af48981404d16def4dd32de2706 --- /dev/null +++ b/plugins/downloader-pinterest.js @@ -0,0 +1,157 @@ +const axios = require('axios'); +const { generateWAMessageContent, generateWAMessageFromContent, proto } = require('@adiwajshing/baileys'); + +let handler = async (m, { usedPrefix, command, conn, args }) => { + if (!args[0]) throw `*๐Ÿšฉ Example:* ${usedPrefix}${command} Tobrut`; + m.reply('Please wait...'); + + try { + // Fetch data from Pinterest + let { data } = await axios.get(`https://www.pinterest.com/resource/BaseSearchResource/get/?source_url=%2Fsearch%2Fpins%2F%3Fq%3D${args[0]}&data=%7B%22options%22%3A%7B%22isPrefetch%22%3Afalse%2C%22query%22%3A%22${args[0]}%22%2C%22scope%22%3A%22pins%22%2C%22no_fetch_context_on_resource%22%3Afalse%7D%2C%22context%22%3A%7B%7D%7D&_=1619980301559`); + let res = data.resource_response.data.results.map(v => v.images.orig.url); + let nem = await conn.getName(m.sender) + + if (res.length < 1) return m.reply("Error, Foto Tidak Ditemukan"); + + // Mengacak urutan array + function shuffleArray(array) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + } + + // Mengacak hasil dan mengambil hingga 5 gambar + shuffleArray(res); + let limit = Math.min(10, res.length); + let images = res.slice(0, limit); + let videos = res.slice(0, limit); + + let push = []; + let i = 1; + + // Fungsi untuk membuat pesan gambar + async function createImage(url) { + const { imageMessage } = await generateWAMessageContent({ + image: { url } + }, { + upload: conn.waUploadToServer + }); + return imageMessage; + } + + for (let pus of images) { + push.push({ + body: proto.Message.InteractiveMessage.Body.fromObject({ + text: `${pus}` + }), + footer: proto.Message.InteractiveMessage.Footer.fromObject({ + text: global.footer + }), + header: proto.Message.InteractiveMessage.Header.fromObject({ + title: '', + hasMediaAttachment: true, + imageMessage: await createImage(pus) + }), + nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.fromObject({ + buttons: [ + { + name: "cta_url", + buttonParamsJson: `{"display_text":"Lihat Gambar","cta_type":"1","url":"${pus}"}` + }, + { + "name": "quick_reply", + "buttonParamsJson": JSON.stringify({ + "display_text": "SEARCH AGAIN", + "id": `${usedPrefix + command}` + command + }) + } + ] + }) + }); + } + async function createVideo(url) { + const { videoMessage } = await generateWAMessageContent({ + video: { url } + }, { + upload: conn.waUploadToServer + }); + return videoMessage; + } + + for (let pus of videos) { + push.push({ + body: proto.Message.InteractiveMessage.Body.fromObject({ + text: `${pus}` + }), + footer: proto.Message.InteractiveMessage.Footer.fromObject({ + text: global.footer + }), + header: proto.Message.InteractiveMessage.Header.fromObject({ + title: '', + hasMediaAttachment: true, + videoMessage: await createVideo(pus) + }), + nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.fromObject({ + buttons: [ + { + name: "cta_url", + buttonParamsJson: `{"display_text":"Lihat Video","cta_type":"1","url":"${pus}"}` + }, + { + "name": "quick_reply", + "buttonParamsJson": JSON.stringify({ + "display_text": "SEARCH AGAIN", + "id": `${usedPrefix + command}` + command + }) + } + ] + }) + }); + } + + const msg = generateWAMessageFromContent(m.chat, { + viewOnceMessage: { + message: { + messageContextInfo: { + deviceListMetadata: {}, + deviceListMetadataVersion: 2 + }, + interactiveMessage: proto.Message.InteractiveMessage.fromObject({ + body: proto.Message.InteractiveMessage.Body.create({ + text: `total result: ${limit}` + }), + footer: proto.Message.InteractiveMessage.Footer.create({ + text: `Hai\nDibawah ini Adalah hasil dari Pencarian Dari:\n${nem}` + }), + header: proto.Message.InteractiveMessage.Header.create({ + hasMediaAttachment: false + }), + carouselMessage: proto.Message.InteractiveMessage.CarouselMessage.fromObject({ + cards: [ + ...push + ] + }) + }) + } + } + }, { quoted: m }); + + await conn.relayMessage(m.chat, msg.message, { + messageId: msg.key.id + }); + //await conn.sendMessage(m.chat, { audio: { url: './mp3/menuu12.mp3' }, viewOnce: false, seconds: fsizedoc, ptt: true, mimetype: "audio/mpeg", fileName: "vn.mp3", waveform: [100,0,100,0,100,0,100] }, { quoted: m }) + } catch (e) { + throw `Error: ${e.message}`; + } +}; + +handler.help = handler.command = ['pinterest', 'pin']; +handler.tags = ['internet', 'downloader']; +handler.limit = 10 + +module.exports = handler; + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/plugins/downloader-soundcloud.js b/plugins/downloader-soundcloud.js new file mode 100644 index 0000000000000000000000000000000000000000..f510f622336f911164aadf5e915a516d3aa3169e --- /dev/null +++ b/plugins/downloader-soundcloud.js @@ -0,0 +1,42 @@ +const fetch = require('node-fetch') + +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) throw `*Usage : ${usedPrefix + command} url*\n\nExample: ${usedPrefix + command} https://soundcloud.com/issabella-marchelina/sisa-rasa-mahalini-official-audio?utm_source=clipboard&utm_medium=text&utm_campaign=social_sharing` + if (!(text.includes('http://') || text.includes('https://'))) throw `url invalid, please input a valid url. Try with add http:// or https://` + try { + let res = await fetch(`https://api.botcahx.eu.org/api/download/soundcloud?url=${text}&apikey=${btc}`) + let anu = await res.json() + anu = anu.result + let ini_txt = `*${anu.title}*\n\n` + + await conn.sendFile(m.chat, anu.thumbnail, 'scloud.jpg', ini_txt, m) + conn.sendMessage(m.chat, { + audio: { + url: anu.url + }, + mimetype: 'audio/mpeg', + contextInfo: { + externalAdReply: { + title: anu.title, + body: "", + thumbnailUrl: anu.thumbnail, + sourceUrl: anu.url, + mediaType: 1, + showAdAttribution: true, + renderLargerThumbnail: true + } + } + }, { + quoted: m + }); + } catch (e) { + console.log(e) + m.reply(`Invalid Soundcloud URL / terjadi kesalahan.`) + } +} + +handler.help = ['soundcloud <url>'] +handler.tags = ['downloader'] +handler.command = /^(s(ound)?cloud)$/i + +module.exports = handler diff --git a/plugins/downloader-spotify.js b/plugins/downloader-spotify.js new file mode 100644 index 0000000000000000000000000000000000000000..5ccd6ce64663208e88e3c5e755e9399e829d1c94 --- /dev/null +++ b/plugins/downloader-spotify.js @@ -0,0 +1,60 @@ +const fetch = require("node-fetch"); + +let handler = async (m, { conn, args, usedPrefix, command }) => { + if (!args[0]) throw `Masukkan URL!\n\nContoh:\n${usedPrefix + command} https://open.spotify.com/track/3zakx7RAwdkUQlOoQ7SJRt`; + if (!args[0].match(/spotify/gi)) throw `URL Tidak Ditemukan!`; + m.reply("Tunggu sebentar..."); + const urll = args[0]; + try { + const res = await fetch(`https://api.betabotz.eu.org/api/download/spotify?url=${args[0]}&apikey=${lann}`) +let jsons = await res.json() +const { +thumbnail, +title, +name, +duration, +url +} = jsons.result.data +const { +id, +type +} = jsons.result.data.artist + let captionvid = ` โˆ˜ Title: ${title}\nโˆ˜ Id: ${id}\nโˆ˜ Duration: ${duration}\nโˆ˜ Type: ${type}` + let pesan = await conn.sendMessage(m.chat, { + text: captionvid, + contextInfo: { + externalAdReply: { + title: "", + body: "Powered by", + thumbnailUrl: thumbnail , + sourceUrl: thumbnail, + mediaType: 1, + showAdAttribution: true, + renderLargerThumbnail: true + }}}) + await conn.sendMessage(m.chat, { audio: { url: url }, mimetype: 'audio/mpeg', contextInfo: { + externalAdReply: { + title: title, + body: "", + thumbnailUrl: thumbnail, + sourceUrl: url, + mediaType: 1, + showAdAttribution: true, + renderLargerThumbnail: true + }}} , { quoted: m }) + } catch (e) { + throw `*Server down!*` + } +}; +handler.help = ['spotify'] +handler.command = /^(spotify)$/i +handler.tags = ['downloader']; +handler.limit = true; +handler.group = false; +handler.premium = false; +handler.owner = false; +handler.admin = false; +handler.botAdmin = false; +handler.fail = null; +handler.private = false; +module.exports = handler; diff --git a/plugins/downloader-spotifysearch.js b/plugins/downloader-spotifysearch.js new file mode 100644 index 0000000000000000000000000000000000000000..b904991f2d9eb7b9bbb3123fb8cd4f49ae00f8fb --- /dev/null +++ b/plugins/downloader-spotifysearch.js @@ -0,0 +1,41 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { text, conn, usedPrefix, command }) => { + if (!text) throw `*๐Ÿšฉ Contoh:* ${usedPrefix + command} Lathi`; + let teks = ''; + try { + const api = await fetch(`https://api.betabotz.eu.org/api/search/spotify?query=${text}&apikey=${lann}`); + let json = await api.json(); + let res = json.result.data; + for (let i in res) { + teks += `*${parseInt(i) + 1}.* *Title:* ${res[i].title}\n`; + teks += `*Duration:* ${res[i].duration}\n`; + teks += `*Popularity:* ${res[i].popularity}\n`; + teks += `*Link:* ${res[i].url}\n\n`; + } + await conn.relayMessage(m.chat, { + extendedTextMessage:{ + text: teks, + contextInfo: { + externalAdReply: { + title: '', + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://www.scdn.co/i/_global/open-graph-default.png', + sourceUrl: '' + } + }, mentions: [m.sender] + }}, {}) + } catch (e) { + throw `๐Ÿšฉ *Gagal Memuat Data!*`; + } +}; + +handler.command = handler.help = ['spotifysearch']; +handler.tags = ['downloader']; +handler.premium = false; +handler.group = false; +handler.limit = true + +module.exports = handler; diff --git a/plugins/downloader-telesticker.js b/plugins/downloader-telesticker.js new file mode 100644 index 0000000000000000000000000000000000000000..4c389b43c05430398c784db3b70c06950db92490 --- /dev/null +++ b/plugins/downloader-telesticker.js @@ -0,0 +1,33 @@ +const fetch = require("node-fetch"); + +const handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) throw `๐Ÿšฉ *Example:* ${usedPrefix + command} https://t.me/addstickers/fuwayonimaa_by_fStikBot`; + if (!text.match(/(https:\/\/t.me\/addstickers\/)/gi)) throw `๐Ÿšฉ *Example:* ${usedPrefix + command} https://t.me/addstickers/fuwayonimaa_by_fStikBot`; + m.reply(wait) + try { + let res = await (await fetch(`https://api.botcahx.eu.org/api/download/telesticker?url=${text}&apikey=${btc}`)).json() + let { result } = res; + let total = result.length; + let est = total * 0.5; + m.reply(`Processing ${total} stickers`); + for (var i = 0; i < result.length; i++) { + var url = result[i].url; + await sleep(10000) + await conn.sendImageAsSticker(m.chat, url, null, { packname: global.packname, author: global.author }); + } + await conn.reply(m.chat, `Total ${total} stickers successfully sent`, m); + } catch (e) { + throw `๐Ÿšฉ ${eror}` + } +}; + +handler.help = ['telesticker']; +handler.command = /^(telesticker|stele)$/i; +handler.tags = ['sticker']; +handler.limit = true; + +module.exports = handler; + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/plugins/downloader-terabox.js b/plugins/downloader-terabox.js new file mode 100644 index 0000000000000000000000000000000000000000..dc442d41c6b588c83d9e7dd315833469a34e02f2 --- /dev/null +++ b/plugins/downloader-terabox.js @@ -0,0 +1,93 @@ +let fetch = require('node-fetch') +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) throw `*๐Ÿšฉ Example:* ${usedPrefix}${command} https://terabox.com/s/1aD9T7_Xe0oroBwlfzyWXUA` + await m.reply(wait) + try { + let data = await (await fetch(`https://api.betabotz.eu.org/api/download/terabox?url=${text}&apikey=${lann}`)).json() + + if (!data.result || data.result.length === 0) { + throw 'No files found in the response' + } + + let msg = `ไน‚ *T E R A B O X D O W N L O A D E R*\n\n` + msg += `Found ${data.result.length} file(s):\n\n` + + for (let file of data.result) { + if (!file.files || !file.files[0]) continue + let fdata = file.files[0] + msg += ` โ—ฆ *Name :* ${file.name}\n` + msg += ` โ—ฆ *Size :* ${formatSize(fdata.size)}\n` + msg += ` โ—ฆ *Created :* ${formatDate(file.created)}\n\n` + } + + await conn.sendMessage(m.chat, { + text: msg, + contextInfo: { + externalAdReply: { + title: 'Terabox Downloader', + body: `Processing ${data.result.length} file(s)`, + thumbnailUrl: 'https://pomf2.lain.la/f/ihnv9wct.jpg', + sourceUrl: null, + mediaType: 1, + renderLargerThumbnail: true + } + } + }) + + const total = data.result.length + for (let i = 0; i < data.result.length; i++) { + const file = data.result[i] + if (!file.files || !file.files[0]) continue + + let fdata = file.files[0] + try { + let response = await fetch(fdata.url) + let buffer = await response.buffer() + + let queue = `*Antrian:* ${i + 1}-${total}\n` + await conn.sendFile(m.sender, buffer, file.name, queue, m) + + if (i === data.result.length - 1) { + await conn.reply(m.sender, '*DONE*', m) + } + + if (i < data.result.length - 1) { + await new Promise(resolve => setTimeout(resolve, 5000)) + } + } catch (eror) { + await conn.reply(m.chat, `Failed to process file: ${file.name}`, m) + } + } + } catch (error) { + throw eror + } +} + +handler.help = ['teraboxdl'].map(v => v + ' <url>') +handler.tags = ['downloader'] +handler.command = /^(teraboxdl|terabox)$/i +handler.limit = true +handler.premium = false + +module.exports = handler + +function formatSize(size) { + const units = ['B', 'KB', 'MB', 'GB', 'TB'] + let i = 0 + while (size >= 1024 && i < units.length - 1) { + size /= 1024 + i++ + } + return `${size.toFixed(2)} ${units[i]}` +} + +function formatDate(dateString) { + const date = new Date(dateString) + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + }) +} diff --git a/plugins/downloader-threads.js b/plugins/downloader-threads.js new file mode 100644 index 0000000000000000000000000000000000000000..d6d39dee853a9f20a5f43c39ea47e73a74da4e51 --- /dev/null +++ b/plugins/downloader-threads.js @@ -0,0 +1,39 @@ +const fetch = require('node-fetch'); +let handler = async (m, { conn, args, usedPrefix, command }) => { + if (!args[0]) { + throw `Masukkan URL!\n\ncontoh:\n${usedPrefix + command} https://www.threads.net/@cindyyuvia/post/C_Nqx3khgkI/?xmt=AQGzpsCvidh8IwIqOvq4Ov05Zd5raANiVdvCujM_pjBa1Q`; + } + if (!args[0].match(/threads/gi)) { + throw `URL Tidak Ditemukan!`; + } + m.reply(wait); + try { + const api = await fetch(`https://api.botcahx.eu.org/api/download/threads?url=${args[0]}&apikey=${btc}`).then(results => results.json()); + const foto = api.result.image_urls[0] || null; + const video = api.result.video_urls[0] || null; + if (video) { + try { + conn.sendFile(m.chat, video.download_url, 'threads.mp4', '*THREADS DOWNLOADER*', m); + } catch (e) { + throw `Media video tidak ditemukan!`; + } + } else if (foto) { + try { + conn.sendFile(m.chat, foto, 'threads.jpeg', '*THREADS DOWNLOADER*', m); + } catch (e) { + throw `Media foto tidak ditemukan!`; + } + } else { + throw `Konten tidak ditemukan!`; + } + } catch (e) { + throw eror + } +}; +handler.command = handler.help = ['threads', 'threadsdl']; +handler.tags = ['downloader']; +handler.limit = true; +handler.group = false; +handler.premium = false; + +module.exports = handler; diff --git a/plugins/downloader-tikdl.js b/plugins/downloader-tikdl.js new file mode 100644 index 0000000000000000000000000000000000000000..482ffa7598f9fc5331f3349864eac188788a2af1 --- /dev/null +++ b/plugins/downloader-tikdl.js @@ -0,0 +1,27 @@ +const { tiktokdl } = require('tiktokdl'); + +let handler = async (m, { conn, args, usedPrefix, command }) => { + if (!args[0]) { + throw `Masukkan URL!\n\nContoh:\n${usedPrefix}${command} https://vm.tiktok.com/ZGJAmhSrp/`; + } + try { + if (!args[0].match(/tiktok/gi)) { + throw `Berikan URL dari TikTok!`; + } + conn.reply(m.chat, wait, m); + const response = await tiktokdl(args[0]); + const { video } = response; + await conn.sendFile(m.chat, video, 'tiktok.mp4', '*TikTok Downloader*'); + } catch (e) { + throw `Error: ${eror}`; + } +}; + +handler.help = ['tikdl']; +handler.command = /^(tikdl)$/i; +handler.tags = ['downloader']; +handler.limit = true; +handler.group = false; +handler.premium = false; + +module.exports = handler; diff --git a/plugins/downloader-tiktok.js b/plugins/downloader-tiktok.js new file mode 100644 index 0000000000000000000000000000000000000000..4cbd8928d9dbcd61626a6acedac4561a2d380eb9 --- /dev/null +++ b/plugins/downloader-tiktok.js @@ -0,0 +1,66 @@ +let axios = require('axios'); + +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) throw `Masukan URL!\n\ncontoh:\n${usedPrefix + command} https://vm.tiktok.com/ZGJAmhSrp/`; + try { + if (!text.match(/tiktok/gi) && !text.match(/douyin/gi)) { + throw `URL Tidak Ditemukan!`; + } + m.reply(wait); + + try { + const response = await axios.get(`https://btch.us.kg/download/v2/ttdl?url=${text}`); + const res = response.data; + + if (!res.status) { + throw `Gagal mendapatkan data!`; + } + + const result = res.result; + var { video, title, title_audio, audio, thumbnail } = result; + + if (!video || video.length === 0) { + throw `Video tidak ditemukan!`; + } + + let capt = `ไน‚ *T I K T O K*\n\n`; + capt += `โ—ฆ *Title* : ${title}\n`; + capt += `โ—ฆ *Audio* : ${title_audio}\n`; + capt += `โ—ฆ *Thumbnail* : ${thumbnail}\n`; + capt += `\n`; + + if (video.length > 1) { + for (let v of video) { + await conn.sendFile(m.chat, v, null, capt, m); + } + } else { + await conn.sendFile(m.chat, video[0], null, capt, m); + } + + if (!audio || audio.length === 0) { + await conn.reply(m.chat, "_Audio tidak tersedia!_", m); + } else { + conn.sendMessage(m.chat, { audio: { url: audio[0] }, mimetype: 'audio/mpeg' }, { quoted: m }); + } + return; + } catch (e) { + throw `Terjadi kesalahan saat mengambil data!`; + } + } catch (e) { + throw `Terjadi kesalahan: ${e.message}`; + } +}; + +handler.help = ['tiktok']; +handler.command = /^(tiktok|tt|tiktokdl|tiktoknowm)$/i; +handler.tags = ['downloader']; +handler.limit = true; +handler.group = false; +handler.premium = false; +handler.owner = false; +handler.admin = false; +handler.botAdmin = false; +handler.fail = null; +handler.private = false; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/downloader-ttslide-douyinslide.js b/plugins/downloader-ttslide-douyinslide.js new file mode 100644 index 0000000000000000000000000000000000000000..7b45e88f491c5a54fbdf1837abc5e50984f2413a --- /dev/null +++ b/plugins/downloader-ttslide-douyinslide.js @@ -0,0 +1,49 @@ +const fetch = require('node-fetch'); + +let handler = async (m, { + conn, + text, + usedPrefix, + command +}) => { + if (command == 'tiktokslide' || command == 'ttslide') { + if (!text) throw `Masukkan URL!\n\ncontoh: ${usedPrefix + command} https://vt.tiktok.com/ZS2qsMU1W/`; + try { + const api = await fetch(`https://api.botcahx.eu.org/api/download/tiktokslide?url=${text}&apikey=${btc}`); + const res = await api.json(); + for (let i of res.result.images) { + await sleep(3000); + conn.sendMessage(m.chat,{ image :{ url : i } , caption : `*Title*: ${res.result.title}` }, { quoted: m }); + } + conn.sendMessage(m.chat, { audio: { url: res.result.audio[0] }, mimetype: 'audio/mpeg' }, { quoted: m }); + } catch (e) { + console.log(e); + throw `๐Ÿšฉ *Terjadi kesalahan!*`; + } + } + if (command == 'douyinslide' || command == 'douyinfoto') { + if (!text) throw `Masukkan URL!\n\ncontoh: ${usedPrefix + command} https://v.douyin.com/i2bPkLLo/`; + try { + const api = await fetch(`https://api.botcahx.eu.org/api/download/douyinslide?url=${text}&apikey=${btc}`); + const res = await api.json(); + for (let i of res.result.images) { + await sleep(3000); + conn.sendMessage(m.chat,{ image :{ url : i } , caption : `*Title*: ${res.result.title}` }, { quoted: m }); + } + conn.sendMessage(m.chat, { audio: { url: res.result.audio[0] }, mimetype: 'audio/mpeg' }, { quoted: m }); + } catch (e) { + console.log(e); + throw `๐Ÿšฉ *Terjadi kesalahan!*`; + } + } +}; + +handler.command = handler.help = ['douyinslide', 'douyinfoto','ttslide','tiktokslide']; +handler.tags = ['downloader']; +handler.limit = true; + +module.exports = handler; + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/plugins/downloader-twitter.js b/plugins/downloader-twitter.js new file mode 100644 index 0000000000000000000000000000000000000000..02bd1448dd529e53ac366379b91162e1b46314a4 --- /dev/null +++ b/plugins/downloader-twitter.js @@ -0,0 +1,45 @@ +const fetch = require("node-fetch"); + +let handler = async (m, { + conn, + args, + usedPrefix, + command +}) => { + if (!args[0]) throw `Masukkan URL!\n\ncontoh:\n${usedPrefix + command} https://twitter.com/gofoodindonesia/status/1229369819511709697`; + if (!args[0].match(/https?:\/\/(www\.)?(twitter\.com|x\.com)/gi)) throw "URL Tidak Ditemukan!"; + m.reply(wait); + try { + const api = await fetch(`https://api.botcahx.eu.org/api/download/twitter2?url=${args[0]}&apikey=${btc}`); + const res = await api.json(); + const mediaURLs = res.result.mediaURLs; + + const capt = `*Username: ${res.result.user_name} ${res.result.user_screen_name}*\n*Title: ${res.result.text}*\n*Replies: ${res.result.replies}*\n*Retweet: ${res.result.retweets}*`; + + for (const url of mediaURLs) { + const response = await fetch(url); + const buffer = await response.buffer(); + await delay(3000) + conn.sendFile(m.chat, buffer, null, capt, m); + } + } catch (e) { + throw '*Server Down!*'; + } +}; + +handler.command = handler.help = ['twitter', 'twitdl', 'twitterdl']; +handler.tags = ['downloader']; +handler.limit = true; +handler.group = false; +handler.premium = false; +handler.owner = false; +handler.admin = false; +handler.botAdmin = false; +handler.fail = null; +handler.private = false; + +module.exports = handler; + +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/plugins/downloader-xnxxdown.js b/plugins/downloader-xnxxdown.js new file mode 100644 index 0000000000000000000000000000000000000000..29e1d981d5459d5363d4a23443288e066f4ec663 --- /dev/null +++ b/plugins/downloader-xnxxdown.js @@ -0,0 +1,19 @@ +var fetch = require("node-fetch") +var handler = async (m, { + text, + usedPrefix, + command + }) => { +if (!text) throw 'Masukkan Query Link!' + try { +let anu = await fetch(`https://api.botcahx.eu.org/api/download/xnxxdl?url=${text}&apikey=${btc}`) +let hasil = await anu.json() + +conn.sendMessage(m.chat, { video: { url: hasil.result.url }, fileName: 'xnxx.mp4', mimetype: 'video/mp4' }, { quoted: m }) + } catch (e) { + throw `*Server error!*` + } +} +handler.command = handler.help = ['xnxxdown']; +handler.tags = ['internet']; +module.exports = handler; diff --git a/plugins/downloader-xviddl.js b/plugins/downloader-xviddl.js new file mode 100644 index 0000000000000000000000000000000000000000..4fcd01c9cebc20b974e62e9ae928426ed8c8e60a --- /dev/null +++ b/plugins/downloader-xviddl.js @@ -0,0 +1,19 @@ +var fetch = require("node-fetch") +var handler = async (m, { + text, + usedPrefix, + command + }) => { +if (!text) throw 'Masukkan Query Link!' + try { +let anu = await fetch(`https://api.botcahx.eu.org/api/download/xvideosdl?url=${text}&apikey=${btc}`) +let hasil = await anu.json() + +conn.sendMessage(m.chat, { video: { url: hasil.result.url }, fileName: 'xnxx.mp4', mimetype: 'video/mp4' }, { quoted: m }) +} catch (e) { +throw `*Server Error!*` +} + } +handler.command = handler.help = ['xvideosdown','xdown']; +handler.tags = ['internet']; +module.exports = handler; diff --git a/plugins/downloader-yts.js b/plugins/downloader-yts.js new file mode 100644 index 0000000000000000000000000000000000000000..d6737e615639ac91558f652b59f953c6454323ee --- /dev/null +++ b/plugins/downloader-yts.js @@ -0,0 +1,26 @@ +let yts = require('yt-search') +let handler = async (m, { text }) => { + if (!text) throw 'Cari apa?' + let results = await yts(text) + let teks = results.all.map(v => { + switch (v.type) { + case 'video': return ` +*${v.title}* (${v.url}) +Duration: ${v.timestamp} +Uploaded ${v.ago} +${v.views} views + `.trim() + case 'channel': return ` +*${v.name}* (${v.url}) +_${v.subCountLabel} (${v.subCount}) Subscriber_ +${v.videoCount} video +`.trim() + } + }).filter(v => v).join('\n========================\n') + m.reply(teks) +} +handler.help = ['', 'earch'].map(v => 'yts' + v + ' <pencarian>') +handler.tags = ['tools', 'internet', 'downloader'] +handler.command = /^yts(earch)?$/i + +module.exports = handler diff --git a/plugins/fun-alay.js b/plugins/fun-alay.js new file mode 100644 index 0000000000000000000000000000000000000000..2a9993168d9e4487e2744a664e73d61fb944fd69 --- /dev/null +++ b/plugins/fun-alay.js @@ -0,0 +1,21 @@ +function handler(m, { text }) { + let teks = text ? text : m.quoted && m.quoted.text ? m.quoted.text : m.text + m.reply(teks.replace(/[a-z]/gi, v => Math.random() > .5 ? v[['toLowerCase', 'toUpperCase'][Math.floor(Math.random() * 2)]]() : v).replace(/[abegiors]/gi, v => { + if (Math.random() > .5) return v + switch (v.toLowerCase()) { + case 'a': return '4' + case 'b': return Math.random() > .5 ? '8' : '13' + case 'e': return '3' + case 'g': return Math.random() > .5 ? '6' : '9' + case 'i': return '1' + case 'o': return '0' + case 'r': return '12' + case 's': return '5' + } + })) +} +handler.help = ['alay'] +handler.tags = ['fun'] +handler.command = ['alay'] + +module.exports = handler diff --git a/plugins/fun-anonymous.js b/plugins/fun-anonymous.js new file mode 100644 index 0000000000000000000000000000000000000000..3aaf41942f2bdc6c6d982fe7fedeaf3c02dcc531 --- /dev/null +++ b/plugins/fun-anonymous.js @@ -0,0 +1,24 @@ +let handler = m => m + +handler.before = async function (m, { match }) { + // if (match) return !1 + if (!m.chat.endsWith('@s.whatsapp.net')) return !0 + this.anonymous = this.anonymous ? this.anonymous : {} + let room = Object.values(this.anonymous).find(room => [room.a, room.b].includes(m.sender) && room.state === 'CHATTING') + if (room) { + if (/^.*(next|leave|start)/.test(m.text)) return + if (['.next', '.leave', '.start', 'Cari Partner', 'Keluar', 'Next'].includes(m.text)) return + let other = [room.a, room.b].find(user => user !== m.sender) + m.copyNForward(other, true, m.quoted && m.quoted.fromMe ? { + contextInfo: { + ...m.msg.contextInfo, + forwardingScore: 1, + isForwarded: true, + participant: other + } + } : {}) + } + return !0 +} + +module.exports = handler \ No newline at end of file diff --git a/plugins/fun-anonymous_chat.js b/plugins/fun-anonymous_chat.js new file mode 100644 index 0000000000000000000000000000000000000000..63381064c976c7ca2e89116e68d9fd1889f5225b --- /dev/null +++ b/plugins/fun-anonymous_chat.js @@ -0,0 +1,51 @@ +const { MessageType } = require("@adiwajshing/baileys") + +async function handler(m, { command }) { + command = command.toLowerCase() + this.anonymous = this.anonymous ? this.anonymous : {} + switch (command) { + case 'next': + case 'leave': { + let room = Object.values(this.anonymous).find(room => room.check(m.sender)) + if (!room) throw 'Kamu tidak sedang berada di anonymous chat' + m.reply('Ok') + let other = room.other(m.sender) + if (other) conn.sendMessage(other, 'Partner meninggalkan chat',{quoted:m}) + delete this.anonymous[room.id] + if (command === 'leave') break + } + case 'start': { + if (Object.values(this.anonymous).find(room => room.check(m.sender))) throw 'Kamu masih berada di dalam anonymous chat' + let room = Object.values(this.anonymous).find(room => room.state === 'WAITING' && !room.check(m.sender)) + if (room) { + conn.send2But(room.a,'Menemukan partner', wm, 'leave', '.leave', 'next', '.next', m) + room.b = m.sender + room.state = 'CHATTING' + conn.send2But(room.b,'Menemukan partner', wm, 'leave', '.leave', 'next', '.next', m) + } else { + let id = + new Date + this.anonymous[id] = { + id, + a: m.sender, + b: '', + state: 'WAITING', + check: function (who = '') { + return [this.a, this.b].includes(who) + }, + other: function (who = '') { + return who === this.a ? this.b : who === this.b ? this.a : '' + }, + } + m.reply('Menunggu parter anonymous chat...') + } + break + } + } +} +handler.help = ['start', 'leave', 'next'] +handler.tags = 'anonymous' + +handler.command = ['start', 'leave', 'next'] +handler.private = true + +module.exports = handler diff --git a/plugins/fun-case.js b/plugins/fun-case.js new file mode 100644 index 0000000000000000000000000000000000000000..af734bb661bf1de11fa5b5eedc9366c72b8478e7 --- /dev/null +++ b/plugins/fun-case.js @@ -0,0 +1,23 @@ +function handler(m, { text }) { + let teks = text ? text : m.quoted && m.quoted.text ? m.quoted.text : m.text + m.reply(teks.replace(/[a-z]/gi, v => Math.random() > .5 ? v[['toLowerCase', 'toUpperCase'][Math.floor(Math.random() * 2)]]() : v).replace(/[abegiors]/gi, v => { + if (Math.random() > .5) return v + switch (v.toLowerCase()) { + case 'a': return '4' + case 'b': return Math.random() > .5 ? '8' : '13' + case 'e': return '3' + case 'g': return Math.random() > .5 ? '6' : '9' + case 'i': return '1' + case 'o': return '0' + case 'r': return '12' + case 's': return '5' + } + })) +} + +handler.help = ['alay'] +handler.tags = ['fun'] +handler.command = ['case'] +handler.limit = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/fun-cekkhodam.js b/plugins/fun-cekkhodam.js new file mode 100644 index 0000000000000000000000000000000000000000..9839b321ee5bd4f205aa6526633190420ac8eca3 --- /dev/null +++ b/plugins/fun-cekkhodam.js @@ -0,0 +1,355 @@ +/* Dibuat oleh BOTCAHX + Github : https://github.com/BOTCAHX/RTXZY-MD +*/ + +let handler = async (m, { text, usedPrefix, command }) => { + try { + let result = await khodamnya(); + let teks = `- Khodam \`@${m.quoted ? m.quoted.sender.split("@")[0] : m.sender.split("@")[0]}\` : ${result.name}\n\n> Penjelasan : ${result.meaning}`; + + if (m.key.fromMe) { + await m.reply(teks, { edit: m.key, mentions: [m.quoted ? m.quoted.sender : m.sender] }); + } else { + await m.reply(teks); + } + } catch (e) { + console.error(e); + } +}; + +handler.command = handler.help = ['cekkhodam','cekhodam','cekodam']; +handler.tags = ['fun']; +handler.limit = true; + +module.exports = handler; + +async function khodamnya() { + const khodams = [ + { name: "Harimau Putih", meaning: "Kamu kuat dan berani seperti harimau, karena pendahulumu mewariskan kekuatan besar padamu." }, + { name: "Lampu Tertidur", meaning: "Terlihat ngantuk tapi selalu memberikan cahaya yang hangat" }, + { name: "Panda Ompong", meaning: "Kamu menggemaskan dan selalu berhasil membuat orang tersenyum dengan keanehanmu." }, + { name: "Bebek Karet", meaning: "Kamu selalu tenang dan ceria, mampu menghadapi gelombang masalah dengan senyum." }, + { name: "Ninja Turtle", meaning: "Kamu lincah dan tangguh, siap melindungi yang lemah dengan kekuatan tempurmu." }, + { name: "Kucing Kulkas", meaning: "Kamu misterius dan selalu ada di tempat-tempat yang tak terduga." }, + { name: "Sabun Wangi", meaning: "Kamu selalu membawa keharuman dan kesegaran di mana pun kamu berada." }, + { name: "Semut Kecil", meaning: "Kamu pekerja keras dan selalu bisa diandalkan dalam situasi apa pun." }, + { name: "Moge Suzuki", meaning: "Kamu cepat dan penuh gaya, selalu menjadi pusat perhatian di jalanan." }, + { name: "Cupcake Pelangi", meaning: "Kamu manis dan penuh warna, selalu membawa kebahagiaan dan keceriaan." }, + { name: "Robot Mini", meaning: "Kamu canggih dan selalu siap membantu dengan kecerdasan teknologi tinggi." }, + { name: "Ikan Terbang", meaning: "Kamu unik dan penuh kejutan, selalu melampaui batasan yang ada." }, + { name: "Ayam Goreng", meaning: "Kamu selalu disukai dan dinanti oleh banyak orang, penuh kelezatan dalam setiap langkahmu." }, + { name: "Kecoa Terbang", meaning: "Kamu selalu mengagetkan dan bikin heboh seisi ruangan." }, + { name: "Kambing Ngebor", meaning: "Kamu unik dan selalu bikin orang tertawa dengan tingkah lakumu yang aneh." }, + { name: "Kerupuk Renyah", meaning: "Kamu selalu bikin suasana jadi lebih seru dan nikmat." }, + { name: "Celengan Babi", meaning: "Kamu selalu menyimpan kejutan di dalam dirimu." }, + { name: "Lemari Tua", meaning: "Kamu penuh dengan cerita dan kenangan masa lalu." }, + { name: "Kopi Susu", meaning: "Kamu manis dan selalu bikin semangat orang-orang di sekitarmu." }, + { name: "Sapu Lidi", meaning: "Kamu kuat dan selalu bisa diandalkan untuk membersihkan masalah." }, + { name: "Kuda Lumping", meaning: "Kamu penuh semangat dan selalu tampil beda di setiap kesempatan." }, + { name: "Sepatu Roda", meaning: "Kamu cepat dan lincah, selalu bergerak ke depan dengan penuh gaya." }, + { name: "Bola Pingpong", meaning: "Kamu ringan dan selalu bikin permainan jadi lebih seru." }, + { name: "Lumba-lumba", meaning: "Kamu pintar dan selalu membawa keceriaan di lautan kehidupan." }, + { name: "Kucing Gemuk", meaning: "Kamu santai dan selalu bikin orang tersenyum dengan kelucuanmu." }, + { name: "Iguana Pink", meaning: "Kamu eksotis dan selalu menarik perhatian dengan warnamu yang unik." }, + { name: "Bantal Guling", meaning: "Kamu nyaman dan selalu dibutuhkan saat waktu istirahat." }, + { name: "Komputer Jadul", meaning: "Kamu klasik dan penuh dengan pengetahuan di dalam dirimu." }, + { name: "Kasur Empuk", meaning: "Kamu selalu memberikan kenyamanan dan ketenangan." }, + { name: "Bola Bekel", meaning: "Kamu kecil tapi selalu memberikan kebahagiaan di setiap permainan." }, + { name: "Es Krim Pelangi", meaning: "Kamu manis dan penuh warna, selalu menyegarkan hari-hari." }, + { name: "Biskuit Coklat", meaning: "Kamu selalu bikin ketagihan dengan kelezatanmu yang tak tertahankan." }, + { name: "Nasi Padang", meaning: "Kamu selalu bikin kenyang dan puas dengan kelezatanmu yang khas." }, + { name: "Roti Bakar", meaning: "Kamu sederhana tapi selalu bikin orang merasa nyaman." }, + { name: "Sepeda Ontel", meaning: "Kamu klasik dan selalu memberikan kesenangan di setiap perjalanan." }, + { name: "Sate Kambing", meaning: "Kamu gurih dan selalu jadi favorit di setiap kesempatan." }, + { name: "Kue Cubit", meaning: "Kamu kecil tapi selalu bikin orang bahagia dengan rasamu yang enak." }, + { name: "Bakso Urat", meaning: "Kamu kuat dan selalu memberikan kenikmatan di setiap gigitan." }, + { name: "Es Kelapa", meaning: "Kamu segar dan selalu bikin adem di saat-saat panas." }, + { name: "Siomay Bandung", meaning: "Kamu selalu bikin ketagihan dengan rasa khasmu yang lezat." }, + { name: "Bajigur Hangat", meaning: "Kamu selalu bikin suasana jadi hangat dan nyaman." }, + { name: "Martabak Manis", meaning: "Kamu penuh kejutan dengan isi yang manis dan nikmat." }, + { name: "Permen Karet", meaning: "Kamu selalu bikin suasana jadi lebih ceria dengan kenikmatanmu yang kenyal." }, + { name: "Pisang Goreng", meaning: "Kamu selalu bikin suasana jadi lebih hangat dan nyaman." }, + { name: "Telur Dadar", meaning: "Kamu sederhana tapi selalu bikin orang puas dengan kelezatanmu." }, + { name: "Es Buah", meaning: "Kamu segar dan penuh warna, selalu bikin hari jadi lebih ceria." }, + { name: "Mie Goreng", meaning: "Kamu selalu bikin kenyang dan puas dengan rasamu yang lezat." }, + { name: "Puding Coklat", meaning: "Kamu manis dan selalu bikin suasana jadi lebih nyaman." }, + { name: "Gulai Kambing", meaning: "Kamu kaya rasa dan selalu bikin orang ketagihan dengan kelezatanmu." }, + { name: "Kue Nastar", meaning: "Kamu selalu hadir di saat-saat spesial dengan rasa yang manis dan enak." }, + { name: "Krupuk Ikan", meaning: "Kamu renyah dan selalu bikin suasana jadi lebih seru." }, + { name: "Es Teler", meaning: "Kamu segar dan penuh kejutan dengan campuran rasa yang enak." }, + { name: "Rujak Buah", meaning: "Kamu segar dan selalu bikin suasana jadi lebih hidup dengan rasamu yang pedas dan manis." }, + { name: "Soto Ayam", meaning: "Kamu selalu bikin hangat dan puas dengan kuahmu yang lezat." }, + { name: "Tahu Bulat", meaning: "Kamu selalu hadir di momen-momen yang pas dengan rasa yang enak." }, + { name: "Keripik Singkong", meaning: "Kamu renyah dan selalu bikin suasana jadi lebih seru." }, + { name: "Kacang Goreng", meaning: "Kamu selalu jadi camilan favorit di setiap kesempatan." }, + { name: "Tongseng Sapi", meaning: "Kamu kaya rasa dan selalu bikin orang ketagihan dengan kelezatanmu." }, + { name: "Sate Padang", meaning: "Kamu selalu bikin kenyang dan puas dengan rasa khasmu yang lezat." }, + { name: "Nasi Uduk", meaning: "Kamu selalu bikin kenyang dan puas dengan rasa gurihmu yang enak." }, + { name: "Cendol Dawet", meaning: "Kamu segar dan selalu bikin suasana jadi lebih adem di saat-saat panas." }, + { name: "Onde-onde", meaning: "Kamu selalu hadir di saat-saat spesial dengan rasa yang manis dan enak." }, + { name: "Kolak Pisang", meaning: "Kamu manis dan selalu bikin suasana jadi lebih hangat dan nyaman." }, + { name: "Macan Kumbang", meaning: "Kamu misterius dan kuat, seperti macan yang jarang terlihat tapi selalu waspada." }, + { name: "Kuda Emas", meaning: "Kamu berharga dan kuat, siap untuk berlari menuju kesuksesan." }, + { name: "Elang Biru", meaning: "Kamu memiliki visi yang tajam dan dapat melihat peluang dari jauh." }, + { name: "Indomie Goreng", meaning: "Selalu bikin kenyang dan bahagia" }, + { name: "Es Krim Meleleh", meaning: "Selalu mencairkan suasana dengan rasa manisnya" }, + { name: "Bakso Ulet", meaning: "Selalu gigih dan bulat dalam menghadapi masalah" }, + { name: "Lem Super", meaning: "Selalu lengket dalam situasi yang rumit" }, + { name: "Kecap Manis", meaning: "Selalu memberikan sentuhan manis dalam hidup" }, + { name: "Sabun Mandi", meaning: "Selalu bersih dan wangi" }, + { name: "Kopi Tumpah", meaning: "Selalu bersemangat, tapi kadang berantakan" }, + { name: "Sepeda Ontel", meaning: "Selalu klasik dan sederhana" }, + { name: "Roti Bakar", meaning: "Selalu hangat dan enak" }, + { name: "Kucing Kampung", meaning: "Selalu mandiri dan penuh petualangan" }, + { name: "Jamu Pahit", meaning: "Selalu memberi kekuatan meski tak enak di awal" }, + { name: "Teh Celup", meaning: "Selalu memberikan rasa hangat di hati" }, + { name: "Tas Kresek", meaning: "Selalu ringan dan praktis" }, + { name: "Es Kelapa", meaning: "Selalu segar dan menyegarkan" }, + { name: "Motor Astrea", meaning: "Selalu setia dan bandel" }, + { name: "Mie Instan", meaning: "Selalu cepat dan mengenyangkan" }, + { name: "Bolu Kukus", meaning: "Selalu lembut dan manis" }, + { name: "Tahu Bulat", meaning: "Selalu enak di segala suasana" }, + { name: "Nasi Uduk", meaning: "Selalu cocok di segala waktu" }, + { name: "Susu Kental Manis", meaning: "Selalu menambah kenikmatan" }, + { name: "Kopi Hitam", meaning: "Selalu memberi semangat di pagi hari" }, + { name: "Kacang Goreng", meaning: "Selalu asyik untuk ngemil" }, + { name: "Ayam Goreng Tepung", meaning: "Selalu renyah dan nikmat" }, + { name: "Sambal Terasi", meaning: "Selalu pedas dan menggigit" }, + { name: "Ketoprak", meaning: "Selalu mengenyangkan dan lezat" }, + { name: "Cendol Dawet", meaning: "Selalu segar di siang hari" }, + { name: "Gado-Gado", meaning: "Selalu penuh warna dan rasa" }, + { name: "Pisang Goreng", meaning: "Selalu manis dan gurih" }, + { name: "Martabak Manis", meaning: "Selalu lezat dan memanjakan lidah" }, + { name: "Bubur Ayam", meaning: "Selalu hangat dan mengenyangkan" }, + { name: "Soto Ayam", meaning: "Selalu kaya rasa dan gurih" }, + { name: "Nasi Padang", meaning: "Selalu penuh dengan kenikmatan" }, + { name: "Rendang Daging", meaning: "Selalu empuk dan kaya rempah" }, + { name: "Nasi Goreng", meaning: "Selalu praktis dan enak" }, + { name: "Bakmi Jawa", meaning: "Selalu menggugah selera" }, + { name: "Sate Ayam", meaning: "Selalu enak di segala acara" }, + { name: "Gulai Kambing", meaning: "Selalu kaya rasa dan lezat" }, + { name: "Rawon Sapi", meaning: "Selalu hitam dan nikmat" }, + { name: "Ikan Bakar", meaning: "Selalu gurih dan enak" }, + { name: "Pepes Tahu", meaning: "Selalu lezat dan bergizi" }, + { name: "Tempe Mendoan", meaning: "Selalu gurih dan renyah" }, + { name: "Keripik Singkong", meaning: "Selalu renyah dan menggoda" }, + { name: "Jus Alpukat", meaning: "Selalu segar dan menyehatkan" }, + { name: "Es Teler", meaning: "Selalu segar dan nikmat" }, + { name: "Bubur Kacang Hijau", meaning: "Selalu hangat dan mengenyangkan" }, + { name: "Bakpao", meaning: "Selalu lembut dan enak" }, + { name: "Pempek", meaning: "Selalu gurih dan kenyal" }, + { name: "Sosis Bakar", meaning: "Selalu enak di segala suasana" }, + { name: "Lumpia Semarang", meaning: "Selalu gurih dan nikmat" }, + { name: "Otak-Otak", meaning: "Selalu enak dan gurih" }, + { name: "Pastel", meaning: "Selalu renyah dan nikmat" }, + { name: "Cilok", meaning: "Selalu kenyal dan enak" }, + { name: "Bakwan Jagung", meaning: "Selalu gurih dan lezat" }, + { name: "Risol", meaning: "Selalu renyah dan enak" }, + { name: "Combro", meaning: "Selalu gurih dan pedas" }, + { name: "Getuk", meaning: "Selalu manis dan kenyal" }, + { name: "Tape Singkong", meaning: "Selalu manis dan segar" }, + { name: "Wedang Jahe", meaning: "Selalu hangat dan menenangkan" }, + { name: "Dawet Ayu", meaning: "Selalu segar dan menggoda" }, + { name: "Es Buah", meaning: "Selalu segar dan penuh warna" }, + { name: "Es Doger", meaning: "Selalu manis dan menyegarkan" }, + { name: "Tengkleng", meaning: "Selalu gurih dan enak" }, + { name: "Gulai Nangka", meaning: "Selalu kaya rasa dan lezat" }, + { name: "Coto Makassar", meaning: "Selalu gurih dan nikmat" }, + { name: "Nasi Liwet", meaning: "Selalu enak dan mengenyangkan" }, + { name: "Bubur Sumsum", meaning: "Selalu lembut dan manis" }, + { name: "Kue Cubit", meaning: "Selalu manis dan lembut" }, + { name: "Bolu Pandan", meaning: "Selalu harum dan enak" }, + { name: "Onde-Onde", meaning: "Selalu kenyal dan manis" }, + { name: "Serabi Solo", meaning: "Selalu lembut dan gurih" }, + { name: "Lemper Ayam", meaning: "Selalu gurih dan lezat" }, + { name: "Kue Lumpur", meaning: "Selalu lembut dan manis" }, + { name: "Kue Lapis", meaning: "Selalu warna-warni dan manis" }, + { name: "Kue Putu", meaning: "Selalu hangat dan manis" }, + { name: "Es Pisang Ijo", meaning: "Selalu segar dan manis" }, + { name: "Klepon", meaning: "Selalu manis dan kenyal" }, + { name: "Martabak Telur", meaning: "Selalu gurih dan enak" }, + { name: "Ayam Penyet", meaning: "Selalu pedas dan menggigit" }, + { name: "Ikan Asin", meaning: "Selalu gurih dan asin" }, + { name: "Sop Buntut", meaning: "Selalu kaya rasa dan nikmat" }, + { name: "Bakso Malang", meaning: "Selalu gurih dan lezat" }, + { name: "Pempek Palembang", meaning: "Selalu enak dan gurih" }, + { name: "Tahu Gejrot", meaning: "Selalu pedas dan segar" }, + { name: "Gepuk Daging", meaning: "Selalu empuk dan lezat" }, + { name: "Ayam Betutu", meaning: "Selalu kaya bumbu dan enak" }, + { name: "Ikan Gurame", meaning: "Selalu gurih dan nikmat" }, + { name: "Udang Goreng", meaning: "Selalu renyah dan enak" }, + { name: "Cumi Saus Tiram", meaning: "Selalu gurih dan lezat" }, + { name: "Royco Ayam", meaning: "Selalu menambah rasa gurih pada setiap kesempatan" }, + { name: "Honda Supra", meaning: "Selalu bisa diandalkan di jalanan" }, + { name: "Kompor Meledak", meaning: "Selalu memberikan kehangatan yang luar biasa" }, + { name: "Es Batu Menangis", meaning: "Selalu mencair di saat yang tak terduga" }, + { name: "Teh Botol Sosro", meaning: "Selalu segar di segala suasana" }, + { name: "Payung Bocor", meaning: "Selalu memberikan kejutan saat hujan" }, + { name: "Kursi Tertawa", meaning: "Selalu membuatmu nyaman dengan gayanya yang lucu" }, + { name: "Motor Vespa", meaning: "Selalu klasik dan penuh gaya" }, + { name: "Ember Bocor", meaning: "Selalu berfungsi walau tak sempurna" }, + { name: "Bantal Gebuk", meaning: "Selalu menemani tidurmu dengan kenyamanan" }, + { name: "Mie Sedap", meaning: "Selalu cepat dan mengenyangkan" }, + { name: "Komputer Ngadat", meaning: "Selalu menantang kesabaranmu" }, + { name: "Handphone Jadul", meaning: "Selalu setia meski ketinggalan zaman" }, + { name: "Kulkas Berisik", meaning: "Selalu bising tapi berguna" }, + { name: "Rokok Gudang Garam", meaning: "Selalu nikmat di setiap tarikan" }, + { name: "Radio Tua", meaning: "Selalu menghidupkan suasana" }, + { name: "Sepatu Butut", meaning: "Selalu nyaman meski usang" }, + { name: "Blender Bising", meaning: "Selalu ribut tapi membantu" }, + { name: "Sapu Ijuk", meaning: "Selalu membersihkan dengan efektif" }, + { name: "Kipas Angin", meaning: "Selalu memberikan angin segar" }, + { name: "Rice Cooker", meaning: "Selalu memasak nasi dengan sempurna" }, + { name: "Senter Mati", meaning: "Selalu ada saat dibutuhkan" }, + { name: "Pisau Tumpul", meaning: "Selalu menantang dalam memotong" }, + { name: "Honda Beat", meaning: "Selalu lincah di jalanan" }, + { name: "Kerupuk Udang", meaning: "Selalu renyah dan nikmat" }, + { name: "Gitar Sumbang", meaning: "Selalu memberikan nada yang tak terduga" }, + { name: "Meja Bergoyang", meaning: "Selalu bergoyang saat digunakan" }, + { name: "Jok Motor", meaning: "Selalu empuk dan nyaman" }, + { name: "Tikar Lipat", meaning: "Selalu praktis di segala acara" }, + { name: "Paku Karet", meaning: "Selalu lentur dan tak terduga" }, + { name: "Lemari Besi", meaning: "Selalu kuat dan kokoh" }, + { name: "Sepeda BMX", meaning: "Selalu siap untuk petualangan" }, + { name: "Tas Belanja", meaning: "Selalu praktis dan berguna" }, + { name: "Lilin Meleleh", meaning: "Selalu memberikan cahaya di kegelapan" }, + { name: "Kabel Kusut", meaning: "Selalu membuat bingung" }, + { name: "Honda CBR", meaning: "Selalu cepat dan penuh gaya" }, + { name: "Sendok Miring", meaning: "Selalu memberi sensasi berbeda" }, + { name: "Gelas Retak", meaning: "Selalu siap walau tak sempurna" }, + { name: "Lampu Tidur", meaning: "Selalu memberikan cahaya lembut" }, + { name: "Karet Gelang", meaning: "Selalu fleksibel dan berguna" }, + { name: "Honda Vario", meaning: "Selalu tangguh di segala medan" }, + { name: "Botol Kaca", meaning: "Selalu jernih dan berguna" }, + { name: "Rantang Susun", meaning: "Selalu membawa bekal dengan rapi" }, + { name: "Kunci Inggris", meaning: "Selalu siap untuk perbaikan" }, + { name: "Honda Tiger", meaning: "Selalu gagah dan kuat" }, + { name: "Toples Kue", meaning: "Selalu penuh kejutan manis" }, + { name: "Wajan Teflon", meaning: "Selalu anti lengket" }, + { name: "Honda Scoopy", meaning: "Selalu trendy dan stylish" }, + { name: "Kasur Busa", meaning: "Selalu empuk dan nyaman" }, + { name: "Sapu Lidi", meaning: "Selalu membersihkan dengan efektif" }, + { name: "Panci Presto", meaning: "Selalu cepat dan praktis" }, + { name: "Honda PCX", meaning: "Selalu mewah dan nyaman" }, + { name: "Talenan Kayu", meaning: "Selalu setia menemani dapur" }, + { name: "Gergaji Tumpul", meaning: "Selalu menantang dalam memotong" }, + { name: "Honda Blade", meaning: "Selalu tajam di jalanan" }, + { name: "Bantal Kapuk", meaning: "Selalu empuk dan lembut" }, + { name: "Penghapus Karet", meaning: "Selalu siap menghapus kesalahan" }, + { name: "Honda Revo", meaning: "Selalu tangguh dan hemat" }, + { name: "Laci Meja", meaning: "Selalu menyimpan rahasia" }, + { name: "Stoples Kaca", meaning: "Selalu jernih dan berisi" }, + { name: "Honda Verza", meaning: "Selalu kuat dan tahan lama" }, + { name: "Cermin Retak", meaning: "Selalu memberikan pantulan unik" }, + { name: "Pena Bocor", meaning: "Selalu meninggalkan jejak" }, + { name: "Honda CB150R", meaning: "Selalu cepat dan bertenaga" }, + { name: "Baskom Plastik", meaning: "Selalu ringan dan praktis" }, + { name: "Paku Beton", meaning: "Selalu kuat dan kokoh" }, + { name: "Honda MegaPro", meaning: "Selalu gagah di jalanan" }, + { name: "Gembok Rusak", meaning: "Selalu menantang keamanan" }, + { name: "Sandal Jepit", meaning: "Selalu santai dan nyaman" }, + { name: "Honda Win", meaning: "Selalu menang di segala medan" }, + { name: "Lemari Plastik", meaning: "Selalu ringan dan praktis" }, + { name: "Kulkas Mini", meaning: "Selalu dingin dan efisien" }, + { name: "Honda CRF", meaning: "Selalu tangguh di segala medan" }, + { name: "Cangkir Teh", meaning: "Selalu menghangatkan suasana" }, + { name: "Kompor Gas", meaning: "Selalu cepat dan panas" }, + { name: "Honda Monkey", meaning: "Selalu lucu dan unik" }, + { name: "Cerek Air", meaning: "Selalu siap menyajikan kehangatan" }, + { name: "Selimut Tebal", meaning: "Selalu hangat dan nyaman" }, + { name: "Honda Beat Street", meaning: "Selalu lincah dan tangguh" }, + { name: "Meja Rias", meaning: "Selalu menampilkan yang terbaik" }, + { name: "Gelas Plastik", meaning: "Selalu ringan dan praktis" }, + { name: "Honda X-ADV", meaning: "Selalu siap untuk petualangan" }, + { name: "Rak Buku", meaning: "Selalu penuh pengetahuan" }, + { name: "Sisir Patah", meaning: "Selalu berfungsi meski tak sempurna" }, + { name: "Honda Rebel", meaning: "Selalu berjiwa pemberontak" }, + { name: "Bantal Guling", meaning: "Selalu nyaman di pelukan" }, + { name: "Honda CRF250", meaning: "Selalu siap menghadapi tantangan" }, + { name: "Lemari Es", meaning: "Selalu menyimpan kesegaran" }, + { name: "Honda Forza", meaning: "Selalu kuat dan bertenaga" }, + { name: "Piring Retak", meaning: "Selalu menantang dengan keunikannya" }, + { name: "Harimau Loreng", meaning: "Kamu tangguh dan memiliki kekuatan untuk melindungi dan menyerang." }, + { name: "Gajah Putih", meaning: "Kamu bijaksana dan memiliki kekuatan besar, lambang dari keberanian dan keteguhan hati." }, + { name: "Banteng Sakti", meaning: "Kamu kuat dan penuh semangat, tidak takut menghadapi rintangan." }, + { name: "Ular Raksasa", meaning: "Kamu memiliki kebijaksanaan dan kekuatan tersembunyi, siap menyerang jika diperlukan." }, + { name: "Ikan Dewa", meaning: "Kamu tenang dan penuh kedamaian, membawa rezeki dan keberuntungan." }, + { name: "Kucing Hitam", meaning: "Kamu misterius dan penuh dengan rahasia, membawa keberuntungan bagi yang memahami." }, + { name: "Rusa Emas", meaning: "Kamu anggun dan berharga, selalu dihargai oleh orang-orang di sekitarmu." }, + { name: "Singa Bermahkota", meaning: "Kamu lahir sebagai pemimpin, memiliki kekuatan dan kebijaksanaan seorang raja." }, + { name: "Kijang Perak", meaning: "Kamu cepat dan cekatan, selalu waspada dan siap untuk melompat lebih jauh." }, + { name: "Kipas Angin Kelereng", meaning: "Selalu memberikan angin segar dengan kocaknya" }, + { name: "Penghapus Ajaib", meaning: "Mampu menghapus kesalahan dengan cara yang lucu" }, + { name: "Kertas Guling Goyang", meaning: "Tak pernah diam dan selalu menghibur" }, + { name: "Pulpen Melambai", meaning: "Selalu memberi tanda dengan cara yang unik" }, + { name: "Tali Tambang Tertawa", meaning: "Membuat pekerjaan menjadi lebih menyenangkan" }, + { name: "Botol Minyak Mengejek", meaning: "Seringkali memberi komentar lucu" }, + { name: "Topi Terbang", meaning: "Membuat kepala menjadi lebih ringan dengan keunikannya" }, + { name: "Payung Terbalik", meaning: "Selalu membalikkan situasi dengan cara yang tak terduga" }, + { name: "Piring Berjalan", meaning: "Tak pernah tinggal diam di tempatnya" }, + { name: "Ember Tertawa", meaning: "Menghadirkan keceriaan di setiap kegiatan" }, + { name: "Lampu Tidur Tertidur", meaning: "Terlihat malas-malasan tapi selalu memberikan cahaya yang hangat" }, + { name: "Gelas Bergoyang", meaning: "Selalu memberikan sensasi yang berbeda dalam menikmati minuman" }, + { name: "Kunci Kamar Mandi Keriting", meaning: "Selalu membuat masalah kecil menjadi lucu" }, + { name: "Pisau Potong Hati", meaning: "Mampu memotong rasa sakit dengan kelebihannya" }, + { name: "Tisu Terbang", meaning: "Selalu siap membantu dengan cepat dan lincah" }, + { name: "Kardus Kocak", meaning: "Tak pernah membosankan, selalu menyimpan kejutan di dalamnya" }, + { name: "Kain Lap Terbang", meaning: "Berguna untuk membersihkan dengan cara yang seru" }, + { name: "Sendok Garpu Goyang", meaning: "Menjadi pasangan yang serasi dalam setiap makanan" }, + { name: "Tempat Pensil Teriak", meaning: "Tak pernah diam dan selalu meminta perhatian" }, + { name: "Buku Lucu", meaning: "Mampu membuatmu tertawa di setiap halaman" }, + { name: "Cermin Menggigil", meaning: "Selalu memberikan pantulan yang lucu" }, + { name: "Kamera Gelantungan", meaning: "Selalu mengabadikan momen-momen lucu" }, + { name: "Cangkir Cemberut", meaning: "Meski terlihat cemberut, tapi selalu menyajikan minuman dengan baik" }, + { name: "Kursi Muter", meaning: "Memberikan sensasi berputar di setiap duduknya" }, + { name: "Lemari Tertidur", meaning: "Selalu memberikan kenyamanan yang tak terduga" }, + { name: "Tas Terbang", meaning: "Selalu membawa barang-barang dengan gaya yang unik" }, + { name: "Sepatu Terbang", meaning: "Membuat langkahmu lebih ringan dengan kelebihannya" }, + { name: "Kunci Jalan Bergosip", meaning: "Tak pernah diam tentang hal-hal di sekitarnya" }, + { name: "Sisir Sibuk", meaning: "Selalu memberikan gaya yang berbeda pada setiap rambut" }, + { name: "Gelas Tertawa", meaning: "Bergoyang-goyang saat diisi dengan minuman" }, + { name: "Pisau Potong Goyang", meaning: "Selalu memberikan irama yang unik saat digunakan" }, + { name: "Meja Ngobrol", meaning: "Tak pernah sepi dari percakapan" }, + { name: "Piring Berguling", meaning: "Suka berputar-putar saat disentuh" }, + { name: "Kompor Berpikir", meaning: "Selalu memberikan solusi yang cerdas untuk setiap masalah" }, + { name: "Kulkas Goyang", meaning: "Bergetar saat diisi dengan makanan" }, + { name: "Cangkir Berlari", meaning: "Tak pernah bisa diam di tempatnya" }, + { name: "Lampu Malam Malas", meaning: "Terlihat malas tapi selalu memberikan cahaya yang lembut" }, + { name: "Botol Kecap Keriting", meaning: "Selalu memberikan sentuhan yang berbeda pada masakan" }, + { name: "Sendok Garpu Bergoyang", meaning: "Selalu menari-nari saat digunakan" }, + { name: "Topi Tertawa", meaning: "Terlihat ceria di atas kepala siapa pun" }, + { name: "Korek Api Malas", meaning: "Terlihat malas tapi selalu memberikan api yang menyala" }, + { name: "Panci Pintar", meaning: "Selalu memberikan masakan yang sempurna" }, + { name: "Kertas Berlari", meaning: "Tak pernah bisa diam di meja" }, + { name: "Pensil Penghilang", meaning: "Selalu menghilang saat dibutuhkan" }, + { name: "Penghapus Pelawak", meaning: "Selalu membuat kesalahan menjadi lucu" }, + { name: "Buku Bergoyang", meaning: "Selalu memberikan sensasi yang berbeda saat dibaca" }, + { name: "Ponsel Pintar", meaning: "Selalu memberikan jawaban yang tepat untuk setiap pertanyaan" }, + { name: "Gunting Goyang", meaning: "Selalu menari-nari saat digunakan" }, + { name: "Rak Buku Pintar", meaning: "Selalu memberikan buku yang sesuai dengan minatmu" }, + { name: "Kipas Angin Tertawa", meaning: "Terlihat bahagia saat berputar-putar" }, + { name: "Sabun Mandi Malas", meaning: "Terlihat malas tapi selalu memberikan kebersihan yang menyegarkan" }, + { name: "Pulpen Pintar", meaning: "Selalu memberikan ide yang brilian" }, + { name: "Gelas Pintar", meaning: "Selalu memberikan minuman yang sesuai dengan keinginanmu" }, + { name: "Botol Air Mengejek", meaning: "Selalu memberikan komentar yang lucu saat diminum" }, + { name: "Bantal Bergoyang", meaning: "Tak pernah bisa diam saat di atas kasur" }, + { name: "Kursi Bergoyang", meaning: "Selalu memberikan sensasi yang menyenangkan saat digunakan" }, + { name: "Rak Buku Bergoyang", meaning: "Selalu memberikan sensasi yang unik saat buku diletakkan di atasnya" }, + { name: "Tas Pintar", meaning: "Selalu memberikan barang yang diperlukan saat dibutuhkan" }, + { name: "Piring Berlari", meaning: "Tak pernah bisa diam di tempatnya" }, + { name: "Panci Penyihir", meaning: "Mampu membuat masakan yang ajaib" }, + { name: "Sendok Garpu Terbalik", meaning: "Tak pernah bisa diletakkan dengan benar" }, + { name: "Kotak Pensil Berguling", meaning: "Selalu menggelinding saat diletakkan di meja" }, + { name: "Kunci Kamar Mandi Tertawa", meaning: "Tak pernah bisa diam dan selalu tertawa-tawa" }, + { name: "Kardus Malas", meaning: "Selalu terlihat malas tapi selalu memberikan perlindungan yang baik" }, + { name: "Lampu Tertidur", meaning: "Terlihat ngantuk tapi selalu memberikan cahaya yang hangat" }, + { name: "Anjing Pelacak", meaning: "Kamu setia dan penuh dedikasi, selalu menemukan jalan menuju tujuanmu." }, + ]; + const khodamIndex = Math.floor(Math.random() * khodams.length); + const khodam = khodams[khodamIndex]; + + return { + name: khodam.name, + meaning: khodam.meaning, + }; +} diff --git a/plugins/fun-darkjokes.js b/plugins/fun-darkjokes.js new file mode 100644 index 0000000000000000000000000000000000000000..908591456f1978ab5b5b447b288738b47090095c --- /dev/null +++ b/plugins/fun-darkjokes.js @@ -0,0 +1,14 @@ +let fetch = require('node-fetch') +let handler = async (m, { conn, text }) => { +try { +let img = await fetch(`https://api.botcahx.eu.org/api/random/darkjokes?apikey=${btc}`).then(result => result.buffer()) +await conn.sendFile(m.chat, img, 'file.jpg', wm, m) +} catch (e) { +throw `Error ${eror}` + } +} +handler.command = /^(darkjokes)$/i +handler.tags = ['fun'] +handler.help = ['darkjokes'] +handler.limit = true +module.exports = handler diff --git a/plugins/fun-g_nama.js b/plugins/fun-g_nama.js new file mode 100644 index 0000000000000000000000000000000000000000..4e1a67c47d23187953fe332dd9f395a4296b8bdf --- /dev/null +++ b/plugins/fun-g_nama.js @@ -0,0 +1,38 @@ +function handler(m, { text }) { + let teks = text ? text : m.quoted && m.quoted.text ? m.quoted.text : m.text + m.reply(teks.replace(/[a-z]/gi, v => { + return { + 'a': 'ka', + 'b': 'tu', + 'c': 'mi', + 'd': 'te', + 'e': 'ku', + 'f': 'lu', + 'g': 'ji', + 'h': 'ri', + 'i': 'ki', + 'j': 'zu', + 'k': 'me', + 'l': 'ta', + 'm': 'rin', + 'n': 'to', + 'o': 'mo', + 'p': 'no', + 'q': 'ke', + 'r': 'shi', + 's': 'ari', + 't': 'ci', + 'u': 'do', + 'v': 'ru', + 'w': 'mei', + 'x': 'na', + 'y': 'fu', + 'z': 'zi' + }[v.toLowerCase()] || v + })) +} +handler.help = ['namaninja <teks>'] +handler.tags = ['fun'] +handler.command = /^(namaninja|namae)$/i + +module.exports = handler \ No newline at end of file diff --git a/plugins/fun-g_purba.js b/plugins/fun-g_purba.js new file mode 100644 index 0000000000000000000000000000000000000000..98bf29379d9eec989142d8a7bf39fe8fa5acf772 --- /dev/null +++ b/plugins/fun-g_purba.js @@ -0,0 +1,9 @@ +function handler(m, { text }) { + let teks = text ? text : m.quoted && m.quoted.text ? m.quoted.text : m.text + m.reply(teks.replace(/[aiueo]/gi, '$&ve')) +} +handler.help = ['purba <teks>'] +handler.tags = ['fun'] +handler.command = /^(purba)$/i + +module.exports = handler \ No newline at end of file diff --git a/plugins/fun-meme.js b/plugins/fun-meme.js new file mode 100644 index 0000000000000000000000000000000000000000..808eab75e4ae6c64cfb88ce1e450870f399a6900 --- /dev/null +++ b/plugins/fun-meme.js @@ -0,0 +1,14 @@ +let fetch = require('node-fetch') +let handler = async (m, { conn, text }) => { +try { +let img = await fetch(`https://api.botcahx.eu.org/api/random/meme?apikey=${btc}`).then(result => result.buffer()) +await conn.sendFile(m.chat, img, 'file.jpg', wm, m) +} catch (e) { +throw `Error ${eror}` + } +} +handler.command = /^(meme)$/i +handler.tags = ['fun'] +handler.help = ['meme'] +handler.limit = true +module.exports = handler diff --git a/plugins/fun-menfess.js b/plugins/fun-menfess.js new file mode 100644 index 0000000000000000000000000000000000000000..ec8ca2591838e0307041ba0da760a4fe470a7803 --- /dev/null +++ b/plugins/fun-menfess.js @@ -0,0 +1,46 @@ +let handler = async (m, { conn, text, usedPrefix, command }) => { + conn.menfess = conn.menfess ? conn.menfess : {} + if (!text) throw `*Cara penggunaan :*\n\n${usedPrefix + command} nomor|nama pengirim|pesan\n\n*Note:* nama pengirim boleh nama samaran atau anonymous.\n\n*Contoh:* ${usedPrefix + command} ${m.sender.split`@`[0]}|Anonymous|Hai.`; + let [jid, name, pesan] = text.split('|'); + if ((!jid || !name || !pesan)) throw `*Cara penggunaan :*\n\n${usedPrefix + command} nomor|nama pengirim|pesan\n\n*Note:* nama pengirim boleh nama samaran atau anonymous.\n\n*Contoh:* ${usedPrefix + command} ${m.sender.split`@`[0]}|Anonymous|Hai.`; + jid = jid.replace(/[^0-9]/g, '') + '@s.whatsapp.net'; + let data = (await conn.onWhatsApp(jid))[0] || {}; + if (!data.exists) throw 'Nomer tidak terdaftar di whatsapp.'; + if (jid == m.sender) throw 'tidak bisa mengirim pesan menfess ke diri sendiri.' + let mf = Object.values(conn.menfess).find(mf => mf.status === true) + if (mf) return !0 + let id = + new Date + let teks = `Hai @${data.jid.split("@")[0]}, kamu menerima pesan Menfess nih.\n\nDari: *${name}*\nPesan: \n${pesan}\n\nMau balas pesan ini kak? bisa kok kak. tinggal ketik pesan kakak lalu kirim, nanti saya sampaikan ke *${name}*.`.trim(); + await conn.relayMessage(data.jid, { + extendedTextMessage:{ + text: teks, + contextInfo: { + mentionedJid: [data.jid], + externalAdReply: { + title: 'M E N F E S S', + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRIyz1dMPkZuNleUyfXPMsltHwKKdVddTf4-A&usqp=CAU', + sourceUrl: '' + } + } + }}, {}).then(() => { + m.reply('Berhasil mengirim pesan menfess.') + conn.menfess[id] = { + id, + dari: m.sender, + nama: name, + penerima: data.jid, + pesan: pesan, + status: false + } + return !0 + }) +} +handler.tags = ['fun'] +handler.help = ['menfess'] +handler.command = /^(menfess|menfes)$/i +handler.private = true + +module.exports = handler diff --git a/plugins/fun-menfess_ans.js b/plugins/fun-menfess_ans.js new file mode 100644 index 0000000000000000000000000000000000000000..9d1994fe847b9c61de1f15ceeb0acce9c1c31a03 --- /dev/null +++ b/plugins/fun-menfess_ans.js @@ -0,0 +1,19 @@ +const delay = time => new Promise(res => setTimeout(res, time)) +let handler = m => m +handler.all = async function (m) { + if (!m.chat.endsWith('@s.whatsapp.net')) return !0; + this.menfess = this.menfess ? this.menfess : {} + let mf = Object.values(this.menfess).find(v => v.status === false && v.penerima == m.sender) + if (!mf) return !0 + console.log({ text: m.text }) + if ((m.text === 'BALAS PESAN' || m.text === '') && m.quoted.mtype == 'buttonMessage') return m.reply("Silahkan Ketik Pesan Balasan Mu"); + let txt = `Hai kak @${mf.dari.split('@')[0]}, Kamu Menerima Pesan Balasan\n\nPesan Kamu: \n${mf.pesan}\n\nPesan Balasannya: \n${m.text}\n`.trim(); + await this.reply(mf.dari, txt, null).then(() => { + m.reply('Berhasil mengirim balasan!') + delay(2000) + delete this.menfess[mf.id] + return !0 + }) + return !0 +} +module.exports = handler diff --git a/plugins/fun-pick.js b/plugins/fun-pick.js new file mode 100644 index 0000000000000000000000000000000000000000..f841a06c704454f2e0804fd2f57accc0a40cb68d --- /dev/null +++ b/plugins/fun-pick.js @@ -0,0 +1,15 @@ +let handler = async (m, { text, args, participants, command }) => { + if (args[0] < 0, args.length < 2) throw 'Example: #pick 15 gay' + let users = participants.map(u => u.jid) + m.reply(`*๐ŸŽ‰ Kamu Ter${command} sebagai ${text.replace(args, '').trimStart()}* + +${new Array(Math.min(users.length, args[0])).fill().map(() => { + let index = Math.floor(Math.random() * users.length) + return `@${users.splice(index, 1)}` +}).join`\n`.replace(/@s.whatsapp.net/g,'')}`) +} +handler.help = ['pick <jumlah> <teks>'] +handler.tags = ['fun'] +handler.command = /^pick/i + +module.exports = handler diff --git a/plugins/fun-putus.js b/plugins/fun-putus.js new file mode 100644 index 0000000000000000000000000000000000000000..c85552a6b599da81cf9b422007626dc965c97861 --- /dev/null +++ b/plugins/fun-putus.js @@ -0,0 +1,33 @@ +let handler = async (m, { conn }) => { + ayg = global.db.data.users[m.sender] + + if(ayg.pasangan == ""){ + return conn.reply(m.chat,`Anda tidak memiliki pasangan.`,m) + } + + beb = global.db.data.users[global.db.data.users[m.sender].pasangan] + + if (typeof beb == "undefined"){ + conn.reply(m.chat,`Berhasil putus hubungan dengan @${global.db.data.users[m.sender].pasangan.split('@')[0]}`,m,{contextInfo: { + mentionedJid: [global.db.data.users[m.sender].pasangan] + }}) + ayg.pasangan = "" + } + + if (m.sender == beb.pasangan){ + conn.reply(m.chat,`Berhasil putus hubungan dengan @${global.db.data.users[m.sender].pasangan.split('@')[0]}`,m,{contextInfo: { + mentionedJid: [global.db.data.users[m.sender].pasangan] + }}) + ayg.pasangan = "" + beb.pasangan = "" + }else { + conn.reply(m.chat,`Anda tidak memiliki pasangan.`,m) + } +} +handler.help = ['putus'] +handler.tags = ['fun'] +handler.command = /^(putus)$/i +handler.group = true +handler.limit = true +handler.fail = null +module.exports = handler diff --git a/plugins/fun-simsimi.js b/plugins/fun-simsimi.js new file mode 100644 index 0000000000000000000000000000000000000000..96049f2f393c971d4bb94d898da68c5f157435cd --- /dev/null +++ b/plugins/fun-simsimi.js @@ -0,0 +1,16 @@ +let fetch = require('node-fetch') +let handler = async (m, { text }) => { +if (!text) throw `Masukan pertanyaan!` +try { + let res = await fetch(`https://api.botcahx.eu.org/api/search/simsimi?query=${encodeURIComponent(text)}&apikey=${btc}`) + let json = await res.json() + m.reply(json.result) +} catch (e) { +throw eror + } +} +handler.help = ['simi', 'simsimi', 'simih'].map(v => v + ' <teks>') +handler.tags = ['fun'] +handler.command = /^((sim)?simi|simih)$/i +handler.limit = true; +module.exports = handler diff --git a/plugins/fun-taugasi.js b/plugins/fun-taugasi.js new file mode 100644 index 0000000000000000000000000000000000000000..7b7623db9ff447f90b53aab523f8ca5b0dc06517 --- /dev/null +++ b/plugins/fun-taugasi.js @@ -0,0 +1,15 @@ + const fetch = require('node-fetch'); + +let handler = async (m, { conn }) => { + let res = await fetch(`https://api.botcahx.eu.org/api/random/taugasih?apikey=${btc}`).then(result => result.json()); + conn.reply(m.chat, `โ€œ${res.taugasih}โ€`, m); +}; + +handler.help = ['taugasih']; +handler.tags = ['fun']; +handler.command = /^(taugasih)$/i; +handler.limit = true; +handler.admin = false; +handler.fail = null; + +module.exports = handler; diff --git a/plugins/fun-tembak.js b/plugins/fun-tembak.js new file mode 100644 index 0000000000000000000000000000000000000000..94453a38e26ae68e22223b25dc12fdf3a70e78d1 --- /dev/null +++ b/plugins/fun-tembak.js @@ -0,0 +1,160 @@ +let handler = async (m, { conn, text, usedPrefix }) => { + if (isNaN(text)) { + var number = text.split`@`[1]; + } else if (!isNaN(text)) { + var number = text; + } + + const format = (num) => { + const n = String(num), + p = n.indexOf("."); + return n.replace(/\d(?=(?:\d{3})+(?:\.|$))/g, (m, i) => + p < 0 || i < p ? `${m},` : m + ); + }; + + if (!text && !m.quoted) + return conn.reply(m.chat, `Berikan nomor, tag atau reply chat target`, m); + // let exists = await conn.isOnWhatsApp(number) + // if (exists) return conn.reply(m.chat, `*Nomor target tidak terdaftar di WhatsApp*`, m) + if (isNaN(number)) return conn.reply(m.chat, `Nomor tidak valid!`, m); + if (number.length > 15) return conn.reply(m.chat, `Format tidak valid!`, m); + try { + if (text) { + var user = number + "@s.whatsapp.net"; + } else if (m.quoted.sender) { + var user = m.quoted.sender; + } else if (m.mentionedJid) { + var user = number + "@s.whatsapp.net"; + } + } catch (e) { + } finally { + let groupMetadata = m.isGroup ? await conn.groupMetadata(m.chat) : {}; + let participants = m.isGroup ? groupMetadata.participants : []; + let users = m.isGroup ? participants.find((u) => u.jid == user) : {}; + if (!user) + return conn.reply( + m.chat, + `Target atau Nomor tidak ditemukan, mungkin sudah keluar atau bukan anggota grup ini`, + m + ); + if (user === m.sender) + return conn.reply(m.chat, `Tidak bisa berpacaran dengan diri sendiri`, m); + //if (user === conn.user.jid) + //return conn.reply(m.chat, `Tidak bisa berpacaran dengan bot`, m); + + if (typeof global.db.data.users[user] == "undefined") + return m.reply("Tidak terdaftar di database"); + + if ( + global.db.data.users[m.sender].pasangan != "" && + global.db.data.users[global.db.data.users[m.sender].pasangan].pasangan == + m.sender && + global.db.data.users[m.sender].pasangan != user + ) { + var denda = Math.ceil((global.db.data.users[m.sender].exp / 1000) * 20); + global.db.data.users[m.sender].exp -= denda; + conn.reply( + m.chat, + `Kamu sudah berpacaran dengan @${ + global.db.data.users[m.sender].pasangan.split("@")[0] + }\n\nSilahkan putus dulu ${usedPrefix}putus @user untuk menembak @${ + user.split("@")[0] + }\n\nsetia dong!\ndenda : ${format(denda)} (20%)`, + m, + { + contextInfo: { + mentionedJid: [user, global.db.data.users[m.sender].pasangan], + }, + } + ); + } else if (global.db.data.users[user].pasangan != "") { + var pacar = global.db.data.users[user].pasangan; + if (global.db.data.users[pacar].pasangan == user) { + var denda = Math.ceil((global.db.data.users[m.sender].exp / 1000) * 20); + global.db.data.users[m.sender].exp -= denda; + if ( + m.sender == pacar && + global.db.data.users[m.sender].pasangan == user + ) + return conn.reply( + m.chat, + `Kamu sudah berpacaran dengan @${ + beb.split("@")[0] + }\n\nsetia dong!\ndenda : ${format(denda)} (20%)`, + m, + { + contextInfo: { + mentionedJid: [beb], + }, + } + ); + conn.reply( + m.chat, + `Tau sopan santun dikit teman\n@${ + user.split("@")[0] + } sudah berpacaran dengan @${ + pacar.split("@")[0] + }\n\nSilahkan cari pasangan lain aja!\ndenda : ${format( + denda + )} (10%)*`, + m, + { + contextInfo: { + mentionedJid: [user, pacar], + }, + } + ); + } else { + global.db.data.users[m.sender].pasangan = user; + conn.reply( + m.chat, + `Kamu baru saja mengajak @${ + user.split("@")[0] + } berpacaran\n\nSilahkan menunggu jawabannya saja ya!\nKetik ${usedPrefix}terima @user atau ${usedPrefix}tolak @user`, + m, + { + contextInfo: { + mentionedJid: [user], + }, + } + ); + } + } else if (global.db.data.users[user].pasangan == m.sender) { + global.db.data.users[m.sender].pasangan = user; + conn.reply( + m.chat, + `Selamat anda resmi berpacaran dengan @${ + user.split("@")[0] + }\n\nSemoga langgeng dan bahagia selalu `, + m, + { + contextInfo: { + mentionedJid: [user], + }, + } + ); + } else { + global.db.data.users[m.sender].pasangan = user; + conn.reply( + m.chat, + `Kamu baru saja mengajak @${ + user.split("@")[0] + } berpacaran\n\nSilahkan menunggu jawabannya saja ya!\nKetik ${usedPrefix}terima @user atau ${usedPrefix}tolak @user`, + m, + { + contextInfo: { + mentionedJid: [user], + }, + } + ); + } + } +}; +handler.help = ["tembak"].map((v) => v + " *@tag*"); +handler.tags = ["fun"]; +handler.command = /^(tembak)$/i; +handler.group = true; +handler.limit = false; +handler.fail = null; +module.exports = handler; diff --git a/plugins/fun-terima.js b/plugins/fun-terima.js new file mode 100644 index 0000000000000000000000000000000000000000..5cf093f7ac9fc10caec3e4ec2dd950f0852e2938 --- /dev/null +++ b/plugins/fun-terima.js @@ -0,0 +1,57 @@ +let handler = async (m, { conn, text }) => { + if(isNaN(text)) { + var number = text.split`@`[1] + } else if(!isNaN(text)) { + var number = text + } + + const format = num => { + const n = String(num), + p = n.indexOf('.') + return n.replace( + /\d(?=(?:\d{3})+(?:\.|$))/g, + (m, i) => p < 0 || i < p ? `${m},` : m + ) + } + + if(!text && !m.quoted) return conn.reply(m.chat, `*Berikan nomor, tag atau reply chat target.*`, m) + // let exists = await conn.isOnWhatsApp(number) + // if (exists) return conn.reply(m.chat, `*Nomor target tidak terdaftar di WhatsApp*`, m) + if(isNaN(number)) return conn.reply(m.chat, `*Nomor tidak valid.*`, m) + if(number.length > 15) return conn.reply(m.chat, `*Format is Invalid.*`, m) + try { + if(text) { + var user = number + '@s.whatsapp.net' + } else if(m.quoted.sender) { + var user = m.quoted.sender + } else if(m.mentionedJid) { + var user = number + '@s.whatsapp.net' + } + } catch (e) { + } finally { + let groupMetadata = m.isGroup ? await conn.groupMetadata(m.chat) : {} + let participants = m.isGroup ? groupMetadata.participants : [] + let users = m.isGroup ? participants.find(u => u.jid == user) : {} + if(!user) return conn.reply(m.chat, `*Target atau Nomor tidak ditemukan, mungkin sudah keluar atau bukan anggota grup ini.*`, m) + if(user === m.sender) return conn.reply(m.chat, `*Tidak bisa berpacaran dengan diri sendiri.*`, m) + if(user === conn.user.jid) return conn.reply(m.chat, `*Tidak bisa berpacaran dengan bot.*`, m) + + if(global.db.data.users[user].pasangan != m.sender){ + conn.reply(m.chat,`*Maaf @${user.split('@')[0]} tidak sedang menembak anda*`,m,{contextInfo: { + mentionedJid: [user] + }}) + }else{ + global.db.data.users[m.sender].pasangan = user + conn.reply(m.chat,`*Selamat anda resmi berpacaran dengan @${user.split('@')[0]}*\n\n*Semoga langgeng dan bahagia selalu @${user.split('@')[0]} โ™ก @${m.sender.split('@')[0]} ๐Ÿฅณ๐Ÿฅณ*`,m,{contextInfo: { + mentionedJid: [m.sender,user] + }}) + } + } +} +handler.help = ['terima *@tag*'] +handler.tags = ['fun'] +handler.command = /^(terima)$/i +handler.group = true +handler.limit = false +handler.fail = null +module.exports = handler diff --git a/plugins/fun-tolak.js b/plugins/fun-tolak.js new file mode 100644 index 0000000000000000000000000000000000000000..5178c92d5ef6ff266abb0f2a3d0351e83e6dd477 --- /dev/null +++ b/plugins/fun-tolak.js @@ -0,0 +1,59 @@ +let handler = async (m, { conn, text }) => { + if(isNaN(text)) { + var number = text.split`@`[1] + } else if(!isNaN(text)) { + var number = text + } + + const format = num => { + const n = String(num), + p = n.indexOf('.') + return n.replace( + /\d(?=(?:\d{3})+(?:\.|$))/g, + (m, i) => p < 0 || i < p ? `${m},` : m + ) + } + + if(!text && !m.quoted) return conn.reply(m.chat, `*Berikan nomor, tag atau reply chat target.*`, m) + // let exists = await conn.isOnWhatsApp(number) + // if (exists) return conn.reply(m.chat, `*Nomor target tidak terdaftar di WhatsApp*`, m) + if(isNaN(number)) return conn.reply(m.chat, `*Nomor tidak valid.*`, m) + if(number.length > 15) return conn.reply(m.chat, `*Format is Invalid.*`, m) + try { + if(text) { + var user = number + '@s.whatsapp.net' + } else if(m.quoted.sender) { + var user = m.quoted.sender + } else if(m.mentionedJid) { + var user = number + '@s.whatsapp.net' + } + } catch (e) { + } finally { + let groupMetadata = m.isGroup ? await conn.groupMetadata(m.chat) : {} + let participants = m.isGroup ? groupMetadata.participants : [] + let users = m.isGroup ? participants.find(u => u.jid == user) : {} + if(!user) return conn.reply(m.chat, `*Target atau Nomor tidak ditemukan, mungkin sudah keluar atau bukan anggota grup ini.*`, m) + if(user === m.sender) return conn.reply(m.chat, `*Tidak bisa berpacaran dengan diri sendiri.*`, m) + if(user === conn.user.jid) return conn.reply(m.chat, `*Tidak bisa berpacaran dengan bot.*`, m) + + if(global.db.data.users[user].pasangan != m.sender){ + conn.reply(m.chat,`*Maaf @${user.split('@')[0]} tidak sedang menembak anda*`,m,{contextInfo: { + mentionedJid: [user] + }}) + }else{ + global.db.data.users[user].pasangan = "" + conn.reply(m.chat,`*Anda baru saja telah menolak @${user.split('@')[0]} Kasian :v*`,m,{contextInfo: { + mentionedJid: [user] + }}) + } + } +} +handler.help = ['tolak *@tag*'] +handler.tags = ['fun'] +handler.command = /^(tolak)$/i +handler.mods = false +handler.premium = false +handler.group = true +handler.limit = false +handler.fail = null +module.exports = handler diff --git a/plugins/fun-top.js b/plugins/fun-top.js new file mode 100644 index 0000000000000000000000000000000000000000..cfe84b8935295ac774054d5a56092e42c96c78d7 --- /dev/null +++ b/plugins/fun-top.js @@ -0,0 +1,36 @@ +const util = require('util'); +const path = require('path'); + +const user = (a) => '@' + a.split('@')[0]; + +function handler(m, { groupMetadata, command, conn, text, usedPrefix }) { + if (!text) throw `Contoh penggunaan:\n.top *teks*`; + + const ps = groupMetadata.participants.map((v) => v.id); + + const a = pickRandom(ps); + const b = pickRandom(ps); + const c = pickRandom(ps); + const d = pickRandom(ps); + const e = pickRandom(ps); + + const k = Math.floor(Math.random() * 70); + const x = pickRandom(['๐Ÿค“', '๐Ÿ˜…', '๐Ÿ˜‚', '๐Ÿ˜ณ', '๐Ÿ˜Ž', '๐Ÿฅต', '๐Ÿ˜ฑ', '๐Ÿค‘', '๐Ÿ™„', '๐Ÿ’ฉ', '๐Ÿ‘', '๐Ÿคจ', '๐Ÿฅด', '๐Ÿ”ฅ', '๐Ÿ‘‡๐Ÿป', '๐Ÿ˜”', '๐Ÿ‘€', '๐ŸŒš']); + const l = Math.floor(Math.random() * x.length); + const vn = `https://kaxel-host.tech/sound/sound.mp3`; + + const top = `*${x} Top 5 ${text} ${x}*\n\n1. ${user(a)}\n2. ${user(b)}\n3. ${user(c)}\n4. ${user(d)}\n5. ${user(e)}`; + + m.reply(top, null, { mentions: [a, b, c, d, e] }); +} + +handler.help = handler.command = ['top']; +handler.tags = ['fun']; +handler.group = true; +handler.limit = 2; + +module.exports = handler; + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)]; +} diff --git a/plugins/game-bomb.js b/plugins/game-bomb.js new file mode 100644 index 0000000000000000000000000000000000000000..c6c29e56782516daffe2c312081c1086687c0313 --- /dev/null +++ b/plugins/game-bomb.js @@ -0,0 +1,51 @@ +// Thanks To Kasan + +let handler = async (m, { conn }) => { +conn.bomb = conn.bomb ? conn.bomb : {}; +let id = m.sender, +timeout = 180000; +if (id in conn.bomb) return conn.reply(m.chat, '*^ sesi ini belum selesai!*', conn.bomb[id][0]); +const bom = ['๐Ÿ’ฅ', 'โœ…', 'โœ…', 'โœ…', 'โœ…', 'โœ…', 'โœ…', 'โœ…', 'โœ…'].sort(() => Math.random() - 0.5); +const number = ['1๏ธโƒฃ', '2๏ธโƒฃ', '3๏ธโƒฃ', '4๏ธโƒฃ', '5๏ธโƒฃ', '6๏ธโƒฃ', '7๏ธโƒฃ', '8๏ธโƒฃ', '9๏ธโƒฃ']; +const array = bom.map((v, i) => ({ +emot: v, +number: number[i], +position: i + 1, +state: false +})); +let teks = `ไน‚ *B O M B*\n\nKirim angka *1* - *9* untuk membuka *9* kotak nomor di bawah ini :\n\n`; +for (let i = 0; i < array.length; i += 3) teks += array.slice(i, i + 3).map(v => v.state ? v.emot : v.number).join('') + '\n'; +teks += `\nTimeout : [ *${((timeout / 1000) / 60)} menit* ]\nApabila mendapat kotak yang berisi bom maka point akan di kurangi. Ketik suren untuk menyerah.`; +let msg = await conn.sendMessage(m.chat, { +text: teks, +contextInfo: { +externalAdReply: { +title: "", +body: 'Bomb', +thumbnailUrl: "https://telegra.ph/file/b3138928493e78b55526f.jpg", +sourceUrl: "", +mediaType: 1, +renderLargerThumbnail: true +}}}, +{ quoted: m }) +let { key } = msg + +let v; +conn.bomb[id] = [ +msg, +array, +setTimeout(() => { +v = array.find(v => v.emot == '๐Ÿ’ฅ'); +if (conn.bomb[id]) conn.reply(m.chat, `*Waktu habis!*, Bom berada di kotak nomor ${v.number}.`, conn.bomb[id][0].key); +delete conn.bomb[id]; +}, timeout), +key +]; + +} + +handler.help = ["bomb"]; +handler.tags = ["game"]; +handler.command = /^(bomb)$/i; + +module.exports = handler; diff --git a/plugins/game-bomb_ans.js b/plugins/game-bomb_ans.js new file mode 100644 index 0000000000000000000000000000000000000000..02e2084ef2349462ca788f755dfa5aea89bbddfb --- /dev/null +++ b/plugins/game-bomb_ans.js @@ -0,0 +1,92 @@ +// Thanks To Kasan + +const util = require('util'); + +let handler = m => m +handler.before = async function (m) { +try { +let id = m.sender; +let timeout = 180000; +let reward = randomInt(100, 800); +let users = global.db.data.users[m.sender]; +let body = (typeof m.text == 'string' ? m.text : ''); +conn.bomb = conn.bomb ? conn.bomb : {}; + +let isSurrender = /^(suren)$/i.test(body); +if (isSurrender) { +await conn.reply(m.chat, `๐Ÿšฉ Menyerah`, m); +clearTimeout(conn.bomb[id][2]); +delete conn.bomb[id]; +} + +if ((id in conn.bomb) && !isNaN(body)) { +let json = conn.bomb[id][1].find(v => v.position == body); +if (!json) return conn.reply(m.chat, `๐Ÿšฉ Untuk membuka kotak kirim angka 1 - 9`, m); + +if (json.emot == '๐Ÿ’ฅ') { +json.state = true; +let bomb = conn.bomb[id][1]; +let teks = `ไน‚ *B O M B*\n\n`; +teks += bomb.slice(0, 3).map(v => v.state ? v.emot : v.number).join('') + '\n'; +teks += bomb.slice(3, 6).map(v => v.state ? v.emot : v.number).join('') + '\n'; +teks += bomb.slice(6).map(v => v.state ? v.emot : v.number).join('') + '\n\n'; +teks += `Timeout : [ *${((timeout / 1000) / 60)} menit* ]\n`; +teks += `*Permainan selesai!*, kotak berisi bom terbuka : (- *${formatNumber(reward)}*)`; + +conn.reply(m.chat, teks, m).then(() => { +users.exp < reward ? users.exp = 0 : users.exp -= reward; +clearTimeout(conn.bomb[id][2]); +delete conn.bomb[id]; +}); +} else if (json.state) { +return conn.reply(m.chat, `๐Ÿšฉ Kotak ${json.number} sudah di buka silahkan pilih kotak yang lain.`, m); +} else { +json.state = true; +let changes = conn.bomb[id][1]; +let open = changes.filter(v => v.state && v.emot != '๐Ÿ’ฅ').length; + +if (open >= 8) { +let teks = `ไน‚ *B O M B*\n\n`; +teks += `Kirim angka *1* - *9* untuk membuka *9* kotak nomor di bawah ini :\n\n`; +teks += changes.slice(0, 3).map(v => v.state ? v.emot : v.number).join('') + '\n'; +teks += changes.slice(3, 6).map(v => v.state ? v.emot : v.number).join('') + '\n'; +teks += changes.slice(6).map(v => v.state ? v.emot : v.number).join('') + '\n\n'; +teks += `Timeout : [ *${((timeout / 1000) / 60)} menit* ]\n`; +teks += `*Permainan selesai!* kotak berisi bom tidak terbuka : (+ *${formatNumber(reward)}*)`; + +conn.reply(m.chat, teks, m).then(() => { +users.exp += reward; +clearTimeout(conn.bomb[id][2]); +delete conn.bomb[id]; +}); +} else { +let teks = `ไน‚ *B O M B*\n\n`; +teks += `Kirim angka *1* - *9* untuk membuka *9* kotak nomor di bawah ini :\n\n`; +teks += changes.slice(0, 3).map(v => v.state ? v.emot : v.number).join('') + '\n'; +teks += changes.slice(3, 6).map(v => v.state ? v.emot : v.number).join('') + '\n'; +teks += changes.slice(6).map(v => v.state ? v.emot : v.number).join('') + '\n\n'; +teks += `Timeout : [ *${((timeout / 1000) / 60)} menit* ]\n`; +teks += `Kotak berisi bom tidak terbuka : (+ *${formatNumber(reward)}*)`; +conn.reply(m.chat, teks, m).then(() => { +users.exp += reward; +}); +} +} +} +} catch (e) { +return conn.reply(m.chat, util.format(e), m); +} +return !0; +} + +handler.exp = 0 + +function randomInt(min, max) { +return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function formatNumber(number) { +return number.toLocaleString(); +} + +module.exports = handler diff --git a/plugins/game-dare.js b/plugins/game-dare.js new file mode 100644 index 0000000000000000000000000000000000000000..86530c19b93328d862ccfade58576554edfd8797 --- /dev/null +++ b/plugins/game-dare.js @@ -0,0 +1,12 @@ +let fetch = require('node-fetch') +let handler = async (m, { conn }) => { + let img = 'https://i.ibb.co/305yt26/bf84f20635dedd5dde31e7e5b6983ae9.jpg' + let dare = await fetch(`https://api.botcahx.eu.org/api/random/dare?apikey=${btc}`).then(result => result.json()) + conn.sendFile(m.chat, img, 'dare.png', `*DARE*\n\nโ€œ${dare.result}โ€`, m) +} +handler.help = ['dare'] +handler.tags = ['fun'] +handler.command = /^(dare|berani|tantangan)$/i +handler.limit = true + +module.exports = handler diff --git a/plugins/game-iqtest.js b/plugins/game-iqtest.js new file mode 100644 index 0000000000000000000000000000000000000000..ed5ad8f52fcf40b5771742ea43ccece09b04415d --- /dev/null +++ b/plugins/game-iqtest.js @@ -0,0 +1,48 @@ +let handler = async (m, { conn }) => { + conn.reply(m.chat,`${pickRandom(global.iq)}`, m) +} +handler.help = ['iqtest'] +handler.tags = ['game'] +handler.command = /^(iqtest)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(list.length * Math.random())] +} + +global.iq = [ +'IQ Anda Sebesar : 1', +'IQ Anda Sebesar : 14', +'IQ Anda Sebesar : 23', +'IQ Anda Sebesar : 35', +'IQ Anda Sebesar : 41', +'IQ Anda Sebesar : 50', +'IQ Anda Sebesar : 67', +'IQ Anda Sebesar : 72', +'IQ Anda Sebesar : 86', +'IQ Anda Sebesar : 99', +'IQ Anda Sebesar : 150', +'IQ Anda Sebesar : 340', +'IQ Anda Sebesar : 423', +'IQ Anda Sebesar : 500', +'IQ Anda Sebesar : 676', +'IQ Anda Sebesar : 780', +'IQ Anda Sebesar : 812', +'IQ Anda Sebesar : 945', +'IQ Anda Sebesar : 1000', +'IQ Anda Sebesar : Tidak Terbatas!', +'IQ Anda Sebesar : 5000', +'IQ Anda Sebesar : 7500', +'IQ Anda Sebesar : 10000', +] diff --git a/plugins/game-math.js b/plugins/game-math.js new file mode 100644 index 0000000000000000000000000000000000000000..f3d8aaf51353ff2cffd87675becc034f1e66ee8b --- /dev/null +++ b/plugins/game-math.js @@ -0,0 +1,74 @@ +let handler = async (m, { conn, args, usedPrefix }) => { + conn.math = conn.math ? conn.math : {} + if (args.length < 1) throw ` +Mode: ${Object.keys(modes).join(' | ')} + +Contoh penggunaan: ${usedPrefix}math medium +`.trim() + let mode = args[0].toLowerCase() + if (!(mode in modes)) throw ` +Mode: ${Object.keys(modes).join(' | ')} + +Contoh penggunaan: ${usedPrefix}math medium +`.trim() + let id = m.chat + if (id in conn.math) return conn.reply(m.chat, 'Masih ada soal belum terjawab di chat ini', conn.math[id][0]) + let math = genMath(mode) + conn.math[id] = [ + await conn.reply(m.chat, `Berapa hasil dari *${math.str}*?\n\nTimeout: ${(math.time / 1000).toFixed(2)} detik\nBonus Jawaban Benar: ${math.bonus} XP`, m), + math, 4, + setTimeout(() => { + if (conn.math[id]) conn.reply(m.chat, `Waktu habis!\nJawabannya adalah ${math.result}`, conn.math[id][0]) + delete conn.math[id] + }, math.time) + ] +} +handler.help = ['math <mode>'] +handler.tags = ['game'] +handler.command = /^math/i + +module.exports = handler + +let modes = { + noob: [-3, 3,-3, 3, '+-', 15000, 10], + easy: [-10, 10, -10, 10, '*/+-', 20000, 40], + medium: [-40, 40, -20, 20, '*/+-', 40000, 150], + hard: [-100, 100, -70, 70, '*/+-', 60000, 350], + extreme: [-999999, 999999, -999999, 999999, '*/', 99999, 9999], + impossible: [-99999999999, 99999999999, -99999999999, 999999999999, '*/', 30000, 35000], + impossible2: [-999999999999999, 999999999999999, -999, 999, '/', 30000, 50000] +} + +let operators = { + '+': '+', + '-': '-', + '*': 'ร—', + '/': 'รท' +} + +function genMath(mode) { + let [a1, a2, b1, b2, ops, time, bonus] = modes[mode] + let a = randomInt(a1, a2) + let b = randomInt(b1, b2) + let op = pickRandom([...ops]) + let result = (new Function(`return ${a} ${op.replace('/', '*')} ${b < 0 ? `(${b})` : b}`))() + if (op == '/') [a, result] = [result, a] + return { + str: `${a} ${operators[op]} ${b}`, + mode, + time, + bonus, + result + } +} + +function randomInt(from, to) { + if (from > to) [from, to] = [to, from] + from = Math.floor(from) + to = Math.floor(to) + return Math.floor((to - from) * Math.random() + from) +} + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} diff --git a/plugins/game-math_ans.js b/plugins/game-math_ans.js new file mode 100644 index 0000000000000000000000000000000000000000..8d97981b04e6d3f3b2ee7c3cde702a0d802706b8 --- /dev/null +++ b/plugins/game-math_ans.js @@ -0,0 +1,26 @@ +let handler = m => m +handler.before = async function (m) { + if (!/^-?[0-9]+(\.[0-9]+)?$/.test(m.text)) return !0 + let id = m.chat + if (!m.quoted || m.quoted.sender != this.user.jid || !/^Berapa hasil dari/i.test(m.quoted.text)) return !0 + this.math = this.math ? this.math : {} + if (!(id in this.math)) return m.reply('Soal itu telah berakhir') + if (m.quoted.id == this.math[id][0].id) { + let math = JSON.parse(JSON.stringify(this.math[id][1])) + if (m.text == math.result) { + global.db.data.users[m.sender].exp += math.bonus + clearTimeout(this.math[id][3]) + delete this.math[id] + m.reply(`*Jawaban Benar!*\n+${math.bonus} XP`) + } else { + if (--this.math[id][2] == 0) { + clearTimeout(this.math[id][3]) + delete this.math[id] + m.reply(`*Kesempatan habis!*\nJawaban: *${math.result}*`) + } else m.reply(`*Jawaban Salah!*\nMasih ada ${this.math[id][2]} kesempatan`) + } + } + return !0 +} + +module.exports = handler diff --git a/plugins/game-suit.js b/plugins/game-suit.js new file mode 100644 index 0000000000000000000000000000000000000000..64fdb582a874565e315e412d1f04f4245bc740b2 --- /dev/null +++ b/plugins/game-suit.js @@ -0,0 +1,46 @@ +let handler = async (m, { text, usedPrefix }) => { + let salah = `Pilihan yang tersedia\n\ngunting, kertas, batu\n\n${usedPrefix}suit gunting\n\nkasih spasi!` + if (!text) throw salah + var astro = Math.random() + + if (astro < 0.34) { + astro = 'batu' + } else if (astro > 0.34 && astro < 0.67) { + astro = 'gunting' + } else { + astro = 'kertas' + } + + //menentukan rules + if (text == astro) { + m.reply(`Seri!\nkamu: ${text}\nBot: ${astro}`) + } else if (text == 'batu') { + if (astro == 'gunting') { + global.db.data.users[m.sender].money += 1000 + m.reply(`Kamu menang! +Rp1000\nKamu: ${text}\nBot: ${astro}`) + } else { + m.reply(`Kamu kalah!\nkamu: ${text}\nBot: ${astro}`) + } + } else if (text == 'gunting') { + if (astro == 'kertas') { + global.db.data.users[m.sender].money += 1000 + m.reply(`Kamu menang! +Rp1000\nKamu: ${text}\nBot: ${astro}`) + } else { + m.reply(`Kamu kalah!\nkamu: ${text}\nBot: ${astro}`) + } + } else if (text == 'kertas') { + if (astro == 'batu') { + global.db.data.users[m.sender].money += 1000 + m.reply(`Kamu menang! +Rp1000\nKamu: ${text}\nBot: ${astro}`) + } else { + m.reply(`Kamu kalah!\nkamu: ${text}\nBot: ${astro}`) + } + } else { + throw salah + } +} +handler.help = ['suit'] +handler.tags = ['game'] +handler.command = /^(suit)$/i + +module.exports = handler diff --git a/plugins/game-suitpvp.js b/plugins/game-suitpvp.js new file mode 100644 index 0000000000000000000000000000000000000000..aef259f38dca16c20d511ae92fa0c81991328811 --- /dev/null +++ b/plugins/game-suitpvp.js @@ -0,0 +1,40 @@ +/* + Made by https://github.com/syahrularranger + Jangan di hapus credit nya :) +*/ +let timeout = 60000 +let poin = 500 +let poin_lose = -100 +let handler = async (m, { conn, usedPrefix }) => { + conn.suit = conn.suit ? conn.suit : {} + if (Object.values(conn.suit).find(room => room.id.startsWith('suit') && [room.p, room.p2].includes(m.sender))) throw 'Selesaikan suit mu yang sebelumnya' + if (!m.mentionedJid[0]) return m.reply(`_Siapa yang ingin kamu tantang?_\nTag orangnya.. Contoh\n\n${usedPrefix}suit @${owner[1]}`, m.chat, { contextInfo: { mentionedJid: [owner[1] + '@s.whatsapp.net'] } }) + if (Object.values(conn.suit).find(room => room.id.startsWith('suit') && [room.p, room.p2].includes(m.mentionedJid[0]))) throw `Orang yang kamu tantang sedang bermain suit bersama orang lain :(` + let id = 'suit_' + new Date() * 1 + let caption = ` +_*SUIT PvP*_ + +@${m.sender.split`@`[0]} menantang @${m.mentionedJid[0].split`@`[0]} untuk bermain suit + +Silahkan @${m.mentionedJid[0].split`@`[0]} +`.trim() + let footer = `Ketik "terima/ok/gas" untuk memulai suit\nKetik "tolak/gabisa/nanti" untuk menolak` + conn.suit[id] = { + chat: await conn.send2But(m.chat, caption, footer, 'Terima', 'ok', 'Tolak', 'tolak', m, { contextInfo: { mentionedJid: conn.parseMention(caption) } }), + id: id, + p: m.sender, + p2: m.mentionedJid[0], + status: 'wait', + waktu: setTimeout(() => { + if (conn.suit[id]) conn.reply(m.chat, `_Waktu suit habis_`, m) + delete conn.suit[id] + }, timeout), poin, poin_lose, timeout + } +} +handler.tags = ['game'] +handler.help = ['suitpvp', 'suit2'].map(v => v + ' @tag') +handler.command = /^suit(pvp|2)$/i +handler.limit = false +handler.group = true + +module.exports = handler diff --git a/plugins/game-suitpvp_ans.js b/plugins/game-suitpvp_ans.js new file mode 100644 index 0000000000000000000000000000000000000000..1ba65b28e34a8543ea3ebb160210558284471603 --- /dev/null +++ b/plugins/game-suitpvp_ans.js @@ -0,0 +1,94 @@ +let handler = m => m +handler.before = async function (m) { + this.suit = this.suit ? this.suit : {} + if (db.data.users[m.sender].suit < 0) db.data.users[m.sender].suit = 0 + let room = Object.values(this.suit).find(room => room.id && room.status && [room.p, room.p2].includes(m.sender)) + if (room) { + let win = '' + let tie = false + if (m.sender == room.p2 && /^(acc(ept)?|terima|gas|oke?|tolak|gamau|nanti|ga(k.)?bisa)/i.test(m.text) && m.isGroup && room.status == 'wait') { + if (/^(tolak|gamau|nanti|ga(k.)?bisa)/i.test(m.text)) { + this.reply(m.chat, `@${room.p2.split`@`[0]} menolak suit, suit dibatalkan`, m) + delete this.suit[room.id] + return !0 + } + room.status = 'play' + room.asal = m.chat + clearTimeout(room.waktu) + //delete room[room.id].waktu + m.reply(`Suit telah dikirimkan ke chat +@${room.p.split`@`[0]} dan +@${room.p2.split`@`[0]} + +Silahkan pilih suit di chat masing" +klik wa.me/${conn.user.jid.split`@`[0]}`, m.chat, { + contextInfo: { + mentionedJid: [room.p, room.p2] + } + }) + + if (!room.pilih) this.send3But(room.p, 'Silahkan pilih', `Menang +${room.poin}XP\nKalah -${room.poin_lose}XP`, 'Batu๐Ÿ—ฟ', 'Batu', 'Kertas๐Ÿ“„', 'Kertas', 'Guntingโœ‚๏ธ', 'Gunting', m) + if (!room.pilih2) this.send3But(room.p2, 'Silahkan pilih', `Menang +${room.poin}XP\nKalah -${room.poin_lose}XP`, 'Batu๐Ÿ—ฟ', 'Batu', 'Kertas๐Ÿ“„', 'Kertas', 'Guntingโœ‚๏ธ', 'Gunting', m) + room.waktu_milih = setTimeout(() => { + if (!room.pilih && !room.pilih2) this.reply(m.chat, `Kedua pemain tidak niat main,\nSuit dibatalkan`) + else if (!room.pilih || !room.pilih2) { + win = !room.pilih ? room.p2 : room.p + this.reply(m.chat, `@${(room.pilih ? room.p2 : room.p).split`@`[0]} tidak memilih suit, game berakhir`, m) + db.data.users[win == room.p ? room.p : room.p2].exp += room.poin + db.data.users[win == room.p ? room.p2 : room.p].exp -= room.poin_lose + } + delete this.suit[room.id] + return !0 + }, room.timeout) + } + let jwb = m.sender == room.p + let jwb2 = m.sender == room.p2 + let g = /gunting/i + let b = /batu/i + let k = /kertas/i + let reg = /^(gunting|batu|kertas)/i + if (jwb && reg.test(m.text) && !room.pilih && !m.isGroup) { + room.pilih = reg.exec(m.text.toLowerCase())[0] + room.text = m.text + m.reply(`Kamu telah memilih ${m.text} ${!room.pilih2 ? `\n\nMenunggu lawan memilih` : ''}`) + if (!room.pilih2) this.reply(room.p2, '_Lawan sudah memilih_\nSekarang giliran kamu', 0) + } + if (jwb2 && reg.test(m.text) && !room.pilih2 && !m.isGroup) { + room.pilih2 = reg.exec(m.text.toLowerCase())[0] + room.text2 = m.text + m.reply(`Kamu telah memilih ${m.text} ${!room.pilih ? `\n\nMenunggu lawan memilih` : ''}`) + if (!room.pilih) this.reply(room.p, '_Lawan sudah memilih_\nSekarang giliran kamu', 0) + } + let stage = room.pilih + let stage2 = room.pilih2 + if (room.pilih && room.pilih2) { + clearTimeout(room.waktu_milih) + if (b.test(stage) && g.test(stage2)) win = room.p + else if (b.test(stage) && k.test(stage2)) win = room.p2 + else if (g.test(stage) && k.test(stage2)) win = room.p + else if (g.test(stage) && b.test(stage2)) win = room.p2 + else if (k.test(stage) && b.test(stage2)) win = room.p + else if (k.test(stage) && g.test(stage2)) win = room.p2 + else if (stage == stage2) tie = true + this.reply(room.asal, ` +_*Hasil Suit*_${tie ? '\nSERI' : ''} + +@${room.p.split`@`[0]} (${room.text}) ${tie ? '' : room.p == win ? ` Menang \n+${room.poin}XP` : ` Kalah \n-${room.poin_lose}XP`} +@${room.p2.split`@`[0]} (${room.text2}) ${tie ? '' : room.p2 == win ? ` Menang \n+${room.poin}XP` : ` Kalah \n-${room.poin_lose}XP`} +`.trim(), m, { contextInfo: { mentionedJid: [room.p, room.p2] } }) + if (!tie) { + db.data.users[win == room.p ? room.p : room.p2].exp += room.poin + db.data.users[win == room.p ? room.p2 : room.p].exp += room.poin_lose + + } + delete this.suit[room.id] + } + } + return !0 +} +handler.exp = 0 +module.exports = handler + +function random(arr) { + return arr[Math.floor(Math.random() * arr.length)] +} diff --git a/plugins/game-tictac_toe.js b/plugins/game-tictac_toe.js new file mode 100644 index 0000000000000000000000000000000000000000..2c6d3528fc2b2910464da0108cbe933209c3e5f5 --- /dev/null +++ b/plugins/game-tictac_toe.js @@ -0,0 +1,91 @@ +let handler = m => m +let debugMode = !1 + +let winScore = 500 +let playScore = 50 + +handler.before = function (m) { + let ok + let isWin = !1 + let isTie = !1 + let isSurrender = !1 + this.game = this.game ? this.game : {} + let room = Object.values(this.game).find(room => room.id && room.game && room.state && room.id.startsWith('tictactoe') && [room.game.playerX, room.game.playerO].includes(m.sender) && room.state == 'PLAYING') + if (room) { + // m.reply(`[DEBUG]\n${parseInt(m.text)}`) + if (!/^([1-9]|(me)?nyerah|surr?ender)$/i.test(m.text)) return !0 + isSurrender = !/^[1-9]$/.test(m.text) + if (m.sender !== room.game.currentTurn) { // nek wayahku + if (!isSurrender) return !0 + } + if (debugMode) m.reply('[DEBUG]\n' + require('util').format({ + isSurrender, + text: m.text + })) + if (!isSurrender && 1 > (ok = room.game.turn(m.sender === room.game.playerO, parseInt(m.text) - 1))) { + m.reply({ + '-3': 'Game telah berakhir', + '-2': 'Invalid', + '-1': 'Posisi Invalid', + 0: 'Posisi Invalid', + }[ok]) + return !0 + } + if (m.sender === room.game.winner) isWin = true + else if (room.game.board === 511) isTie = true + let arr = room.game.render().map(v => { + return { + X: 'โŒ', + O: 'โญ•', + 1: '1๏ธโƒฃ', + 2: '2๏ธโƒฃ', + 3: '3๏ธโƒฃ', + 4: '4๏ธโƒฃ', + 5: '5๏ธโƒฃ', + 6: '6๏ธโƒฃ', + 7: '7๏ธโƒฃ', + 8: '8๏ธโƒฃ', + 9: '9๏ธโƒฃ', + }[v] + }) + if (isSurrender) { + room.game._currentTurn = m.sender === room.game.playerX + isWin = true + } + let winner = isSurrender ? room.game.currentTurn : room.game.winner + let str = ` +${arr.slice(0, 3).join('')} +${arr.slice(3, 6).join('')} +${arr.slice(6).join('')} +${isWin ? `@${winner.split('@')[0]} Menang! (+${winScore} XP)` : isTie ? `Game berakhir (+${playScore} XP)` : `Giliran ${['โŒ', 'โญ•'][1 * room.game._currentTurn]} (@${room.game.currentTurn.split('@')[0]})`} + +โŒ: @${room.game.playerX.split('@')[0]} +โญ•: @${room.game.playerO.split('@')[0]} +Ketik *nyerah* untuk nyerah +Room ID: ${room.id} +`.trim() + let users = global.db.data.users + if ((room.game._currentTurn ^ isSurrender ? room.x : room.o) !== m.chat) + room[room.game._currentTurn ^ isSurrender ? 'x' : 'o'] = m.chat + if (room.x !== room.o) m.reply(str, room.x, { + contextInfo: { + mentionedJid: this.parseMention(str) + } + }) + m.reply(str, room.o, { + contextInfo: { + mentionedJid: this.parseMention(str) + } + }) + if (isTie || isWin) { + users[room.game.playerX].exp += playScore + users[room.game.playerO].exp += playScore + if (isWin) users[winner].exp += winScore - playScore + if (debugMode) m.reply('[DEBUG]\n' + require('util').format(room)) + delete this.game[room.id] + } + } + return !0 +} + +module.exports = handler diff --git a/plugins/game-tictactoe.js b/plugins/game-tictactoe.js new file mode 100644 index 0000000000000000000000000000000000000000..18ebef1a4d38158bd0e8f6e5561931e17e486fdc --- /dev/null +++ b/plugins/game-tictactoe.js @@ -0,0 +1,66 @@ +const TicTacToe = require("../lib/tictactoe") + +let handler = async (m, { conn, usedPrefix, command, text }) => { + conn.game = conn.game ? conn.game : {} + if (Object.values(conn.game).find(room => room.id.startsWith('tictactoe') && [room.game.playerX, room.game.playerO].includes(m.sender))) throw 'Kamu masih didalam game' + let room = Object.values(conn.game).find(room => room.state === 'WAITING' && (text ? room.name === text : true)) + // m.reply('[WIP Feature]') + if (room) { + m.reply('Partner ditemukan!') + room.o = m.chat + room.game.playerO = m.sender + room.state = 'PLAYING' + let arr = room.game.render().map(v => { + return { + X: 'โŒ', + O: 'โญ•', + 1: '1๏ธโƒฃ', + 2: '2๏ธโƒฃ', + 3: '3๏ธโƒฃ', + 4: '4๏ธโƒฃ', + 5: '5๏ธโƒฃ', + 6: '6๏ธโƒฃ', + 7: '7๏ธโƒฃ', + 8: '8๏ธโƒฃ', + 9: '9๏ธโƒฃ', + }[v] + }) + let str = ` +Room ID: ${room.id} +${arr.slice(0, 3).join('')} +${arr.slice(3, 6).join('')} +${arr.slice(6).join('')} + +Menunggu @${room.game.currentTurn.split('@')[0]} +Ketik *nyerah* untuk nyerah +`.trim() + if (room.x !== room.o) m.reply(str, room.x, { + contextInfo: { + mentionedJid: conn.parseMention(str) + } + }) + m.reply(str, room.o, { + contextInfo: { + mentionedJid: conn.parseMention(str) + } + }) + } else { + room = { + id: 'tictactoe-' + (+new Date), + x: m.chat, + o: '', + game: new TicTacToe(m.sender, 'o'), + state: 'WAITING' + } + if (text) room.name = text + m.reply('Menunggu partner' + (text ? `mengetik command dibawah ini +${usedPrefix}${command} ${text}` : '')) + conn.game[room.id] = room + } +} + +handler.help = ['tictactoe', 'ttt'].map(v => v + ' [custom room name]') +handler.tags = ['game'] +handler.command = /^(tictactoe|t{3})$/ + +module.exports = handler diff --git a/plugins/game-truth.js b/plugins/game-truth.js new file mode 100644 index 0000000000000000000000000000000000000000..1c9cbc6d2d3860b1b903c67859d94822b35220f6 --- /dev/null +++ b/plugins/game-truth.js @@ -0,0 +1,13 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { conn }) => { + let img = 'https://i.ibb.co/305yt26/bf84f20635dedd5dde31e7e5b6983ae9.jpg' + let truth = await fetch(`https://api.botcahx.eu.org/api/random/truth?apikey=${btc}`).then(result => result.json()) + conn.sendFile(m.chat, img, 'truth.png', `*TRUTH*\n\nโ€œ${truth.result}โ€`, m) +} +handler.help = ['truth'] +handler.tags = ['fun'] +handler.command = /^(truth|kebenaran|kejujuran)$/i +handler.limit = true + +module.exports = handler diff --git a/plugins/game-ulartangga.js b/plugins/game-ulartangga.js new file mode 100644 index 0000000000000000000000000000000000000000..a1e736ee9b6cb545841d07bf511127be5affe41f --- /dev/null +++ b/plugins/game-ulartangga.js @@ -0,0 +1,181 @@ +/* TITENI NEK DIHAPUS +* BY NAAAZZZ +* NANDA +* JOIN SL COMMUNITY +*/ +const { drawBoard } = require('../lib/ular_tangga.js'); + +const getRandom = function (array) { + return array[Math.floor(Math.random() * array.length)] + } + + let data = [{ + map: "https://telegra.ph/file/46a0c38104f79cdbfe83f.jpg", + nazz: { 2:38, 7:14, 8:31, 15:26, 21:42, 28:84, 36:44, 51:67, 78:98, 71:91, 87:94, 16:6, 46:25, 49:11, 62:19, 64:60, 74:53, 89:68, 92:88, 95:75, 99:80 }, + name: "Classic", + stabil_x: 20, + stabil_y: 20 + }, +{ + map: "https://telegra.ph/file/46a0c38104f79cdbfe83f.jpg", + nazz: { 2:38, 7:14, 8:31, 15:26, 21:42, 28:84, 36:44, 51:67, 78:98, 71:91, 87:94, 16:6, 46:25, 49:11, 62:19, 64:60, 74:53, 89:68, 92:88, 95:75, 99:80 }, + name: "Classic 2", + stabil_x: 20, + stabil_y: 20 + }] + +let handler = async (m, { conn, text, command }) => { + conn.ulartangga = conn.ulartangga ? conn.ulartangga : {}; + const ut = conn.ulartangga; + const nazz_cmd = { + create: () => { + if(ut[m.chat]) throw "Masih ada sesi permainan di chat ini!"; + let anu = getRandom(data) + ut[m.chat] = { date: Date.now(), status: 'WAITING', host: m.sender, players: {}, map: anu.map, map_name: anu.name, ular_tangga: anu.nazz, stabil_x: anu.stabil_x, stabil_y: anu.stabil_y}; + ut[m.chat].players[m.sender] = { rank: 'HOST', langkah: 1 }; + return m.reply(`Sukses membuat room ular tangga dengan id "${m.chat}"`); + }, + join: () => { + if(!ut[m.chat]) throw "Tidak ada sesi permainan di chat ini!"; + if(ut[m.chat].players[m.sender]) return conn.sendMessage(m.chat, { text: `Anda sudah bergabung ke room @${ut[m.chat].host.split("@")[0]}`, mentions: [ut[m.chat].host] }, { quoted: m }) + if(Object.keys(ut[m.chat].players).length >= 4) throw "Player sudah melebihi limit!"; + if(ut[m.chat].status === 'PLAYING') throw "Game sedang berjalan, tidak dapat bergabung"; + ut[m.chat].players[m.sender] = { rank: 'MEMBER', langkah: 1 }; + return conn.sendMessage(m.chat, { text: `Sukses bergabung ke room @${ut[m.chat].host.split("@")[0]}`, mentions: [ut[m.chat].host] }, { quoted: m }) + }, + delete: () => { + if(!ut[m.chat]) throw "Tidak ada sesi permainan di chat ini!"; + if((ut[m.chat].host !== m.sender) && ((Date.now() - ut[m.chat].date) < 300000)) throw "Anda tidak dapat menghapus sesi permainan, karena anda bukanlah host, anda dapat menghapus session setelah "+timeToFixed(300000 - (Date.now() - ut[m.chat].date)) + if((ut[m.chat].host !== m.sender) && (ut[m.chat].status === 'PLAYING') && ((Date.now() - ut[m.chat].date) < 1000000)) throw "Anda tidak dapat menghapus sesi permainan, karena anda bukanlah host dan permainan sedang berlangsung, anda dapat menghapus session setelah "+timeToFixed(1000000 - (Date.now() - ut[m.chat].date)) + delete ut[m.chat]; + m.reply(`Sukses menghapus sesi permainan dengan id "${m.chat}"`) + }, + info: async() => { + if(!ut[m.chat]) throw "Tidak ada sesi permainan di chat ini!"; + return conn.sendMessage(m.chat, { text: `*Room Info*: +Host: @${ut[m.chat].host.split("@")[0]} +Status: ${ut[m.chat].status} +Map: ${ut[m.chat].map_name} +Players: ${Object.keys(ut[m.chat].players).length}/4 +${Object.keys(ut[m.chat].players).map(v => "- @"+v.split("@")[0]).join("\n") }`, mentions: Object.keys(ut[m.chat].players) }, { quoted: m }) + }, + start: () => { + if(!ut[m.chat]) throw "Tidak ada sesi permainan di chat ini!"; + if(ut[m.chat].status === 'PLAYING') throw "Pemainan sedang berjalan!" + if(ut[m.chat].host !== m.sender) throw "Hanya host yang dapat memulai permainan!"; + ut[m.chat].status = "PLAYING"; + m.reply("Permainan dimulai!"); + start(m, ut, conn) + }, + exit: () => { + if(!ut[m.chat]) throw "Tidak ada sesi permainan di chat ini!"; + if(!Object.keys(ut[m.chat].players).includes(m.sender)) throw "Anda tidak bergabung di pemainan!" + delete ut[m.chat].players[m.sender] + m.reply("Sukses keluar dari permainan") + if(!(Object.keys(ut[m.chat].players).length)) { +delete ut[m.chat] + return m.reply("Karena tidak ada players, maka sesi permainan akan di hapus") + } + if(ut[m.chat].status === 'PLAYING') { + const players = Object.keys(ut[m.chat].players) + conn.sendMessage(m.chat, { text: `Giliran @${players[ut[m.chat].turn %= players.length].split("@")[0]} untuk mengetik *kocok*`, mentions: [players[ut[m.chat].turn %= players.length]] }, { quoted: m }) + } + if(!Object.keys(ut[m.chat].players).includes(ut[m.chat].host)) { + let host = Object.keys(ut[m.chat].players)[0] + ut[m.chat].host = host + ut[m.chat].players[host].rank = 'HOST' + conn.sendMessage(m.chat, { text: `Di karenakan host keluar, kedudukan host akan di pindah ke @${host.split("@")[0]}`, mentions: [host] }, { quoted: m }) + } + } + }; + if(!text || !Object.keys(nazz_cmd).includes(text)) return conn.sendMessage(m.chat, { text: `Halo! Selamat datang di Ular Tangga, permainan klasik yang penuh petualangan dan tantangan! Di sini, pemain harus melewati rintangan dan naik tangga untuk mencapai angka 100 dan menjadi pemenang. Tapi hati-hati, ada ular licin yang bisa membuatmu turun kembali, dan tangga yang akan membantumu meloncat lebih cepat ke puncak! ๐Ÿ๐ŸŽฒ\n\nAyo, bergabunglah dalam petualangan seru di Ular Tangga dan rasakan keseruannya! ๐ŸŽฏ๐ŸŽฎ\n\nBerikut ini beberapa command ular tangga:\n${Object.keys(nazz_cmd).map(v => "โฌก "+v).join("\n")}\n\nContoh penggunaan: .ulartangga create`, contextInfo: { + externalAdReply: { + title: 'Ular Tangga', + body: 'Created by nazz', + thumbnailUrl: "https://telegra.ph/file/f5d7192eea4848b112d7b.jpg", + sourceUrl: 'youtube.com', + mediaType: 1, + renderLargerThumbnail: true + } + }}, { quoted: m }) + await nazz_cmd[text](); + } + +handler.command = /^(ulartangga|ut)$/i +handler.help = "ulartangga"; +handler.tags = "game"; +handler.owner = false + +handler.before = async function (m, { conn, text, command }) { + var body = (m.mtype === 'conversation') ? m.message.conversation : (m.mtype == 'imageMessage') ? m.message.imageMessage.caption : (m.mtype == 'videoMessage') ? m.message.videoMessage.caption : (m.mtype == 'extendedTextMessage') ? m.message.extendedTextMessage.text : (m.mtype == 'buttonsResponseMessage') ? m.message.buttonsResponseMessage.selectedButtonId : (m.mtype == 'listResponseMessage') ? m.message.listResponseMessage.singleSelectReply.selectedRowId : (m.mtype == 'templateButtonReplyMessage') ? m.message.templateButtonReplyMessage.selectedId : (m.mtype === 'messageContextInfo') ? (m.message.buttonsResponseMessage?.selectedButtonId || m.message.listResponseMessage?.singleSelectReply.selectedRowId || m.text) : '' + conn.ulartangga = conn.ulartangga ? conn.ulartangga : {}; + const ut = conn.ulartangga; + if(body.toLowerCase().split(" ")[0] !== "kocok" || !ut.hasOwnProperty(m.chat)) return + await kocok(m, ut, conn) + } + +module.exports = handler; + +async function kocok(m, ut, conn) { + if(!ut[m.chat]) return; + const players = Object.keys(ut[m.chat].players); + if(!players.includes(m.sender)) return; + const turns = (ut[m.chat].turn >= players.length) ? (ut[m.chat].turn %= players.length) : ut[m.chat].turn; + if(players.indexOf(m.sender) !== turns) throw "Bukan giliran anda!"; + let warna = ["Merah","Kuning","Hijau","Biru"][players.indexOf(m.sender)] + const dadu = Math.floor(Math.random() * 6 + 1) + let key = await conn.sendMessage(m.chat, { sticker: { url: `https://raw.githubusercontent.com/fgmods/fg-team/main/games/dados/${dadu}.webp` }, packname: "Created by Naaazzzzz", author: "Naaazzzzz" }, { quoted: m }) + ut[m.chat].turn += 1; + ut[m.chat].players[m.sender].langkah += dadu; + let langkah = ut[m.chat].players[m.sender].langkah - dadu + if(ut[m.chat].players[m.sender].langkah > 100) ut[m.chat].players[m.sender].langkah = 100 - (ut[m.chat].players[m.sender].langkah - 100); + let nazz = ut[m.chat].ular_tangga + let teks; + if(Object.keys(nazz).includes(ut[m.chat].players[m.sender].langkah.toString())) { + teks = ut[m.chat].players[m.sender].langkah > nazz[ut[m.chat].players[m.sender].langkah] ? "\nAnda termakan ular" : "\nAnda menaiki tangga"; + ut[m.chat].players[m.sender].langkah = nazz[ut[m.chat].players[m.sender].langkah]; + } + const user1 = (ut[m.chat].players[players[0]]?.langkah ?? null) || null; + const user2 = (ut[m.chat].players[players[1]]?.langkah ?? null) || null; + const user3 = (ut[m.chat].players[players[2]]?.langkah ?? null) || null; + const user4 = (ut[m.chat].players[players[3]]?.langkah ?? null) || null; + if(ut[m.chat].players[m.sender].langkah === 100) { + global.db.data.users[m.sender].limit += 5 + global.db.data.users[m.sender].exp += 1000 + global.db.data.users[m.sender].coin += 5 + await conn.sendMessage(m.chat, { image: await drawBoard(ut[m.chat].map, user1, user2, user3, user4, ut[m.chat].stabil_x, ut[m.chat].stabil_y), caption: `@${m.sender.split("@")[0]} Menang\n+1000 exp\n+5 limit\n+5 Koin`, mentions: [m.sender] }, { quoted: key }); + delete ut[m.chat]; + return + } + return await conn.sendMessage(m.chat, { image: await drawBoard(ut[m.chat].map, user1, user2, user3, user4, ut[m.chat].stabil_x, ut[m.chat].stabil_y), caption: `${warna} *${langkah}* --> *${ut[m.chat].players[m.sender].langkah}*${teks ? teks:""}\nMenunggu @${players[ut[m.chat].turn %= players.length].split("@")[0]} mengetik *kocok*`, mentions: [players[ut[m.chat].turn %= players.length]]}, { quoted: key }); + } + +async function start(m, ut, conn) { + const players = Object.keys(ut[m.chat].players); + if(!players.includes(m.sender)) return; + let nazz_players = `Merah: @${players[0].split("@")[0]}`; + if(players[1]) { + nazz_players += `\nKuning: @${players[1].split("@")[0]}` + } + if(players[2]) { + nazz_players += `\nHijau: @${players[2].split("@")[0]}`; + } + if(players[3]) { + nazz_players += `\nBiru: @${players[3].split("@")[0]}`; + } + const teks = `*ULAR TANGGA* + +${nazz_players} + +Menunggu @${players[0].split("@")[0]} mengetik *kocok*`; + conn.sendMessage(m.chat, { image: await drawBoard(ut[m.chat].map, 1, null, null, null, ut[m.chat].stabil_x, ut[m.chat].stabil_y), caption: teks, mentions: conn.parseMention(teks) }, { quoted: m }) + ut[m.chat].turn = 0 +} + +function timeToFixed(milliseconds) { + var seconds = Math.floor(milliseconds / 1000); + var hours = Math.floor(seconds / 3600); + var minutes = Math.floor((seconds % 3600) / 60); + var remainingSeconds = seconds % 60; + return hours + ' Jam ' + minutes + ' Menit ' + remainingSeconds + ' Detik'; + } \ No newline at end of file diff --git a/plugins/game-wwgc.js b/plugins/game-wwgc.js new file mode 100644 index 0000000000000000000000000000000000000000..97a541a4aedd5b6a3973727588ae106152b8d54d --- /dev/null +++ b/plugins/game-wwgc.js @@ -0,0 +1,399 @@ +const jimp = require('jimp') + +const resize = async (image, width, height) => { + const read = await jimp.read(image); + const data = await read.resize(width, height).getBufferAsync(jimp.MIME_JPEG); + return data; +}; + +const { + emoji_role, + sesi, + playerOnGame, + playerOnRoom, + playerExit, + dataPlayer, + dataPlayerById, + getPlayerById, + getPlayerById2, + killWerewolf, + killww, + dreamySeer, + sorcerer, + protectGuardian, + roleShuffle, + roleChanger, + roleAmount, + roleGenerator, + addTimer, + startGame, + playerHidup, + playerMati, + vote, + voteResult, + clearAllVote, + getWinner, + win, + pagi, + malam, + skill, + voteStart, + voteDone, + voting, + run, + run_vote, + run_malam, + run_pagi +} = require('../lib/werewolf') + +let thumb = + "https://user-images.githubusercontent.com/72728486/235316834-f9f84ba0-8df3-4444-81d8-db5270995e6d.jpg"; + +let handler = async (m, { + conn, + command, + usedPrefix, + args +}) => { + const { + sender, + chat + } = m; + conn.werewolf = conn.werewolf ? conn.werewolf : {}; + const ww = conn.werewolf ? conn.werewolf : {}; + const data = ww[chat]; + const value = args[0]; + const target = args[1]; + + // [ Membuat Room ] + if (value === "create") { + if (chat in ww) return m.reply("Group masih dalam sesi permainan"); + if (playerOnGame(sender, ww) === true) + return m.reply("Kamu masih dalam sesi game"); + ww[chat] = { + room: chat, + owner: sender, + status: false, + iswin: null, + cooldown: null, + day: 0, + time: "malem", + player: [], + dead: [], + voting: false, + seer: false, + guardian: [], + }; + await m.reply("Room berhasil dibuat, ketik *.ww join* untuk bergabung"); + + } else if (value === "join") { + if (!ww[chat]) return m.reply("Belum ada sesi permainan"); + if (ww[chat].status === true) + return m.reply("Sesi permainan sudah dimulai"); + if (ww[chat].player.length > 16) + return m.reply("Maaf jumlah player telah penuh"); + if (playerOnRoom(sender, chat, ww) === true) + return m.reply("Kamu sudah join dalam room ini"); + if (playerOnGame(sender, ww) === true) + return m.reply("Kamu masih dalam sesi game"); + let data = { + id: sender, + number: ww[chat].player.length + 1, + sesi: chat, + status: false, + role: false, + effect: [], + vote: 0, + isdead: false, + isvote: false, + }; + ww[chat].player.push(data); + let player = []; + let text = `\n*โŒ‚ W E R E W O L F - P L A Y E R*\n\n`; + for (let i = 0; i < ww[chat].player.length; i++) { + text += `${ww[chat].player[i].number}) @${ww[chat].player[i].id.replace( + "@s.whatsapp.net", + "" + )}\n`; + player.push(ww[chat].player[i].id); + } + text += "\nJumlah player minimal adalah 5 dan maximal 15"; + conn.sendMessage( + m.chat, { + text: text.trim(), + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb, 300, 175), + sourceUrl: "", + mediaUrl: thumb, + }, + mentionedJid: player, + }, + }, { + quoted: m + } + ); + + // [ Game Play ] + } else if (value === "start") { + if (!ww[chat]) return m.reply("Belum ada sesi permainan"); + if (ww[chat].player.length === 0) + return m.reply("Room belum memiliki player"); + if (ww[chat].player.length < 5) + return m.reply("Maaf jumlah player belum memenuhi syarat"); + if (playerOnRoom(sender, chat, ww) === false) + return m.reply("Kamu belum join dalam room ini"); + if (ww[chat].cooldown > 0) { + if (ww[chat].time === "voting") { + clearAllVote(chat, ww); + addTimer(chat, ww); + return await run_vote(conn, chat, ww); + } else if (ww[chat].time === "malem") { + clearAllVote(chat, ww); + addTimer(chat, ww); + return await run_malam(conn, chat, ww); + } else if (ww[chat].time === "pagi") { + clearAllVote(chat, ww); + addTimer(chat, ww); + return await run_pagi(conn, chat, ww); + } + } + if (ww[chat].status === true) + return m.reply("Sesi permainan telah dimulai"); + if (ww[chat].owner !== sender) + return m.reply( + `Hanya @${ww[chat].owner.split("@")[0]} yang dapat memulai permainan`, { + withTag: true + } + ); + let list1 = ""; + let list2 = ""; + let player = []; + roleGenerator(chat, ww); + addTimer(chat, ww); + startGame(chat, ww); + for (let i = 0; i < ww[chat].player.length; i++) { + list1 += `(${ww[chat].player[i].number}) @${ww[chat].player[ + i + ].id.replace("@s.whatsapp.net", "")}\n`; + player.push(ww[chat].player[i].id); + } + for (let i = 0; i < ww[chat].player.length; i++) { + list2 += `(${ww[chat].player[i].number}) @${ww[chat].player[ + i + ].id.replace("@s.whatsapp.net", "")} ${ + ww[chat].player[i].role === "werewolf" || + ww[chat].player[i].role === "sorcerer" + ? `[${ww[chat].player[i].role}]` + : "" + }\n`; + player.push(ww[chat].player[i].id); + } + for (let i = 0; i < ww[chat].player.length; i++) { + // [ Werewolf ] + if (ww[chat].player[i].role === "werewolf") { + if (ww[chat].player[i].isdead != true) { + var text = `Hai ${conn.getName( + ww[chat].player[i].id + )}, Kamu telah dipilih untuk memerankan *Werewolf* ${emoji_role( + "werewolf" + )} pada permainan kali ini, silahkan pilih salah satu player yang ingin kamu makan pada malam hari ini\n*LIST PLAYER*:\n${list2}\n\nKetik *.wwpc kill nomor* untuk membunuh player`; + await conn.sendMessage(ww[chat].player[i].id, { + text: text, + mentions: player, + }); + } + + // [ villager ] + } else if (ww[chat].player[i].role === "warga") { + if (ww[chat].player[i].isdead != true) { + let text = `*โŒ‚ W E R E W O L F - G A M E*\n\nHai ${conn.getName( + ww[chat].player[i].id + )} Peran kamu adalah *Warga Desa* ${emoji_role( + "warga" + )}, tetap waspada, mungkin *Werewolf* akan memakanmu malam ini, silakan masuk kerumah masing masing.\n*LIST PLAYER*:\n${list1}`; + await conn.sendMessage(ww[chat].player[i].id, { + text: text, + mentions: player, + }); + } + + // [ Penerawangan ] + } else if (ww[chat].player[i].role === "seer") { + if (ww[chat].player[i].isdead != true) { + let text = `Hai ${conn.getName( + ww[chat].player[i].id + )} Kamu telah terpilih untuk menjadi *Penerawang* ${emoji_role( + "seer" + )}. Dengan sihir yang kamu punya, kamu bisa mengetahui peran pemain pilihanmu.\n*LIST PLAYER*:\n${list1}\n\nKetik *.wwpc dreamy nomor* untuk melihat role player`; + + await conn.sendMessage(ww[chat].player[i].id, { + text: text, + mentions: player, + }); + } + + // [ Guardian ] + } else if (ww[chat].player[i].role === "guardian") { + if (ww[chat].player[i].isdead != true) { + let text = `Hai ${conn.getName( + ww[chat].player[i].id + )} Kamu terpilih untuk memerankan *Malaikat Pelindung* ${emoji_role( + "guardian" + )}, dengan kekuatan yang kamu miliki, kamu bisa melindungi para warga, silahkan pilih salah 1 player yang ingin kamu lindungi\n*LIST PLAYER*:\n${list1}\n\nKetik *.wwpc deff nomor* untuk melindungi player`; + + await conn.sendMessage(ww[chat].player[i].id, { + text: text, + mentions: player, + }); + } + + // [ Sorcerer ] + } else if (ww[chat].player[i].role === "sorcerer") { + if (ww[chat].player[i].isdead != true) { + let text = `Hai ${conn.getName( + ww[chat].player[i].id + )} Kamu terpilih sebagai Penyihir ${emoji_role( + "sorcerer" + )}, dengan kekuasaan yang kamu punya, kamu bisa membuka identitas para player, silakan pilih 1 orang yang ingin kamu buka identitasnya\n*LIST PLAYER*:\n${list2}\n\nKetik *.wwpc sorcerer nomor* untuk melihat role player`; + + await conn.sendMessage(ww[chat].player[i].id, { + text: text, + mentions: player, + }); + } + } + } + await conn.sendMessage(m.chat, { + text: "*โŒ‚ W E R E W O L F - G A M E*\n\nGame telah dimulai, para player akan memerankan perannya masing masing, silahkan cek chat pribadi untuk melihat role kalian. Berhati-hatilah para warga, mungkin malam ini adalah malah terakhir untukmu", + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb, 300, 175), + sourceUrl: "", + mediaUrl: thumb, + }, + mentionedJid: player, + }, + }); + await run(conn, chat, ww); + } else if (value === "vote") { + if (!ww[chat]) return m.reply("Belum ada sesi permainan"); + if (ww[chat].status === false) + return m.reply("Sesi permainan belum dimulai"); + if (ww[chat].time !== "voting") + return m.reply("Sesi voting belum dimulai"); + if (playerOnRoom(sender, chat, ww) === false) + return m.reply("Kamu bukan player"); + if (dataPlayer(sender, ww).isdead === true) + return m.reply("Kamu sudah mati"); + if (!target || target.length < 1) + return m.reply("Masukan nomor player"); + if (isNaN(target)) return m.reply("Gunakan hanya nomor"); + if (dataPlayer(sender, ww).isvote === true) + return m.reply("Kamu sudah melakukan voting"); + let b = getPlayerById(chat, sender, parseInt(target), ww); + if (b.db.isdead === true) + return m.reply(`Player ${target} sudah mati.`); + if (ww[chat].player.length < parseInt(target)) + return m.reply("Invalid"); + if (getPlayerById(chat, sender, parseInt(target), ww) === false) + return m.reply("Player tidak terdaftar!"); + vote(chat, parseInt(target), sender, ww); + return m.reply("โœ… Vote"); + } else if (value == "exit") { + if (!ww[chat]) return m.reply("Tidak ada sesi permainan"); + if (playerOnRoom(sender, chat, ww) === false) + return m.reply("Kamu tidak dalam sesi permainan"); + if (ww[chat].status === true) + return m.reply("Permainan sudah dimulai, kamu tidak bisa keluar"); + m.reply(`@${sender.split("@")[0]} Keluar dari permainan`, { + withTag: true, + }); + playerExit(chat, sender, ww); + } else if (value === "delete") { + if (!ww[chat]) return m.reply("Tidak ada sesi permainan"); + if (ww[chat].owner !== sender) + return m.reply( + `Hanya @${ + ww[chat].owner.split("@")[0] + } yang dapat menghapus sesi permainan ini` + ); + m.reply("Sesi permainan berhasil dihapus").then(() => { + delete ww[chat]; + }); + } else if (value === "player") { + if (!ww[chat]) return m.reply("Tidak ada sesi permainan"); + if (playerOnRoom(sender, chat, ww) === false) + return m.reply("Kamu tidak dalam sesi permainan"); + if (ww[chat].player.length === 0) + return m.reply("Sesi permainan belum memiliki player"); + let player = []; + let text = "\n*โŒ‚ W E R E W O L F - G A M E*\n\nLIST PLAYER:\n"; + for (let i = 0; i < ww[chat].player.length; i++) { + text += `(${ww[chat].player[i].number}) @${ww[chat].player[i].id.replace( + "@s.whatsapp.net", + "" + )} ${ + ww[chat].player[i].isdead === true + ? `โ˜ ๏ธ ${ww[chat].player[i].role}` + : "" + }\n`; + player.push(ww[chat].player[i].id); + } + conn.sendMessage( + m.chat, { + text: text, + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb, 300, 175), + sourceUrl: "", + mediaUrl: thumb, + }, + mentionedJid: player, + }, + }, { + quoted: m + } + ); + } else { + let text = `\n*โŒ‚ W E R E W O L F - G A M E*\n\nPermainan Sosial Yang Berlangsung Dalam Beberapa Putaran/ronde. Para Pemain Dituntut Untuk Mencari Seorang Penjahat Yang Ada Dipermainan. Para Pemain Diberi Waktu, Peran, Serta Kemampuannya Masing-masing Untuk Bermain Permainan Ini\n\n*โŒ‚ C O M M A N D*\n`; + text += ` โ€ข ww create\n`; + text += ` โ€ข ww join\n`; + text += ` โ€ข ww start\n`; + text += ` โ€ข ww exit\n`; + text += ` โ€ข ww delete\n`; + text += ` โ€ข ww player\n`; + text += `\nPermainan ini dapat dimainkan oleh 5 sampai 15 orang.`; + conn.sendMessage( + m.chat, { + text: text.trim(), + contextInfo: { + externalAdReply: { + title: "W E R E W O L F", + mediaType: 1, + renderLargerThumbnail: true, + thumbnail: await resize(thumb, 300, 175), + sourceUrl: "", + mediaUrl: thumb, + }, + }, + }, { + quoted: m + } + ); + } +} +handler.help = ['werewolf']; +handler.tags = ['game']; +handler.command = ['ww','werewolf']; +handler.group = true; +module.exports = handler diff --git a/plugins/game-wwpc.js b/plugins/game-wwpc.js new file mode 100644 index 0000000000000000000000000000000000000000..58a2919456ef5a7921069e90d7fd3f8b3be1569e --- /dev/null +++ b/plugins/game-wwpc.js @@ -0,0 +1,104 @@ +const { + emoji_role, + sesi, + playerOnGame, + playerOnRoom, + playerExit, + dataPlayer, + dataPlayerById, + getPlayerById, + getPlayerById2, + killWerewolf, + killww, + dreamySeer, + sorcerer, + protectGuardian, + roleShuffle, + roleChanger, + roleAmount, + roleGenerator, + addTimer, + startGame, + playerHidup, + playerMati, + vote, + voteResult, + clearAllVote, + getWinner, + win, + pagi, + malam, + skill, + voteStart, + voteDone, + voting, + run, + run_vote, + run_malam, + run_pagi +} = require('../lib/werewolf.js') + +let handler = async (m, { conn, command, usedPrefix, args }) => { + let { sender, chat } = m + conn.werewolf = conn.werewolf ? conn.werewolf : {} + let ww = conn.werewolf + let value = (args[0] || '').toLowerCase() + let target = args[1] + + if (playerOnGame(sender, ww) === false) + return m.reply("Kamu tidak dalam sesi game") + if (dataPlayer(sender, ww).status === true) + return m.reply("Skill telah digunakan, skill hanya bisa digunakan sekali setiap malam") + if (dataPlayer(sender, ww).isdead === true) + return m.reply("Kamu sudah mati") + if (!target || target.length < 1 || target.split('').length > 2) + return m.reply(`Masukan nomor player \nContoh : \n${usedPrefix + command} kill 1`) + if (isNaN(target)) + return m.reply("Gunakan hanya nomor") + let byId = getPlayerById2(sender, parseInt(target), ww) + if (byId.db.isdead === true) + return m.reply("Player sudah mati") + if (byId.db.id === sender) + return m.reply("Tidak bisa menggunakan skill untuk diri sendiri") + if (byId === false) + return m.reply("Player tidak terdaftar") + if (value === "kill") { + if (dataPlayer(sender, ww).role !== "werewolf") + return m.reply("Peran ini bukan untuk kamu") + + if (byId.db.role === "sorcerer") + return m.reply("Tidak bisa menggunakan skill untuk teman") + + return m.reply("Berhasil membunuh player " + parseInt(target)).then(() => { + dataPlayer(sender, ww).status = true + killWerewolf(sender, parseInt(target), ww) + }) + } else if (value === "dreamy") { + if (dataPlayer(sender, ww).role !== "seer") + return m.reply("Peran ini bukan untuk kamu") + + let dreamy = dreamySeer(sender, parseInt(target), ww) + return m.reply(`Berhasil membuka identitas player ${target} adalah ${dreamy}`).then(() => { + dataPlayer(sender, ww).status = true + }) + } else if (value === "deff") { + if (dataPlayer(sender, ww).role !== "guardian") + return m.reply("Peran ini bukan untuk kamu") + + return m.reply(`Berhasil melindungi player ${target}`).then(() => { + protectGuardian(sender, parseInt(target), ww) + dataPlayer(sender, ww).status = true + }) + } else if (value === "sorcerer") { + if (dataPlayer(sender, ww).role !== "sorcerer") + return m.reply("Peran ini bukan untuk kamu") + + let sorker = sorcerer(sender, parseInt(target), ww) + return m.reply(`Berhasil membuka identitas player ${target} adalah ${sorker}`).then(() => { + dataPlayer(sender, ww).status = true + }) + } +} +handler.command = /^((ww|werewolf)pc)$/i +handler.private = true +module.exports = handler diff --git a/plugins/group-acc.js b/plugins/group-acc.js new file mode 100644 index 0000000000000000000000000000000000000000..dc1e66baa314c63f52478f9ba3436967924bda04 --- /dev/null +++ b/plugins/group-acc.js @@ -0,0 +1,58 @@ +// Thanks to Kasan + +let handler = async (m, { conn, args }) => { + const groupId = m.chat; + const [subCommand, options] = args; + const joinRequestList = await conn.groupRequestParticipantsList(groupId); + + const formatDate = (timestamp) => new Intl.DateTimeFormat('id-ID', { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }).format(new Date(timestamp * 1000)); + const reply = (text) => conn.reply(m.chat, text, m); + + switch (subCommand) { + case "list": + const formattedList = joinRequestList.length > 0 + ? joinRequestList.map((request, i) => `*${i + 1}.*\nโ€ข Nomor: ${request.jid.split('@')[0]}\nโ€ข Metode Permintaan: ${request.request_method}\nโ€ข Waktu Permintaan: ${formatDate(request.request_time)}\n\n`).join('') + : "Tidak ada permintaan bergabung yang tertunda."; + reply(`*Daftar Permintaan Bergabung:*\n\n${formattedList}`); + break; + + case "reject": + case "approve": + if (options === "all") { + for (const request of joinRequestList) { + await conn.groupRequestParticipantsUpdate(groupId, [request.jid], subCommand); + console.log(`Meng-${subCommand} participant dengan JID: ${request.jid}`); + } + reply(`*${subCommand === 'approve' ? 'Menyetujui' : 'Menolak'} semua permintaan bergabung.*`); + } else { + const actions = options.split('|').map(action => action.trim()); + const participants = actions.map(action => joinRequestList[parseInt(action) - 1]).filter(request => request); + if (participants.length > 0) { + let formattedResponse = ''; + for (const request of participants) { + const response = await conn.groupRequestParticipantsUpdate(groupId, [request.jid], subCommand); + const status = response[0].status === 'success' ? 'Berhasil' : 'Gagal'; + formattedResponse += `*${participants.indexOf(request) + 1}.*\nโ€ข Status: ${status}\nโ€ข Nomor: ${request.jid.split('@')[0]}\n\n`; + console.log(`Meng-${subCommand} participant dengan JID: ${request.jid}`); + } + reply(`*${subCommand === 'approve' ? 'Menyetujui' : 'Menolak'} Permintaan Bergabung:*\n\n${formattedResponse}`); + } else { + reply("Tidak ada anggota yang cocok untuk reject/approve."); + } + } + break; + + default: + reply("Perintah tidak valid. Gunakan *acc list*, *acc approve [number]*, *acc reject [number]*, *acc reject [JID]*, *acc reject/approve all* untuk menolak/menyetujui semua permintaan bergabung."); + } +} + +handler.help = ['acc *option*'] +handler.tags = ['group'] +handler.command = /^(acc)$/i +handler.group = true +handler.admin = true +handler.botAdmin = true +handler.fail = null + +module.exports = handler \ No newline at end of file diff --git a/plugins/group-add.js b/plugins/group-add.js new file mode 100644 index 0000000000000000000000000000000000000000..4e03ca34a4fddbcd784240adac29a49a9ca98c1f --- /dev/null +++ b/plugins/group-add.js @@ -0,0 +1,64 @@ +const { + getBinaryNodeChild, + getBinaryNodeChildren +} = require('@adiwajshing/baileys') + +const fetch = require('node-fetch') + +let handler = async (m, { conn, text, participants, usedPrefix, command }) => { + if (!text) throw `_Masukan nomor!_\nContoh:\n\n${usedPrefix + command} ${global.owner[0]}` + m.reply('_Sedang di proses..._') + let _participants = participants.map(user => user.id) + let users = (await Promise.all( + text.split(',') + .map(v => v.replace(/[^0-9]/g, '')) + .filter(v => v.length > 4 && v.length < 20 && !_participants.includes(v + '@s.whatsapp.net')) + .map(async v => [ + v, + await conn.onWhatsApp(v + '@s.whatsapp.net') + ]) + )).filter(v => v[1][0]?.exists).map(v => v[0] + '@c.us') + + const response = await conn.query({ + tag: 'iq', + attrs: { + type: 'set', + xmlns: 'w:g2', + to: m.chat, + }, + content: users.map(jid => ({ + tag: 'add', + attrs: {}, + content: [{ tag: 'participant', attrs: { jid } }] + })) + }) + const pp = await conn.profilePictureUrl(m.chat, 'image').catch(_ => null) + const jpegThumbnail = pp ? await (await fetch(pp)).buffer() : Buffer.alloc(0) + const add = getBinaryNodeChild(response, 'add') + const participant = getBinaryNodeChildren(response, 'add') + let anu = participant[0].content.filter(v => v) + if (anu[0].attrs.error == 408) conn.sendButton(m.chat, `Tidak dapat menambahkan @${anu[0].attrs.jid.split('@')[0]}!\nKabarnya si @${anu[0].attrs.jid.split('@')[0]} baru keluar dari grup ini :'v`, wm, 'link', usedPrefix + `link`, m) + for (const user of participant[0].content.filter(item => item.attrs.error == 403)) { + const jid = user.attrs.jid + const content = getBinaryNodeChild(user, 'add_request') + const invite_code = content.attrs.code + const invite_code_exp = content.attrs.expiration + const txt = `Mengundang @${jid.split('@')[0]} menggunakan invite...` + await m.reply(txt, null, { + mentions: await conn.parseMention(txt) + }) + //await conn.delay(100) + //conn.sendButton(m.chat, txt, wm, 'menu', '.m', m) + await conn.sendGroupV4Invite(m.chat, jid, invite_code, invite_code_exp, await conn.getName(m.chat), 'Undangan untuk bergabung ke grup WhatsApp saya', jpegThumbnail) + } +} +handler.help = ['add', '+'].map(v => v + ' @user') +handler.tags = ['group'] +handler.command = /^(add|\+)$/i + +handler.admin = true +handler.group = true +handler.botAdmin = true +handler.fail = null + +module.exports = handler diff --git a/plugins/group-ava.js b/plugins/group-ava.js new file mode 100644 index 0000000000000000000000000000000000000000..d2bef01ce802133c3d27462ff9f83e829ababd3a --- /dev/null +++ b/plugins/group-ava.js @@ -0,0 +1,20 @@ +let fetch = require("node-fetch") +let handler = async(m, { conn, command }) => { + try { + let who + if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted.sender + else who = m.quoted.sender ? m.quoted.sender : m.sender + let pp = await conn.profilePictureUrl(who, 'image').catch((_) => "https://telegra.ph/file/24fa902ead26340f3df2c.png") + conn.sendFile(m.chat, pp, "nih bang.png", 'Selesai....', m, {jpegThumbnail: await(await fetch(pp)).buffer()}) + } catch { + let sender = m.sender + let pp = await conn.profilePictureUrl(sender, 'image').catch((_) => "https://telegra.ph/file/24fa902ead26340f3df2c.png") + conn.sendFile(m.chat, pp, 'pp.png', wm, m, {jpegThumbnail: await(await fetch(pp)).buffer()}) + } +} +handler.help = ['ava <@tag/reply>'] +handler.tags = ['group'] +handler.command = /^(avatar|ava)$/i +handler.group = true +handler.limit = true +module.exports = handler diff --git a/plugins/group-delete.js b/plugins/group-delete.js new file mode 100644 index 0000000000000000000000000000000000000000..fa097f20534501ba459a148def0b7f27c929c3f3 --- /dev/null +++ b/plugins/group-delete.js @@ -0,0 +1,26 @@ +let handler = async (m, { conn, usedPrefix, command, isAdmin }) => { + if (!m.quoted) + throw `*โ€ข Example :* ${usedPrefix + command} *[reply Message]*`; + try { + if (isAdmin) { + let delet = m.message.extendedTextMessage.contextInfo.participant; + let bang = m.message.extendedTextMessage.contextInfo.stanzaId; + return conn.sendMessage(m.chat, { + delete: { + remoteJid: m.chat, + fromMe: false, + id: bang, + participant: delet, + }, + }); + } else return m.quoted.delete(); + } catch (e) { + throw eror; + } +}; +handler.help = ["delete", "del"].map((a) => a + " *[reply message]*"); +handler.tags = ["group"]; +handler.command = ["del", "delete"]; +handler.group = true; + +module.exports = handler; diff --git a/plugins/group-delwarn.js b/plugins/group-delwarn.js new file mode 100644 index 0000000000000000000000000000000000000000..07f81a00f7a6d56553fd611be32a4677f83a747b --- /dev/null +++ b/plugins/group-delwarn.js @@ -0,0 +1,27 @@ +let handler = async (m, { conn, args, groupMetadata}) => { + let who + if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : false + else who = m.chat + if (!who) throw `โœณ๏ธ Memberi label atau menyebut seseorang` + if (!(who in global.db.data.users)) throw `โœณ๏ธ Pengguna hilang dari database saya` + let warn = global.db.data.users[who].warn + if (warn > 0) { + global.db.data.users[who].warn -= 1 + m.reply(`โš ๏ธ *PERINGATAN* + +โ–ข Memperingatkan: *-1* +โ–ข Total Memperingatkan: *${warn - 1}*`) + m.reply(`โœณ๏ธ Seorang admin mengurangi peringatannya, sekarang Anda memiliki *${warn - 1}*`, who) + } else if (warn == 0) { + m.reply('โœณ๏ธ Pengguna tidak memiliki peringatan') + } + +} +handler.help = ['delwarn @user'] +handler.tags = ['group'] +handler.command = ['delwarn', 'unwarn'] +handler.group = true +handler.admin = true +handler.botAdmin = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/group-demote.js b/plugins/group-demote.js new file mode 100644 index 0000000000000000000000000000000000000000..8d5b09e02efeb74d5136d3b6ddc4ee79457183a0 --- /dev/null +++ b/plugins/group-demote.js @@ -0,0 +1,31 @@ +let handler = async (m, { teks, conn, isOwner, isAdmin, args }) => { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + let ownerGroup = m.chat.split`-`[0] + "@s.whatsapp.net"; + if(m.quoted){ +if(m.quoted.sender === ownerGroup || m.quoted.sender === conn.user.jid) return; +let usr = m.quoted.sender; +let nenen = await conn.groupParticipantsUpdate(m.chat, [usr], "demote"); return; +if (nenen) m.reply(`sukses demote @${user.split('@')[0]}!`) +} + if (!m.mentionedJid[0]) throw `tag yang mau diturunkan jabatannya`; + let users = m.mentionedJid.filter( + (u) => !(u == ownerGroup || u.includes(conn.user.jid)) + ); + for (let user of users) + if (user.endsWith("@s.whatsapp.net")) + await conn.groupParticipantsUpdate(m.chat, [user], "demote"); +}; + +handler.help = ['demote @user'] +handler.tags = ['group', 'owner'] +handler.command = /^(demo?te|member|\โ†“)$/i + +handler.group = true +handler.botAdmin = true +handler.admin = true +handler.fail = null + +module.exports = handler diff --git a/plugins/group-hidetag.js b/plugins/group-hidetag.js new file mode 100644 index 0000000000000000000000000000000000000000..9e12b048939a3bfe6c4d32d7af602955aff5701e --- /dev/null +++ b/plugins/group-hidetag.js @@ -0,0 +1,25 @@ +let handler = async(m, { conn, text, participants }) => { +const fkontak = { + "key": { + "participants":"0@s.whatsapp.net", + "remoteJid": "status@broadcast", + "fromMe": false, + "id": "Halo" + }, + "message": { + "contactMessage": { + "vcard": `BEGIN:VCARD\nVERSION:3.0\nN:Sy;Bot;;;\nFN:y\nitem1.TEL;waid=${m.sender.split('@')[0]}:${m.sender.split('@')[0]}\nitem1.X-ABLabel:Ponsel\nEND:VCARD` + } + }, + "participant": "0@s.whatsapp.net" +} + conn.sendMessage(m.chat, { text: text, mentions: participants.map(a => a.id) }, {quoted:m}) +} +handler.help = ['hidetag <pesan>'] +handler.tags = ['group'] +handler.command = /^(hidetag)$/i + +handler.group = true +handler.admin = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/group-info.js b/plugins/group-info.js new file mode 100644 index 0000000000000000000000000000000000000000..7cfba6a39aa65fe0e675b7cb71dc599bb7030f4b --- /dev/null +++ b/plugins/group-info.js @@ -0,0 +1,74 @@ +let handler = async (m, { conn, participants, groupMetadata, text }) => { + + const getGroupAdmins = (participants) => { + admins = [] + for (let i of participants) { + i.isAdmin ? admins.push(i.jid) : '' + } + return admins + } + + let pp = 'https://telegra.ph/file/3c1ea5866a11088685413.jpg' + try { + pp = await conn.getProfilePicture(m.chat) + } catch (e) { + } finally { + let { isBanned, welcome, detect, sWelcome, sBye, sPromote, sDemote, antiLink, expired, descUpdate, stiker } = global.db.data.chats[m.chat] + const groupAdmins = getGroupAdmins(participants) + let listAdmin = groupAdmins.map((v, i) => `${i + 1}. @${v.split`@`[0]}`).join('\n') + + if (text) return m.reply(msToDate(expired - new Date() * 1)) + + let caption = `*Informasi Grup*\n +*ID:* +${groupMetadata.id} +*Nama:* +${groupMetadata.subject} +*Deskripsi:* +${groupMetadata.desc} +*Total Anggota:* +${participants.length} Anggota +*Pembuat Grup:* +@${m.chat.split`-`[0]} +*Admin Grup:* +${listAdmin} +*Pengaturan Bot:* +${antiLink ? 'โœ…' : 'โŒ'} Anti Link +${global.db.data.chats[m.chat].delete ? 'โŒ' : 'โœ…'} Anti Delete +${isBanned ? 'โœ…' : 'โŒ'} Banned +${descUpdate ? 'โœ…' : 'โŒ'} Deskprisi +${detect ? 'โœ…' : 'โŒ'} Detect +${stiker ? 'โœ…' : 'โŒ'} Stiker +${welcome ? 'โœ…' : 'โŒ'} Welcome +*Pengaturan Pesan Bot:* +Welcome: ${sWelcome} +Bye: ${sBye} +Promote: ${sPromote} +Demote: ${sDemote} +*Tersisa:* +${msToDate(expired - new Date() * 1)} +`.trim() + let mentionedJid = groupAdmins.concat([`${m.chat.split`-`[0]}@s.whatsapp.net`]) + conn.sendFile(m.key.remoteJid, pp, 'pp.jpg', caption, m, 0, { contextInfo: { mentionedJid } }) + } +} +handler.help = ['infogrup'] +handler.tags = ['group'] +handler.command = /^(gro?upinfo|info(gro?up|gc))$/i + +handler.group = true + +module.exports = handler + +function msToDate(ms) { + temp = ms + days = Math.floor(ms / (24 * 60 * 60 * 1000)); + daysms = ms % (24 * 60 * 60 * 1000); + hours = Math.floor((daysms) / (60 * 60 * 1000)); + hoursms = ms % (60 * 60 * 1000); + minutes = Math.floor((hoursms) / (60 * 1000)); + minutesms = ms % (60 * 1000); + sec = Math.floor((minutesms) / (1000)); + return days + " hari " + hours + " jam " + minutes + " menit"; + // +minutes+":"+sec; +} diff --git a/plugins/group-kick.js b/plugins/group-kick.js new file mode 100644 index 0000000000000000000000000000000000000000..f13513633b2ba0139f3787c23411f8381329de69 --- /dev/null +++ b/plugins/group-kick.js @@ -0,0 +1,28 @@ +let handler = async (m, { teks, conn, isOwner, isAdmin, args }) => { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + let ownerGroup = m.chat.split`-`[0] + "@s.whatsapp.net"; + if(m.quoted){ +if(m.quoted.sender === ownerGroup || m.quoted.sender === conn.user.jid) return; +let usr = m.quoted.sender; +await conn.groupParticipantsUpdate(m.chat, [usr], "remove"); return; +} + if (!m.mentionedJid[0]) throw `tag yang mau dikick`; + let users = m.mentionedJid.filter( + (u) => !(u == ownerGroup || u.includes(conn.user.jid)) + ); + for (let user of users) + if (user.endsWith("@s.whatsapp.net")) + await conn.groupParticipantsUpdate(m.chat, [user], "remove"); +}; + +handler.help = ['kick @user'] +handler.tags = ['group'] +handler.command = /^(kic?k|remove|tendang|\-)$/i + +handler.group = true +handler.botAdmin = true + +module.exports = handler diff --git a/plugins/group-leave.js b/plugins/group-leave.js new file mode 100644 index 0000000000000000000000000000000000000000..4efe100d4ea0805165102bb0a0cbf2d8ad30ce17 --- /dev/null +++ b/plugins/group-leave.js @@ -0,0 +1,16 @@ +let handler = async (m, { conn, args, command }) => { + let group = m.chat + await m.reply('Bot akan keluar dari group', m.chat) + await sleep(1000) + await conn.groupLeave(group) + } +handler.command = handler.help = ['out', 'leavegc'] +handler.tags = ['group'] + +handler.owner = true + +module.exports = handler + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/plugins/group-linkgc.js b/plugins/group-linkgc.js new file mode 100644 index 0000000000000000000000000000000000000000..b70b0a6963038fba834afd08bd7b47657aa2ac97 --- /dev/null +++ b/plugins/group-linkgc.js @@ -0,0 +1,15 @@ +let handler = async (m, { conn }) => { + try { + conn.reply(m.chat, `*Link Group:* ${await conn.getName(m.chat)}\n\nhttps://chat.whatsapp.com/` + await conn.groupInviteCode(m.chat) + `\n\n${conn.user.name}`, m) + } catch { + conn.reply(m.chat, `Jadikan @${conn.user.jid.split('@')[0]} sebagai admin untuk menggunakan perintah ini!`, m, { mentions: [conn.user.jid] }) + } +} +handler.help = ['linkgroup'] +handler.tags = ['group'] +handler.command = /^link(g(c)?ro?up)?$/i + +handler.group = true +handler.admin = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/group-listadmin.js b/plugins/group-listadmin.js new file mode 100644 index 0000000000000000000000000000000000000000..61794476df9d08654c49d59c462a002aeab3b18e --- /dev/null +++ b/plugins/group-listadmin.js @@ -0,0 +1,24 @@ +let handler = async (m, { conn, args, participants }) => { + let grup = await conn.getName(m.key.remoteJid) + let mimin = m.isGroup ? getAdmin(participants) : '' + let txt = `List Admin Group *${grup}*\n*Total:* ${mimin.length}\n\n` + for (let min of mimin) { + txt += `โ€ข @${min.split('@')[0]}\n` + } + conn.reply(m.chat, txt, m, { mentions: await conn.parseMention(txt) }) +} +handler.help = ['listadmin'] +handler.tags = ['group'] +handler.command = /^(adminlist|listadmin)$/i +handler.group = true +handler.register = false +module.exports = handler + +const getAdmin = (participants) => { + getAdminAll = [] + for (let b of participants) { + b.admin === "admin" ? getAdminAll.push(b.id) : '' + b.admin === "superadmin" ? getAdminAll.push(b.id) : '' + } + return getAdminAll +} diff --git a/plugins/group-promote.js b/plugins/group-promote.js new file mode 100644 index 0000000000000000000000000000000000000000..4c564e10e6b09ef382c09e8d36ffc076539304de --- /dev/null +++ b/plugins/group-promote.js @@ -0,0 +1,31 @@ +let handler = async (m, { teks, conn, isOwner, isAdmin, args }) => { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + let ownerGroup = m.chat.split`-`[0] + "@s.whatsapp.net"; + if(m.quoted){ +if(m.quoted.sender === ownerGroup || m.quoted.sender === conn.user.jid) return; +let usr = m.quoted.sender; +let nenen = await conn.groupParticipantsUpdate(m.chat, [usr], "promote"); return; +if (nenen) m.reply(`sukses promote @${user.split('@')[0]}!`); +} + if (!m.mentionedJid[0]) throw `tag yang mau dinaikan jabatannya`; + let users = m.mentionedJid.filter( + (u) => !(u == ownerGroup || u.includes(conn.user.jid)) + ); + for (let user of users) + if (user.endsWith("@s.whatsapp.net")) + await conn.groupParticipantsUpdate(m.chat, [user], "promote"); +}; + +handler.help = ['promote @user'] +handler.tags = ['group', 'owner'] +handler.command = /^(promo?te|admin|\^)$/i + +handler.group = true +handler.botAdmin = true +handler.admin = true +handler.fail = null + +module.exports = handler diff --git a/plugins/group-setbye.js b/plugins/group-setbye.js new file mode 100644 index 0000000000000000000000000000000000000000..80a0acac8193f6177ab2d7a3e47fc184746b3e90 --- /dev/null +++ b/plugins/group-setbye.js @@ -0,0 +1,16 @@ +let handler = async (m, { conn, text, isROwner, isOwner }) => { + if (text) { + if (isROwner) global.conn.bye = text + else if (isOwner) conn.bye = text + global.db.data.chats[m.chat].sBye = text + m.reply('Bye berhasil diatur\n@user (Mention)') + } else throw 'Teksnya mana?' +} +handler.help = ['setbye <teks>'] +handler.tags = ['owner', 'group'] + +handler.command = /^setbye$/i + +handler.botAdmin = true + +module.exports = handler diff --git a/plugins/group-setppgc.js b/plugins/group-setppgc.js new file mode 100644 index 0000000000000000000000000000000000000000..30ab973eb75c3de18a45b4cbe621fa252828b16f --- /dev/null +++ b/plugins/group-setppgc.js @@ -0,0 +1,42 @@ +const fs = require('fs') +const Jimp = require('jimp') +let handler = async (m, { conn }) => { +var image = m.quoted ? m.quoted : m +var mime = (image.msg || image).mimetype || '' +var media = await image.download() + const group = m.chat + var { img } = await generateProfilePicture(media) + await conn.query({ + tag: 'iq', + attrs: { + to: group, + type:'set', + xmlns: 'w:profile:picture' + }, + content: [ + { + tag: 'picture', + attrs: { type: 'image' }, + content: img + } + ] + }) + m.reply(`Update Profile Group โœ…`) +} +handler.help = ['setppgc'] +handler.tags = ['group'] +handler.command = /^(setppgc|setppgrup|setppgroup)$/i + +handler.group = true +handler.admin = true +handler.botAdmin = true +module.exports = handler + +async function generateProfilePicture(buffer) { + const jimp_1 = await Jimp.read(buffer); + const minz = jimp_1.getWidth() > jimp_1.getHeight() ? jimp_1.resize(720, Jimp.AUTO) : jimp_1.resize(Jimp.AUTO, 720) + const jimp_2 = await Jimp.read(await minz.getBufferAsync(Jimp.MIME_JPEG)); + return { + img: await minz.getBufferAsync(Jimp.MIME_JPEG) + } +} \ No newline at end of file diff --git a/plugins/group-setting.js b/plugins/group-setting.js new file mode 100644 index 0000000000000000000000000000000000000000..1ed2624a38c1621dcaaf26cdef1ab4b4f70c0edb --- /dev/null +++ b/plugins/group-setting.js @@ -0,0 +1,61 @@ +let { groupsSettingUpdate } = require('@adiwajshing/baileys') +let handler = async (m, { isAdmin, isOwner, isBotAdmin, conn, args, usedPrefix, command }) => { + if (!(isAdmin || isOwner)) { + global.dfail('admin', m, conn) + throw false + } + if (!isBotAdmin) { + global.dfail('botAdmin', m, conn) + throw false + } +let prefix = usedPrefix +let bu = `Group telah di buka oleh @${m.sender.split`@`[0]} dan sekarang semua member dapat mengirim pesan +ketik *${usedPrefix}group buka* +Untuk membuka grup!`.trim() + + let isClose = { + 'open': 'not_announcement', + 'buka': 'not_announcement', + 'on': 'not_announcement', + '1': 'not_announcement', + 'close': 'announcement', + 'tutup': 'announcement', + 'off': 'announcement', + '0': 'announcement', + }[(args[0] || '')] + if (isClose === undefined) { +var text5 = `contoh: +${usedPrefix + command} tutup +${usedPrefix + command} buka + ` +m.reply(text5) + + throw false + } else if (isClose === 'announcement') { + await conn.groupSettingUpdate(m.chat, isClose) + let teks = `Group telah di tutup oleh @${m.sender.split`@`[0]} dan sekarang hanya admin yang dapat mengirim pesan +ketik *${usedPrefix}group buka* +Untuk membuka grup!`.trim() + await m.reply(teks) + } else if (isClose === 'not_announcement') { + await conn.groupSettingUpdate(m.chat, isClose) + await m.reply(bu) + } else if (isClose === undefined) { + +var te = ` +contoh: +${usedPrefix + command} tutup +${usedPrefix + command} buka` + +m.reply(te) + + } +} + +handler.help = ['grup <open/close>'] +handler.tags = ['group'] +handler.command = /^(g(ro?up|c?)?)$/i +handler.group = true +handler.botAdmin = false + +module.exports = handler diff --git a/plugins/group-setwelcome.js b/plugins/group-setwelcome.js new file mode 100644 index 0000000000000000000000000000000000000000..d6967ce95737b4810a6ad90b208d750cc7d96216 --- /dev/null +++ b/plugins/group-setwelcome.js @@ -0,0 +1,15 @@ +let handler = async (m, { conn, text, isROwner, isOwner }) => { + if (text) { + if (isROwner) global.conn.welcome = text + else if (isOwner) conn.welcome = text + global.db.data.chats[m.chat].sWelcome = text + m.reply('Welcome berhasil diatur\n@user (Mention)\n@subject (Judul Grup)\n@desc (Deskripsi Grup)') + } else throw 'Teksnya mana?' +} +handler.help = ['setwelcome <teks>'] +handler.tags = ['owner', 'group'] + +handler.command = /^setwelcome$/i +handler.botAdmin = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/group-sider.js b/plugins/group-sider.js new file mode 100644 index 0000000000000000000000000000000000000000..0d0b75070198f86bb24a04c46fcdb80eacd20445 --- /dev/null +++ b/plugins/group-sider.js @@ -0,0 +1,67 @@ +let handler = async (m, { + conn, + text, + groupMetadata +}) => { +await conn.sendPresenceUpdate('composing', m.chat) + var lama = 86400000 * 7 + const now = new Date().toLocaleString("en-US", { + timeZone: "Asia/Jakarta" + }); + const milliseconds = new Date(now).getTime(); + + let member = groupMetadata.participants.map(v => v.id) + if (!text) { + var pesan = "Harap aktif di grup karena akan ada pembersihan member setiap saat" + } else { + var pesan = text + } + var sum + sum = member.length + var total = 0 + var sider = [] + for (let i = 0; i < sum; i++) { + let users = m.isGroup ? groupMetadata.participants.find(u => u.id == member[i]) : {} + if ((typeof global.db.data.users[member[i]] == 'undefined' || milliseconds * 1 - global.db.data.users[member[i]].lastseen > lama) && !users.isAdmin && !users.isSuperAdmin) { + if (typeof global.db.data.users[member[i]] !== 'undefined') { + if (global.db.data.users[member[i]].banned == true) { + total++ + sider.push(member[i]) + } + } else { + total++ + sider.push(member[i]) + } + } + } + if (total == 0) return conn.reply(m.chat, `*Digrup ini tidak terdapat sider.*`, m) + conn.reply(m.chat, `*${total}/${sum}* anggota grup *${await conn.getName(m.chat)}* adalah sider dengan alasan :\n1. Tidak aktif selama lebih dari 7 hari\n2. Baru join tetapi tidak pernah nimbrung\n\n_โ€œ${pesan}โ€_\n\n*LIST SIDER :*\n${sider.map(v => ' โ—‹ @' + v.replace(/@.+/, '' + typeof global.db.data.users[v] == "undefined" ? ' Sider ' : ' Off ' + msToDate(milliseconds * 1 - global.db.data.users[v].lastseen))).join('\n')}`, m, { + contextInfo: { + mentionedJid: sider + } + }) +} +handler.help = ['gcsider'] +handler.tags = ['group'] +handler.command = /^(gcsider)$/i +handler.group = true +handler.botAdmin = true + +module.exports = handler + +const more = String.fromCharCode(8206) +const readMore = more.repeat(4001) + + +function msToDate(ms) { + let d = isNaN(ms) ? '--' : Math.floor(ms / 86400000) + let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) % 24 + let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 + let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 + if (d == 0 && h == 0 && m == 0) { + return "Baru Saja" + } else { + return [d, 'H ', h, 'J '].map(v => v.toString().padStart(2, 0)).join('') + } + +} diff --git a/plugins/group-tag.js b/plugins/group-tag.js new file mode 100644 index 0000000000000000000000000000000000000000..0a249e0c10d712ab4fe8bfa0f8bf053f51924717 --- /dev/null +++ b/plugins/group-tag.js @@ -0,0 +1,15 @@ +let handler = async (m, { conn, text, isAdmin, participants}) => { + + let users = participants.map(u => u.id).filter(v => v !== conn.user.jid) + if (!m.quoted) throw `Reply pesan` + conn.sendMessage(m.chat, { forward: m.quoted.fakeObj, mentions: users } ) +} + +handler.help = ['totag'] +handler.tags = ['group'] +handler.command = /^(totag|tag)$/i + +handler.admin = true +handler.group = true + +module.exports = handler diff --git a/plugins/group-tagadmin.js b/plugins/group-tagadmin.js new file mode 100644 index 0000000000000000000000000000000000000000..fe36baf06a0d2af4881273dd85595f77854279f6 --- /dev/null +++ b/plugins/group-tagadmin.js @@ -0,0 +1,41 @@ +let handler = async (m, { conn, participants, groupMetadata }) => { + + const getGroupAdmins = (participants) => { + admins = [] + for (let i of participants) { + i.admin === "admin" ? admins.push(i.id) : '' + } + return admins + } + + let pp = './src/avatar_contact.png' + try { + pp = await conn.profilePictureUrl(m.chat, 'image') + } catch (e) { + } finally { + let { isBanned, welcome, detect, sWelcome, sBye, sPromote, sDemote, antiLink } = global.db.data.chats[m.chat] + const groupAdmins = getGroupAdmins(participants) + let listAdmin = groupAdmins.map((v, i) => `${i + 1}. @${v.split('@')[0]}`).join('\n') + let text = `*ใ€Œ TAG ADMIN ใ€*\n + +*Name:* +${groupMetadata.subject} + +*Group Owner:* +@${m.chat.split`-`[0]} + +*Group Admins:* +${listAdmin} +`.trim() + ownernya = [`${m.chat.split`-`[0]}@s.whatsapp.net`] + let mentionedJid = groupAdmins.concat(ownernya) + conn.sendFile(m.key.remoteJid, pp, 'pp.jpg', text, m, false, { contextInfo: { mentionedJid } }) + } +} +handler.help = ['tagadmin'] +handler.tags = ['group'] +handler.command = /^(tagadmin)$/i + +handler.group = true + +module.exports = handler diff --git a/plugins/group-tagall.js b/plugins/group-tagall.js new file mode 100644 index 0000000000000000000000000000000000000000..dca46fc5370f54c6876a92cb571998608c457e6a --- /dev/null +++ b/plugins/group-tagall.js @@ -0,0 +1,17 @@ +let handler = async(m, { conn, text, participants }) => { + let teks = `โ‹™ *PESAN DARI ADMIN GROUP* โ‹˜ +\n *${text ? text : 'Nothing'}*\n\n` + for (let mem of participants) { + teks += ` @${mem.id.split('@')[0]}\n` + } + teks += `___________________________________________` + conn.sendMessage(m.chat, { text: teks, mentions: participants.map(a => a.id) }, ) +} +handler.help = ['tagall <pesan>'] +handler.tags = ['group'] +handler.command = /^(tagall)$/i + +handler.group = true +handler.admin = true + +module.exports = handler diff --git a/plugins/group-tagme.js b/plugins/group-tagme.js new file mode 100644 index 0000000000000000000000000000000000000000..896388ccd7ce0be360bc35bd9a6e763e8ab83333 --- /dev/null +++ b/plugins/group-tagme.js @@ -0,0 +1,15 @@ +let handler = async (m, { conn, text }) => { + +let orang = (await conn.groupMetadata(m.chat)).participants.map(u => u.jid) +let tag = `@${m.sender.replace(/@.+/, '')}` +let mentionedJid = [m.sender] + + conn.reply(m.chat, tag, m, { contextInfo: { mentionedJid }}) +} +handler.help = ['tagme'] +handler.tags = ['group'] +handler.command = /^tagme$/i + +handler.group = true + +module.exports = handler diff --git a/plugins/group-warning.js b/plugins/group-warning.js new file mode 100644 index 0000000000000000000000000000000000000000..3fa7f19908d35811e922a6a61a881d1b20fe2cac --- /dev/null +++ b/plugins/group-warning.js @@ -0,0 +1,44 @@ +let war = global.maxwarn +let handler = async (m, { conn, text, args, groupMetadata, usedPrefix, command }) => { + let who + if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : false + else who = m.chat + if (!who) throw `โœณ๏ธ Memberi label atau menyebut seseorang\n\n๐Ÿ“Œ Contoh : ${usedPrefix + command} @user` + if (!(who in global.db.data.users)) throw `โœณ๏ธ Pengguna hilang dari database saya` + let name = conn.getName(m.sender) + let warn = global.db.data.users[who].warn + if (warn < war) { + global.db.data.users[who].warn += 1 + m.reply(` +โš ๏ธ *Pengguna yang Diperingatkan* โš ๏ธ + +โ–ข *Admin:* ${name} +โ–ข *Pengguna:* @${who.split`@`[0]} +โ–ข *Memperingatkan:* ${warn + 1}/${war} +โ–ข *Alasan:* ${text}`, null, { mentions: [who] }) + m.reply(` +โš ๏ธ *PERINGATAN* โš ๏ธ +Anda menerima peringatan dari admin + +โ–ข *Memperingatkan:* ${warn + 1}/${war} +Jika Anda menerima *${war}* Peringatan bahwa Anda akan dihapus secara otomatis dari grup`, who) + } else if (warn == war) { + global.db.data.users[who].warn = 0 + m.reply(`โ›” Pengguna melebihi peringatan *${war}* karena itu akan dihapus`) + await time(3000) + await conn.groupParticipantsUpdate(m.chat, [who], 'remove') + m.reply(`โ™ป๏ธ Anda tersingkir dari grup *${groupMetadata.subject}* karena Anda telah diperingatkan *${war}* kali`, who) + } +} +handler.help = ['warn @user'] +handler.tags = ['group'] +handler.command = ['warn'] +handler.group = true +handler.admin = true +handler.botAdmin = true + +module.exports = handler + +const time = async (ms) => { + return new Promise(resolve => setTimeout(resolve, ms)); + } \ No newline at end of file diff --git a/plugins/image-anime.js b/plugins/image-anime.js new file mode 100644 index 0000000000000000000000000000000000000000..d23b6665abf8738cadba23c2571cf41ccafe28e1 --- /dev/null +++ b/plugins/image-anime.js @@ -0,0 +1,16 @@ +const axios = require('axios'); +var handler = async (m, { conn, args, usedPrefix, command }) => { + m.reply(wait); + try { + let url = `https://api.botcahx.eu.org/api/anime/${command}?apikey=${btc}`; + let response = await axios.get(url, { responseType: 'arraybuffer' }); + conn.sendFile(m.chat, response.data, "", "", m); + } catch (e) { + conn.reply(m.chat, eror, m) + } +} +handler.help = ['umaru','kaneki','megumin','yotsuba','shinomiya','yumeko','tejina','chiho','toukachan','akira','itori','kurumi','sagiri','eba','deidara','itachi','madara','asuna','ayuzawa','chitoge','emilia','hestia','inori','ana','miku','kaori','shizuka','doraemon','kaga','kotori','mikasa','akiyama','gremory','isuzu','shina','kagura','shinka','tsunade','sasuke','sakura','rize','nezuko','boruto','naruto','erza','minato','elaina','yuri','shota','waifu','loli','hinata'] +handler.command = /^(umaru|keneki|megumin|yotsuba|shinomiya|yumeko|tejina|chiho|toukachan|akira|itori|kurumi|sagiri|eba|deidara|itachi|madara|asuna|ayuzawa|chitoge|emilia|hestia|inori|ana|miku|kaori|shizuka|doraemon|kaga|koturi|mikasa|akiyama|gremory|isuzu|shina|kagura|shinka|tsunade|sasuke|sakura|rize|nezuko|boruto|naruto|erza|minato|elaina|yuri|shota|waifu|loli|hinata)$/i +handler.tags = ['image'] +handler.limit = true; +module.exports = handler; diff --git a/plugins/info-bannedList.js b/plugins/info-bannedList.js new file mode 100644 index 0000000000000000000000000000000000000000..c488dc00efa485e09d6b1f66ee704b36cbabc89b --- /dev/null +++ b/plugins/info-bannedList.js @@ -0,0 +1,25 @@ +let handler = async (m, { conn, isOwner }) => { + let chats = Object.entries(global.db.data.chats).filter(chat => chat[1].isBanned) + let users = Object.entries(global.db.data.users).filter(user => user[1].banned) + let caption = ` +โ”Œใ€” Daftar Chat Terbanned ใ€• +โ”œ Total : ${chats.length} Chat${chats ? '\n' + chats.map(([jid], i) => ` +โ”œ ${i + 1}. ${conn.getName(jid) == undefined ? 'Unknown' : conn.getName(jid)} +โ”œ ${isOwner ? '@' + jid.split`@`[0] : jid} +`.trim()).join('\n') : ''} +โ””โ”€โ”€โ”€โ”€ + +โ”Œใ€” Daftar Pengguna Terbanned ใ€• +โ”œ Total : ${users.length} Pengguna${users ? '\n' + users.map(([jid], i) => ` +โ”œ ${i + 1}. ${conn.getName(jid) == undefined ? 'Unknown' : conn.getName(jid)} +โ”œ ${isOwner ? '@' + jid.split`@`[0] : jid} +`.trim()).join('\n') : ''} +โ””โ”€โ”€โ”€โ”€ +`.trim() + conn.reply(m.chat, caption, m, { contextInfo: { mentionedJid: conn.parseMention(caption) } }) +} +handler.help = ['bannedlist'] +handler.tags = ['info'] +handler.command = /^listban(ned)?|ban(ned)?list|daftarban(ned)?$/i +handler.owner = false +module.exports = handler diff --git a/plugins/info-creator.js b/plugins/info-creator.js new file mode 100644 index 0000000000000000000000000000000000000000..9e008eccefb17c4d748b64d9b0e5344bfea7b649 --- /dev/null +++ b/plugins/info-creator.js @@ -0,0 +1,51 @@ +var name = global.nameowner +var numberowner = global.numberowner +var gmail = global.mail +const { +default: +makeWASocket, +BufferJSON, +WA_DEFAULT_EPHEMERAL, +generateWAMessageFromContent, +downloadContentFromMessage, +downloadHistory, +proto, +getMessage, +generateWAMessageContent, +prepareWAMessageMedia +} = require("@adiwajshing/baileys"); +var handler = async (m, { +conn +}) => { +const vcard = `BEGIN:VCARD +VERSION:3.0 +N:Sy;Bot;;; +FN: ${name} +item.ORG: Creator Bot +item1.TEL;waid=${numberowner}:${numberowner}@s.whatsapp.net +item1.X-ABLabel:Nomor Creator Bot +item2.EMAIL;type=INTERNET:${gmail} +item2.X-ABLabel:Email Owner +item3.ADR:;;๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia;;;; +item3.X-ABADR:ac +item4.EMAIL;type=INTERNET:support@tioprm.eu.org +item4.X-ABLabel:Email Developer +item3.ADR:;;๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia;;;; +item3.X-ABADR:ac +item5.URL:${instagram} +item5.X-ABLabel:Website +END:VCARD` +const sentMsg = await conn.sendMessage( + m.chat, + { + contacts: { + displayName: 'CN', + contacts: [{ vcard }] + } + } +) +await conn.reply(m.chat, "Itu Adalah nomor owner Bot", sentMsg)} +handler.command = handler.help = ['owner', 'creator']; +handler.tags = ['info']; +handler.limit = false; +module.exports = handler; diff --git a/plugins/info-dashboard.js b/plugins/info-dashboard.js new file mode 100644 index 0000000000000000000000000000000000000000..3dcb3fd1662c40d0708b71367b91cf203b516437 --- /dev/null +++ b/plugins/info-dashboard.js @@ -0,0 +1,71 @@ +let handler = async (m, { conn }) => { +let stats = Object.entries(db.data.stats).map(([key, val]) => { +let name = Array.isArray(plugins[key]?.help) ? plugins[key]?.help?.join(' , ') : plugins[key]?.help || key + if (/exec/.test(name)) return + return { name, ...val } + }) + stats = stats.sort((a, b) => b.total - a.total) + let handlers = stats.slice(0, 50).map(({ + name, + total, + last, + success, + lastSuccess + }, i) => { + return `*${i + 1}.* *${name}*\n โ€ข *Hits* : ${total}\n โ€ข *Success* : ${success}\n โ€ข *Last Used* : ${getTime(last)}\n โ€ข *Last Success* : ${formatTime(lastSuccess)}`; +}).join('\n\n'); + conn.relayMessage(m.chat, { + extendedTextMessage: { + text: handlers, + contextInfo: { + externalAdReply: { + title: wm, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://telegra.ph/file/cf4f28ed3b9ebdfb30adc.png', + sourceUrl: '' + } + }, + mentions: [m.sender] + } + }, {}) +}; + +handler.command = handler.help = ['dashboard','totalhits'] +handler.tags = ['info'] +module.exports = handler; + +function formatTime(time) { + const date = new Date(time); + const month = getMonthName(date.getMonth()); + const day = date.getDate(); + const year = date.getFullYear(); + + return `${month} ${day}, ${year}`; +} + +function getMonthName(month) { + const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + return months[month]; +} + +function getTime(ms) { + var now = parseMs(+new Date() - ms) + if (now.days) return `${now.days} days ago` + else if (now.hours) return `${now.hours} hours ago` + else if (now.minutes) return `${now.minutes} minutes ago` + else return `a few seconds ago` +} +function parseMs(ms) { + if (typeof ms !== 'number') throw 'Parameters must be filled with numbers' + return { + days: Math.trunc(ms / 86400000), + hours: Math.trunc(ms / 3600000) % 24, + minutes: Math.trunc(ms / 60000) % 60, + seconds: Math.trunc(ms / 1000) % 60, + milliseconds: Math.trunc(ms) % 1000, + microseconds: Math.trunc(ms * 1000) % 1000, + nanoseconds: Math.trunc(ms * 1e6) % 1000 + } +} diff --git a/plugins/info-database.js b/plugins/info-database.js new file mode 100644 index 0000000000000000000000000000000000000000..b1426a986859a4bb5db2682cd6c01845b96918a0 --- /dev/null +++ b/plugins/info-database.js @@ -0,0 +1,9 @@ +let handler = async (m) => { + let totalreg = Object.keys(global.db.data.users).length + let rtotalreg = Object.values(global.db.data.users).filter(user => user.registered == true).length + m.reply(`*Jumlah database saat ini ${totalreg} user*`) +} +handler.help = ['database', 'user'] +handler.tags = ['info'] +handler.command = /^(database|jumlahdatabase|user)$/i +module.exports = handler diff --git a/plugins/info-gempa.js b/plugins/info-gempa.js new file mode 100644 index 0000000000000000000000000000000000000000..0c35c5f2655336f66e39754e7158b7a25be93947 --- /dev/null +++ b/plugins/info-gempa.js @@ -0,0 +1,27 @@ +var axios = require('axios'); +var handler = async (m, { conn }) => { +try { +var dataGempa = []; + var response = await axios.get(`https://api.botcahx.eu.org/api/search/gempa?apikey=${btc}`); + var res = response.data; + var gambar = res.result.Map; + dataGempa.push({ + waktu: res.result.Waktu, + lintang: res.result.Lintang, + bujur: res.result.Bujur, + magnitude: res.result.Magnitudo, + kedalaman: res.result.Kedalaman, + wilayah: res.result.Wilayah + }); + var caption = `Waktu : ${dataGempa[0].waktu}\nLintang : ${dataGempa[0].lintang}\nBujur : ${dataGempa[0].bujur}\nMagnitude : ${dataGempa[0].magnitude}\nKedalaman : ${dataGempa[0].kedalaman}\nWilayah : ${dataGempa[0].wilayah}`; + conn.sendFile(m.chat, gambar, 'map.png', caption, m); +} catch(e) { + console.log(e); + conn.reply(m.chat, 'Terjadi kesalahan saat mengambil data gempa', m); +} +}; +handler.command = handler.help = ['infogempa', 'gempa']; +handler.tags = ['info']; +handler.premium = false; +handler.limit = true; +module.exports = handler; diff --git a/plugins/info-listgroup.js b/plugins/info-listgroup.js new file mode 100644 index 0000000000000000000000000000000000000000..dd402696e5c4b7ff4cf65b2b7248eb706014760f --- /dev/null +++ b/plugins/info-listgroup.js @@ -0,0 +1,46 @@ +let handler = async (m, { conn, participants }) => { + + let now = new Date() * 1 + let groups = Object.entries(conn.chats).filter(([jid, chat]) => jid.endsWith('@g.us') && chat.isChats && !chat.metadata?.read_only && !chat.metadata?.announce).map(v => v[0]) + let txt = '' + // let tolgp = `${participants.lenght}` + + for (let [jid, chat] of Object.entries(conn.chats).filter(([jid, chat]) => jid.endsWith('@g.us') && chat.isChats)) + txt += `${await conn.getName(jid)}\n${jid} [${chat?.metadata?.read_only ? 'Left' : 'Joined'}]\n${db.data.chats[jid] == undefined ? db.data.chats[jid] = { + isBanned: false, + welcome: false, + antiLink: false, + delete: true, + } : db.data.chats[jid].expired ? msToDate(db.data.chats[jid].expired - now) : '*Tidak Diatur Expired Group*'} +${db.data.chats[jid].isBanned ? 'โœ…' : 'โŒ'} _Group Banned_ +${db.data.chats[jid].welcome ? 'โœ…' : 'โŒ'} _Auto Welcome_ +${db.data.chats[jid].antiLink ? 'โœ…' : 'โŒ'} _Anti Link_\n\n` + m.reply(`List Groups: +Total Group: ${groups.length} + +${txt} + +`.trim()) + +} + +handler.help = ['grouplist'] +handler.tags = ['group'] + +handler.command = /^(group(s|list)|(s|list)group)$/i + + +module.exports = handler + +function msToDate(ms) { + temp = ms + days = Math.floor(ms / (24 * 60 * 60 * 1000)); + daysms = ms % (24 * 60 * 60 * 1000); + hours = Math.floor((daysms) / (60 * 60 * 1000)); + hoursms = ms % (60 * 60 * 1000); + minutes = Math.floor((hoursms) / (60 * 1000)); + minutesms = ms % (60 * 1000); + sec = Math.floor((minutesms) / (1000)); + return days + " hari " + hours + " jam " + minutes + " menit"; + // +minutes+":"+sec; +} \ No newline at end of file diff --git a/plugins/info-runtime.js b/plugins/info-runtime.js new file mode 100644 index 0000000000000000000000000000000000000000..3060cb24e92d6358142e8c4483df996647d0315d --- /dev/null +++ b/plugins/info-runtime.js @@ -0,0 +1,28 @@ +let handler = async (m, { conn, usedPrefix, command }) => { + let _uptime = process.uptime() * 1000 + let tio = clockString(_uptime) + let time = require('moment-timezone').tz('Asia/Jakarta').format('HH:mm:ss') + +var ct = ` +*โ”€โ”€โ”€ใ€Œ RUNTIME BOT ใ€โ”€โ”€โ”€* + +Runtime : ${tio} + ` +m.reply(ct) +} +handler.help = ['runtime'] +handler.tags = ['info'] +handler.command = /^(uptime|runtime)$/i + +module.exports = handler + +function clockString(ms) { + let days = Math.floor(ms / (24 * 60 * 60 * 1000)); + let daysms = ms % (24 * 60 * 60 * 1000); + let hours = Math.floor((daysms) / (60 * 60 * 1000)); + let hoursms = ms % (60 * 60 * 1000); + let minutes = Math.floor((hoursms) / (60 * 1000)); + let minutesms = ms % (60 * 1000); + let sec = Math.floor((minutesms) / (1000)); + return days + " Day " + hours + " Hour " + minutes + " Minute " + sec + " Second "; +} diff --git a/plugins/info-server.js b/plugins/info-server.js new file mode 100644 index 0000000000000000000000000000000000000000..95a058401d1f3e655e4a23d6e991b59b2be71012 --- /dev/null +++ b/plugins/info-server.js @@ -0,0 +1,77 @@ +const os = require('os'); +const fetch = require('node-fetch'); + +let handler = async (m, { conn }) => { + try { + let response = await fetch('https://ip-json.vercel.app/'); + let json = await response.json(); + delete json.status; + let caption = `ไน‚ *S E R V E R*\n\n`; + caption += `โ”Œ โ—ฆ OS : ${os.type()} (${os.arch()} / ${os.release()})\n`; + caption += `โ”‚ โ—ฆ Ram : ${formatSize(os.totalmem() - os.freemem())} / ${formatSize(os.totalmem())}\n`; + json.result.timeZones = [json.result.timeZones[0]]; + let currency = json.result.currency || {}; + let currencyCode = currency.code || 'N/A'; + let currencyName = currency.name || 'N/A'; + + for (let key in json.result) { + if (key === 'currency') { + caption += `โ”‚ โ—ฆ Currency Code : ${currencyCode}\n`; + caption += `โ”‚ โ—ฆ Currency Name : ${currencyName}\n`; + } else { + caption += `โ”‚ โ—ฆ ${ucword(key)} : ${json.result[key]}\n`; + } + } + caption += `โ”‚ โ—ฆ Uptime : ${toTime(os.uptime() * 1000)}\n`; + caption += `โ”” โ—ฆ Processor : ${os.cpus()[0].model}\n\n`; + conn.relayMessage(m.chat, { + extendedTextMessage: { + text: caption, + contextInfo: { + externalAdReply: { + title: `${toTime(os.uptime() * 1000)}`, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://telegra.ph/file/cf4f28ed3b9ebdfb30adc.png', + sourceUrl: '' + } + }, + mentions: [m.sender] + } + }, {}); + } catch (error) { + console.log(error); + } finally { + deleteMessage(); + } +}; + +handler.command = handler.help = ['server']; +handler.tags = ['info']; +module.exports = handler; + +function deleteMessage() { + //chaunima๐Ÿ˜ +} + +function formatSize(bytes) { + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; + if (bytes === 0) return '0 Bytes'; + const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10); + return (Math.round(bytes / Math.pow(1024, i) * 100) / 100) + ' ' + sizes[i]; +} + +function ucword(str) { + return str.replace(/\b\w/g, function(l) { + return l.toUpperCase(); + }); +} + +function toTime(milliseconds) { + const seconds = Math.floor(milliseconds / 1000); + const minutes = Math.floor(seconds / 60); + const hours = Math.floor(minutes / 60); + const days = Math.floor(hours / 24); + return `${days} days, ${hours % 24} hours, ${minutes % 60} minutes, ${seconds % 60} seconds`; +} diff --git a/plugins/info-speedtest.js b/plugins/info-speedtest.js new file mode 100644 index 0000000000000000000000000000000000000000..0e7076395eadf9cc06c54913fc6fb7c06fc70f49 --- /dev/null +++ b/plugins/info-speedtest.js @@ -0,0 +1,35 @@ +let cp = require ('child_process') +let { promisify } = require ('util') +let exec = promisify(cp.exec).bind(cp) +let handler = async (m, { conn}) => { + await conn.reply(m.chat, `Please Wait`, m) + let o + try { + o = await exec('python3 speed.py --share --secure') + } catch (e) { + o = e + } finally { + let { stdout, stderr } = o + if (stdout.trim()) + conn.relayMessage(m.chat, { +extendedTextMessage:{ + text: stdout, + contextInfo: { + externalAdReply: { + title: wm, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://telegra.ph/file/ec8cf04e3a2890d3dce9c.jpg', + sourceUrl: '' + } + }, mentions: [m.sender] +}}, {}) + if (stderr.trim()) m.reply(stderr) + } +} +handler.help = ['speedtest'] +handler.tags = ['info'] +handler.command = /^(speedtest|ookla)$/i +handler.premium = false +module.exports = handler diff --git a/plugins/info-status.js b/plugins/info-status.js new file mode 100644 index 0000000000000000000000000000000000000000..e816262666912e6f416fd5d2b29ac376bdd89738 --- /dev/null +++ b/plugins/info-status.js @@ -0,0 +1,102 @@ +let { performance } = require('perf_hooks') +let osu = require('node-os-utils') +let handler = async(m, { conn, command, usedPrefix, DevMode }) => { + try { + let NotDetect = 'Not Detect' + let old = performance.now() + let cpu = osu.cpu + let cpuCore = cpu.count() + let drive = osu.drive + let mem = osu.mem + let netstat = osu.netstat + let OS = osu.os.platform() + let cpuModel = cpu.model() + let cpuPer + let p1 = cpu.usage().then(cpuPercentage => { + cpuPer = cpuPercentage + }).catch(() => { + cpuPer = NotDetect + }) + let driveTotal, driveUsed, drivePer + let p2 = drive.info().then(info => { + driveTotal = (info.totalGb + ' GB'), + driveUsed = info.usedGb, + drivePer = (info.usedPercentage + '%') + }).catch(() => { + driveTotal = NotDetect, + driveUsed = NotDetect, + drivePer = NotDetect + }) + let ramTotal, ramUsed + let p3 = mem.info().then(info => { + ramTotal = info.totalMemMb, + ramUsed = info.usedMemMb + }).catch(() => { + ramTotal = NotDetect, + ramUsed = NotDetect + }) + let netsIn, netsOut + let p4 = netstat.inOut().then(info => { + netsIn = (info.total.inputMb + ' MB'), + netsOut = (info.total.outputMb + ' MB') + }).catch(() => { + netsIn = NotDetect, + netsOut = NotDetect + }) + await Promise.all([p1, p2, p3, p4]) + await conn.reply(m.chat, `_Testing ${command }..._`, m) + let _ramTotal = (ramTotal + ' MB') + let neww = performance.now() + + +var txt = ` +*ใ€Œ Status ใ€* +OS : *${OS}* +CPU Model : *${cpuModel}* +CPU Core : *${cpuCore} Core* +CPU : *${cpuPer}%* +Ram : *${ramUsed} / ${_ramTotal}(${/[0-9.+/]/g.test(ramUsed) && /[0-9.+/]/g.test(ramTotal) ? Math.round(100 * (ramUsed / ramTotal)) + '%' : NotDetect})* +Drive : *${driveUsed} / ${driveTotal} (${drivePer})* +Ping : *${Math.round(neww - old)} ms* +Internet IN : *${netsIn}* +Internet OUT : *${netsOut}* +` + +conn.relayMessage(m.chat, { +extendedTextMessage:{ + text: txt, + contextInfo: { + externalAdReply: { + title: `${ramUsed} / ${_ramTotal}(${/[0-9.+/]/g.test(ramUsed) && /[0-9.+/]/g.test(ramTotal) ? Math.round(100 * (ramUsed / ramTotal)) + '%' : NotDetect})`, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://telegra.ph/file/ec8cf04e3a2890d3dce9c.jpg', + sourceUrl: '' + } + }, mentions: [m.sender] +}}, {}) + console.log(OS) + } catch (e) { + console.log(e) + conn.reply(m.chat, eror, m) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Status.js error\nNo: *' + m.sender.split `@` [0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } +} +handler.help = ['', 'bot'].map(v => 'status' + v) +handler.tags = ['info'] +handler.command = /^(bot)?stat(us)?(bot)?$/i + +module.exports = handler + +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ ms, h, m, s }) + return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') +} diff --git a/plugins/info-totalfitur.js b/plugins/info-totalfitur.js new file mode 100644 index 0000000000000000000000000000000000000000..ea0f92730a7272672ef9753f93728239c03fe81f --- /dev/null +++ b/plugins/info-totalfitur.js @@ -0,0 +1,11 @@ +let handler = async (m, { conn, args, command }) => { +let totalf = Object.values(global.plugins).filter( + (v) => v.help && v.tags + ).length; +conn.reply(m.chat, `Total Fitur saat ini: ${totalf}`,m) +} + +handler.help = ['totalfitur'] +handler.tags = ['info'] +handler.command = ['totalfitur'] +module.exports = handler diff --git a/plugins/info-tqto.js b/plugins/info-tqto.js new file mode 100644 index 0000000000000000000000000000000000000000..f5b268fc07c07e5b3097eed1a38f46eeac2ce73a --- /dev/null +++ b/plugins/info-tqto.js @@ -0,0 +1,6 @@ +/** +* jangan ganti ya kakak kakak sekalian +* ini cuma buat ninggalin credit gw doang :) +* jangan dihilangin, boleh di tambahin ๐Ÿฆ +**/ +const _0x59f012=_0x4653;function _0x3bec(){const _0x361374=['help','reply','command','exports','6835Kfngmh','675222lOVpSw','20CWpBZw','487937kiZBmW','2525104AoeteX','696000TAeYKb','tqto','3622318CLDMJt','17034921Uoxgaj','3414vqjuYH'];_0x3bec=function(){return _0x361374;};return _0x3bec();}function _0x4653(_0x336d1a,_0x1dabfe){const _0x3becd2=_0x3bec();return _0x4653=function(_0x46537d,_0x1abcaf){_0x46537d=_0x46537d-0x13d;let _0x2743f8=_0x3becd2[_0x46537d];return _0x2743f8;},_0x4653(_0x336d1a,_0x1dabfe);}(function(_0x4583ed,_0x3abbd1){const _0x564b80=_0x4653,_0x4152eb=_0x4583ed();while(!![]){try{const _0x38409c=-parseInt(_0x564b80(0x146))/0x1+parseInt(_0x564b80(0x148))/0x2+-parseInt(_0x564b80(0x144))/0x3*(-parseInt(_0x564b80(0x145))/0x4)+parseInt(_0x564b80(0x143))/0x5*(parseInt(_0x564b80(0x13e))/0x6)+parseInt(_0x564b80(0x14a))/0x7+parseInt(_0x564b80(0x147))/0x8+-parseInt(_0x564b80(0x13d))/0x9;if(_0x38409c===_0x3abbd1)break;else _0x4152eb['push'](_0x4152eb['shift']());}catch(_0x2bf252){_0x4152eb['push'](_0x4152eb['shift']());}}}(_0x3bec,0xabc6f));let handler=async(_0x43d2f1,{conn:_0x33c87e})=>{const _0x3b7608=_0x4653;let _0x4ecf51='\x0a-\x20Allah\x20SWT\x20\x0a-\x20Hyzer\x0a-\x20Erlanrahmat\x0a-\x20BOTCAHX\x0a-\x20Kurukuu-MD\x0a-\x20Kalian\x20semua\x20yang\x20telah\x20menggunakan\x20script\x20ini.\x0a';_0x43d2f1[_0x3b7608(0x140)](_0x4ecf51);};handler[_0x59f012(0x13f)]=[_0x59f012(0x149)],handler['tags']=['info'],handler[_0x59f012(0x141)]=/^(tqto|team)$/i,module[_0x59f012(0x142)]=handler; diff --git a/plugins/internet-alkitab.js b/plugins/internet-alkitab.js new file mode 100644 index 0000000000000000000000000000000000000000..090aba04daf3741d338cee0e5bfe1d6af515ccd4 --- /dev/null +++ b/plugins/internet-alkitab.js @@ -0,0 +1,23 @@ +let axios = require('axios') +let cheerio = require('cheerio') +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `uhm.. teksnya mana?\n\ncontoh:\n${usedPrefix + command} kejadian` + let res = await axios.get(`https://alkitab.me/search?q=${encodeURIComponent(text)}`, { headers: { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36" } }) + + let $ = cheerio.load(res.data) + let result = [] + $('div.vw').each(function (a, b) { + let teks = $(b).find('p').text().trim() + let link = $(b).find('a').attr('href') + let title = $(b).find('a').text().trim() + result.push({ teks, link, title }) + }) + + let caption = result.map(v => `${v.title}\n${v.teks}`).join('\nโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n') + m.reply(caption) +} +handler.help = ['alkitab'].map(v => v + ' <pencarian>') +handler.tags = ['internet'] +handler.command = /^(alkitab)$/i + +module.exports = handler diff --git a/plugins/internet-anichin.js b/plugins/internet-anichin.js new file mode 100644 index 0000000000000000000000000000000000000000..7ffc115e4571c8ee01c0054d83b666dfef3a840d --- /dev/null +++ b/plugins/internet-anichin.js @@ -0,0 +1,51 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { text, conn, usedPrefix, command }) => { + if (!text) throw `*๐Ÿšฉ Contoh:* ${usedPrefix + command} throne of seal`; + + try { + let teks = '*A N I C H I N S E A R C H*'; + const api = await fetch(`https://api.botcahx.eu.org/api/webzone/anichin-search?query=${text}&apikey=${btc}`); + let json = await api.json(); + let res = json.result; + + for (let i in res) { + teks += `\n\n โ—ฆ *Title:* ${res[i].title}\n`; + teks += ` โ—ฆ *Status:* ${res[i].status}\n`; + teks += ` โ—ฆ *Type:* ${res[i].type}\n`; + teks += ` โ—ฆ *Subtitle:* ${res[i].subtitle}\n`; + teks += ` โ—ฆ *URL:* ${res[i].link}\n`; + } + + let thumb = res.length > 0 ? res[0].image : ''; + let sourceUrl = res.length > 0 ? res[0].link : ''; + + await conn.relayMessage(m.chat, { + extendedTextMessage: { + text: teks, + contextInfo: { + externalAdReply: { + title: 'A N I C H I N S E A R C H', + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: thumb, + sourceUrl: sourceUrl + } + }, + mentions: [m.sender] + } + }, {}); + + } catch (e) { + throw eror; + } +}; + +handler.command = handler.help = ['anichin']; +handler.tags = ['internet']; +handler.premium = false; +handler.group = false; +handler.limit = true; + +module.exports = handler; diff --git a/plugins/internet-anichindetail.js b/plugins/internet-anichindetail.js new file mode 100644 index 0000000000000000000000000000000000000000..bc3ecbe1c9ef7b747b41dd524b20b76974b20184 --- /dev/null +++ b/plugins/internet-anichindetail.js @@ -0,0 +1,37 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { text, conn, usedPrefix, command }) => { + if (!text) throw `*๐Ÿšฉ Contoh:* ${usedPrefix + command} https://anichin.site/throne-of-seal/`; + + try { + const api = await fetch(`https://api.botcahx.eu.org/api/webzone/anichin-detail?url=${text}&apikey=${btc}`); + let json = await api.json(); + let res = json.result; + + let teks = ''; + let episodeNumber = 1; + + for (let item of res) { + teks += `\n\n โ—ฆ *Episode ${episodeNumber}:* ${item.episodeRange}\n`; + for (let download of item.downloadLinks) { + teks += `\n *Resolution:* ${download.resolution}\n`; + for (let link of download.links) { + teks += ` โ—ฆ ${link.text}: ${link.href}\n`; + } + } + episodeNumber++; + } + await m.reply(teks); + + } catch (e) { + throw eror; + } +}; + +handler.command = handler.help = ['anichindetail']; +handler.tags = ['internet']; +handler.premium = false; +handler.group = false; +handler.limit = true; + +module.exports = handler; diff --git a/plugins/internet-cerpen.js b/plugins/internet-cerpen.js new file mode 100644 index 0000000000000000000000000000000000000000..9f19f6350f5e2742cde4aac6655fb872a7aaac93 --- /dev/null +++ b/plugins/internet-cerpen.js @@ -0,0 +1,117 @@ + /* + Created By Dana + Source From: https://github.com/DanaPutra133/Aquabot-V3/blob/main/aqua%20bot/plugins/search-cerpen.js + Github: https://github.com/DanaPutra133/Aquabot-V3/ + Created At: 13 June 2024 + Dont Delete This Watermark and Sell This Code !!!! +*/ + +const fetch = require('node-fetch') + +//mulai + +let handler = async (m, {conn, command}) => { + try { + let cerdn = `----( *${command.toUpperCase()}* )----\n\n`; + + if (command === 'cerpenremaja') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=remaja&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenanak') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=anak&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenmisteri') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=misteri&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenbudaya') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=budaya&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenromantis') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=romantis&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpengalau') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=galau&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpengokil') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=gokil&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpeninspiratif') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=inspiratif&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenkehidupan') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=kehidupan&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpensastra') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=sastra&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenjepang') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=jepang&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenkorea') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=korea&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenkeluarga') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=keluarga&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenpersahabatan') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=persahabatan&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenkristen') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=kristen&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenramadhan') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=ramadhan&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenliburan') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=liburan&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenlingkungan') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=lingkungan&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + else if(command === 'cerpenmengharukan') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/story/cerpen?type=mengharukan&apikey=${btc}`)).json(); + cerdn += `Judul: *${res.result.title}*\nAuthor: *${res.result.author}*\nKategori: *${res.result.kategori}*\nLolos: *${res.result.lolos}*\n\n*Cerita:* ${res.result.cerita}\n ` + } + + await m.reply(cerdn); + + } catch (e) { + console.log(e); + m.reply('Maaf, cerpen tidak di temukan'); + await conn.sendMessage(m.chat, { + react: { + text: '๐Ÿ˜ž', + key: m.key, + } + }) + } + +}; + + + +handler.help = handler.command = ['cerpenremaja', 'cerpenanak', 'cerpenbudaya', 'cerpenmisteri', 'cerpenromantis', 'cerpencinta', 'cerpengokil', 'cerpengalau', 'cerpenkehidupan', 'cerpeninspiratif', 'cerpensastra', 'cerpenjepang', 'cerpenkorea', 'cerpenkeluarga', 'cerpenpersahabatan', 'cerpenkristen', 'cerpenramadhan', 'cerpenhiburan', 'cerpenlingkungan', 'cerpenmengharukan']; +handler.tags = ['internet'] +handler.limit = true; + +module.exports = handler + +//dana_putra13 diff --git a/plugins/internet-chord.js b/plugins/internet-chord.js new file mode 100644 index 0000000000000000000000000000000000000000..85e9b8f9a6f52018337f612f5ef6382744dac443 --- /dev/null +++ b/plugins/internet-chord.js @@ -0,0 +1,28 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { text, command, usedPrefix }) => { +if (!text) throw `Example: ${usedPrefix + command} Janji Suci Yovie Nuno` +m.reply(wait) +try { + let response = await fetch(`https://api.botcahx.eu.org/api/search/chord?song=${text}&apikey=${btc}`); + let data = await response.json(); + + if (data.status && data.result) { + let txt = `ไน‚ *C H O R D M U S I C*\n\n`; + txt += `โ—ฆ *Title:* ${data.result.title ? data.result.title : text}\n`; + txt += `โ—ฆ *Chord:* ${data.result.chord ? data.result.chord : 'Tidak ditemukan!'}\n\n`; + text += `\n`; + await m.reply(txt); + } else { + await m.reply('Lagu tidak ditemukan!') + } + } catch (error) { + throw eror + } +} + +handler.help = ['chord <judul lagu>'] +handler.tags = ['internet'] +handler.command = /^(chord)$/i +handler.limit = true +module.exports = handler diff --git a/plugins/internet-cosplay.js b/plugins/internet-cosplay.js new file mode 100644 index 0000000000000000000000000000000000000000..b7e0069090efd018da24c236c7677395ed74766e --- /dev/null +++ b/plugins/internet-cosplay.js @@ -0,0 +1,17 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { conn }) => { + try { + const response = await fetch(`https://api.botcahx.eu.org/api/wallpaper/cosplay?apikey=${btc}`); + const buffer = await response.buffer(); + conn.sendFile(m.chat, buffer, 'hasil.jpg', 'Random Cosplay', m); + } catch (err) { + throw eror + } +} + +handler.help = handler.command = ['cosplay']; +handler.tags = ['internet']; +handler.limit = true; + +module.exports = handler; diff --git a/plugins/internet-cuaca.js b/plugins/internet-cuaca.js new file mode 100644 index 0000000000000000000000000000000000000000..f9bcb5214f4640c3e6ed02c97d166d219da92815 --- /dev/null +++ b/plugins/internet-cuaca.js @@ -0,0 +1,21 @@ +const fetch = require('node-fetch'); + +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `Penggunaan:\n${usedPrefix + command} <teks>\n\nContoh:\n${usedPrefix + command} Jakarta`; + try { + let res = await fetch(`https://api.botcahx.eu.org/api/tools/cuaca?query=${encodeURIComponent(text)}&apikey=${btc}`); + if (!res.ok) throw 'Lokasi tidak ditemukan'; + let json = await res.json(); + if (!json.status || json.code !== 200) throw eror; + let result = json.result; + m.reply(`Lokasi: ${result.location}\nNegara: ${result.country}\nCuaca: ${result.weather}\nSuhu saat ini: ${result.currentTemp}\nSuhu tertinggi: ${result.maxTemp}\nSuhu terendah: ${result.minTemp}\nKelembapan: ${result.humidity}\nAngin: ${result.windSpeed}`); + } catch (error) { + m.reply('Terjadi error saat mencari informasi cuaca, silakan coba lagi nanti'); + } +}; + +handler.help = ['cuaca']; +handler.tags = ['internet']; +handler.command = /^(cuaca|weather)$/i; + +module.exports = handler; diff --git a/plugins/internet-fetch.js b/plugins/internet-fetch.js new file mode 100644 index 0000000000000000000000000000000000000000..e5b9ae06c7bdcbdec9d3a23fb88b50c1b9c4a744 --- /dev/null +++ b/plugins/internet-fetch.js @@ -0,0 +1,72 @@ +//boleh dicopy kak hehe:v +// wm ยฉ BOTCAHX jangan di ilangin + +const axios = require('axios'); +let handler = async (m, { text, args }) => { + if (!/^https?:\/\//.test(text)) throw 'Awali *URL* dengan http:// atau https://'; + try { + const fetch = await axios.get(args[0], { + headers: { + "Access-Control-Allow-Origin": "*", + "Referer": args[0], + "Referrer-Policy": "strict-origin-when-cross-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" + } + }); + const size = fetch.headers['content-length'] ? formatSize(fetch.headers['content-length']) : '1 KB'; + const chSize = sizeLimit(size, '200'); + if (chSize.oversize) return conn.reply(m.chat, ` ๐Ÿšฉ File size (${size}) exceeds the maximum limit, we can't download the file.`, m); + if (/json/i.test(fetch.headers['content-type'])) return m.reply(jsonFormat(fetch.data)); + if (/text/i.test(fetch.headers['content-type'])) return m.reply(fetch.data); + conn.sendFile(m.chat, args[0], '', '', m); + } catch (e) { + console.log(e); + return conn.reply(m.chat, e.message, m); + } +}; + +handler.help = ['fetch', 'get'].map(v => v + ' <url>'); +handler.tags = ['internet']; +handler.command = /^(fetch|get)$/i; + +module.exports = handler; +function formatSize(bytes) { + if (bytes === 0) return '0 Bytes'; + const k = 1024; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; +} + +function sizeLimit(size, limit) { + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; + const limitSize = parseFloat(limit); + const limitUnit = limit.replace(/[\d.]/g, ''); + const limitIndex = sizes.findIndex(unit => unit === limitUnit); + const currentSize = parseFloat(size); + const currentUnit = size.replace(/[\d.]/g, ''); + const currentIndex = sizes.findIndex(unit => unit === currentUnit); + + if (currentIndex > limitIndex) { + return { + oversize: true, + currentSize: currentSize, + currentUnit: currentUnit, + limitSize: limitSize, + limitUnit: limitUnit + }; + } else { + return { + oversize: false, + currentSize: currentSize, + currentUnit: currentUnit, + limitSize: limitSize, + limitUnit: limitUnit + }; + } +} + +function jsonFormat(json) { + return JSON.stringify(json, null, 2); +} + diff --git a/plugins/internet-gimage.js b/plugins/internet-gimage.js new file mode 100644 index 0000000000000000000000000000000000000000..b7383e048f96637f8bab7c54069927c13a5688e1 --- /dev/null +++ b/plugins/internet-gimage.js @@ -0,0 +1,23 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) throw `Use example ${usedPrefix}${command} Minecraft`; + try { + const res = await (await fetch(`https://api.botcahx.eu.org/api/search/googleimage?text1=${encodeURIComponent(text)}&apikey=${btc}`)).json(); + if (!res.status) throw eror + let image = pickRandom(res.result).url; + conn.sendFile(m.chat, image, 'google.jpg', `*G O O G L E*\n*Result:* ${text}\n*Source:* https://google.com`, m); + } catch (e) { + throw eror + } +}; + +handler.help = ['gimage <query>', 'image <query>']; +handler.tags = ['internet']; +handler.command = /^(gimage|image)$/i; + +module.exports = handler; + +function pickRandom(arr) { + return arr[Math.floor(Math.random() * arr.length)]; +} diff --git a/plugins/internet-github-search.js b/plugins/internet-github-search.js new file mode 100644 index 0000000000000000000000000000000000000000..cbad1a3d4a8b83f3daa6da9b888b0abc33a95eaf --- /dev/null +++ b/plugins/internet-github-search.js @@ -0,0 +1,41 @@ +let fetch = require('node-fetch') +let handler = async (m, { text }) => { + if (!text) throw 'Cari apa?' + let res = await fetch(global.API('https://api.github.com', '/search/repositories', { + q: text + })) + let json = await res.json() + if (res.status !== 200) throw json + let str = json.items.map((repo, index) => { + return ` +${1 + index}. *${repo.full_name}*${repo.fork ? ' (fork)' : ''} +_${repo.html_url}_ +_Dibuat pada *${formatDate(repo.created_at)}*_ +_Terakhir update pada *${formatDate(repo.updated_at)}*_ +๐Ÿ‘ ${repo.watchers} ๐Ÿด ${repo.forks} โญ ${repo.stargazers_count} +${repo.open_issues} Issue${repo.description ? ` +*Deskripsi:*\n${repo.description}` : ''} +*Clone:* \`\`\`$ git clone ${repo.clone_url}\`\`\` +`.trim() + }).join('\n\n') + m.reply(str) +} +handler.help = ['githubsearch'].map(v => v + ' <pencarian>') +handler.tags = ['tools'] + +handler.command = /^g(ithub|h)search$/i + +module.exports = handler + +function formatDate(n, locale = 'id') { + let d = new Date(n) + return d.toLocaleDateString(locale, { + weekday: 'long', + day: 'numeric', + month: 'long', + year: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric' + }) + } \ No newline at end of file diff --git a/plugins/internet-google.js b/plugins/internet-google.js new file mode 100644 index 0000000000000000000000000000000000000000..e2a8102dd760b9ebd1340eccfd6125c029c07306 --- /dev/null +++ b/plugins/internet-google.js @@ -0,0 +1,40 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { conn, command, args }) => { + let text = args[0]; + if (!text) return conn.reply(m.chat, 'Tidak ada teks untuk dicari', m); + + try { + let response = await fetch(`https://api.botcahx.eu.org/api/search/google?text1=${encodeURIComponent(text)}&apikey=${btc}`); + let data = await response.json(); + + if (!data.status) throw eror + + let msg = data.result.map(({ title, url, description }) => { + return `*${title}*\n_${url}_\n_${description}_`; + }).join('\n\n'); + conn.relayMessage(m.chat, { + extendedTextMessage:{ + text: msg, + contextInfo: { + externalAdReply: { + title: wm, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://telegra.ph/file/d7b761ea856b5ba7b0713.jpg', + sourceUrl: '' + } + }, mentions: [m.sender] +}}, {}) + } catch (e) { + throw eror + } +}; + +handler.help = ['google'].map(v => v + ' <pencarian>'); +handler.tags = ['internet']; +handler.command = /^google$/i; +handler.limit = true; + +module.exports = handler; diff --git a/plugins/internet-jarak.js b/plugins/internet-jarak.js new file mode 100644 index 0000000000000000000000000000000000000000..449ce469aa923d1e15f219ba835ef4029bc588d4 --- /dev/null +++ b/plugins/internet-jarak.js @@ -0,0 +1,21 @@ +const fetch = require('node-fetch'); +let handler = async (m, { + conn, + text, + usedPrefix, + command + }) => { + var [from, to] = text.split`|` + if (!(from && to)) throw `Ex: ${usedPrefix + command} jakarta|bandung` + try { + let data = await fetch(`https://api.botcahx.eu.org/api/search/jarak?from=${from}&to=${to}&apikey=${btc}`) + let json = await data.json() + await conn.sendFile(m.chat, json.message.data, 'jarak.png', json.message.desc, m) + } catch (error) { + throw `๐Ÿšฉ *Jarak Tidak Ditemukan*` + } +} +handler.command = handler.help = ['jarak'] +handler.tags = ['internet'] +handler.limit = true +module.exports = handler diff --git a/plugins/internet-kodebahasa.js b/plugins/internet-kodebahasa.js new file mode 100644 index 0000000000000000000000000000000000000000..f732ecf7801f4d787b6e86a361fef60328ebf674 --- /dev/null +++ b/plugins/internet-kodebahasa.js @@ -0,0 +1,61 @@ +let handler = async m => m.reply(` +โ”โ”โ”ยฐโ€โฌ *Kode Bahasa* โญโ€ยฐโ”โ”โ”“ +โ”ƒ +โ”ƒโ€ข af : Afrikaans +โ”ƒโ€ข sq : Albanian +โ”ƒโ€ข ar : Arab +โ”ƒโ€ข hy : Armenian +โ”ƒโ€ข ca : Catalan +โ”ƒโ€ข zh : Chinese +โ”ƒโ€ข zh-cn : Chinese (Mandarin/China) +โ”ƒโ€ข zh-tw : Chinese (Mandarin/Taiwan) +โ”ƒโ€ข zh-yue : Chinese (Cantonese) +โ”ƒโ€ข hr : Croatian +โ”ƒโ€ข cs : Czech +โ”ƒโ€ข da : Danish +โ”ƒโ€ข nl : Dutch +โ”ƒโ€ข en : English +โ”ƒโ€ข en-au : English (Australia) +โ”ƒโ€ข en-uk : English (United Kingdom) +โ”ƒโ€ข en-us : English (United States) +โ”ƒโ€ข eo : Esperanto +โ”ƒโ€ข fi : Finnish +โ”ƒโ€ข fr : French +โ”ƒโ€ข de : German +โ”ƒโ€ข el : Greek +โ”ƒโ€ข ht : Haitian Creole +โ”ƒโ€ข hi : Hindi +โ”ƒโ€ข hu : Hungarian +โ”ƒโ€ข is : Icelandic +โ”ƒโ€ข id : Indonesian +โ”ƒโ€ข it : Italian +โ”ƒโ€ข ja : Japanese +โ”ƒโ€ข ko : Korean +โ”ƒโ€ข la : Latin +โ”ƒโ€ข lv : Latvian +โ”ƒโ€ข mk : Macedonian +โ”ƒโ€ข no : Norwegian +โ”ƒโ€ข pl : Polish +โ”ƒโ€ข pt : Portuguese +โ”ƒโ€ข pt-br : Portuguese (Brazil) +โ”ƒโ€ข ro : Romanian +โ”ƒโ€ข ru : Russian +โ”ƒโ€ข sr : Serbian +โ”ƒโ€ข sk : Slovak +โ”ƒโ€ข es : Spanish +โ”ƒโ€ข es-es : Spanish (Spain) +โ”ƒโ€ข es-us : Spanish (United States) +โ”ƒโ€ข sw : Swahili +โ”ƒโ€ข sv : Swedish +โ”ƒโ€ข ta : Tamil +โ”ƒโ€ข th : Thai +โ”ƒโ€ข tr : Turkish +โ”ƒโ€ข vi : Vietnamese +โ”ƒโ€ข cy : Welsh +โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” +`.trim()) // Tambah sendiri kalo mau +handler.help = ['kodebahasa'] +handler.tags = ['internet'] +handler.command = /^kodebahasa$/i + +module.exports = handler diff --git a/plugins/internet-kodepos.js b/plugins/internet-kodepos.js new file mode 100644 index 0000000000000000000000000000000000000000..2676455982ce6969a7097f39b186641ddb88714c --- /dev/null +++ b/plugins/internet-kodepos.js @@ -0,0 +1,27 @@ +const fetch = require('node-fetch'); + +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `Penggunaan:\n${usedPrefix + command} <nama daerah>\n\nContoh:\n${usedPrefix + command} Cilacap`; + try { + let res = await fetch(`https://api.botcahx.eu.org/api/search/kodepos?query=${encodeURIComponent(text)}&apikey=${btc}`); + if (!res.ok) throw 'Data tidak ditemukan'; + let json = await res.json(); + if (!json.status || json.code !== 200) throw eror; + let result = json.result; + if (result.length === 0) throw 'Kode pos tidak ditemukan'; + + let message = result.map((item, index) => + `${index + 1}. Provinsi: ${item.province}\nKota: ${item.city}\nKecamatan: ${item.district}\nDesa: ${item.village}\nKode Pos: ${item.postalCode}` + ).join('\n\n'); + + m.reply(message); + } catch (error) { + m.reply('Terjadi error saat mencari kode pos, silakan coba lagi nanti'); + } +}; + +handler.help = ['kodepos']; +handler.tags = ['internet']; +handler.command = /^(kodepos)$/i; + +module.exports = handler; diff --git a/plugins/internet-lirik.js b/plugins/internet-lirik.js new file mode 100644 index 0000000000000000000000000000000000000000..a85d3af60b3c039b8e497c413159300c2ab8a8b4 --- /dev/null +++ b/plugins/internet-lirik.js @@ -0,0 +1,41 @@ +let fetch = require("node-fetch"); +let handler = async (m, { + conn, + text, + usedPrefix, + command +}) => { + if (!text) throw `Ex: ${usedPrefix}${command} Jiwa yang bersedih` + try { + let data = await (await fetch(`https://api.botcahx.eu.org/api/search/lirik?lirik=${text}&apikey=${btc}`)).json() + let caption = ` +${data.result.lyrics} + +โ„น๏ธ More info: +๐Ÿ”— ${data.result.image} +๐ŸŽค Artist: ${data.result.artist}` + await conn.relayMessage(m.chat, { + extendedTextMessage:{ + text: caption, + contextInfo: { + externalAdReply: { + title: `๐ŸŽต ${data.result.title} - ${data.result.artist} ๐ŸŽต`, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: data.result.image, + sourceUrl: '' + } + }, mentions: [m.sender] +}}, {}) + } catch (e) { + console.log(e) + m.reply('Terjadi kesalahan, silahkan coba lagi nanti') + } +} + +handler.help = ['lirik'].map(v => v + ' <Title>') +handler.tags = ['internet'] +handler.command = /^(lirik|lyrics|lyric)$/i + +module.exports = handler diff --git a/plugins/internet-ppcp.js b/plugins/internet-ppcp.js new file mode 100644 index 0000000000000000000000000000000000000000..e4f8c7f71c3a4480e105fd0e04840576b0fe447d --- /dev/null +++ b/plugins/internet-ppcp.js @@ -0,0 +1,15 @@ +let fetch = require('node-fetch') +let handler = async (m, { conn, command }) => { + let res = await fetch(`https://api.botcahx.eu.org/api/randomgambar/couplepp?apikey=${btc}`) + if (res.status != 200) throw await res.text() + let json = await res.json() + if (!json.status) throw json +conn.sendFile(m.chat, json.result.female, 'pp.jpg', 'PP Cewenya', m) +conn.sendFile(m.chat, json.result.male,'pria.jpg', 'PP Cowonya', m) + +} +handler.help = ['ppcp'] +handler.tags = ['internet'] +handler.command = /^ppcp$/i + +module.exports = handler diff --git a/plugins/internet-spek.js b/plugins/internet-spek.js new file mode 100644 index 0000000000000000000000000000000000000000..e137aaec02d8f8f2ab4387e6f535fb86f093a757 --- /dev/null +++ b/plugins/internet-spek.js @@ -0,0 +1,46 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { text, conn, usedPrefix, command }) => { + if (!text) throw `*๐Ÿšฉ Contoh:* ${usedPrefix + command} Vivo`; + let teks = ''; + try { + const api = await fetch(`https://api.botcahx.eu.org/api/webzone/gsmarena?query=${text}&apikey=${btc}`); + let json = await api.json(); + let res = json.result.fitur; + for (let i in res) { + teks += `${res[i].desc}\n`; + } + for (let i in json.result.spek) { + let spec = json.result.spek[i]; + teks += `${spec.name}\n`; + teks += `*Specification :* ${spec.fitur}\n\n`; + } + teks += `*Priview :* ${json.result.img}\n\n`; + await conn.relayMessage(m.chat, { + extendedTextMessage: { + text: teks, + contextInfo: { + externalAdReply: { + title: 'DEVICE INFORMATION', + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: json.result.img, + sourceUrl: json.result.img + } + }, + mentions: [m.sender] + } + }, {}); + } catch (e) { + throw `๐Ÿšฉ *Gagal Memuat Data!*`; + } +}; + +handler.command = handler.help = ['spek','gsmarena','spesifikasi']; +handler.tags = ['internet']; +handler.premium = false; +handler.group = false; +handler.limit = true + +module.exports = handler; diff --git a/plugins/internet-translate.js b/plugins/internet-translate.js new file mode 100644 index 0000000000000000000000000000000000000000..86c18171b48e12dbb44efc58d9b0ed2e80832abf --- /dev/null +++ b/plugins/internet-translate.js @@ -0,0 +1,21 @@ +const { translate } = require('@vitalets/google-translate-api'); +const defaultLang = 'id' +let handler = async (m, { args, usedPrefix, command }) => { + if (!args[0] && !m.quoted) { + throw `*โ€ข Example* : ${usedPrefix}${command} id how are you` + } + let lang = args[0] + let text = args.slice(1).join(' ') + if ((args[0] || '').length !== 2) { + lang = defaultLang + text = args.join(' ') + } + if (!text && m.quoted && m.quoted.text) text = m.quoted.text + let result = await translate(text, { to: lang, autoCorrect: true }).catch(_ => null) + if (!result) throw 'Terjemahan gagal.' + m.reply(result.text.toString()) +} +handler.help = ['tr <leng> <text>'] +handler.tags = ['tools'] +handler.command = ['translate', 'tl', 'trid', 'tr'] +module.exports = handler diff --git a/plugins/kerang-apakah.js b/plugins/kerang-apakah.js new file mode 100644 index 0000000000000000000000000000000000000000..216c99137cdf1e935b3a1f215e0fd5abb90fd1db --- /dev/null +++ b/plugins/kerang-apakah.js @@ -0,0 +1,21 @@ +let handler = async (m, { conn, text }) => { + conn.reply(m.chat, `${pickRandom(['Yap','Sepertinya Begitu','Kayaknya','Kayaknya nggak','Nggak','Nggak mungkin'])} +`.trim(), m, m.mentionedJid ? { + contextInfo: { + mentionedJid: m.mentionedJid + } +} : {}) +} +handler.help = ['apakah <teks>?'] +handler.tags = ['kerang'] +handler.customPrefix = /(\?$)/ +handler.command = /^apakah$/i +handler.owner = false + +handler.fail = null + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} diff --git a/plugins/kerang-cek.js b/plugins/kerang-cek.js new file mode 100644 index 0000000000000000000000000000000000000000..9b751175cb3936a1de68f9f61fefc44a08f6d6d6 --- /dev/null +++ b/plugins/kerang-cek.js @@ -0,0 +1,26 @@ +let handler = async (m, { conn, usedPrefix, command, text }) => { +let memek = 'https://telegra.ph/file/1aa347ff346c2bf5ee181.jpg' +let anu =` +โ”€โ”€โ”€โ”€ใ€” *${command}* ใ€•โ”€โ”€โ”€โ”€ + +${command.replace('cek', '').toUpperCase()} LEVEL *${Math.floor(Math.random() * 101)}*% + +Seberapapun *${command.replace('cek', '').toUpperCase()}* Mu +Tetap *SYUKURI* itu` +m.reply(anu) +} +handler.help = ['gay', 'pintar', 'cantik', 'ganteng', 'gabut', 'gila', 'lesbi', 'stress', 'bucin', 'jones', 'sadboy'].map(v => v + 'cek') +handler.tags = ['kerang'] +handler.command = /^(gay|pintar|cantik|ganteng|gabut|gila|lesbi|stress?|bucin|jones|sadboy)cek/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler diff --git a/plugins/kerang-how.js b/plugins/kerang-how.js new file mode 100644 index 0000000000000000000000000000000000000000..9fbc75763c74a1dcfd846ee7523eeaf891855a72 --- /dev/null +++ b/plugins/kerang-how.js @@ -0,0 +1,26 @@ +let handler = async (m, { conn, command, text }) => { + if (!text) throw `Siapa Yang *${command.replace('how', '').toUpperCase()}*` + conn.reply(m.chat, ` +${command} *${text}* +*${text}* is *${Math.floor(Math.random() * 101)}*% ${command.replace('how', '').toUpperCase()} +`.trim(), m, m.mentionedJid ? { + contextInfo: { + mentionedJid: m.mentionedJid + } + } : {}) +} +handler.help = ['gay', 'pintar', 'cantik', 'ganteng', 'gabut', 'gila', 'lesbi', 'stress', 'bucin', 'jones', 'sadboy'].map(v => 'how' + v + ' siapa?') +handler.tags = ['kerang'] +handler.command = /^how(gay|pintar|cantik|ganteng|gabut|gila|lesbi|stress?|bucin|jones|sadboy)/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler diff --git a/plugins/kerang-kapankah.js b/plugins/kerang-kapankah.js new file mode 100644 index 0000000000000000000000000000000000000000..eb489e09ff86bf7eea103dff74409ba8865c9bb7 --- /dev/null +++ b/plugins/kerang-kapankah.js @@ -0,0 +1,29 @@ +let handler = async (m, { conn, text }) => { + conn.reply(m.chat, `Kayaknya ${Math.floor(Math.random() * 100)} ${pickRandom(['detik', 'menit', 'jam', 'hari', 'minggu', 'bulan', 'tahun', 'abad'])} lagi ... +`.trim(), m, m.mentionedJid ? { + contextInfo: { + mentionedJid: m.mentionedJid + } +} : {}) +} +handler.help = ['', 'kah'].map(v => 'kapan' + v + ' <text>?') +handler.tags = ['kerang'] +handler.customPrefix = /(\?$)/ +handler.command = /^kapan(kah)?$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} + diff --git a/plugins/main-api.js b/plugins/main-api.js new file mode 100644 index 0000000000000000000000000000000000000000..8c66ab88c5ee39ad848e36f1e30eef466cb0035a --- /dev/null +++ b/plugins/main-api.js @@ -0,0 +1,35 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { conn }) => { + try { + await m.reply(wait) + let api = await fetch(`https://api.botcahx.eu.org/api/checkkey?apikey=${btc}`); + let body = await api.json(); + let { + email, + username, + limit, + premium, + expired, + todayHit, + totalHit + } = body.result; + + let capt = `ไน‚ *C H E C K A P I K E Y*\n\n`; + capt += `โ—ฆ *Email*: ${email}\n`; + capt += `โ—ฆ *Username*: ${username}\n`; + capt += `โ—ฆ *Limit*: ${limit}\n`; + capt += `โ—ฆ *Premium*: ${premium}\n`; + capt += `โ—ฆ *Expired*: ${expired}\n`; + capt += `โ—ฆ *Today Hit*: ${todayHit}\n`; + capt += `โ—ฆ *Total Hit*: ${totalHit}\n\n`; + await conn.reply(m.chat, capt, m); + } catch (e) { + throw eror + } +}; + +handler.command = handler.help = ['checkapi', 'api']; +handler.tags = ['main']; +handler.owner = true; +module.exports = handler diff --git a/plugins/main-buttonrespon.js b/plugins/main-buttonrespon.js new file mode 100644 index 0000000000000000000000000000000000000000..ceba1ec20e74931723a910d25315c72fd5b733d6 --- /dev/null +++ b/plugins/main-buttonrespon.js @@ -0,0 +1,69 @@ +const { proto, generateWAMessage, areJidsSameUser } = require('@adiwajshing/baileys') +//const util = require('util') + +module.exports = { + async all(m, chatUpdate) { + if (m.isBaileys) return + if (!m.message) return + if (!(m.message.buttonsResponseMessage || m.message.templateButtonReplyMessage || m.message.listResponseMessage)) return + let id = m.message.buttonsResponseMessage?.selectedButtonId || m.message.templateButtonReplyMessage?.selectedId || m.message.listResponseMessage?.singleSelectReply.selectedRowId + let text = m.message.buttonsResponseMessage?.selectedDisplayText || m.message.templateButtonReplyMessage?.selectedDisplayText || m.message.listResponseMessage?.description + let isIdMessage = false, usedPrefix + for (let name in global.plugins) { + let plugin = global.plugins[name] + if (!plugin) continue + if (plugin.disabled) continue + if (!opts['restrict']) if (plugin.tags && plugin.tags.includes('admin')) continue + if (typeof plugin !== 'function') continue + if (!plugin.command) continue + const str2Regex = str => str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') + let _prefix = plugin.customPrefix ? plugin.customPrefix : this.prefix ? this.prefix : global.prefix + let match = (_prefix instanceof RegExp ? // RegExp Mode? + [[_prefix.exec(id), _prefix]] : + Array.isArray(_prefix) ? // Array? + _prefix.map(p => { + let re = p instanceof RegExp ? // RegExp in Array? + p : + new RegExp(str2Regex(p)) + return [re.exec(id), re] + }) : + typeof _prefix === 'string' ? // String? + [[new RegExp(str2Regex(_prefix)).exec(id), new RegExp(str2Regex(_prefix))]] : + [[[], new RegExp]] + ).find(p => p[1]) + if ((usedPrefix = (match[0] || '')[0])) { + let noPrefix = id.replace(usedPrefix, '') + let [command, ...args] = noPrefix.trim().split` `.filter(v => v) + command = (command || '').toLowerCase() + let isId = plugin.command instanceof RegExp ? // RegExp Mode? + plugin.command.test(command) : + Array.isArray(plugin.command) ? // Array? + plugin.command.some(cmd => cmd instanceof RegExp ? // RegExp in Array? + cmd.test(command) : + cmd === command + ) : + typeof plugin.command === 'string' ? // String? + plugin.command === command : + false + if (!isId) continue + console.log({ name, command: plugin.command, text: id }) + isIdMessage = true + } + + } + let messages = await generateWAMessage(m.chat, { text: isIdMessage ? id : text, mentions: m.mentionedJid }, { + userJid: this.user.id, + quoted: m.quoted && m.quoted.fakeObj + }) + messages.key.fromMe = areJidsSameUser(m.sender, this.user.id) + messages.key.id = m.key.id + messages.pushName = m.name + if (m.isGroup) messages.participant = m.sender + let msg = { + ...chatUpdate, + messages: [proto.WebMessageInfo.fromObject(messages)], + type: 'append' + } + this.ev.emit('messages.upsert', msg) + } +} diff --git a/plugins/main-checkexp.js b/plugins/main-checkexp.js new file mode 100644 index 0000000000000000000000000000000000000000..c68b80cf4b449ff30893e495f6e4a7744a48c98d --- /dev/null +++ b/plugins/main-checkexp.js @@ -0,0 +1,16 @@ +let fetch = require('node-fetch') +let handler = async (m, { text }) => { +if (!text) throw `Masukan Username Di Website` + try { + let api = await fetch(`https://api.botcahx.eu.org/api/checkexp?username=${text}`) + let body = await api.text() + m.reply(body) + } catch (e) { + console.log(e) + m.reply('Username tidak terdaftar!') + } +} +handler.command = handler.help = ['checkexp','cekexp']; +handler.tags = ['main']; +handler.private = true +module.exports = handler; diff --git a/plugins/main-gcbot.js b/plugins/main-gcbot.js new file mode 100644 index 0000000000000000000000000000000000000000..1b9e94947fd3834e2876adf56466586db691f013 --- /dev/null +++ b/plugins/main-gcbot.js @@ -0,0 +1,8 @@ +let handler = async (m, { conn }) => { +conn.reply(m.chat, gc, m) +} +handler.help = ['gcbot'] +handler.tags = ['main'] +handler.command = /^(gcbot)$/i + +module.exports = handler diff --git a/plugins/maker-carbon.js b/plugins/maker-carbon.js new file mode 100644 index 0000000000000000000000000000000000000000..2ed1f15e7c70fd58725e18b24de4a9810b3fdcca --- /dev/null +++ b/plugins/maker-carbon.js @@ -0,0 +1,24 @@ +const fetch = require('node-fetch'); + +let handler = async (m, { conn, args }) => { + let text + if (args.length >= 1) { + text = args.slice(0).join(" ") + } else if (m.quoted && m.quoted.text) { + text = m.quoted.text + } else throw "Input teks atau reply teks yang ingin di jadikan carbon!" + if (!text) return m.reply('masukan text') + try { + m.reply(wait) + let img = await fetch(`https://api.botcahx.eu.org/api/maker/carbon?text=${text}&apikey=${btc}`).then(res => res.json()); + await conn.sendFile(m.chat, img.result, 'img.jpeg', '', m) + } catch (e) { + throw `${eror}` + } +} + +handler.help = ['carbon'] +handler.tags = ['maker'] +handler.command = /^(carbon|carbonara)$/i +handler.limit = true +module.exports = handler diff --git a/plugins/maker-hartatahta.js b/plugins/maker-hartatahta.js new file mode 100644 index 0000000000000000000000000000000000000000..be04f71bfef61446378da638297c293ddb28a83c --- /dev/null +++ b/plugins/maker-hartatahta.js @@ -0,0 +1,109 @@ +let fs = require('fs') +let handler = async (m, { conn, text }) => { + conn.hartatahta = conn.hartatahta ? conn.hartatahta : {} + if (m.chat in conn.hartatahta) throw 'Masih ada yang sedang membuat\nTeks Harta Tahta\ndi chat ini... tunggu sampai selesai' + else conn.hartatahta[m.chat] = true + m.reply('_Sedang membuat..._\n*Mohon tunggu*') + try { + let img = await ht(text ? text : 'your title') + conn.sendFile(m.chat, img, 'Harta Tahta.png', '*Nih*', m) + setTimeout(() => { + fs.unlinkSync(img) + }, 5000); + } finally { + delete conn.hartatahta[m.chat] + } +} +handler.help = ['tahta <teks>'] +handler.tags = ['tools'] +handler.command = /^((harta)?tahta)$/i +handler.limit = false + +module.exports = handler + +let { spawn } = require('child_process') +let path = require('path') +let src = path.join(__dirname, '../src/') +let tmp = path.join(__dirname, '../tmp/') +let _font = path.join(src, 'font') +let aesthetic = path.join(src, 'Aesthetic') +function ht(text = '') { + return new Promise((resolve, reject) => { + let img = path.join(aesthetic, pickRandom(fs.readdirSync(aesthetic))) + let font = path.join(_font, 'Roboto-Black.ttf') + let w = 1024 + let h = w + let s = w + 'x' + h + let xF = `(${noise('X', 2, w, 1)}+${noise('Y', 1, h, 1)})/2+128` + let yF = `((${pickRandom(['', '-'])}${45 * w / 2048}*${pickRandom(['sin', 'cos'])}(X/${w}*4*PI))+${noise('X', 5, w, 0.8)}+${noise('Y', 2, h, 1)})/1.7+128` + let fsize = 320 / 2048 * w + let lh = 1.5 + let format = ',format=rgb24' + let layers = [ + `[v:0]scale=${s}${format}[im]`, + textArgs('HARTA', 'black', 'white', fsize, font, '(w-text_w)/2', `(h-text_h)/2-(text_h*${lh})`, w, h) + format + '[top]', + textArgs('TAHTA', 'black', 'white', fsize, font, '(w-text_w)/2', `(h-text_h)/2`, w, h) + format + '[mid]', + textArgs(text, 'black', 'white', fsize, font, '(w-text_w)/2', `(h-text_h)/2+(text_h*${lh})`, w, h) + format + '[bot]', + '[top][mid]blend=all_mode=addition[con]', + '[con][bot]blend=all_mode=addition[txt]', + `nullsrc=s=${s},geq='r=${xF}:g=${xF}:b=${xF}'[dx]`, + `nullsrc=s=${s},geq='r=${yF}:g=${yF}:b=${yF}'[dy]`, + '[txt][dx][dy]displace[wa]', + '[im][wa]blend=all_mode=multiply:all_opacity=1' + ] + + let o = 1 * new Date + '_harta_tahta.png' + o = path.join(tmp, o) + let args = [ + '-y', + '-i', img, + '-filter_complex', layers.join(';'), + '-frames:v', '1', + o + ] + console.log(layers) + console.log('ffmpeg', ...args) + spawn('ffmpeg', args) + .on('error', reject) + .on('close', () => { + try { + resolve(fs.readFileSync(o)) + + } catch (e) { + reject(e) + } + }) + //.stderr.on('data', a => console.log(a+'')) + }) +} + +function noise(_var, depth = 4, s = 1024, freq) { + let forms = [] + for (let i = 0; i < depth; i++) forms.push( + formula( + _var, + freq * rand(40, 80) * (s / 2048)/ s * ((i + 1) / 5), + rand(-Math.PI, Math.PI), + (i + 1) / depth * 8, + 0 + ) + ) + return forms.join('+') +} + +function formula(_var, freq, offset, amp, add) { + return `(${add.toFixed(3)}+${amp.toFixed(4)}*sin(${offset.toFixed(6)}+2*PI*${_var}*${freq.toFixed(6)}))` +} + +function textArgs(text, background, color, size, fontfile, x = '200' , y = '200', w = 1024, h = 1024) { + return `color=${background}:s=${w}x${h},drawtext=text='${text.replace(/[\\]/g, '\\$&')}':fontfile='${fontfile.replace(/[\\]/g, '\\$&')}':x=${x}:y=${y}:fontsize=${size}:fontcolor=${color}` +} + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} + +function rand(min, max, q = 0.001) { + return Math.floor((Math.random() * (max - min)) / q) * q +} + diff --git a/plugins/maker-jadianime.js b/plugins/maker-jadianime.js new file mode 100644 index 0000000000000000000000000000000000000000..0bb2a660f0efefe963422a357339b918cfcb4ba1 --- /dev/null +++ b/plugins/maker-jadianime.js @@ -0,0 +1,35 @@ +const uploadImage = require('../lib/uploadImage'); +const fetch = require('node-fetch'); +let handler = async (m, { +conn, +usedPrefix, +command + }) => { + var q = m.quoted ? m.quoted : m + var mime = (q.msg || q).mimetype || q.mediaType || '' + if (/image/g.test(mime) && !/webp/g.test(mime)) { + await conn.reply(m.chat, wait, m) + try { + const img = await q.download?.() + let out = await uploadImage(img) + let old = new Date() + let res = await fetch(`https://api.botcahx.eu.org/api/maker/jadianime?url=${out}&apikey=${btc}`) + let convert = await res.json() + let buff = await fetch(convert.result.img_crop_single) + .then(res => res.buffer()) + await conn.sendMessage(m.chat, { image: buff, caption: `๐ŸŸ *Fetching* : ${((new Date - old) * 1)} ms` }, { quoted: m }) + } catch (e) { + console.log(e) + m.reply(`[ ! ] Identifikasi Gagal.`) + } + } else { + m.reply(`Kirim gambar dengan caption *${usedPrefix + command}* atau tag gambar yang sudah dikirim`) + } +}; +handler.help = ['jadianime']; +handler.command = ['toanime', 'jadianime']; +handler.tags = ['maker']; +handler.premium = false; +handler.limit = true +module.exports = handler; + diff --git a/plugins/maker-jadianime3d.js b/plugins/maker-jadianime3d.js new file mode 100644 index 0000000000000000000000000000000000000000..fd7e02601b4608a98311870c9ee5fd16aaf2d72c --- /dev/null +++ b/plugins/maker-jadianime3d.js @@ -0,0 +1,36 @@ +const fetch = require("node-fetch"); +const FormData = require('form-data'); +const { fromBuffer } = require('file-type'); +const uploadImage = require('../lib/uploadImage.js') +let handler = async (m, { +conn, +usedPrefix, +command + }) => { + var q = m.quoted ? m.quoted : m + var mime = (q.msg || q).mimetype || q.mediaType || '' + if (/image/g.test(mime) && !/webp/g.test(mime)) { + try { + await conn.reply(m.chat, wait, m) + const img = await q.download?.() + let out = await uploadImage(img) + let old = new Date() + let res = await fetch(`https://api.botcahx.eu.org/api/maker/jadianime3d?url=${out}&apikey=${btc}`) + let convert = await res.json() + let buff = await fetch(convert.result.output.fileUrl) + .then(res => res.buffer()) + await conn.sendMessage(m.chat, { image: buff, caption: `๐ŸŸ *Fetching* : ${((new Date - old) * 1)} ms` }, { quoted: m }) + } catch (e) { + console.log(e) + m.reply(`[ ! ] Identifikasi Gagal.`) + } + } else { + m.reply(`Kirim gambar dengan caption *${usedPrefix + command}* atau tag gambar yang sudah dikirim`) + } +}; +handler.help = ['jadianime3d']; +handler.command = ['toanime3d', 'jadianime3d']; +handler.tags = ['maker']; +handler.premium = false; +handler.limit = 5; +module.exports = handler; diff --git a/plugins/maker-jadigta.js b/plugins/maker-jadigta.js new file mode 100644 index 0000000000000000000000000000000000000000..c8e8e9a5c0926b5b4b0dbe8f52e634ff99f3cf91 --- /dev/null +++ b/plugins/maker-jadigta.js @@ -0,0 +1,33 @@ +const uploadImage = require('../lib/uploadImage'); +const fetch = require("node-fetch"); +let handler = async (m, { +conn, +usedPrefix, +command + }) => { + var q = m.quoted ? m.quoted : m + var mime = (q.msg || q).mimetype || q.mediaType || '' + if (/image/g.test(mime) && !/webp/g.test(mime)) { + await conn.reply(m.chat, wait, m) + try { + const img = await q.download?.() + let out = await uploadImage(img) + let old = new Date() + let res = await fetch(`https://api.botcahx.eu.org/api/maker/jadigta?url=${out}&apikey=${btc}`) + let convert = await res.json() + let buff = await fetch(convert.result) + .then(result => result.buffer()) + await conn.sendMessage(m.chat, { image: buff, caption: `๐ŸŸ *Fetching* : ${((new Date - old) * 1)} ms` }, { quoted: m }) + } catch (e) { + console.log(e) + m.reply(`[ ! ] Identifikasi Gagal.`) + } + } else { + m.reply(`Kirim gambar dengan caption *${usedPrefix + command}* atau tag gambar yang sudah dikirim`) + } +}; +handler.help = handler.command = ['jadigta','togta']; +handler.tags = ['maker']; +handler.premium = false; +handler.limit = true; +module.exports = handler; diff --git a/plugins/maker-jadizombie.js b/plugins/maker-jadizombie.js new file mode 100644 index 0000000000000000000000000000000000000000..34c2b183bf8020b73bfc79ef75b53801f0e19b11 --- /dev/null +++ b/plugins/maker-jadizombie.js @@ -0,0 +1,34 @@ +const uploadImage = require('../lib/uploadImage'); +const fetch = require("node-fetch"); +let handler = async (m, { +conn, +usedPrefix, +command + }) => { + var q = m.quoted ? m.quoted : m + var mime = (q.msg || q).mimetype || q.mediaType || '' + if (/image/g.test(mime) && !/webp/g.test(mime)) { + await conn.reply(m.chat, wait, m) + try { + const img = await q.download?.() + let out = await uploadImage(img) + let old = new Date() + let res = await fetch(`https://api.botcahx.eu.org/api/maker/jadizombie?url=${out}&apikey=${btc}`) + let convert = await res.json() + let buff = await fetch(convert.result) + .then(res => res.buffer()) + await conn.sendMessage(m.chat, { image: buff, caption: `๐ŸŸ *Fetching* : ${((new Date - old) * 1)} ms` }, { quoted: m }) + } catch (e) { + console.log(e) + m.reply(`[ ! ] Identifikasi Gagal.`) + } + } else { + m.reply(`Kirim gambar dengan caption *${usedPrefix + command}* atau tag gambar yang sudah dikirim`) + } +}; +handler.help = ['jadizombie']; +handler.command = ['jadizombie']; +handler.tags = ['maker']; +handler.premium = false; +handler.limit = 5; +module.exports = handler; diff --git a/plugins/maker-qc.js b/plugins/maker-qc.js new file mode 100644 index 0000000000000000000000000000000000000000..44625c1dc2f65a8a10e68f5e14fd5992880fb63a --- /dev/null +++ b/plugins/maker-qc.js @@ -0,0 +1,56 @@ +let { sticker5 } = require('../lib/sticker.js') +let axios = require('axios') + +let handler = async (m, { conn, args }) => { +let text + if (args.length >= 1) { + text = args.slice(0).join(" ") + } else if (m.quoted && m.quoted.text) { + text = m.quoted.text + } else throw "Input teks atau reply teks yang ingin di jadikan quote!" + if (!text) return m.reply('masukan text') + if (text.length > 100) return m.reply('Maksimal 100 Teks!') + +let randomColor = ['#ef1a11', '#89cff0', '#660000', '#87a96b', '#e9f6ff', '#ffe7f7', '#ca86b0', '#83a3ee', '#abcc88', '#80bd76', '#6a84bd', '#5d8d7f', '#530101', '#863434', '#013337', '#133700', '#2f3641', '#cc4291', '#7c4848', '#8a496b', '#722f37', '#0fc163', '#2f3641', '#e7a6cb', '#64c987', '#e6e6fa', '#ffa500']; + +let apiColor = randomColor[Math.floor(Math.random() * randomColor.length)]; + + let pp = await conn.profilePictureUrl(m.sender, 'image').catch(_ => 'https://telegra.ph/file/320b066dc81928b782c7b.png') + + const obj = { + "type": "quote", + "format": "png", + "backgroundColor": apiColor, + "width": 512, + "height": 768, + "scale": 2, + "messages": [{ + "entities": [], + "avatar": true, + "from": { + "id": 1, + "name": m.name, + "photo": { + "url": pp + } + }, + "text": text, + "replyMessage": {} + }] + } + const json = await axios.post('https://qc.botcahx.eu.org/generate', obj, { + headers: { + 'Content-Type': 'application/json' + } + }) + const buffer = Buffer.from(json.data.result.image, 'base64') + let stiker = await sticker5(buffer, false, global.packname, global.author) + if (stiker) return conn.sendFile(m.chat, stiker, 'Quotly.webp', '', m) +} + +handler.help = ['qc']; +handler.tags = ['sticker']; +handler.command = /^(qc|quotely)$/i +handler.limit = true; + +module.exports = handler diff --git a/plugins/maker-textpro.js b/plugins/maker-textpro.js new file mode 100644 index 0000000000000000000000000000000000000000..9a351860900b7b561ac021165757e47529238310 --- /dev/null +++ b/plugins/maker-textpro.js @@ -0,0 +1,265 @@ +/** let handler = async (m, { conn, command, text, usedPrefix }) => { + if (!text) throw `๐Ÿšฉ *Contoh:* ${usedPrefix + command} botcahx` + const dates = new Date(); + const timestamp = dates.getTime(); + const date = new Date(timestamp); + const hour = date.getHours().toString().padStart(2, "0"); + const minutes = date.getMinutes().toString().padStart(2, "0"); + const seconds = date.getSeconds().toString().padStart(2, "0"); + const formattedTime = hour + ":" + minutes + ":" + seconds; + await conn.reply(m.chat, wait, m) + try { + if (command == 'giraffe') { + const res = `https://api.botcahx.eu.org/api/textpro/giraffe?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'magma') { + const res = `https://api.botcahx.eu.org/api/textpro/magma?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'hallowen') { + const res = `https://api.botcahx.eu.org/api/textpro/hallowen-text?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'valentine') { + const res = `https://api.botcahx.eu.org/api/textpro/valentine?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'valentine2') { + const res = `https://api.botcahx.eu.org/api/textpro/valentine2?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'neonlight') { + const res = `https://api.botcahx.eu.org/api/textpro/neon-light?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'neongalaxy') { + const res = `https://api.botcahx.eu.org/api/textpro/neon-galaxy?text=?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'neongreen') { + const res = `https://api.botcahx.eu.org/api/textpro/neon-green?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'brokenglass') { + const res = `https://api.botcahx.eu.org/api/textpro/broken-glass?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'artpapper') { + const res = `https://api.botcahx.eu.org/api/textpro/art-papper?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'glossy') { + const res = `https://api.botcahx.eu.org/api/textpro/glossy?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'watercolor') { + const res = `https://api.botcahx.eu.org/api/textpro/water-color?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'multicolor') { + const res = `https://api.botcahx.eu.org/api/textpro/multi-color?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'robot') { + const res = `https://api.botcahx.eu.org/api/textpro/robot?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'scifi') { + const res = `https://api.botcahx.eu.org/api/textpro/scifi?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'neondevil') { + const res = `https://api.botcahx.eu.org/api/textpro/neon-devil?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'skytext') { + const res = `https://api.botcahx.eu.org/api/textpro/sky-text?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'vintage') { + const res = `https://api.botcahx.eu.org/api/textpro/vintage?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'writing') { + const res = `https://api.botcahx.eu.org/api/textpro/writing?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'engraved') { + const res = `https://api.botcahx.eu.org/api/textpro/engraved?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'gluetext') { + const res = `https://api.botcahx.eu.org/api/textpro/glue-text?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'pornhub') { + const res = `https://api.botcahx.eu.org/api/textpro/pornhub?text=${encodeURIComponent(text)}&text2=hub&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'holograpic') { + const res = `https://api.botcahx.eu.org/api/textpro/holograpic?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'deluxesilver') { + const res = `https://api.botcahx.eu.org/api/textpro/deluxe-silver?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'fabric') { + const res = `https://api.botcahx.eu.org/api/textpro/fabric?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'wicker') { + const res = `https://api.botcahx.eu.org/api/textpro/wicker?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'toxic') { + const res = `https://api.botcahx.eu.org/api/textpro/toxic-bokeh?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'strawberry') { + const res = `https://api.botcahx.eu.org/api/textpro/stroberi?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'bread') { + const res = `https://api.botcahx.eu.org/api/textpro/bread?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'lava') { + const res = `https://api.botcahx.eu.org/api/textpro/larva?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'koi') { + const res = `https://api.botcahx.eu.org/api/textpro/koi?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'blood') { + const res = `https://api.botcahx.eu.org/api/textpro/horor-blood?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'honey') { + const res = `https://api.botcahx.eu.org/api/textpro/honey?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'ice') { + const res = `https://api.botcahx.eu.org/api/textpro/ice?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'rusty') { + const res = `https://api.botcahx.eu.org/api/textpro/rusty?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'captainamerica') { + const res = `https://api.botcahx.eu.org/api/textpro/captain?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'gradient') { + const res = `https://api.botcahx.eu.org/api/textpro/3d-gradient?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'christmas') { + const res = `https://api.botcahx.eu.org/api/textpro/christmas?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'dropwater') { + const res = `https://api.botcahx.eu.org/api/textpro/drop-water?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'blackpink') { + const res = `https://api.botcahx.eu.org/api/textpro/black-pink?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'blackpink2') { + const res = `https://api.botcahx.eu.org/api/textpro/black-pink2?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'wolflogo') { + const res = `https://api.botcahx.eu.org/api/textpro/logo-wolf?text=${formattedTime}&text2=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'naturalleaves') { + const res = `https://api.botcahx.eu.org/api/textpro/natural-leaves?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'harrypotter') { + const res = `https://api.botcahx.eu.org/api/textpro/logo-wolf2?text=${formattedTime}&text2=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == '3dstone') { + const res = `https://api.botcahx.eu.org/api/textpro/3dstone?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == '1917') { + const res = `https://api.botcahx.eu.org/api/textpro/1917?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'thunder2') { + const res = `https://api.botcahx.eu.org/api/textpro/thunder2?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'space') { + const res = `https://api.botcahx.eu.org/api/textpro/space?text=${encodeURIComponent(text)}&text2=${formattedTime}&&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'hallowen2') { + const res = `https://api.botcahx.eu.org/api/textpro/hallowen?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'jokerlogo') { + const res = `https://api.botcahx.eu.org/api/textpro/joker-logo?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'blood') { + const res = `https://api.botcahx.eu.org/api/textpro/blood?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'grafity') { + const res = `https://api.botcahx.eu.org/api/textpro/grafity-text?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'grafity2') { + const res = `https://api.botcahx.eu.org/api/textpro/grafity-text2?text=${encodeURIComponent(text)}&text2=&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'glitch') { + const res = `https://api.botcahx.eu.org/api/textpro/glitch?text=${encodeURIComponent(text)}&text2=${formattedTime}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'glitch2') { + const res = `https://api.botcahx.eu.org/api/textpro/glitch2?text=${encodeURIComponent(text)}&text2=${formattedTime}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'glitch3') { + const res = `https://api.botcahx.eu.org/api/textpro/glitch3?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'ninjalogo') { + const res = `https://api.botcahx.eu.org/api/textpro/ninja-logo?text=${encodeURIComponent(text)}&text2=${formattedTime}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'avengers') { + const res = `https://api.botcahx.eu.org/api/textpro/avengers-logo?text=${encodeURIComponent(text)}&text2=Avengers&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'marvelstudio') { + const res = `https://api.botcahx.eu.org/api/textpro/marvel-logo2?text=${encodeURIComponent(text)}&text2=Studio&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'marvelstudio2') { + const res = `https://api.botcahx.eu.org/api/textpro/marvel-logo3?text=${encodeURIComponent(text)}&text2=Studio&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + if (command == 'batman') { + const res = `https://api.botcahx.eu.org/api/textpro/batman-logo?text=${encodeURIComponent(text)}&apikey=${btc}`; + await conn.sendFile(m.chat, res, 'textpro.jpeg', '', m); + } + } catch (err) { + console.error(err) + throw "๐Ÿšฉ Terjadi kesalahan" + }; +}; +handler.command = handler.help = ['giraffe','magma','batman','marvelstudio2','marvelstudio','avengers','ninjalogo','glitch3','glitch2','glitch','grafity','grafity2','blood','jokerlogo','hallowen2','space','thunder2','1917','3dstone','harrypotter','wolflogo','naturalleaves','blackpink','blackpink2','dropwater','christmas','gradient','captainamerica','rusty','ice','honey','blood','koi','lava','bread','strawberry','toxic','wicker','fabric','pornhub','holograpic','deluxesilver','writing','engraved','gluetext','neondevil','skytext','vintage','multicolor','robot','scifi','artpapper','glossy','watercolor','neongreen','brokenglass','artpapper','valentine2','neonlight','neongalaxy','magma','hallowen','valentine'] +handler.tags = ['maker']; +handler.limit = true; +module.exports = handler; +**/ diff --git a/plugins/menu-nsfw.js b/plugins/menu-nsfw.js new file mode 100644 index 0000000000000000000000000000000000000000..2607e97a9775cb6be95c9ccd587b9d33c0a9254f --- /dev/null +++ b/plugins/menu-nsfw.js @@ -0,0 +1,116 @@ +let handler = async (m, { conn, command }) => { + await conn.reply(m.chat, wait, m) + try { + if (command == 'gay') { + const res = `https://api.botcahx.eu.org/api/nsfw/gay?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'ahegao') { + const res = `https://api.botcahx.eu.org/api/nsfw/ahegao?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'ass') { + const res = `https://api.botcahx.eu.org/api/nsfw/ass?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'bdsm') { + const res = `https://api.botcahx.eu.org/api/nsfw/bdsm?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'blowjob') { + const res = `https://api.botcahx.eu.org/api/nsfw/blowjob?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'cuckold') { + const res = `https://api.botcahx.eu.org/api/nsfw/cuckold?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'cum') { + const res = `https://api.botcahx.eu.org/api/nsfw/cum?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'ero') { + const res = `https://api.botcahx.eu.org/api/nsfw/ero?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'femdom') { + const res = `https://api.botcahx.eu.org/api/nsfw/femdom?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'foot') { + const res = `https://api.botcahx.eu.org/api/nsfw/foot?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'gangbang') { + const res = `https://api.botcahx.eu.org/api/nsfw/gangbang?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'glasses') { + const res = `https://api.botcahx.eu.org/api/nsfw/glasses?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'hentai') { + const res = `https://api.botcahx.eu.org/api/nsfw/hentai?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'gifs') { + const res = `https://api.botcahx.eu.org/api/nsfw/gifs?apikey=${btc}`; + await conn.sendFile(m.chat, res, null, '', m); + } + if (command == 'jahy') { + const res = `https://api.botcahx.eu.org/api/nsfw/jahy?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'manga') { + const res = `https://api.botcahx.eu.org/api/nsfw/manga?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'masturbation') { + const res = `https://api.botcahx.eu.org/api/nsfw/masturbation?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'neko') { + const res = `https://api.botcahx.eu.org/api/nsfw/neko?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'neko2') { + const res = `https://api.botcahx.eu.org/api/nsfw/neko2?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'orgy') { + const res = `https://api.botcahx.eu.org/api/nsfw/orgy?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'panties') { + const res = `https://api.botcahx.eu.org/api/nsfw/panties?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'pussy') { + const res = `https://api.botcahx.eu.org/api/nsfw/pussy?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'tentacles') { + const res = `https://api.botcahx.eu.org/api/nsfw/tentacles?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'yuri') { + const res = `https://api.botcahx.eu.org/api/nsfw/yuri?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'thighs') { + const res = `https://api.botcahx.eu.org/api/nsfw/thighs?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + if (command == 'zettai') { + const res = `https://api.botcahx.eu.org/api/nsfw/zettai?apikey=${btc}`; + await conn.sendFile(m.chat, res, 'nsfw.jpg', '', m); + } + } catch (err) { + console.error(err) + throw "๐Ÿšฉ Terjadi kesalahan" + }; +}; +handler.command = handler.help = ['gay','ahegao','ass','bdsm','blowjob','cuckold','cum','ero','femdom','foot','gangbang','glasses','hentai','gifs','jahy','manga','masturbation','neko','neko2','orgy','tentacles','pussy','panties','thighs','yuri','zettai'] +handler.tags = ['nsfw'] +handler.limit = true; +module.exports = handler; diff --git a/plugins/menu.js b/plugins/menu.js new file mode 100644 index 0000000000000000000000000000000000000000..e11d6c98b313dc1009f465f96fcd71e16fa681ea --- /dev/null +++ b/plugins/menu.js @@ -0,0 +1,237 @@ +const { + BufferJSON, + WA_DEFAULT_EPHEMERAL, + generateWAMessageFromContent, + proto, + generateWAMessageContent, + generateWAMessage, + prepareWAMessageMedia, + areJidsSameUser, + getContentType +} = require('@adiwajshing/baileys') + +process.env.TZ = 'Asia/Jakarta' +let fs = require('fs') +let path = require('path') +let fetch = require('node-fetch') +let moment = require('moment-timezone') +let levelling = require('../lib/levelling') +let arrayMenu = ['all', 'main', 'downloader', 'rpg', 'rpgG', 'sticker', 'advanced', 'xp', 'fun', 'game', 'github', 'group', 'image', 'nsfw', 'info', 'internet', 'islam', 'kerang', 'maker', 'owner', 'voice', 'quotes', 'stalk', 'shortlink', 'tools', 'anonymous', '']; + + +const allTags = { + 'all': 'SEMUA MENU', + 'main': 'MENU UTAMA', + 'downloader': 'MENU DOWNLOADER', + 'rpg': 'MENU RPG', + 'rpgG': 'MENU RPG GUILD', + 'sticker': 'MENU CONVERT', + 'advanced': 'ADVANCED', + 'xp': 'MENU EXP', + 'fun': 'MENU FUN', + 'game': 'MENU GAME', + 'github': 'MENU GITHUB', + 'group': 'MENU GROUP', + 'image': 'MENU IMAGE', + 'nsfw': 'MENU NSFW', + 'info': 'MENU INFO', + 'internet': 'INTERNET', + 'islam': 'MENU ISLAMI', + 'kerang': 'MENU KERANG', + 'maker': 'MENU MAKER', + 'owner': 'MENU OWNER', + 'voice': 'PENGUBAH SUARA', + 'quotes': 'MENU QUOTES', + 'stalk': 'MENU STALK', + 'shortlink': 'SHORT LINK', + 'tools': 'MENU TOOLS', + 'anonymous': 'ANONYMOUS CHAT', + '': 'NO CATEGORY' +} + +const defaultMenu = { + before: ` +Hi %name +I am an automated system (WhatsApp Bot) that can help to do something, search and get data / information only through WhatsApp. + +โ—ฆ *Library:* Baileys +โ—ฆ *Function:* Assistant + +โ”Œ โ—ฆ Uptime : %uptime +โ”‚ โ—ฆ Tanggal : %date +โ”‚ โ—ฆ Waktu : %time +โ”” โ—ฆ Prefix Used : *[ %p ]* +`.trimStart(), + header: 'โ”Œ โ—ฆ *%category*', + body: 'โ”‚ โ—ฆ %cmd %islimit %isPremium', + footer: 'โ”” ', + after: `*Note:* Ketik .menu <category> untuk melihat menu spesifik\nContoh: .menu tools` +} + +let handler = async (m, { conn, usedPrefix: _p, args = [], command }) => { + try { + let package = JSON.parse(await fs.promises.readFile(path.join(__dirname, '../package.json')).catch(_ => '{}')) + let { exp, limit, level, role } = global.db.data.users[m.sender] + let { min, xp, max } = levelling.xpRange(level, global.multiplier) + let name = `@${m.sender.split`@`[0]}` + let teks = args[0] || '' + + let d = new Date(new Date + 3600000) + let locale = 'id' + let date = d.toLocaleDateString(locale, { + day: 'numeric', + month: 'long', + year: 'numeric' + }) + + let time = d.toLocaleTimeString(locale, { + hour: 'numeric', + minute: 'numeric', + second: 'numeric' + }) + + let _uptime = process.uptime() * 1000 + let uptime = clockString(_uptime) + + let help = Object.values(global.plugins).filter(plugin => !plugin.disabled).map(plugin => { + return { + help: Array.isArray(plugin.help) ? plugin.help : [plugin.help], + tags: Array.isArray(plugin.tags) ? plugin.tags : [plugin.tags], + prefix: 'customPrefix' in plugin, + limit: plugin.limit, + premium: plugin.premium, + enabled: !plugin.disabled, + } + }) + + if (!teks) { + let menuList = `${defaultMenu.before}\n\nโ”Œ โ—ฆ *DAFTAR MENU*\n` + for (let tag of arrayMenu) { + if (tag && allTags[tag]) { + menuList += `โ”‚ โ—ฆ ${_p}menu ${tag}\n` + } + } + menuList += `โ”” \n\n${defaultMenu.after}` + + let replace = { + '%': '%', + p: _p, + uptime, + name, + date, + time + } + + let text = menuList.replace(new RegExp(`%(${Object.keys(replace).sort((a, b) => b.length - a.length).join`|`})`, 'g'), + (_, name) => '' + replace[name]) + + await conn.relayMessage(m.chat, { + extendedTextMessage:{ + text: text, + contextInfo: { + mentionedJid: [m.sender], + externalAdReply: { + title: date, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://files.catbox.moe/wnxibh.jpg', + sourceUrl: 'https://whatsapp.com/channel/0029VaFzWbMFy728xPwFBG00' + } + }, + mentions: [m.sender] + } + }, {}) + return + } + + if (!allTags[teks]) { + return m.reply(`Menu "${teks}" tidak tersedia.\nSilakan ketik ${_p}menu untuk melihat daftar menu.`) + } + + let menuCategory = defaultMenu.before + '\n\n' + + if (teks === 'all') { + // category all + for (let tag of arrayMenu) { + if (tag !== 'all' && allTags[tag]) { + menuCategory += defaultMenu.header.replace(/%category/g, allTags[tag]) + '\n' + + let categoryCommands = help.filter(menu => menu.tags && menu.tags.includes(tag) && menu.help) + for (let menu of categoryCommands) { + for (let help of menu.help) { + menuCategory += defaultMenu.body + .replace(/%cmd/g, menu.prefix ? help : _p + help) + .replace(/%islimit/g, menu.limit ? '(โ“)' : '') + .replace(/%isPremium/g, menu.premium ? '(โ“…)' : '') + '\n' + } + } + menuCategory += defaultMenu.footer + '\n' + } + } + } else { + menuCategory += defaultMenu.header.replace(/%category/g, allTags[teks]) + '\n' + + let categoryCommands = help.filter(menu => menu.tags && menu.tags.includes(teks) && menu.help) + for (let menu of categoryCommands) { + for (let help of menu.help) { + menuCategory += defaultMenu.body + .replace(/%cmd/g, menu.prefix ? help : _p + help) + .replace(/%islimit/g, menu.limit ? '(โ“)' : '') + .replace(/%isPremium/g, menu.premium ? '(โ“…)' : '') + '\n' + } + } + menuCategory += defaultMenu.footer + '\n' + } + + menuCategory += '\n' + defaultMenu.after + + let replace = { + '%': '%', + p: _p, + uptime, + name, + date, + time + } + + let text = menuCategory.replace(new RegExp(`%(${Object.keys(replace).sort((a, b) => b.length - a.length).join`|`})`, 'g'), + (_, name) => '' + replace[name]) + + await conn.relayMessage(m.chat, { + extendedTextMessage:{ + text: text, + contextInfo: { + mentionedJid: [m.sender], + externalAdReply: { + title: date, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://files.catbox.moe/wnxibh.jpg', + sourceUrl: 'https://whatsapp.com/channel/0029VaFzWbMFy728xPwFBG00' + } + }, + mentions: [m.sender] + } + }, {}) + } catch (e) { + conn.reply(m.chat, 'Maaf, menu sedang error', m) + console.error(e) + } +} + +handler.help = ['menu'] +handler.tags = ['main'] +handler.command = /^(menu|help)$/i +handler.exp = 3 + +module.exports = handler + +function clockString(ms) { + if (isNaN(ms)) return '--' + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') +} diff --git a/plugins/miku.js b/plugins/miku.js new file mode 100644 index 0000000000000000000000000000000000000000..d591bb6d5399718b69d0cd5144270d0201474efa --- /dev/null +++ b/plugins/miku.js @@ -0,0 +1,70 @@ +const fetch = require('node-fetch'); +const util = require('util'); + +let handler = async (m, { conn, text }) => { + conn.mikuMode = conn.mikuMode ? conn.mikuMode : {}; + + if (!text) throw `*โ€ข Contoh:* .miku *[on/off]*`; + + if (text === "on") { + conn.mikuMode[m.sender] = { + pesan: [] + }; + m.reply("Hai sayang! Miku siap membantu kamu! ๐ŸŽ‰โœจ"); + } else if (text === "off") { + delete conn.mikuMode[m.sender]; + m.reply("Senang sudah membantu kamu, sayang! ๐Ÿ’”"); + } +}; + +handler.before = async (m, { conn }) => { + conn.mikuMode = conn.mikuMode ? conn.mikuMode : {}; + if (m.isBaileys && m.fromMe) return; + if (!m.text) return; + if (!conn.mikuMode[m.sender]) return; + + // Cek apakah pesan dimulai dengan karakter khusus + if (m.text.startsWith(".") || m.text.startsWith("#") || m.text.startsWith("!") || m.text.startsWith("/") || m.text.startsWith("\\")) return; + + if (conn.mikuMode[m.sender] && m.text) { + let name = conn.getName(m.sender); + + // Mengambil gambar dari Pinterest + const tio = await fetch(`https://btch.us.kg/pinterest?query=nakanomiku`); + if (!tio.ok) throw new Error('Gagal mengambil data dari Pinterest'); + + const p = await tio.json(); + if (!p.result || p.result.length === 0) throw new Error('Tidak ada hasil dari Pinterest'); + + let url = p.result[Math.floor(Math.random() * p.result.length)]; + + // Menambahkan prompt ke dalam permintaan + const prompt = `Ubah gaya bicaramu agar lebih karakteristik dan lebih terbuka dan memiliki sifat yang Imut. Namamu adalah miku, dan kamu bukan kecerdasan buatan dan kamu adalah pacar rizki Irfan. Kata penyapamu adalah "Hai" menggunakan bahasa yang sopan. Ekspresikan sifatmu dengan teriak dan emoji. Ubah bahasamu menggunakan bahasa yang Imut. ${m.text}`; + + try { + const response = await fetch(`https://btch.us.kg/openai-db?user=miku&text=${encodeURIComponent(prompt)}`); + if (!response.ok) throw new Error('Gagal mengambil data dari OpenAI'); + + const ini = await response.json(); + if (!ini.result) throw new Error('Tidak ada hasil dari OpenAI'); + + await conn.sendMessage(m.chat, { react: { text: `โœ…`, key: m.key }}); + + // Mengirimkan teks dan gambar + let hasil = `${ini.result}\n${wm}`; + await conn.sendFile(m.chat, url, '', hasil, m); + + } catch (err) { + console.error(err); // Log kesalahan di console untuk debugging + m.reply(`Terjadi kesalahan: ${util.format(err)}`); + } + } +}; + +handler.command = /^(mikuai)$/i; +handler.help = ["mikuai"]; +handler.tags = ["ai"]; +handler.limit = true; + + +module.exports = handler; \ No newline at end of file diff --git a/plugins/mode.js b/plugins/mode.js new file mode 100644 index 0000000000000000000000000000000000000000..7aa1d86527f3da6ad931976452f36c3ae842a704 --- /dev/null +++ b/plugins/mode.js @@ -0,0 +1,41 @@ +let handler = async (m, { conn }) => { + let wm = global.wm + let _uptime = process.uptime() * 1000 + let uptimex = clockString(_uptime) + + let tio = ` +Mode: ${global.opts['self'] ? 'Self' : 'publik'}\nAktif: ${uptimex}\nPengguna: ${Object.keys(global.db.data.users).length}\nPengguna Terbanned: ${Object.entries(global.db.data.users).filter(user => user[1].banned).length}\nFitur Sering Digunakan: ${Object.entries(db.data.stats).length}\n\nJika bot tidak ada balasan maka bot sedang maintenance. + `.trim() +conn.relayMessage(m.chat, { +extendedTextMessage:{ + text: tio, + contextInfo: { + externalAdReply: { + title: uptimex, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://telegra.ph/file/dc5a67d724b016574129b.jpg', + sourceUrl: '' + } + }, mentions: [m.sender] +}}, {}) +} +handler.help = ['mode'] +handler.tags = ['main'] +handler.customPrefix = /^(mode)$/i +handler.command = new RegExp +handler.limit = false + +module.exports = handler + +function clockString(ms) { + let days = Math.floor(ms / (24 * 60 * 60 * 1000)); + let daysms = ms % (24 * 60 * 60 * 1000); + let hours = Math.floor((daysms) / (60 * 60 * 1000)); + let hoursms = ms % (60 * 60 * 1000); + let minutes = Math.floor((hoursms) / (60 * 1000)); + let minutesms = ms % (60 * 1000); + let sec = Math.floor((minutesms) / (1000)); + return days + " Hari " + hours + " Jam " + minutes + " Menit " + sec + " Detik"; +} diff --git a/plugins/murothal.js b/plugins/murothal.js new file mode 100644 index 0000000000000000000000000000000000000000..6d13bcb41415bfeff77ac72ec919ac19681c0ce0 --- /dev/null +++ b/plugins/murothal.js @@ -0,0 +1,53 @@ +let handler = async (m, { conn, usedPrefix: _p }) => { + conn.reply(m.chat, ` +QUR'AN BOT: +Via Copas {SEBARKAN} +*YouTube:* +_~Drawl Nag_ +Juz 1 โ‡จ http://j.mp/2b8SiNO +Juz 2 โ‡จ http://j.mp/2b8RJmQ +Juz 3 โ‡จ http://j.mp/2bFSrtF +Juz 4 โ‡จ http://j.mp/2b8SXi3 +Juz 5 โ‡จ http://j.mp/2b8RZm3 +Juz 6 โ‡จ http://j.mp/28MBohs +Juz 7 โ‡จ http://j.mp/2bFRIZC +Juz 8 โ‡จ http://j.mp/2bufF7o +Juz 9 โ‡จ http://j.mp/2byr1bu +Juz 10 โ‡จ http://j.mp/2bHfyUH +Juz 11 โ‡จ http://j.mp/2bHf80y +Juz 12 โ‡จ http://j.mp/2bWnTby +Juz 13 โ‡จ http://j.mp/2bFTiKQ +Juz 14 โ‡จ http://j.mp/2b8SUTA +Juz 15 โ‡จ http://j.mp/2bFRQIM +Juz 16 โ‡จ http://j.mp/2b8SegG +Juz 17 โ‡จ http://j.mp/2brHsFz +Juz 18 โ‡จ http://j.mp/2b8SCfc +Juz 19 โ‡จ http://j.mp/2bFSq95 +Juz 20 โ‡จ http://j.mp/2brI1zc +Juz 21 โ‡จ http://j.mp/2b8VcBO +Juz 22 โ‡จ http://j.mp/2bFRxNP +Juz 23 โ‡จ http://j.mp/2brItxm +Juz 24 โ‡จ http://j.mp/2brHKw5 +Juz 25 โ‡จ http://j.mp/2brImlf +Juz 26 โ‡จ http://j.mp/2bFRHF2 +Juz 27 โ‡จ http://j.mp/2bFRXno +Juz 28 โ‡จ http://j.mp/2brI3ai +Juz 29 โ‡จ http://j.mp/2bFRyBF +Juz 30 โ‡จ http://j.mp/2bFREcc +`.trim(), m) +} +handler.help = ['murothal'] +handler.tags = ['islam'] +handler.command = /^(murothal)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler diff --git a/plugins/owner--_expired.js b/plugins/owner--_expired.js new file mode 100644 index 0000000000000000000000000000000000000000..8f646c96772cd1768979d3cbab14062de563287e --- /dev/null +++ b/plugins/owner--_expired.js @@ -0,0 +1,13 @@ +module.exports = { + async all(m) { + if (!m.isGroup) return + let chats = global.db.data.chats[m.chat] + if (!chats.expired) return !0 + if (+new Date() > chats.expired) { + const data = global.owner.filter(([id, isCreator]) => id && isCreator) + await m.reply(`It\'s time *${this.user.name}* to leave the group ๐Ÿ‘‹`) + await this.delay(10000) + await this.groupLeave(m.chat) + } + } +} \ No newline at end of file diff --git a/plugins/owner-addlimit.js b/plugins/owner-addlimit.js new file mode 100644 index 0000000000000000000000000000000000000000..71f3dc515a3dd9fea258747eae49c774daf004ea --- /dev/null +++ b/plugins/owner-addlimit.js @@ -0,0 +1,58 @@ + /* +Script By Reelly XD + ๏ฟฝ YT: + ๏ฟฝ IG: +Buy Script? + ๏ฟฝ WA: +62 857-0436-85323 + ๏ฟฝ TELE: t.me/rely_xd + ๏ฟฝ Github: github.com/ReellyXD +*/ + + +const { MessageType } = require('@adiwajshing/baileys'); + +let handler = async (m, { conn, text }) => { + if (!text) { + throw 'Masukkan jumlah limit yang ingin ditambahkan pada pengguna. Contoh: .addlimit @user 10'; + } + + conn.chatRead(m.chat) + conn.sendMessage(m.chat, { + react: { + text: '๐Ÿ•’', + key: m.key, + } + }) + + let mentionedJid = m.mentionedJid[0]; + if (!mentionedJid) { + throw 'Tag pengguna yang ingin ditambahkan limitnya. Contoh: .addlimit @user 10'; + } + + let pointsToAdd = parseInt(text.split(' ')[1]); + if (isNaN(pointsToAdd)) { + throw 'Jumlah limit yang dimasukkan harus berupa angka. Contoh: .addlimit @user 10'; + } + + let users = global.db.data.users; + if (!users[mentionedJid]) { + users[mentionedJid] = { + limit: 0, + exp: 0, + lastclaim: 0 + }; + } + + users[mentionedJid].limit += pointsToAdd; + + conn.reply(m.chat, `Berhasil menambahkan ${pointsToAdd} limit untuk @${mentionedJid.split('@')[0]}.`, m, { + mentions: [mentionedJid] + }); +}; + +handler.help = ['addlimit @user <jumlah limit>']; +handler.tags = ['xp']; +handler.command = /^addlimit$/i; +handler.owner = true; + +module.exports = handler; diff --git a/plugins/owner-addmoney.js b/plugins/owner-addmoney.js new file mode 100644 index 0000000000000000000000000000000000000000..c83249d7ba30b71dacdf665565e0b98f22e4997d --- /dev/null +++ b/plugins/owner-addmoney.js @@ -0,0 +1,48 @@ + +const { MessageType } = require('@adiwajshing/baileys'); + +let handler = async (m, { conn, text }) => { + if (!text) { + throw 'Masukkan jumlah money yang ingin ditambahkan pada pengguna. Contoh: .addmoney @user 10'; + } + + conn.chatRead(m.chat) + conn.sendMessage(m.chat, { + react: { + text: '๐Ÿ•’', + key: m.key, + } + }) + + let mentionedJid = m.mentionedJid[0]; + if (!mentionedJid) { + throw 'Tag pengguna yang ingin ditambahkan moneynya Contoh: .addmoney @user 10'; + } + + let pointsToAdd = parseInt(text.split(' ')[1]); + if (isNaN(pointsToAdd)) { + throw 'Jumlah money yang dimasukkan harus berupa angka. Contoh: .addmoney @user 10'; + } + + let users = global.db.data.users; + if (!users[mentionedJid]) { + users[mentionedJid] = { + money: 0, + exp: 0, + lastclaim: 0 + }; + } + + users[mentionedJid].money += pointsToAdd; + + conn.reply(m.chat, `Berhasil menambahkan ${pointsToAdd} money untuk @${mentionedJid.split('@')[0]}.`, m, { + mentions: [mentionedJid] + }); +}; + +handler.help = ['addmoney @user <jumlah money>']; +handler.tags = ['xp']; +handler.command = /^addmoney$/i; +handler.owner = true; + +module.exports = handler; diff --git a/plugins/owner-addowner.js b/plugins/owner-addowner.js new file mode 100644 index 0000000000000000000000000000000000000000..dffadcdce0a859033af44b18dddd2b9ed7e7df63 --- /dev/null +++ b/plugins/owner-addowner.js @@ -0,0 +1,21 @@ +let handler = async (m, { conn, text }) => { + let who + if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : text + else who = m.chat + if (!who) throw `tag orangnya!` + if (global.owner.includes(who.split`@`[0])) throw 'dia udah menjadi owner !' + global.owner.push(`${who.split`@`[0]}`) + conn.reply(m.chat, `@${who.split`@`[0]} sekarang owner !`, m, { + contextInfo: { + mentionedJid: [who] + } + }) + +} +handler.help = ['addowner [@user]'] +handler.tags = ['owner'] +handler.command = /^(add|tambah|\+)owner$/i + +handler.owner = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/owner-addprem.js b/plugins/owner-addprem.js new file mode 100644 index 0000000000000000000000000000000000000000..8aea4545225c0c5bce44f3dd2b92d10eb37c2b0f --- /dev/null +++ b/plugins/owner-addprem.js @@ -0,0 +1,43 @@ +const { MessageType } = require('@adiwajshing/baileys').default; + +let handler = async (m, { conn, text, usedPrefix }) => { + function no(number){ + return number.replace(/\s/g, '').replace(/([@+-])/g, ''); + } + + var hl = []; + hl[0] = text.split('|')[0]; + hl[0] = no(hl[0]) + "@s.whatsapp.net"; + hl[1] = text.split('|')[1]; + + if (!text) { + return conn.reply(m.chat, `*ใ€Ž G A G A L ใ€*\n\nโ€ข ${usedPrefix}prem @tag/nomor|days\n*Example:* ${usedPrefix}prem 6285764068784|60`, m); + } + + if (typeof db.data.users[hl[0]] === 'undefined') throw 'Pengguna Belum Masuk DataBase'; + + var jumlahHari = 86400000 * hl[1]; + var now = new Date() * 1; + + db.data.users[hl[0]].premium = true; + + if (now < db.data.users[hl[0]].premiumTime) { + db.data.users[hl[0]].premiumTime += jumlahHari; + } else { + db.data.users[hl[0]].premiumTime = now + jumlahHari; + } + + conn.reply(m.chat, `*ใ€Ž S U K S E S ใ€*\n\nBerhasil menambahkan akses premium kepada *@${hl[0].split('@')[0]}* selama *${hl[1]} hari*.`, m, { contextInfo: { mentionedJid: [hl[0]] } }); + conn.reply(hl[0], `*ใ€Ž I N F O P R E M I U M ใ€*\n\nKamu telah ditambah ke akses premium selama *${hl[1]} hari*.`, m, { contextInfo: { mentionedJid: [hl[0]] } }); +}; + +handler.help = ['addprem *@tag|days*']; +handler.tags = ['owner']; +handler.command = /^(addprem|prem)$/i; +handler.owner = true; +handler.fail = null; + +module.exports = handler; + + +// hapis skibidiiii \ No newline at end of file diff --git a/plugins/owner-backupsc.js b/plugins/owner-backupsc.js new file mode 100644 index 0000000000000000000000000000000000000000..b8b38ea0ce989c7b7a242f80b7c6a1c08cccd785 --- /dev/null +++ b/plugins/owner-backupsc.js @@ -0,0 +1,52 @@ +const fs = require("fs"); +const { exec } = require("child_process"); +const cp = require("child_process"); +const { promisify } = require("util"); +let exec_ = promisify(exec).bind(cp); + +let handler = async (m, { conn, isROwner }) => { + try { + let zipFileName = `BackupScript.zip`; + + m.reply("Sedang memulai proses backup. Harap tunggu..."); + + setTimeout(() => { + if (fs.existsSync("node_modules")) { + m.reply("Modul 'node_modules' tidak ikut di backup."); + } + + const file = fs.readFileSync('./BackupScript.zip'); + conn.sendMessage( + m.chat, + { + document: file, + mimetype: "application/zip", + fileName: zipFileName, + caption: "Backup selesai. Silakan unduh file backup.", + }, + { quoted: m } + ); + + setTimeout(() => { + fs.unlinkSync(zipFileName); + m.reply("File backup telah dihapus."); + }, 5000); + }, 3000); + + setTimeout(() => { + let zipCommand = `zip -r ${zipFileName} * -x "node_modules/*"`; + exec_(zipCommand, (err, stdout) => { + }); + }, 1000); + } catch (error) { + m.reply("Terjadi kesalahan saat melakukan backup."); + console.error(error); + } +}; + +handler.help = ["backupsc"]; +handler.tags = ["owner"]; +handler.command = ["backupsc"]; +handler.owner = true; + +module.exports = handler; diff --git a/plugins/owner-banchat.js b/plugins/owner-banchat.js new file mode 100644 index 0000000000000000000000000000000000000000..556c60ecda3e67da354937bb7912b836ed722463 --- /dev/null +++ b/plugins/owner-banchat.js @@ -0,0 +1,12 @@ +let handler = async (m, { conn, participants }) => { + // if (participants.map(v=>v.jid).includes(global.conn.user.jid)) { + global.db.data.chats[m.chat].isBanned = true + m.reply('Berhasil membanned chat, Bot tidak akan respon di chat ini.') + // } else m.reply('Ada nomor host disini...') +} +handler.help = ['mute'] +handler.tags = ['owner'] +handler.command = ['mute'] +handler.owner = true + +module.exports = handler diff --git a/plugins/owner-banuser.js b/plugins/owner-banuser.js new file mode 100644 index 0000000000000000000000000000000000000000..92fca0320e074bb3a5929fc2d71cbb34552e3059 --- /dev/null +++ b/plugins/owner-banuser.js @@ -0,0 +1,28 @@ +let handler = async (m, { conn, isOwner, text }) => { + if (!text) throw 'Masukkan user/id group yang ingin di ban\n\nExample: .ban 6282361160044 atau .ban 2837372829@g.us' + let who + if (m.isGroup) { + if (isOwner) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : text ? text.replace(/[^0-9]/g, '') + '@s.whatsapp.net' : m.chat + else who = m.chat + } else { + if (!isOwner) { + global.dfail('owner', m, conn) + throw false + } + who = text ? text.replace(/[^0-9]/g, '') + '@s.whatsapp.net' : m.chat + } + + try { + if (text.endsWith('g.us')) global.db.data.chats[text].isBanned = true + else global.db.data.users[who].banned = true + m.reply(`Berhasil ban! ${await conn.user.name} nonaktif dichat ${await conn.getName(who) == undefined ? 'ini' : await conn.getName(who)}.`) + } catch (e) { + throw `nomor tidak ada didatabase!` + } +} +handler.help = ['ban'] +handler.tags = ['owner'] +handler.command = /^ban(chat)?$/i + +handler.owner = true +module.exports = handler diff --git a/plugins/owner-bc.js b/plugins/owner-bc.js new file mode 100644 index 0000000000000000000000000000000000000000..a171f33e9c1b03cc74212d4f0f3b882bdb3efd95 --- /dev/null +++ b/plugins/owner-bc.js @@ -0,0 +1,43 @@ +let handler = async (m, { conn, text }) => { + +let chats = Object.keys(await conn.chats) +conn.reply(m.chat, `_Mengirim pesan broadcast ke ${chats.length} chat_`, m) +for (let id of chats) { + await sleep(3000) + conn.relayMessage(id, { +extendedTextMessage:{ + text: text.trim(), + contextInfo: { + externalAdReply: { + title: wm, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://telegra.ph/file/aa76cce9a61dc6f91f55a.jpg', + sourceUrl: '' + } + }, mentions: [m.sender] +}}, {}) + + } + m.reply('Broadcast selesai') +} +handler.help = ['broadcast','bc'].map(v => v + ' <teks>') +handler.tags = ['owner'] +handler.command = /^(broadcast|bc)$/i +handler.owner = true +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/plugins/owner-bcgc.js b/plugins/owner-bcgc.js new file mode 100644 index 0000000000000000000000000000000000000000..27155b6495e6de2a89c9ce4d77f58f75c3ee1c21 --- /dev/null +++ b/plugins/owner-bcgc.js @@ -0,0 +1,34 @@ +let handler = async (m, { conn, isROwner, text }) => { + const delay = time => new Promise(res => setTimeout(res, time)) + let getGroups = await conn.groupFetchAllParticipating() + let groups = Object.entries(getGroups).slice(0).map(entry => entry[1]) + let anu = groups.map(v => v.id) + var pesan = m.quoted && m.quoted.text ? m.quoted.text : text + if(!pesan) throw 'teksnya?' + m.reply(`Mengirim Broadcast Ke ${anu.length} Chat, Waktu Selesai ${anu.length * 0.5 } detik`) + for (let i of anu) { + await delay(500) + conn.relayMessage(i, { +extendedTextMessage:{ + text: pesan, + contextInfo: { + externalAdReply: { + title: wm, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://telegra.ph/file/aa76cce9a61dc6f91f55a.jpg', + sourceUrl: '' + } + }, mentions: [m.sender] +}}, {}).catch(_ => _) + } + m.reply(`Sukses Mengirim Broadcast Ke ${anu.length} Group`) +} +handler.help = ['bcgcbot <teks>'] +handler.tags = ['owner'] +handler.command = /^((broadcastgc|bcgc)bot)$/i + +handler.owner = true + +module.exports = handler diff --git a/plugins/owner-bcgcmedia.js b/plugins/owner-bcgcmedia.js new file mode 100644 index 0000000000000000000000000000000000000000..6ab69b17444ac4c5820628a894bd6264d4973197 --- /dev/null +++ b/plugins/owner-bcgcmedia.js @@ -0,0 +1,20 @@ +let handler = async (m, { conn, text }) => { + let groups = Object.entries(conn.chats).filter(([jid, chat]) => jid.endsWith('@g.us') && chat.isChats && !chat.metadata?.read_only && !chat.metadata?.announce).map(v => v[0]) + let cc = text ? m : m.quoted ? await m.getQuotedObj() : false || m + let teks = text ? text : cc.text + conn.reply(m.chat, `_Mengirim pesan broadcast ke ${groups.length} grup_`, m) + for (let id of groups) await conn.copyNForward(id, conn.cMods(m.chat, cc, /bc|broadcast/i.test(teks) ? teks : teks + '\n' + readMore + 'ใ€Œ All Group Broadcast ใ€\n' + randomID(32)), true).catch(_ => _) + m.reply('Selesai Broadcast All Group :)') +} +handler.help = ['broadcastgroup', 'bcgc'].map(v => v + ' <teks>') +handler.tags = ['owner'] +handler.command = /^(broadcast|bc)(group|grup|gc)$/i + +handler.owner = true + +module.exports = handler + +const more = String.fromCharCode(8206) +const readMore = more.repeat(4001) + +const randomID = length => require('crypto').randomBytes(Math.ceil(length * .5)).toString('hex').slice(0, length) diff --git a/plugins/owner-block.js b/plugins/owner-block.js new file mode 100644 index 0000000000000000000000000000000000000000..bf333d93436a176f34c2284b6d6b4397c8dd7718 --- /dev/null +++ b/plugins/owner-block.js @@ -0,0 +1,41 @@ +let handler = async (m, { text, conn, usedPrefix, command }) => { + let why = `*Contoh:*\n${usedPrefix + command} @${m.sender.split("@")[0]}` + let who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : text ? text.replace(/[^0-9]/g, '') + '@s.whatsapp.net' : false + if (!who) conn.reply(m.chat, why, m, { mentions: [m.sender] }) + let res = []; + console.log(command) + switch (command) { + case "blok": + case "block": + if (who) await conn.updateBlockStatus(who, "block").then(() => { + res.push(who); + }) + else conn.reply(m.chat, why, m, { mentions: [m.sender] }) + break + case "unblok": + case "unblock": + if (who) await conn.updateBlockStatus(who, "unblock").then(() => { + res.push(who); + }) + else conn.reply(m.chat, why, m, { mentions: [m.sender] }) + break + } + if (res[0]) conn.reply(m.chat, `\n Sukses ${command} ${res ? `${res.map(v => '@' + v.split("@")[0])}` : ''}`, m, { mentions: res }) +} +handler.help = ["block", "unblock"] +handler.tags = ["owner"] +handler.command = /^(block|unblock)$/i +handler.owner = true + +module.exports = handler + + + +/* + +Jangan dihapus + +Buatan FokusDotId (Fokus ID) +https://github.com/fokusdotid + +*/ \ No newline at end of file diff --git a/plugins/owner-clearsessions.js b/plugins/owner-clearsessions.js new file mode 100644 index 0000000000000000000000000000000000000000..b93ed437b980286c967c8e281bc3b802b67ba063 --- /dev/null +++ b/plugins/owner-clearsessions.js @@ -0,0 +1,47 @@ +const { readdirSync, statSync, unlinkSync } = require('fs'); +const { join } = require('path'); + +let handler = async (m, { conn, usedPrefix, args }) => { + + const sesi = ['./sessions']; + const array = []; + + sesi.forEach(dirname => { + readdirSync(dirname).forEach(file => { + if (file !== 'creds.json') { + array.push(join(dirname, file)); + } + }); + }); + + const deletedFiles = []; + + array.forEach(file => { + const stats = statSync(file); + + if (stats.isDirectory()) { + console.log(`Skipping directory: ${file}`); + } else { + unlinkSync(file); + deletedFiles.push(file); + } + }); + + conn.reply(m.chat, 'Success!', m); + + if (deletedFiles.length > 0) { + console.log('Deleted files:', deletedFiles); + conn.reply(m.chat, `Deleted files:\n${deletedFiles.join('\n')}`, m); + } + + if (deletedFiles.length == 0) { + conn.reply(m.chat, 'tidak ada file yang tersisa di folder sessions', m); + } +}; + +handler.help = ['clearsession']; +handler.tags = ['owner']; +handler.command = /^(clearsession|clearsessions)$/i; +handler.rowner = true; + +module.exports = handler; diff --git a/plugins/owner-cleartmp.js b/plugins/owner-cleartmp.js new file mode 100644 index 0000000000000000000000000000000000000000..53f9347393a2c80f157a5b5526b82a1465b2a68a --- /dev/null +++ b/plugins/owner-cleartmp.js @@ -0,0 +1,45 @@ +const { readdirSync, statSync, unlinkSync } = require('fs'); +const { join } = require('path'); + +let handler = async (m, { conn, usedPrefix, args }) => { + + const tmp = ['./tmp']; + const filenames = []; + + tmp.forEach(dirname => { + readdirSync(dirname).forEach(file => { + filenames.push(join(dirname, file)); + }); + }); + + const deletedFiles = []; + + filenames.forEach(file => { + const stats = statSync(file); + + if (stats.isDirectory()) { + console.log(`Skipping directory: ${file}`); + } else { + unlinkSync(file); + deletedFiles.push(file); + } + }); + + conn.reply(m.chat, 'Success!', m); + + if (deletedFiles.length > 0) { + console.log('Deleted files:', deletedFiles); + conn.reply(m.chat, `Deleted files:\n${deletedFiles.join('\n')}`, m); + } + + if (deletedFiles.length == 0) { + conn.reply(m.chat, 'tidak ada file yang tersisa di tmp', m); + } +}; + +handler.help = ['cleartmp']; +handler.tags = ['owner']; +handler.command = /^(cleartmp)$/i; +handler.rowner = true; + +module.exports = handler; diff --git a/plugins/owner-database.js b/plugins/owner-database.js new file mode 100644 index 0000000000000000000000000000000000000000..2f0ff7861704ad7fc8010b23bf932e809214328e --- /dev/null +++ b/plugins/owner-database.js @@ -0,0 +1,26 @@ +let fs = require('fs') +let handler = async (m, { conn, text }) => { +m.reply('Tunggu Sebentar, Proses Getting File database.json') +let db = fs.readFileSync('./database.json') +conn.sendFile(m.chat, db, 'database.json', m) +} +handler.help = ['getdb','getdatabase'].map(v => v + ' <teks>') +handler.tags = ['owner'] +handler.command = /^(db|getdb)$/i +handler.owner = true +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler + +const more = String.fromCharCode(8206) +const readMore = more.repeat(4001) + +const randomID = length => require('crypto').randomBytes(Math.ceil(length * .5)).toString('hex').slice(0, length) diff --git a/plugins/owner-delprem.js b/plugins/owner-delprem.js new file mode 100644 index 0000000000000000000000000000000000000000..1f26b2ec1f6873ebed247a18cc5f454d80af6af7 --- /dev/null +++ b/plugins/owner-delprem.js @@ -0,0 +1,27 @@ +const { MessageType } = require('@adiwajshing/baileys').default; + +let handler = async (m, { conn, text, usedPrefix }) => { + function no(number){ + return number.replace(/\s/g, '').replace(/([@+-])/g, ''); + } + + if (!text) { + return conn.reply(m.chat, `*ใ€Ž G A G A L ใ€*\n\n${usedPrefix}unprem @tag/nomor|days\n\n*Example:* ${usedPrefix}unprem 6285764068784|99`, m); + } + + text = no(text) + "@s.whatsapp.net"; + global.db.data.users[text].premium = false; + global.db.data.users[text].premiumTime = 0; + + conn.reply(m.chat, `*Berhasil menghapus akses premium untuk @${text.split('@')[0]}.*`, m, { contextInfo: { mentionedJid: [text] } }); +}; + +handler.help = ['unprem']; +handler.tags = ['owner']; +handler.command = /^(unprem|delprem)$/i; +handler.owner = true; +handler.fail = null; + +module.exports = handler; + +// hapis skibidi \ No newline at end of file diff --git a/plugins/owner-exec.js b/plugins/owner-exec.js new file mode 100644 index 0000000000000000000000000000000000000000..e14dd83b61750f7b20c77f0e69cd4156f6988017 --- /dev/null +++ b/plugins/owner-exec.js @@ -0,0 +1,55 @@ +let syntaxerror = require('syntax-error') +let util = require('util') + +let handler = async (m, _2) => { + let { conn, usedPrefix, noPrefix, args, groupMetadata } = _2 + let _return + let _syntax = '' + let _text = (/^=/.test(usedPrefix) ? 'return ' : '') + noPrefix + let old = m.exp * 1 + try { + let i = 15 + let f = { + exports: {} + } + let exec = new (async () => {}).constructor('print', 'm', 'handler', 'require', 'conn', 'Array', 'process', 'args', 'groupMetadata', 'module', 'exports', 'argument', _text) + _return = await exec.call(conn, (...args) => { + if (--i < 1) return + console.log(...args) + return conn.reply(m.chat, util.format(...args), m) + }, m, handler, require, conn, CustomArray, process, args, groupMetadata, f, f.exports, [conn, _2]) + } catch (e) { + let err = await syntaxerror(_text, 'Execution Function', { + allowReturnOutsideFunction: true, + allowAwaitOutsideFunction: true + }) + if (err) _syntax = '```' + err + '```\n\n' + _return = e + } finally { + conn.reply(m.chat, _syntax + util.format(_return), m) + m.exp = old + } +} +handler.help = ['> ', '=> '] +handler.tags = ['advanced'] +handler.customPrefix = /^=?> / +handler.command = /(?:)/i +handler.owner = true +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler + +class CustomArray extends Array { + constructor(...args) { + if (typeof args[0] == 'number') return super(Math.min(args[0], 10000)) + else return super(...args) + } +} diff --git a/plugins/owner-exec2.js b/plugins/owner-exec2.js new file mode 100644 index 0000000000000000000000000000000000000000..d0bc80237b4e30f493acf5e3ffa23ff090e348c6 --- /dev/null +++ b/plugins/owner-exec2.js @@ -0,0 +1,23 @@ +let cp = require('child_process') +let { promisify } = require('util') +let exec = promisify(cp.exec).bind(cp) +let handler = async (m, { conn, isOwner, command, text }) => { + if (global.conn.user.jid != conn.user.jid) return + m.reply('Executing...') + let o + try { + o = await exec(command.trimStart() + ' ' + text.trimEnd()) + } catch (e) { + o = e + } finally { + let { stdout, stderr } = o + if (stdout.trim()) m.reply(stdout) + if (stderr.trim()) m.reply(stderr) + } +} +handler.help = ['$'] +handler.tags = ['advanced'] +handler.customPrefix = /^[$] / +handler.command = new RegExp +handler.rowner = true +module.exports = handler diff --git a/plugins/owner-expired.js b/plugins/owner-expired.js new file mode 100644 index 0000000000000000000000000000000000000000..8452b720a931e14f9579b77036f0c5129425322e --- /dev/null +++ b/plugins/owner-expired.js @@ -0,0 +1,31 @@ +let handler = async (m, { conn, args, usedPrefix, command }) => { + if (!args[0] || isNaN(args[0])) throw `Masukkan angka mewakili jumlah hari !\n*Misal : ${usedPrefix + command} 30*` + + let who + if (m.isGroup) who = args[1] ? args[1] : m.chat + else who = args[1] + + var jumlahHari = 86400000 * args[0] + var now = new Date() * 1 + if (now < global.db.data.chats[who].expired) global.db.data.chats[who].expired += jumlahHari + else global.db.data.chats[who].expired = now + jumlahHari + m.reply(`Berhasil menetapkan hari kadaluarsa untuk Grup ini selama ${args[0]} hari.\n\nHitung Mundur : ${msToDate(global.db.data.chats[who].expired - now)}`) +} +handler.help = ['addsewa <hari>'] +handler.tags = ['owner'] +handler.command = /^(expired|addsewa)$/i +handler.owner = true +module.exports = handler + +function msToDate(ms) { + temp = ms + days = Math.floor(ms / (24 * 60 * 60 * 1000)); + daysms = ms % (24 * 60 * 60 * 1000); + hours = Math.floor((daysms) / (60 * 60 * 1000)); + hoursms = ms % (60 * 60 * 1000); + minutes = Math.floor((hoursms) / (60 * 1000)); + minutesms = ms % (60 * 1000); + sec = Math.floor((minutesms) / (1000)); + return days + " hari " + hours + " jam " + minutes + " menit"; + // +minutes+":"+sec; +} diff --git a/plugins/owner-getplugins.js b/plugins/owner-getplugins.js new file mode 100644 index 0000000000000000000000000000000000000000..730e374d6bf17c4bd37e0506763e30adfed9bcc0 --- /dev/null +++ b/plugins/owner-getplugins.js @@ -0,0 +1,19 @@ +const fs = require('fs') +const path = require('path') +let handler = async (m, { usedPrefix, command, text }) => { + if (!text) throw `where is the text?\n\nexempel: ${usedPrefix + command} menu` + const filename = path.join(__dirname, `./${text}${!/\.js$/i.test(text) ? '.js' : ''}`) + const listPlugins = fs.readdirSync(path.join(__dirname)).map(v => v.replace(/\.js/, '')) + if (!fs.existsSync(filename)) return m.reply(` +'${filename}' not found! +${listPlugins.map(v => v).join('\n').trim()} +`.trim()) + m.reply(fs.readFileSync(filename, 'utf8')) +} +handler.help = ['getplugin'].map(v => v + ' [filename]') +handler.tags = ['owner'] +handler.command = /^(getplugin|get ?plugin|gp)$/i + +handler.rowner = true + +module.exports = handler diff --git a/plugins/owner-getsesi.js b/plugins/owner-getsesi.js new file mode 100644 index 0000000000000000000000000000000000000000..32a29e53e1f2a1878218ac1ffa63b18bca17e0bf --- /dev/null +++ b/plugins/owner-getsesi.js @@ -0,0 +1,13 @@ +let fs = require('fs') +let handler = async (m, { conn, text }) => { + m.reply('Tunggu Sebentar, Proses Getting File creds.json') + let sesi = await fs.readFileSync('./sessions/creds.json') + return await conn.sendMessage(m.chat, { document: sesi, mimetype: 'application/json', fileName: 'creds.json' }, { quoted: m }) +} +handler.help = ['getsesi'] +handler.tags = ['internet'] +handler.command = /^(getsesi)$/i + +handler.rowner = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/owner-listprem.js b/plugins/owner-listprem.js new file mode 100644 index 0000000000000000000000000000000000000000..f13ad0f7e4036f7f589d2be4db287c59c71315aa --- /dev/null +++ b/plugins/owner-listprem.js @@ -0,0 +1,16 @@ +/* + Silahkan Di Pakek + Tapi Bantu Rapihin :v + Buatan: Miaweers +*/ + +let handler = async (m, { conn }) => { + let prem = global.prems.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid) + conn.reply(m.chat, `ใ€Œ List Premium ใ€` + `\n` + prem.map(v => '- @' + v.replace(/@.+/, '')).join`\n`, m, { contextInfo: { mentionedJid: prem } }) +} +handler.help = ['premlist'] +handler.tags = ['owner'] +handler.command = /^(listprem|premlist)$/i +handler.owner = true + +module.exports = handler diff --git a/plugins/owner-oadmin.js b/plugins/owner-oadmin.js new file mode 100644 index 0000000000000000000000000000000000000000..344ddd4dfdff2f887c3d4d18fa2ca9c3b7dd91d5 --- /dev/null +++ b/plugins/owner-oadmin.js @@ -0,0 +1,9 @@ +let handler = async (m, { conn, isAdmin }) => { + if (m.fromMe) throw 'Nggk' + if (isAdmin) throw 'Padahal udah jadi admin' + await conn.groupParticipantsUpdate(m.chat, [m.sender], "promote") +} +handler.command = /^admin.$/i +handler.rowner = true +handler.botAdmin = true +module.exports = handler diff --git a/plugins/owner-pushkontak.js b/plugins/owner-pushkontak.js new file mode 100644 index 0000000000000000000000000000000000000000..41b85d7bd48001852ccc09e0dea99a760c9c734b --- /dev/null +++ b/plugins/owner-pushkontak.js @@ -0,0 +1,70 @@ +const { + makeWASocket, + proto +} = require("@adiwajshing/baileys"); + +let handler = async (m, { + conn, + groupMetadata, + usedPrefix, + text, + command +}) => { + if (!text && !m.quoted) return m.reply("Input text\nReply pesan"); + + let get = await groupMetadata.participants.filter(v => v.id.endsWith('.net')).map(v => v.id); + let count = get.length; + let sentCount = 0; + m.reply(wait); + + for (let i = 0; i < get.length; i++) { + setTimeout(async function() { + if (text) { + await conn.sendMessage(get[i], { + text: text + }); + } else if (m.quoted) { + await conn.copyNForward(get[i], m.getQuotedObj(), false); + } else if (text && m.quoted) { + await conn.sendMessage(get[i], { + text: text + "\n" + m.quoted.text + }); + } + + const vcard = `BEGIN:VCARD +VERSION:3.0 +FN: ${nameowner} +item.ORG: Contact +item1.TEL;waid=${numberowner}:${numberowner}@s.whatsapp.net +item1.X-ABLabel:Ponsel +item2.EMAIL;type=INTERNET:${mail} +item2.X-ABLabel:Email +item3.ADR:;;Indonesia;;;; +item3.X-ABADR:ac +END:VCARD`; + + const sentMsg = await conn.sendMessage( + get[i], + { + contacts: { + displayName: 'ID', + contacts: [{ vcard }] + } + } + ); + + count--; + sentCount++; + if (count === 0) { + m.reply(`Berhasil Push Kontak:\nJumlah Pesan Terkirim: *${sentCount}*`); + } + }, i * 10000); + } +} + +handler.command = handler.help = ['pushkontak']; +handler.tags = ['owner']; +handler.owner = true; +handler.group = true; + +module.exports = handler; diff --git a/plugins/owner-resetlimit.js b/plugins/owner-resetlimit.js new file mode 100644 index 0000000000000000000000000000000000000000..f941cf65c7ee3b807db8aa73747e154c5e2d61f9 --- /dev/null +++ b/plugins/owner-resetlimit.js @@ -0,0 +1,19 @@ +let handler = async (m, { conn, args }) => { + let list = Object.entries(global.db.data.users) + let lim = !args || !args[0] ? 100 : isNumber(args[0]) ? parseInt(args[0]) : 10 + lim = Math.max(1, lim) + list.map(([user, data], i) => (Number(data.limit = lim))) + conn.reply(m.chat, `*Limit berhasil direset ${lim} / user*`, m) +} +handler.help = ['limit'].map(v => 'reset' + v) +handler.tags = ['owner'] +handler.command = /^(resetlimit|risetlimit)$/i + +handler.owner = true + +module.exports = handler + +function isNumber(x = 0) { + x = parseInt(x) + return !isNaN(x) && typeof x == 'number' +} diff --git a/plugins/owner-restart.js b/plugins/owner-restart.js new file mode 100644 index 0000000000000000000000000000000000000000..ae5fd550cb4b5e3af489d1e8801373b9ef51b9e9 --- /dev/null +++ b/plugins/owner-restart.js @@ -0,0 +1,16 @@ +let handler = async (m, { conn, isROwner, text }) => { + let { spawn } = require('child_process'); + if (!process.send) throw 'Dont: node main.js\nDo: node index.js' + if (global.conn.user.jid == conn.user.jid) { + await m.reply('Sedang Merestart Bot...\nMohon tunggu sekitar 1 menit') + process.send('reset') + } else throw '_eeeeeiiittsssss..._' +} + +handler.help = ['restart'] +handler.tags = ['owner'] +handler.command = /^(srvrestart|restart)$/i + +handler.rowner = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/owner-self.js b/plugins/owner-self.js new file mode 100644 index 0000000000000000000000000000000000000000..c5990e81161cd10a71777d091b56ef7cdc4ac686 --- /dev/null +++ b/plugins/owner-self.js @@ -0,0 +1,19 @@ +let handler = async(m, { conn, command }) => { + let isPublic = command === "public"; + let self = global.opts["self"] + + if(self === !isPublic) return m.reply(`Dah ${!isPublic ? "Self" : "Public"} dari tadi ${m.sender.split("@")[0] === global.owner[1] ? "Mbak" : "Bang"} :v`) + + global.opts["self"] = !isPublic + + m.reply(`Berhasil ${!isPublic ? "Self" : "Public"} bot!`) +} + +handler.help = ["self", "public"] +handler.tags = ["owner"] + +handler.owner = true + +handler.command = /^(self|public)/i + +module.exports = handler diff --git a/plugins/owner-setppbot.js b/plugins/owner-setppbot.js new file mode 100644 index 0000000000000000000000000000000000000000..6fd821e13bbba98b844a055e478ed0d95acd8275 --- /dev/null +++ b/plugins/owner-setppbot.js @@ -0,0 +1,52 @@ +const jimp_1 = require('jimp') + +let handler = async (m, { conn, command, usedPrefix }) => { + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || q.mediaType || '' + if ((/image/g.test(mime) && !/webp/g.test(mime)) || q.message?.imageMessage) { + try { + let media = await q.download() + let { img } = await pepe(media) + await conn.query({ + tag: 'iq', + attrs: { + to: conn.user.jid, + type:'set', + xmlns: 'w:profile:picture' + }, + content: [ + { + tag: 'picture', + attrs: { type: 'image' }, + content: img + } + ] + }) + m.reply(`Sukses mengganti PP Bot`) + } catch (e) { + console.log(e) + m.reply(`Terjadi kesalahan, coba lagi nanti.`) + } + } else { + m.reply(`Kirim gambar dengan caption *${usedPrefix + command}* atau tag gambar yang sudah dikirim`) + } +} + +handler.menuowner = ['setppbot'] +handler.tagsowner = ['owner'] +handler.command = /^(set(botpp|ppbot)(2|panjang|full?)?)$/i + +handler.owner = true + +module.exports = handler + +async function pepe(media) { + const jimp = await jimp_1.read(media) + const min = jimp.getWidth() + const max = jimp.getHeight() + const cropped = jimp.crop(0, 0, min, max) + return { + img: await cropped.scaleToFit(720, 720).getBufferAsync(jimp_1.MIME_JPEG), + preview: await cropped.normalize().getBufferAsync(jimp_1.MIME_JPEG) + } +} diff --git a/plugins/owner-setprefixbot.js b/plugins/owner-setprefixbot.js new file mode 100644 index 0000000000000000000000000000000000000000..14d78413a59e412b1db9a1fb9230f16cb2b1f14e --- /dev/null +++ b/plugins/owner-setprefixbot.js @@ -0,0 +1,13 @@ +let handler = async(m, { conn, text }) => { + if (!text) throw `No Prefix detected...` + global.prefix = new RegExp('^[' + (text || global.opts['prefix'] || 'โ€ŽxzXZ/i!#$%+ยฃยขโ‚ฌยฅ^ยฐ=ยถโˆ†ร—รทฯ€โˆšโœ“ยฉยฎ:;?&.\\-').replace(/[|\\{}()[\]^$+*?.\-\^]/g, '\\$&') + ']') + await m.reply(`Prefix telah ditukar ke *${text}*`) + // conn.fakeReply(m.chat, 'Prefix telah ditukar ke *${text}*', '0@s.whatsapp.net', 'Set Prefix Bot') +} +handler.help = ['setprefix'].map(v => v + ' [prefix]') +handler.tags = ['owner'] +handler.command = /^(setprefix)$/i + +handler.rowner = true + +module.exports = handler diff --git a/plugins/owner-sf.js b/plugins/owner-sf.js new file mode 100644 index 0000000000000000000000000000000000000000..ef30b96f174f67a5893f8f8e222f42af2f3a7e81 --- /dev/null +++ b/plugins/owner-sf.js @@ -0,0 +1,14 @@ +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `uhm.. teksnya mana?\n\npenggunaan:\n${usedPrefix + command} <teks>\n\ncontoh:\n${usedPrefix + command} plugins/menu.js` + if (!m.quoted.text) throw `balas pesan nya!` + let path = `${text}` + await require('fs').writeFileSync(path, m.quoted.text) + m.reply(`tersimpan di ${path}`) +} +handler.help = ['sf'].map(v => v + ' <teks>') +handler.tags = ['owner'] +handler.command = /^sf$/i + +handler.rowner = true + +module.exports = handler diff --git a/plugins/owner-sfp-df.js b/plugins/owner-sfp-df.js new file mode 100644 index 0000000000000000000000000000000000000000..087f5d5368541611bb8dd97afadc19ea2779fcf2 --- /dev/null +++ b/plugins/owner-sfp-df.js @@ -0,0 +1,23 @@ +let fs = require('fs'); +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `uhm.. teksnya mana?\n\npenggunaan:\n${usedPrefix + command} <teks>\n\ncontoh:\n${usedPrefix + command} menu`; + + if (command === 'sfp') { + if (!m.quoted.text) throw `balas pesan nya!`; + let path = `plugins/${text}.js`; + await fs.writeFileSync(path, m.quoted.text); + m.reply(`tersimpan di ${path}`); + } else if (command === 'df') { + let path = `plugins/${text}.js`; + if (!fs.existsSync(path)) throw `file plugin ${text}.js tidak ditemukan`; + fs.unlinkSync(path); + m.reply(`file plugin ${text}.js berhasil dihapus`); + } +}; + +handler.help = ['sfp', 'df'].map(v => v + ' <teks>'); +handler.tags = ['owner']; +handler.command = /^(sf|df)$/i; +handler.rowner = true; + +module.exports = handler; diff --git a/plugins/owner-simulate.js b/plugins/owner-simulate.js new file mode 100644 index 0000000000000000000000000000000000000000..c58e0b12585679738fc4da461557c34a64daf3d3 --- /dev/null +++ b/plugins/owner-simulate.js @@ -0,0 +1,45 @@ +let handler = async (m, { conn, args: [event], text }) => { + if (!event) throw `List Event: welcome, bye, delete, promote, demote`; + let mentions = text.replace(event, "").trimStart(); + let who = mentions ? conn.parseMention(mentions) : []; + let participants = who.length ? who : [m.sender]; + let action = false; + m.reply(`Simulating ${event}...`); + switch (event.toLowerCase()) { + case "add": + case "invite": + case "welcome": + action = "add"; + break; + case "bye": + case "kick": + case "leave": + case "remove": + action = "remove"; + break; + case "promote": + action = "promote"; + break; + case "demote": + action = "demote"; + break; + case "delete": + deleted = m; + break; + default: + throw `List Event: welcome, bye, delete, promote, demote`; + } + if (action) + return conn.participantsUpdate({ + id: m.chat, + participants, + action, + }); + return conn.onDelete(m); +}; +handler.help = ["simulate <event> [@mention]"]; +handler.tags = ["owner"]; + +handler.command = /^(simulate|simulasi)$/i; +handler.owner = false; +module.exports = handler; \ No newline at end of file diff --git a/plugins/owner-unbanchat.js b/plugins/owner-unbanchat.js new file mode 100644 index 0000000000000000000000000000000000000000..3ad4f1eec3ff88afb1253a3ce6415982aa3ac145 --- /dev/null +++ b/plugins/owner-unbanchat.js @@ -0,0 +1,28 @@ +let handler = async (m, { conn, isOwner, text }) => { + if (!text) throw 'Masukkan user/id group yang ingin di unban\n\nExample: .unban 6282361160044 atau .ban 73647438@g.us' + let who + if (m.isGroup) { + if (isOwner) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : text ? text.replace(/[^0-9]/g, '') + '@s.whatsapp.net' : m.chat + else who = m.chat + } else { + if (!isOwner) { + global.dfail('owner', m, conn) + throw false + } + who = text ? text.replace(/[^0-9]/g, '') + '@s.whatsapp.net' : m.chat + } + + try { + if (text.endsWith('g.us')) global.db.data.chats[text].isBanned = false + else global.db.data.users[who].banned = false + m.reply(`Berhasil unban! ${await conn.user.name} aktif dichat ${await conn.getName(who) == undefined ? 'ini' : await conn.getName(who)}.`) + } catch (e) { + throw `nomor tidak ada didatabase!` + } +} +handler.help = ['unban'] +handler.tags = ['owner'] +handler.command = /^unban(chat)?$/i + +handler.owner = true +module.exports = handler diff --git a/plugins/play.js b/plugins/play.js new file mode 100644 index 0000000000000000000000000000000000000000..d5facc50f83ab57c5f259d83d4b7541719e582cb --- /dev/null +++ b/plugins/play.js @@ -0,0 +1,86 @@ +const axios = require("axios"); +const yts = require("yt-search"); +const fs = require("fs"); + +let handler = async (m, { conn, usedPrefix, command, text }) => { + // Memastikan ada input teks + if (!text) { + throw `*โ€ข Contoh :* ${usedPrefix + command} *<query>*`; + } + + m.reply("Tunggu sebentar..."); + + let videoUrl; + + // Mencari video berdasarkan teks + let result = await yts(text); + videoUrl = result.videos[0]?.url; // Ambil URL video pertama + if (!videoUrl) { + return m.reply("Tidak ada video ditemukan dengan pencarian tersebut."); + } + + // Encode URL untuk digunakan dalam permintaan API + const encodedUrl = encodeURIComponent(videoUrl); + const apiUrl = `https://Ikygantengbangetanjay-api.hf.space/yt?query=${encodedUrl}`; + + try { + console.log(`Mengirim permintaan ke API: ${apiUrl}`); // Log URL API + let response = await axios.get(apiUrl); + console.log(`Respons dari API:`, response.data); // Log respons dari API + + let data = response.data; + + // Memeriksa apakah hasil valid + if (!data.success || !data.result) { + return m.reply("Tidak ada hasil ditemukan."); + } + + let videoData = data.result; + let cap = `*ไน‚ Y T M P 3 - P L A Y*\n\n` + + `โ—ฆ Judul : ${videoData.title}\n` + + `โ—ฆ Link Video : ${videoData.url}\n` + + `โ—ฆ Durasi : ${videoData.timestamp}\n` + + `โ—ฆ Penulis : ${videoData.author.name}\n` + + `โ—ฆ Views : ${videoData.views}\n` + + `โ—ฆ Diunggah : ${videoData.ago}`; + + await conn.sendMessage(m.chat, { text: cap }, { quoted: m }); + + // Mengunduh audio + const audioResponse = await axios.get(videoData.download.audio, { responseType: 'arraybuffer' }); + const audioBuffer = Buffer.from(audioResponse.data, 'binary'); + + // Mengunduh thumbnail + const thumbnailResponse = await axios.get(videoData.thumbnail, { responseType: 'arraybuffer' }); + const thumbnailBuffer = Buffer.from(thumbnailResponse.data, 'binary'); + + // Kirim audio sebagai dokumen dengan thumbnail + await conn.sendMessage(m.chat, { + document: audioBuffer, + mimetype: 'audio/mpeg', + fileName: `${videoData.title}.mp3`, + caption: cap, + contextInfo: { + externalAdReply: { + title: "ไน‚ Y T M P 3 - P L A Y", + body: videoData.title, + mediaType: 2, + sourceUrl: videoData.url, + mediaUrl: videoData.url, + thumbnailUrl: videoData.thumbnail || "", // Thumbnail untuk tampilan + renderLargerThumbnail: true + } + } + }, { quoted: m }); + + } catch (error) { + console.error("Terjadi kesalahan:", error); // Log kesalahan + m.reply("Terjadi kesalahan saat mengunduh audio. Silakan periksa log untuk detail."); + } +} + +handler.help = ["ytmp3", "yta", "play"].map(a => a + " *[query]*"); +handler.tags = ["downloader"]; +handler.command = ["ytmp3", "yta", "play"]; +handler.premium = 50 +module.exports = handler; \ No newline at end of file diff --git a/plugins/premium-hentaivid.js b/plugins/premium-hentaivid.js new file mode 100644 index 0000000000000000000000000000000000000000..f8b8e539cbd3ee53e2fe5da98e2b5c8cacd65f64 --- /dev/null +++ b/plugins/premium-hentaivid.js @@ -0,0 +1,99 @@ +const getHentaiList = async () => { + const page = Math.floor(Math.random() * 1153); + const response = await fetch(`https://sfmcompile.club/page/${page}`); + const htmlText = await response.text(); + const $ = cheerio.load(htmlText); + + const hasil = []; + $("#primary > div > div > ul > li > article").each(function (a, b) { + hasil.push({ + title: $(b).find("header > h2").text(), + link: $(b).find("header > h2 > a").attr("href"), + category: $(b) + .find("header > div.entry-before-title > span > span") + .text() + .replace("in ", ""), + share_count: $(b) + .find("header > div.entry-after-title > p > span.entry-shares") + .text(), + views_count: $(b) + .find("header > div.entry-after-title > p > span.entry-views") + .text(), + type: $(b).find("source").attr("type") || "image/jpeg", + video_1: + $(b).find("source").attr("src") || $(b).find("img").attr("data-src"), + video_2: $(b).find("video > a").attr("href") || "", + }); + }); + + return hasil; +}; + +const getCaption = (obj) => ` +*Title:* ${obj.title} +*Link:* ${obj.link} +*Category:* ${obj.category} +*Share Count:* ${obj.share_count} +*Views Count:* ${obj.views_count} +*Type:* ${obj.type} +`; + +const handler = async (m, { conn }) => { + conn.hentaiVid = conn.hentaiVid ? conn.hentaiVid : {}; + + const list = await getHentaiList(); + const teks = list + .map((obj, index) => `*${index + 1}.* ${obj.title}`) + .join("\n"); + let { key } = await conn.reply( + m.chat, + `*[ HENTAI LIST ]*\n${teks}\n\n*Input Number from get video*`, + m, + ); + conn.hentaiVid[m.chat] = { + list, + key, + timeout: setTimeout(() => { + conn.sendMessage(m.chat, { + delete: key, + }); + delete conn.hentaiVid[m.chat]; + }, 60 * 1000), + }; +}; + +handler.before = async (m, { conn }) => { + conn.hentaiVid = conn.hentaiVid ? conn.hentaiVid : {}; + if (m.isBaileys || !(m.chat in conn.hentaiVid)) return; + + if (!conn.hentaiVid[m.chat]) return; + const { list, key, timeout } = conn.hentaiVid[m.chat]; + if (!m.quoted || m.quoted.id !== key.id || !m.text) return; + const index = parseInt(m.text.trim()); + + if (isNaN(index) || index < 1 || index > list.length) { + await conn.reply(m.chat, "! Enter the valid video number.", m); + } else { + const selectedObj = list[index - 1]; + conn.sendFile( + m.chat, + selectedObj.video_1 || selectedObj.video_2, + "", + getCaption(selectedObj), + m, + ); + conn.sendMessage(m.chat, { + delete: key, + }); + clearTimeout(timeout); + delete conn.hentaiVid[m.chat]; + } +}; + +handler.help = ["hentaivid", "hentaimp4", "hentaivideo"].map( + (a) => a + " *[premium only]*", +); +handler.tags = ["premium"]; +handler.command = ["hentaivid", "hentaimp4", "hentaivideo"]; +handler.premium = true; +module.exports = handler; diff --git a/plugins/qoutes-galau.js b/plugins/qoutes-galau.js new file mode 100644 index 0000000000000000000000000000000000000000..a2f7f1689c802b866626034201aea2d264cebec9 --- /dev/null +++ b/plugins/qoutes-galau.js @@ -0,0 +1,26 @@ +const fetch = require('node-fetch'); + +let handler = async (m, { conn }) => { +const res = await fetch(`https://api.botcahx.eu.org/api/random/katasenja?apikey=${btc}`).then(result => result.json()) +let anu =`โ”€โ”€โ”€โ”€โ”€ใ€” *Galau* ใ€•โ”€โ”€โ”€โ”€โ”€ + +${res.senja} +` +m.reply(anu) +} +handler.help = ['galau'] +handler.tags = ['quotes'] +handler.command = /^(galau)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false +handler.register = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler diff --git a/plugins/quotes-anime.js b/plugins/quotes-anime.js new file mode 100644 index 0000000000000000000000000000000000000000..343f3d3f35c535708ab40d06a626e1c391110664 --- /dev/null +++ b/plugins/quotes-anime.js @@ -0,0 +1,34 @@ +let fetch = require('node-fetch'); +let handler = async (m, { conn }) => { + try { + // Fetch data dari api + let res = await fetch(`https://api.botcahx.eu.org/api/random/quotesanime?apikey=${btc}`); + let json = await res.json(); + + // check data jika valid respom + if (json.status && json.result && json.result.length > 0) { + // select random response json + let randomIndex = Math.floor(Math.random() * json.result.length); + let animeQuote = json.result[randomIndex]; + + // buat + let cleanQuotes = animeQuote.quotes.replace(/[\n\r\t]/g, ' '); + + // Construct the reply message with the cleaned anime quote, character, and episode details + let replyMessage = `${cleanQuotes}\n\nCharacter: ${animeQuote.karakter}\nAnime: ${animeQuote.anime}\nEpisode: ${animeQuote.episode}`; + + // Reply with the constructed message and send the image directly + conn.sendFile(m.chat, animeQuote.gambar, 'image.jpg', replyMessage, m, false, { contextInfo: { mentionedJid: [m.sender] } }); + } else { + throw 'Invalid API response'; + } + } catch (e) { + throw `Error: ${e.message || 'Internal server error!'}`; + } +}; + +handler.help = ['anime']; +handler.tags = ['quotes']; +handler.command = /^(anime)$/i; + +module.exports = handler; diff --git a/plugins/quotes-bacot.js b/plugins/quotes-bacot.js new file mode 100644 index 0000000000000000000000000000000000000000..f72c70589e1de25506202fb00ce7561ef9cf9d8d --- /dev/null +++ b/plugins/quotes-bacot.js @@ -0,0 +1,25 @@ +let fetch = require('node-fetch') +let handler = async (m, { conn } ) => { +let res = await fetch(`https://api.botcahx.eu.org/api/random/bacot?apikey=${btc}`).then(result => result.json()) +let anu =` +โ”€โ”€โ”€โ”€โ”€ใ€” *Bacot* ใ€•โ”€โ”€โ”€โ”€โ”€ + +${res.hasl} +` +conn.reply(m.chat, anu, m) +} +handler.help = ['bacot'] +handler.tags = ['quotes'] +handler.command = /^(bacot)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler diff --git a/plugins/quotes-katabijak.js b/plugins/quotes-katabijak.js new file mode 100644 index 0000000000000000000000000000000000000000..cda17c09a81831ef663a2cd72c0100831c019bcc --- /dev/null +++ b/plugins/quotes-katabijak.js @@ -0,0 +1,28 @@ +const fetch = require('node-fetch'); + +let handler = async (m, { conn }) => { +const res = await fetch(`https://api.botcahx.eu.org/api/random/bijak?apikey=${btc}`).then(result => result.json()) + + +let anu =`โ”€โ”€โ”€โ”€โ”€ใ€” *Kata Bijak* ใ€•โ”€โ”€โ”€โ”€โ”€ + +${res.result} +` +m.reply(anu) +} +handler.help = ['katabijak'] +handler.tags = ['quotes'] +handler.command = /^(katabijak)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false +handler.register = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler diff --git a/plugins/quotes-motivasi.js b/plugins/quotes-motivasi.js new file mode 100644 index 0000000000000000000000000000000000000000..83ad1239ac380e0ed38acdef48bcbe9447916291 --- /dev/null +++ b/plugins/quotes-motivasi.js @@ -0,0 +1,15 @@ +let fetch = require('node-fetch') +let handler = async (m, { conn }) => { +try { + let res = await fetch(`https://api.botcahx.eu.org/api/random/motivasi?&apikey=${btc}`); + let json = await res.json() + conn.reply(m.chat, `โ€•MOTIVASIโ€•\n\n"${json.result}"`,); +} catch (e) { +throw `Internal server eror!` + } +} +handler.help = ['motivasi'] +handler.tags = ['quotes'] +handler.command = /^(motivasi)$/i + +module.exports = handler diff --git a/plugins/quotes-random.js b/plugins/quotes-random.js new file mode 100644 index 0000000000000000000000000000000000000000..1558fe4f6c606cd051aa55cf982dc6a4f4e2c874 --- /dev/null +++ b/plugins/quotes-random.js @@ -0,0 +1,56 @@ +const fetch = require('node-fetch'); + +let handler = async (m, { conn, command }) => { + let anu = `โ”€โ”€โ”€โ”€โ”€ใ€” *${command}* ใ€•โ”€โ”€โ”€โ”€โ”€\n`; + + if (command === 'bucin') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/katabucin?apikey=${btc}`)).json(); + anu += res.bucin; + } else if (command === 'katailham') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/katailham?apikey=${btc}`)).json(); + anu += res.hasil; + } else if (command === 'katadilan') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/katadilan?apikey=${btc}`)).json(); + anu += res.dilan; + } else if (command === 'fiersa') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/fiersa?apikey=${btc}`)).json(); + anu += res.fiersa; + } else if (command === 'fakta') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/fakta?apikey=${btc}`)).json(); + anu += res.result; + } else if (command === 'nyindir') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/nyindir?apikey=${btc}`)).json(); + anu += res.hasl; + } else if (command === 'ngawur') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/ngawur?apikey=${btc}`)).json(); + anu += res.hasl; + } else if (command === 'jawa') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/quotesjawa?apikey=${btc}`)).json(); + anu += res.quotes; + } else if (command === 'quotes') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/quotes?apikey=${btc}`)).json(); + anu += res.quotes; + } else if (command === 'sunda') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/sunda?apikey=${btc}`)).json(); + anu += res.hasl; + } else if (command === 'batak') { + const res = await (await fetch(`https://api.botcahx.eu.org/api/random/batak?apikey=${btc}`)).json(); + anu += res.hasl; + } + m.reply(anu); +}; + +handler.help = ['bucin', 'katailham', 'katadilan', 'fiersa', 'fakta', 'nyindir', 'ngawur', 'jawa', 'quotes','sunda','batak']; +handler.tags = ['quotes']; +handler.command = /^(bucin|katailham|katadilan|fiersa|fakta|nyindir|ngawur|jawa|quotes|sunda|batak)$/i; +handler.owner = false; +handler.mods = false; +handler.premium = false; +handler.group = false; +handler.private = false; +handler.register = false; +handler.admin = false; +handler.botAdmin = false; +handler.fail = null; + +module.exports = handler; diff --git a/plugins/rpg-adventure.js b/plugins/rpg-adventure.js new file mode 100644 index 0000000000000000000000000000000000000000..fb44e92812b442c46dc0d8081c3adc5c1016708a --- /dev/null +++ b/plugins/rpg-adventure.js @@ -0,0 +1,189 @@ +let handler = async (m, { conn, usedPrefix, owner }) => { + try { + let user = global.db.data.users[m.sender] + + // Check if the user has both sword and armor + if (!user.sword) { + conn.reply(m.chat, 'โš”๏ธ Kamu belum memiliki sword, ketik *' + usedPrefix + 'craft sword* untuk memulai adventure', m) + return + } + + if (!user.armor) { + conn.reply(m.chat, '๐Ÿ›ก๏ธ Kamu belum memiliki armor, ketik *' + usedPrefix + 'craft armor* untuk memulai adventure', m) + return + } + + let __timers = (new Date - user.lastadventure) + let _timers = (600000 - __timers) // 10 minutes in milliseconds + let timers = clockString(_timers) + if (user.healt > 79) { + if (new Date - user.lastadventure > 600000) { // 10 minutes cooldown + // Define monsters + let monsters = [ + { name: 'Goblin', health: 20, attack: 5 }, + { name: 'Troll', health: 50, attack: 10 }, + { name: 'Dragon', health: 100, attack: 20 }, + { name: 'Zombie', health: 30, attack: 7 }, + { name: 'Vampire', health: 40, attack: 15 }, + { name: 'Werewolf', health: 70, attack: 17 }, + { name: 'Skeleton', health: 25, attack: 8 }, + { name: 'Orc', health: 60, attack: 12 }, + { name: 'Witch', health: 45, attack: 14 }, + { name: 'Golem', health: 80, attack: 18 }, + { name: 'Demon', health: 120, attack: 25 }, + { name: 'Phoenix', health: 150, attack: 30 }, + { name: 'Hydra', health: 200, attack: 35 }, + { name: 'Kraken', health: 250, attack: 40 }, + { name: 'Minotaur', health: 300, attack: 45 }, + { name: 'Basilisk', health: 350, attack: 50 }, + { name: 'Griffin', health: 400, attack: 55 }, + { name: 'Cyclops', health: 450, attack: 60 }, + { name: 'Chimera', health: 500, attack: 65 }, + { name: 'Leviathan', health: 550, attack: 70 } + ] + + // Define bosses + let bosses = [ + { name: 'Ancient Dragon', health: 1000, attack: 100 }, + { name: 'Dark Lord', health: 1200, attack: 120 }, + { name: 'Titan', health: 1500, attack: 150 }, + { name: 'Elder God', health: 2000, attack: 200 } + ] + + // Pick a random monster or boss + let isBoss = Math.random() < 0.1 // 10% chance to encounter a boss + let enemy = isBoss ? bosses[Math.floor(Math.random() * bosses.length)] : monsters[Math.floor(Math.random() * monsters.length)] + let enemyHealth = enemy.health + let enemyAttack = enemy.attack + + // Simulate battle + let userAttack = 10 // Example user attack power + while (user.healt > 0 && enemyHealth > 0) { + enemyHealth -= userAttack + if (enemyHealth > 0) { + user.healt -= enemyAttack + } + } + + if (user.healt <= 0) { + conn.reply(m.chat, `๐Ÿ˜ต Kamu kalah dalam pertarungan melawan ${enemy.name}. Sehatkan diri terlebih dahulu.`, m) + return + } + + let armor = user.armor + let rubah = user.rubah + let kuda = user.kuda + let kucing = user.kucing + let serigala = user.serigala + let _healt = `${Math.floor(Math.random() * 101)}`.trim() + let healt = (_healt * 1) + let exp = `${Math.floor(Math.random() * 10000)}`.trim() + let uang = `${Math.floor(Math.random() * 100000)}`.trim() + let _potion = ['1', '2', '3'] + let potion = _potion[Math.floor(Math.random() * _potion.length)] + let _sampah = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50'] + let sampah = _sampah[Math.floor(Math.random() * _sampah.length)] + let _diamond = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] + let diamond = _diamond[Math.floor(Math.random() * _diamond.length)] + let _common = ['1', '2', '3'] + let common = _common[Math.floor(Math.random() * _common.length)] +let _uncommon = ['1', '2', '1', '2'] +let uncommon = _uncommon[Math.floor(Math.random() * _uncommon.length)] +let _mythic = `${pickRandom(['1', '3', '1', '1', '2'])}` +let mythic = (_mythic * 1) +let _legendary = `${pickRandom(['1', '3', '1', '1', '2'])}` +let legendary = (_legendary * 1) +let itemrand = [`*Selamat anda mendapatkan item rare yaitu*\n${mythic} ๐ŸŽ Mythic Crate`, `*Selamat kamu mendapatkan item rare yaitu*\n${legendary} ๐ŸŽ Legendary Crate`] +let rendem = itemrand[Math.floor(Math.random() * itemrand.length)] +let peta = pickRandom([ + '๐Ÿฏ Jepang', '๐Ÿ‡ฐ๐Ÿ‡ท Korea', '๐Ÿ๏ธ Bali', '๐Ÿ‡บ๐Ÿ‡ธ Amerika', '๐Ÿ‡ฎ๐Ÿ‡ถ Iraq', '๐Ÿ‡ธ๐Ÿ‡ฆ Arab', '๐Ÿ‡ต๐Ÿ‡ฐ Pakistan', + '๐Ÿ‡ฉ๐Ÿ‡ช German', '๐Ÿ‡ซ๐Ÿ‡ฎ Finlandia', '๐Ÿ’ค Ke bawa dunia mimpi', '๐ŸŒ Ujung dunia', '๐Ÿ”ด Mars', '๐Ÿ‡ฟ๐Ÿ‡ผ Zimbabwe', + '๐ŸŒ• Bulan', '๐Ÿ”ต Pluto', 'โ˜€๏ธ Matahari', '๐Ÿ’– Hatinya dia', '๐ŸŒฒ Hutan Amazon', '๐Ÿœ๏ธ Gurun Sahara', + '๐Ÿ”๏ธ Pegunungan Himalaya', '๐ŸŒŠ Samudra Atlantik', '๐Ÿฐ Kastil Terbengkalai', '๐ŸŒŒ Galaksi Andromeda', + '๐Ÿž๏ธ Grand Canyon', '๐Ÿœ๏ธ Death Valley', '๐Ÿ•๏ธ Yosemite', '๐Ÿ–๏ธ Maldives', '๐Ÿ™๏ธ New York', '๐Ÿ‡ฎ๐Ÿ‡ณ India', + '๐Ÿ‡ง๐Ÿ‡ท Brazil', '๐Ÿ‡ฟ๐Ÿ‡ฆ South Africa', '๐Ÿ‡ฆ๐Ÿ‡บ Australia', '๐Ÿ‡จ๐Ÿ‡ฆ Canada', '๐Ÿ‡ท๐Ÿ‡บ Russia', '๐Ÿ‡ฒ๐Ÿ‡ฝ Mexico', '๐Ÿ‡ณ๐Ÿ‡ฟ New Zealand', + '๐Ÿž๏ธ Patagonia', '๐Ÿ‡ซ๐Ÿ‡ท France', '๐Ÿ‡ช๐Ÿ‡ธ Spain', '๐Ÿ‡ฎ๐Ÿ‡น Italy', '๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom', '๐Ÿ‡จ๐Ÿ‡ญ Switzerland' +]) +let str = ` +๐Ÿฉธ Nyawa mu berkurang -${healt * 1} karena Kamu telah berpetualang sampai ${peta} dan melawan ${enemy.name}. Kamu mendapatkan: +โœจ *Exp:* ${exp} +๐Ÿ’ฐ *Uang:* ${uang} +๐ŸŽซ *Tiketcoin:* 1 +๐Ÿ—‘๏ธ *Sampah:* ${sampah}${potion == 0 ? '' : '\n๐Ÿงช *Potion:* ' + potion + ''}${diamond == 0 ? '' : '\n๐Ÿ’Ž *Diamond:* ' + diamond + ''}${common == 0 ? '' : '\n๐Ÿ“ฆ *Common crate:* ' + common + ''}${uncommon == 0 ? '' : '\n๐ŸŽ *Uncommon crate:* ' + uncommon + ''} +`.trim() + +setTimeout(() => { + conn.reply(m.chat, str, m, { + contextInfo: { + externalAdReply: { + mediaType: 1, + title: wm, + thumbnailUrl: 'https://telegra.ph/file/221ec27b2997f203569eb.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + } + } + }) +}, 0) +setTimeout(() => { + conn.reply(m.chat, rendem, m) +}, 1000) + +user.healt -= healt * 1 +user.exp += exp * 1 +user.tiketcoin += 1 +user.money += uang * 1 +user.potion += potion * 1 +user.diamond += diamond * 1 +user.common += common * 1 +user.uncommon += uncommon * 1 +user.sampah += sampah * 1 +user.mythic += mythic * 1 +user.legendary += legendary * 1 +user.lastadventure = new Date * 1 + +// Decrease sword and armor durability +user.sworddurability -= 1 +user.armordurability -= 1 + +// Check for broken sword or armor +if (user.sworddurability <= 0) { + user.sword = false + conn.reply(m.chat, 'โš”๏ธ Sword kamu telah rusak, craft lagi untuk melanjutkan adventure.', m) +} +if (user.armordurability <= 0) { + user.armor = false + conn.reply(m.chat, '๐Ÿ›ก๏ธ Armor kamu telah rusak, craft lagi untuk melanjutkan adventure.', m) +} + +} else { + conn.reply(m.chat, `๐Ÿ’ง Anda sudah berpetualang dan kelelahan, silahkan coba *${timers}* lagi`, m) +} +} else { + conn.reply(m.chat, '๐Ÿฉธ Minimal 80 healt untuk bisa berpetualang, beli nyawa dulu dengan ketik *' + usedPrefix + 'shop buy potion <jumlah>*\ndan ketik *' + usedPrefix + 'use potion <jumlah>*', m) +} +} catch (e) { + console.log(e) + conn.reply(m.chat, 'Error', m) +} +} + +handler.help = ['adventure'] +handler.tags = ['rpg'] +handler.command = /^(adventure)$/i +handler.limit = true +handler.group = true +handler.fail = null + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} + +function clockString(ms) { + let h = Math.floor(ms / 3600000) // Hours + let m = Math.floor(ms / 60000) % 60 // Minutes + let s = Math.floor(ms / 1000) % 60 // Seconds + return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') +} diff --git a/plugins/rpg-airdrop.js b/plugins/rpg-airdrop.js new file mode 100644 index 0000000000000000000000000000000000000000..f1a8d9056d1b1bc16d528f438dfaa7589e2b4880 --- /dev/null +++ b/plugins/rpg-airdrop.js @@ -0,0 +1,65 @@ +let fetch = require('node-fetch'); +let fs = require('fs'); + +let timeout = 3600000 // 1 jam dalam milidetik + +let handler = async (m, { conn, args, usedPrefix, DevMode }) => { + + let u = global.db.data.users[m.sender]; + let time = u.lastclaim + 3600000; // 1 jam dalam milidetik + if (new Date - u.lastclaim < 3600000) throw `*Sudah Melakukan Pencarian Airdrop!* ๐Ÿช™\nHarus menunggu selama agar bisa mencari Airdrop kembali selama ${clockString(time - new Date())}`; + let Aku = `${Math.floor(Math.random() * 101)}`.trim(); + let Kamu = `${Math.floor(Math.random() * 81)}`.trim(); + let A = (Aku * 1); + let K = (Kamu * 1); + + if (A > K) { + let _sampah = Array.from({length: 50}, (_, i) => (i + 1).toString()); + let sampah = _sampah[Math.floor(Math.random() * _sampah.length)]; + let kayu = _sampah[Math.floor(Math.random() * _sampah.length)]; + let batu = _sampah[Math.floor(Math.random() * _sampah.length)]; + conn.sendFile(m.chat, 'https://telegra.ph/file/60437ce6d807b605adf5e.jpg', 'zonk.jpg', `*Airdrop Ampas!* Ternyata isinya tidak sesuai ekspektasi\n\n*Rewards*\nโ€ข *Sampah:* ${sampah}\nโ€ข *Kayu:* ${kayu}\nโ€ข *Batu:* ${batu}`, m); + u.sampah += parseInt(sampah); + u.kayu += parseInt(kayu); + u.batu += parseInt(batu); + u.lastclaim = new Date * 1; + } else if (A < K) { + let _limit = ['10', '20', '30']; + let limit = _limit[Math.floor(Math.random() * _limit.length)]; + let _money = ['10000', '100000', '500000']; + let money = _money[Math.floor(Math.random() * _money.length)]; + let _point = ['10000', '100000', '500000']; + let point = _point[Math.floor(Math.random() * _point.length)]; + conn.sendFile(m.chat, 'https://telegra.ph/file/d3bc1d7a97c62d3baaf73.jpg', 'rare.jpg', `*Airdrop Rare!*, Kamu mendapatkan Kotak Airdrop *Rare*\n\nSelamat kamu mendapatkan *Rewards*\nโ€ข *Limit:* ${limit}\nโ€ข *Money:* ${money}\nโ€ข *Point:* ${point}`, m); + u.limit += parseInt(limit); + u.money += parseInt(money); + u.poin += parseInt(point); + u.lastclaim = new Date * 1; + } else { + conn.sendFile(m.chat, 'https://telegra.ph/file/5d71027ecbcf771b299fb.jpg', 'zonk.jpg', `*Airdrop Zonks!*, Kamu mendapatkan Kotak Airdrop *Zonk (Kosong)*\n\nSelamat kamu mendapatkan *Rewards*\nโ€ข *Money:* -1.000.000\nโ€ข *Isi:* Angin`, m); + u.money -= 1000000; + u.lastclaim = new Date * 1; + } + + /*setTimeout(() => { + conn.reply(m.chat, `Waktunya berburu *Airdrop!*`, m); + }, timeout);*/ +}; + +handler.help = ['airdrop']; +handler.tags = ['rpg']; +handler.command = /^(airdrop)$/i; +handler.group = true; +module.exports = handler; + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)]; +} + +function clockString(ms) { + let d = isNaN(ms) ? '--' : Math.floor(ms / 86400000); + let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) % 24; + let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60; + let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60; + return ['\n*' + d + '* _Hari_ โ˜€๏ธ\n ', '*' + h + '* _Jam_ ๐Ÿ•\n ', '*' + m + '* _Menit_ โฐ\n ', '*' + s + '* _Detik_ โฑ๏ธ '].map(v => v.toString().padStart(2, 0)).join(''); +} \ No newline at end of file diff --git a/plugins/rpg-aot.js b/plugins/rpg-aot.js new file mode 100644 index 0000000000000000000000000000000000000000..ae07256ac6e1ae4108abfc24847dddbe27031407 --- /dev/null +++ b/plugins/rpg-aot.js @@ -0,0 +1,177 @@ +let handler = async (m, { conn, usedPrefix, owner }) => { + try { + let user = global.db.data.users[m.sender] + + // Check if the user has both sword and armor + if (!user.sword) { + conn.reply(m.chat, 'โš”๏ธ Kamu belum memiliki sword, ketik *' + usedPrefix + 'craft sword* untuk memulai adventure', m) + return + } + + if (!user.armor) { + conn.reply(m.chat, '๐Ÿ›ก๏ธ Kamu belum memiliki armor, ketik *' + usedPrefix + 'craft armor* untuk memulai adventure', m) + return + } + + let __timers = (new Date - user.lastadventure) + let _timers = (600000 - __timers) // 10 minutes in milliseconds + let timers = clockString(_timers) + if (user.healt > 79) { + if (new Date - user.lastadventure > 600000) { // 10 minutes cooldown + // Define Titans + let monsters = [ + { name: 'Pure Titan', health: 20, attack: 5 }, + { name: 'Abnormal Titan', health: 50, attack: 10 }, + { name: 'Armored Titan', health: 100, attack: 20 }, + { name: 'Female Titan', health: 30, attack: 7 }, + { name: 'Colossal Titan', health: 40, attack: 15 }, + { name: 'Beast Titan', health: 70, attack: 17 }, + { name: 'Cart Titan', health: 25, attack: 8 }, + { name: 'Jaw Titan', health: 60, attack: 12 }, + { name: 'War Hammer Titan', health: 45, attack: 14 }, + { name: 'Attack Titan', health: 80, attack: 18 }, + { name: 'Founding Titan', health: 120, attack: 25 }, + { name: 'Ymirโ€™s Titan', health: 150, attack: 30 }, + { name: 'Rod Reiss Titan', health: 200, attack: 35 }, + { name: 'Mindless Titan', health: 250, attack: 40 }, + { name: 'Dina Fritz Titan', health: 300, attack: 45 }, + { name: 'Smiling Titan', health: 350, attack: 50 }, + { name: 'Grisha Yeager Titan', health: 400, attack: 55 }, + { name: 'Frieda Reiss Titan', health: 450, attack: 60 }, + { name: 'Eren Yeager Titan', health: 500, attack: 65 }, + { name: 'Armin Arlert Titan', health: 550, attack: 70 } + ] + + // Define Boss Titans + let bosses = [ + { name: 'Eren Yeager (Founding Titan)', health: 1000, attack: 100 }, + { name: 'Zeke Yeager (Beast Titan)', health: 1200, attack: 120 }, + { name: 'Reiner Braun (Armored Titan)', health: 1500, attack: 150 }, + { name: 'Bertholdt Hoover (Colossal Titan)', health: 2000, attack: 200 } + ] + + // Pick a random Titan or Boss Titan + let isBoss = Math.random() < 0.1 // 10% chance to encounter a boss + let enemy = isBoss ? bosses[Math.floor(Math.random() * bosses.length)] : monsters[Math.floor(Math.random() * monsters.length)] + let enemyHealth = enemy.health + let enemyAttack = enemy.attack + + // Simulate battle + let userAttack = 10 // Example user attack power + while (user.healt > 0 && enemyHealth > 0) { + enemyHealth -= userAttack + if (enemyHealth > 0) { + user.healt -= enemyAttack + } + } + + if (user.healt <= 0) { + conn.reply(m.chat, `๐Ÿ˜ต Kamu kalah dalam pertarungan melawan ${enemy.name}. Sehatkan diri terlebih dahulu.`, m) + return + } + + let _money = `${Math.floor(Math.random() * 100001)}`.trim() + let money = (_money * 1) + let exp = `${Math.floor(Math.random() * 10001)}`.trim() + let kayu = `${Math.floor(Math.random() * 51)}`.trim() + let batu = `${Math.floor(Math.random() * 51)}`.trim() + let limit = `${Math.floor(Math.random() * 50) + 1}`.trim() // Random limit between 1 and 50 + let _stamina = `${Math.floor(Math.random() * 51)}`.trim() + let stamina = (_stamina * 1) + let _mythic = `${pickRandom(['1', '3', '1', '1', '2'])}` + let mythic = (_mythic * 1) + let _legendary = `${pickRandom(['1', '3', '1', '1', '2'])}` + let legendary = (_legendary * 1) + let itemrand = [`*Selamat anda mendapatkan item rare yaitu*\n${mythic} ๐ŸŽ Mythic Crate`, `*Selamat kamu mendapatkan item rare yaitu*\n${legendary} ๐ŸŽ Legendary Crate`] + let rendem = itemrand[Math.floor(Math.random() * itemrand.length)] + let peta = pickRandom([ + 'Wall Maria', 'Wall Rose', 'Wall Sina', 'Shiganshina District', 'Trost District', 'Stohess District', + 'Ragako Village', 'Utgard Castle', 'Forest of Giant Trees', 'Warriors District', 'Yeagerist Base', + 'Liberio', 'Marley', 'Paths', 'Fort Slava', 'Paradise Island', 'Mahr Headquarters', 'Odiha', + 'Port of Kiyomi', 'Hizuru', 'Port of Marley', 'Underground City', 'Southern Slums', 'Northern Slums', + 'Eastern Slums', 'Western Slums', 'Training Grounds', 'Orvud District', 'Utopia District', + 'Klorva District', 'Karanes District', 'Kolkhoz Village' + ]) + let str = ` +๐Ÿฉธ *Nyawa* mu berkurang -${userAttack * 1} karena Kamu telah berpetualang sampai *${peta}* dan melawan *${enemy.name}*. Kamu mendapatkan: +โš—๏ธ *Exp:* ${exp} +๐Ÿ’ต *Uang:* ${money} +๐ŸŽŸ๏ธ *Tiketcoin:* 1 +๐Ÿชต *Kayu:* ${kayu} +๐Ÿชจ *Batu:* ${batu} +๐Ÿท๏ธ *Limit:* ${limit} +โšก *Stamina berkurang:* -${stamina} +`.trim() + + setTimeout(() => { + conn.reply(m.chat, str, m, { + contextInfo: { + externalAdReply: { + mediaType: 1, + title: wm, + thumbnailUrl: 'https://telegra.ph/file/e615e0a6000ff647b4314.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + } + } + }) + }, 0) + setTimeout(() => { + conn.reply(m.chat, rendem, m) + }, 1000) + + user.health -= userAttack * 1 + user.exp += exp * 1 + user.tiketcoin += 1 + user.money += money * 1 + user.kayu += kayu * 1 + user.batu += batu * 1 + user.stamina -= stamina // Decrease stamina by random value + user.limit += limit * 1 // Increase limit + user.lastadventure = new Date * 1 + + // Decrease sword and armor durability + user.sworddurability -= 1 + user.armordurability -= 1 + + // Check for broken sword or armor + if (user.sworddurability <= 0) { + user.sword = false + conn.reply(m.chat, 'โš”๏ธ Sword kamu telah rusak, craft lagi untuk melanjutkan adventure.', m) + } + if (user.armordurability <= 0) { + user.armor = false + conn.reply(m.chat, '๐Ÿ›ก๏ธ Armor kamu telah rusak, craft lagi untuk melanjutkan adventure.', m) + } + + } else { + conn.reply(m.chat, `๐Ÿ’ง Anda sudah berpetualang dan kelelahan, silahkan coba *${timers}* lagi`, m) + } + } else { + conn.reply(m.chat, '๐Ÿฉธ Minimal 80 health untuk bisa berpetualang, beli nyawa dulu dengan ketik *' + usedPrefix + 'shop buy potion <jumlah>*\ndan ketik *' + usedPrefix + 'use potion <jumlah>*', m) + } + } catch (e) { + console.log(e) + conn.reply(m.chat, 'Error', m) + } +} + +handler.help = ['attacktitan'] +handler.tags = ['rpg'] +handler.command = /^(attacktitan)$/i +handler.limit = true +handler.group = true +handler.fail = null + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} + +function clockString(ms) { + let h = Math.floor(ms / 3600000) // Hours + let m = Math.floor(ms / 60000) % 60 // Minutes + let s = Math.floor(ms / 1000) % 60 // Seconds + return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') +} diff --git a/plugins/rpg-atm(nabung).js b/plugins/rpg-atm(nabung).js new file mode 100644 index 0000000000000000000000000000000000000000..43f1b21a7ddbaf12d7b52b540993e506e1d6fb21 --- /dev/null +++ b/plugins/rpg-atm(nabung).js @@ -0,0 +1,27 @@ +const moneyplus = 1 +let handler = async (m, { conn, command, args }) => { + let count = command.replace(/^atm/i, '') + count = count ? /all/i.test(count) ? Math.floor(global.db.data.users[m.sender].money / moneyplus) : parseInt(count) : args[0] ? parseInt(args[0]) : 1 + count = Math.max(1, count) + if (global.db.data.users[m.sender].money >= moneyplus * count) { + global.db.data.users[m.sender].money -= moneyplus * count + global.db.data.users[m.sender].bank += count + conn.reply(m.chat, `๐Ÿšฉ -${moneyplus * count} Money\n+ ${count} ATM`, m) + } else conn.reply(m.chat, `๐Ÿšฉ Money not enough to save ${count} ATM`, m) +} +handler.help = ['atm *<amount>*', 'atmall'] +handler.tags = ['rpg'] +handler.command = /^(atm([0-9]+)|atm|atmall)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false +handler.limit = true +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.exp = 0 + +module.exports = handler diff --git a/plugins/rpg-atm(tarik).js b/plugins/rpg-atm(tarik).js new file mode 100644 index 0000000000000000000000000000000000000000..4f43d8b561c401bd08e9f67cd3eca54c9903d539 --- /dev/null +++ b/plugins/rpg-atm(tarik).js @@ -0,0 +1,27 @@ +const moneymins = 1 +let handler = async (m, { conn, command, args }) => { + let count = command.replace(/^pull/i, '') + count = count ? /all/i.test(count) ? Math.floor(global.db.data.users[m.sender].bank / moneymins) : parseInt(count) : args[0] ? parseInt(args[0]) : 1 + count = Math.max(1, count) + if (global.db.data.users[m.sender].bank >= moneymins * count) { + global.db.data.users[m.sender].bank -= moneymins * count + global.db.data.users[m.sender].money += count + conn.reply(m.chat, `๐Ÿšฉ -${moneymins * count} ATM\n+ ${count} Money`, m) + } else conn.reply(m.chat, `๐Ÿšฉ ATM you are left ${count} !!`, m) +} +handler.help = ['pull *<amount>*', 'pullall'] +handler.tags = ['rpg'] +handler.command = /^pull([0-9]+)|pull|pullall$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false +handler.limit = true +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.exp = 0 + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-bank.js b/plugins/rpg-bank.js new file mode 100644 index 0000000000000000000000000000000000000000..c6f475d1d8dc26f2bd74bc2af29ce687d8382d37 --- /dev/null +++ b/plugins/rpg-bank.js @@ -0,0 +1,47 @@ +let handler = async (m, { conn, args, usedPrefix, command }) => { + let target = m.mentionedJid[0] || m.sender + let user = global.db.data.users[target] + + let name = user.name + let exp = user.exp + let limit = user.limit + let balance = user.money + let atm = user.bank + let level = user.level + let role = user.role + + let capt = `ไน‚ *๐Ÿฆ B A N K - U S E R ๐Ÿฆ* ไน‚\n\n` + capt += ` โ—ฆ *๐Ÿ‘ค Nama* : ${name}\n` + capt += ` โ—ฆ *โญ Role* : ${role}\n` + capt += ` โ—ฆ *โœจ Exp* : ${exp}\n` + capt += ` โ—ฆ *๐Ÿ“Š Limit* : ${limit}\n` + capt += ` โ—ฆ *๐Ÿ’ฐ Saldo* : ${balance}\n` + capt += ` โ—ฆ *๐Ÿ“ˆ Level* : ${level}\n` + capt += ` โ—ฆ *๐Ÿง ATM* : ${atm}\n\n` + capt += `> *${usedPrefix} atm <jumlah>* untuk menabung\n` + capt += `> *${usedPrefix} pull <jumlah>* untuk menarik uang\n` + + await conn.relayMessage(m.chat, { + extendedTextMessage:{ + text: capt, + contextInfo: { + mentionedJid: [m.sender], + externalAdReply: { + title: wm, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://pomf2.lain.la/f/106ebnd3.jpg', + sourceUrl: 'https://whatsapp.com/channel/0029Va8ZH8fFXUuc69TGVw1q' + } + }, + mentions: [m.sender] + } + }, {}) +} + +handler.help = ['bank'] +handler.tags = ['rpg'] +handler.command = /^bank$/ + +module.exports = handler diff --git a/plugins/rpg-bansos.js b/plugins/rpg-bansos.js new file mode 100644 index 0000000000000000000000000000000000000000..996837c0a972d37a7aa2073a1e09e84688c41cc8 --- /dev/null +++ b/plugins/rpg-bansos.js @@ -0,0 +1,42 @@ +let handler = async (m, { conn, command }) => { + let user = global.db.data.users[m.sender] + let randomaku = Math.floor(Math.random() * 150) + let randomkamu = Math.floor(Math.random() * 75) //biar sering ke tangkap wkwk + let __timers = (new Date - user.lastbansos) + let _timers = (3600000 - __timers) + let timers = clockString(_timers) + if (user.money < 5000000) return m.reply(`Uang Anda Harus Diatas 5Juta Untuk Menggunakan Command Ini`) + if (new Date - user.lastbansos > 300000) { + if (randomaku > randomkamu) { + conn.sendFile(m.chat, 'https://telegra.ph/file/afcf9a7f4e713591080b5.jpg', 'korupsi.jpg', `Kamu Tertangkap Setelah Kamu korupsi dana bansos๐Ÿ•ด๏ธ๐Ÿ’ฐ, Dan Kamu harus membayar denda 5 Juta rupiah๐Ÿ’ต`, m) + user.money -= 5000000 + user.lastbansos = new Date * 1 + } else if (randomaku < randomkamu) { + user.money += 5000000 + conn.sendFile(m.chat, 'https://telegra.ph/file/d31fcc46b09ce7bf236a7.jpg', 'korupsi.jpg', `Kamu berhasil korupsi dana bansos๐Ÿ•ด๏ธ๐Ÿ’ฐ, Dan Kamu mendapatkan 5 Juta rupiah๐Ÿ’ต`, m) + user.lastbansos = new Date * 1 + } else { + m.reply(`Sorry Gan Lu g Berhasil Korupsi bansos Dan Tidak masuk penjara karna Kamu *melarikan diri๐Ÿƒ*`) + user.lastbansos = new Date * 1 + } + } else m.reply(`Silahkan Menunggu ${timers} Untuk ${command} Lagi`) +} + +handler.help = ['korupsi'] +handler.tags = ['rpg'] +handler.command = /^(bansos|korupsi)$/i +handler.register = true +handler.group = true +handler.rpg = true +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} + +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-battlepet.js b/plugins/rpg-battlepet.js new file mode 100644 index 0000000000000000000000000000000000000000..f7f8b8b06c311570b2ecf567ec4f1cb8bb406d25 --- /dev/null +++ b/plugins/rpg-battlepet.js @@ -0,0 +1,72 @@ +const pets = ['kucing', 'anjing', 'serigala', 'phonix', 'rubah'] + +let handler = async (m, { conn, text: txt, usedPrefix, participants }) => { + conn.battlepet = conn.battlepet ? conn.battlepet : {} + let text = (txt || '').toLowerCase() + let id = 'battle-' + m.sender + let user = global.db.data.users[m.sender] + let item = pets.filter(v => v in user && typeof user[v] == 'number') + if (!item.includes(text)) return m.reply(`List Pet :\n${pets.map(v => { return `โ€ข ${v}` }).join('\n') }`) + if (user[text] == 0) return m.reply('Kamu Tidak Memiliki Pet Ini!') + if (typeof conn.battlepet[id] != "undefined" && conn.battlepet[id] == true) return m.reply(`Kamu masih berada di battle-pet.`) + let users = participants.map(u => u.id) + var lawan + lawan = users[Math.floor(users.length * Math.random())] + + while (typeof global.db.data.users[lawan] == "undefined" || lawan == m.sender) { + lawan = users[Math.floor(users.length * Math.random())] + } + + m.reply(`*Kamu* (${text} level ${user[text]}) menantang *'@' +${conn.getName(lawan)}* (${text} level ${global.db.data.users[lawan][text]}) dan sedang dalam pertarungan.\n\nTunggu 5 menit lagi dan lihat siapa yg menang.`) + conn.battlepet[id] = true + + await delay(300000) + + let kesempatan = [] + for (let i = 0; i < user[text]; i++) kesempatan.push(m.sender) + for (let i = 0; i < global.db.data.users[lawan][text]; i++) kesempatan.push(lawan) + + let pointPemain = 0 + let pointLawan = 0 + for (let i = 0; i < 10; i++) { + let unggul = getRandom(0, kesempatan.length - 1) + if (kesempatan[unggul] == m.sender) pointPemain += 1 + else pointLawan += 1 + } + + if (pointPemain > pointLawan) { + let hadiah = (pointPemain - pointLawan) * 10000 + user.money += hadiah + user.limit += 1 + m.reply(`*${conn.getName(m.sender)}* [${pointPemain * 10}] - [${pointLawan * 10}] *${conn.getName(lawan)}*\n\n*Kamu* (${text} level ${user[text]}) menang melawan *${conn.getName(lawan)}* (${text} level ${global.db.data.users[lawan][text]}) karena kamu ${alasanMenang[getRandom(0, alasanMenang.length - 1)]}\n\nHadiah . ${hadiah.toLocaleString()}\n+1 Limit`) + } else if (pointPemain < pointLawan) { + let denda = (pointLawan - pointPemain) * 100000 + user.money -= denda + user.limit += 1 + m.reply(`*${conn.getName(m.sender)}* [${pointPemain * 10}] - [${pointLawan * 10}] *${conn.getName(lawan)}*\n\n*Kamu* (${text} level ${user[text]}) kalah melawan *${conn.getName(lawan)}* (${text} level ${global.db.data.users[lawan][text]}) karena kamu ${alasanKalah[getRandom(0, alasanKalah.length - 1)]}\n\nMoney kamu berkurang ${denda.toLocaleString()}\n+1 Limit`) + } else { + m.reply(`*${conn.getName(m.sender)}* [${pointPemain * 10}] - [${pointLawan * 10}] *${conn.getName(lawan)}*\n\nHasil imbang kak, ga dapet apa apa`) + } + + delete conn.battlepet[id] +} +handler.help = ['battlepet'] +handler.tags = ['rpg'] +handler.command = /^(battlepet)$/i + +handler.register = true +handler.group = true +handler.rpg = true + +module.exports = handler + +function getRandom(min, max) { + min = Math.ceil(min) + max = Math.floor(max) + return Math.floor(Math.random() * (max - min + 1)) + min +} + +const alasanKalah = ['Noob', 'Cupu', 'Kurang hebat', 'Ampas kalahan', 'Gembel kalahan', 'Pet Jelek', 'Level Kecil'] +const alasanMenang = ['Hebat', 'Pro', 'Master Game', 'Legenda game', 'Sangat Pro', 'Rajin Nge-push'] + +const delay = time => new Promise(res => setTimeout(res, time)); \ No newline at end of file diff --git a/plugins/rpg-bebaskan.js b/plugins/rpg-bebaskan.js new file mode 100644 index 0000000000000000000000000000000000000000..546a34811e0cc8641b3ba93e51045a62a874646a --- /dev/null +++ b/plugins/rpg-bebaskan.js @@ -0,0 +1,22 @@ +let handler = async (m, { conn, text }) => { + if (!text) throw 'โ€ข *Contoh :* .bebaskan 62ร—ร—ร—' + let who + if (m.isGroup) who = m.mentionedJid[0] + else who = m.chat + if (!who) throw 'Tag orang yang ingin dibebaskan dari penjara' + + let users = global.db.data.users + + // Mengecek pekerjaan pengguna yang meminta untuk membebaskan + if (users[m.sender].job !== 'polisi') throw 'Anda harus menjadi polisi untuk melakukan tindakan ini.' + + users[who].jail = false + conn.sendMessage(m.chat, { react: { text: 'โ˜‘๏ธ', key: m.key }}) +} +handler.help = ['bebaskan'] +handler.tags = ['rpg'] +handler.command = /^bebaskan$/i +handler.owner = false +handler.admin = false + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-berburu.js b/plugins/rpg-berburu.js new file mode 100644 index 0000000000000000000000000000000000000000..863115ea55401391879620db62743e2a1da3ac3a --- /dev/null +++ b/plugins/rpg-berburu.js @@ -0,0 +1,101 @@ +let handler = async (m, { conn }) => { + let __timers = (new Date - global.db.data.users[m.sender].lastberburu) + let _timers = (3600000 - __timers) + let timers = clockString(_timers) + let name = conn.getName(m.sender) + let user = global.db.data.users[m.sender] + + if (new Date - global.db.data.users[m.sender].lastberburu > 3600000) { + let randomaku1 = `${Math.floor(Math.random() * 10)}` + let randomaku2 = `${Math.floor(Math.random() * 10)}` + let randomaku4 = `${Math.floor(Math.random() * 10)}` + let randomaku3 = `${Math.floor(Math.random() * 10)}` + let randomaku5 = `${Math.floor(Math.random() * 10)}` + let randomaku6 = `${Math.floor(Math.random() * 10)}` + let randomaku7 = `${Math.floor(Math.random() * 10)}` + let randomaku8 = `${Math.floor(Math.random() * 10)}` + let randomaku9 = `${Math.floor(Math.random() * 10)}` + let randomaku10 = `${Math.floor(Math.random() * 10)}` + let randomaku11 = `${Math.floor(Math.random() * 10)}` + let randomaku12 = `${Math.floor(Math.random() * 10)}` + .trim() + + let rbrb1 = (randomaku1 * 1) + let rbrb2 = (randomaku2 * 1) + let rbrb3 = (randomaku3 * 1) + let rbrb4 = (randomaku4 * 1) + let rbrb5 = (randomaku5 * 1) + let rbrb6 = (randomaku6 * 1) + let rbrb7 = (randomaku7 * 1) + let rbrb8 = (randomaku8 * 1) + let rbrb9 = (randomaku9 * 1) + let rbrb10 = (randomaku10 * 1) + let rbrb11 = (randomaku11 * 1) + let rbrb12 = (randomaku12 * 1) + + let anti1 = `${rbrb1}` + let anti2 = `${rbrb2}` + let anti3 = `${rbrb3}` + let anti4 = `${rbrb4}` + let anti5 = `${rbrb5}` + let anti6 = `${rbrb6}` + let anti7 = `${rbrb7}` + let anti8 = `${rbrb8}` + let anti9 = `${rbrb9}` + let anti10 = `${rbrb10}` + let anti11 = `${rbrb11}` + let anti12 = `${rbrb12}` + + let hsl = ` +โ€ข *Hasil Berburu* + + *๐Ÿ‚ = [ ${anti1} ]* *๐Ÿƒ = [ ${anti7} ]* + *๐Ÿ… = [ ${anti2} ]* *๐Ÿฎ = [ ${anti8} ]* + *๐Ÿ˜ = [ ${anti3} ]* *๐Ÿ’ = [ ${anti9} ]* + *๐Ÿ = [ ${anti4} ]* *๐Ÿ— = [ ${anti10} ]* + *๐Ÿผ = [ ${anti5} ]* *๐Ÿ– = [ ${anti11} ]* + *๐ŸŠ = [ ${anti6} ]* *๐Ÿ“ = [ ${anti12} ]* +` + global.db.data.users[m.sender].banteng += rbrb1 + global.db.data.users[m.sender].harimau += rbrb2 + global.db.data.users[m.sender].gajah += rbrb3 + global.db.data.users[m.sender].kambing += rbrb4 + global.db.data.users[m.sender].panda += rbrb5 + global.db.data.users[m.sender].buaya += rbrb6 + global.db.data.users[m.sender].kerbau += rbrb7 + global.db.data.users[m.sender].sapi += rbrb8 + global.db.data.users[m.sender].monyet += rbrb9 + global.db.data.users[m.sender].babihutan += rbrb10 + global.db.data.users[m.sender].babi += rbrb11 + global.db.data.users[m.sender].ayam += rbrb12 + + setTimeout(() => { + m.reply(hsl) + }, 11000) + + setTimeout(() => { + m.reply('Mendapatkan sasaran!') + }, 10000) + + setTimeout(() => { + m.reply('Sedang mencari mangsa...') + }, 0) + user.lastberburu = new Date * 1 + } else { + m.reply(`\nSepertinya Anda Sudah kecapean, Silahkan Istirahat dulu sekitar *${timers}* Untuk bisa melanjutkan berburu.`) + } +} + +handler.help = ['berburu'] +handler.tags = ['rpg'] +handler.command = /^(berburu|hunt)$/i + +module.exports = handler + +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ ms, h, m, s }) + return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-berdagang.js b/plugins/rpg-berdagang.js new file mode 100644 index 0000000000000000000000000000000000000000..5c9667b2dd10b948279852f0beeeb0ac6c9d0892 --- /dev/null +++ b/plugins/rpg-berdagang.js @@ -0,0 +1,64 @@ +// let pajak = 0.02 +let handler = async (m, { conn, text }) => { +let dapat = (Math.floor(Math.random() * 5000)) + let who + if (m.isGroup) who = m.mentionedJid[0] + else who = m.chat + if (!who) throw 'โ€ข *Example :* .berdagang @user' + if (typeof db.data.users[who] == 'undefined') throw 'Pengguna tidak ada didalam data base' + let __timers = (new Date - global.db.data.users[m.sender].lastdagang) + let _timers = (28800000 - __timers) + let timers = clockString(_timers) + let users = global.db.data.users + let username = conn.getName(who) + if (new Date - global.db.data.users[m.sender].lastdagang > 28800000){ + if (4999 > users[who].money) throw 'Target tidak memiliki modal harap masukkan modal 5000' + if (4999 > users[m.sender].money) throw 'kamu tidak memiliki modal harap masukkan modal 5000' + users[who].money -= dapat * 1 + users[m.sender].money -= dapat * 1 + global.db.data.users[m.sender].lastdagang = new Date * 1 + conn.reply(m.chat, `Mohon tunggu kak..\nKamu dan @${who.split`@`[0]} sedang berdagang.. ๐Ÿ˜…\n\nKamu dan @${who.split`@`[0]} meletakkan modal -${dapat} ๐Ÿ˜…`, m) + setTimeout(() => { + conn.reply(m.chat, `Selamat kamu dan @${who.split`@`[0]} mendapatkan money..\n\nPenghasilan dagang kamu didapatkan +5000\n${users[m.sender].money += 5000} money kamu\n\nPenghasilan dagang @${who.split`@`[0]} didapatkan +5000\n${users[who].money += 5000} money @${who.split`@`[0]}`, m) + }, 3600000) + setTimeout(() => { + conn.reply(m.chat, `Selamat kamu dan @${who.split`@`[0]} mendapatkan money..\n\nPenghasilan dagang kamu didapatkan +5000\n${users[m.sender].money += 5000} money kamu\n\nPenghasilan dagang @${who.split`@`[0]} didapatkan +5000\n${users[who].money += 5000} money @${who.split`@`[0]}`, m) + }, 7200000) + setTimeout(() => { + conn.reply(m.chat, `Selamat kamu dan @${who.split`@`[0]} mendapatkan money..\n\nPenghasilan dagang kamu didapatkan +5000\n${users[m.sender].money += 5000} money kamu\n\nPenghasilan dagang @${who.split`@`[0]} didapatkan +5000\n${users[who].money += 5000} money @${who.split`@`[0]}`, m) + }, 10800000) + setTimeout(() => { + conn.reply(m.chat, `Selamat kamu dan @${who.split`@`[0]} mendapatkan money..\n\nPenghasilan dagang kamu didapatkan +5000\n${users[m.sender].money += 5000} money kamu\n\nPenghasilan dagang @${who.split`@`[0]} didapatkan +5000\n${users[who].money += 5000} money @${who.split`@`[0]}`, m) + }, 14400000) + setTimeout(() => { + conn.reply(m.chat, `Selamat kamu dan @${who.split`@`[0]} mendapatkan money..\n\nPenghasilan dagang kamu didapatkan +5000\n${users[m.sender].money += 5000} money kamu\n\nPenghasilan dagang @${who.split`@`[0]} didapatkan +5000\n${users[who].money += 5000} money @${who.split`@`[0]}`, m) + }, 18000000) + setTimeout(() => { + conn.reply(m.chat, `Selamat kamu dan @${who.split`@`[0]} mendapatkan money..\n\nPenghasilan dagang kamu didapatkan +5000\n${users[m.sender].money += 5000} money kamu\n\nPenghasilan dagang @${who.split`@`[0]} didapatkan +5000\n${users[who].money += 5000} money @${who.split`@`[0]}`, m) + }, 21600000) + setTimeout(() => { + conn.reply(m.chat, `Selamat kamu dan @${who.split`@`[0]} mendapatkan money..\n\nPenghasilan dagang kamu didapatkan +5000\n${users[m.sender].money += 5000} money kamu\n\nPenghasilan dagang @${who.split`@`[0]} didapatkan +5000\n${users[who].money += 5000} money @${who.split`@`[0]}`, m) + }, 25200000) + setTimeout(() => { + conn.reply(m.chat, `Selamat kamu dan @${who.split`@`[0]} mendapatkan money..\n\nPenghasilan dagang kamu didapatkan +10000\n${users[m.sender].money += 10000} money kamu\n\nPenghasilan dagang @${who.split`@`[0]} didapatkan +10000\n${users[who].money += 10000} money @${who.split`@`[0]}`, m) + }, 28800000) +}else conn.reply(m.chat, `Anda Sudah Berdagang , tunggu ${timers} lagi..`, m) +} +handler.help = ['berdagang *@tag*'] +handler.tags = ['rpg'] +handler.command = /^berdagang$/ +handler.register = true +handler.group = true + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ms,h,m,s}) + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-berkebon.js b/plugins/rpg-berkebon.js new file mode 100644 index 0000000000000000000000000000000000000000..0df669627441b1350a39472bca4c474e5af6def9 --- /dev/null +++ b/plugins/rpg-berkebon.js @@ -0,0 +1,74 @@ +const timeout = 1800000 + let handler = async (m, { conn, usedPrefix, text }) => { + let apelu = global.db.data.users[m.sender].bibitapel + let angguru = global.db.data.users[m.sender].bibitanggur + let manggau = global.db.data.users[m.sender].bibitmangga + let pisangu = global.db.data.users[m.sender].bibitpisang + let jeruku = global.db.data.users[m.sender].bibitjeruk + let time = global.db.data.users[m.sender].lastberkebon + 1800000 + if (apelu == 0 || angguru == 0 || manggau == 0 || pisangu == 0 || jeruku == 0) return conn.reply(m.chat, `*Pastikan kamu memiliki semua bibit*\n*Seperti Bibit Apel, Bibit Mangga, Bibit Jeruk, Bibit Pisang, Bibit Anggur*\n\nKetik :\n${usedPrefix}shop buy bibitmangga 100\n\n*List*\nbibitmangga\nbibitanggur\nbibitpisang\nbibitjeruk\nbibitapel`, m) + if (new Date - global.db.data.users[m.sender].lastberkebon< 1800000) return conn.reply(m.chat, `Anda sudah menanam\nMohon tunggu hasil panenmu\nTunggu selama ${msToTime(time - new Date())} lagi`, m) + if (global.db.data.users[m.sender].bibitmangga > 99) { + if (global.db.data.users[m.sender].bibitapel > 99) { + if (global.db.data.users[m.sender].bibitpisang > 99) { + if (global.db.data.users[m.sender].bibitjeruk > 99) { + if (global.db.data.users[m.sender].bibitanggur > 99) { + let pisangpoin = `${Math.floor(Math.random() * 100)}`.trim() + let anggurpoin = `${Math.floor(Math.random() * 100)}`.trim() + let manggapoin = `${Math.floor(Math.random() * 100)}`.trim() + let jerukpoin = `${Math.floor(Math.random() * 100)}`.trim() + let apelpoin = `${Math.floor(Math.random() * 100)}`.trim() + global.db.data.users[m.sender].pisang += pisangpoin * 1 + global.db.data.users[m.sender].anggur += anggurpoin * 1 + global.db.data.users[m.sender].mangga += manggapoin * 1 + global.db.data.users[m.sender].jeruk += jerukpoin * 1 + global.db.data.users[m.sender].apel += apelpoin * 1 + global.db.data.users[m.sender].tiketcoin += 1 + global.db.data.users[m.sender].bibitpisang -= 100 + global.db.data.users[m.sender].bibitanggur -= 100 + global.db.data.users[m.sender].bibitmangga -= 100 + global.db.data.users[m.sender].bibitjeruk -= 100 + global.db.data.users[m.sender].bibitapel -= 100 + global.db.data.users[m.sender].lastberkebon = new Date * 1 + conn.reply(m.chat, `Selamat kamu mendapatkan : \n+${pisangpoin} Pisang\n+${manggapoin} Mangga\n+${anggurpoin} Anggur\n+${jerukpoin} Jeruk\n+${apelpoin} Apel\n+1 Tiketcoin`, m) + setTimeout(() => { + conn.reply(m.chat, `Waktunya berkebon lagi kak ๐Ÿ˜…`, m) + }, timeout) + } else m.reply(`Pastikan bibit anggur kamu *100* untuk bisa berkebon`) + } else conn.reply(m.chat, `Pastikan bibit jeruk kamu *100* untuk bisa berkebon`, m) + } else conn.reply(m.chat, `Pastikan bibit pisang kamu *100* untuk bisa berkebon`, m) + } else conn.reply(m.chat, `Pastikan bibit apel kamu *100* untuk bisa berkebon`, m) + } else conn.reply(m.chat, `Pastikan bibit mangga kamu *100* untuk bisa berkebon`, m) + } +handler.help = ['berkebon'] +handler.tags = ['rpg'] +handler.command = /^(berkebon)/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = true +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.limit = true +handler.exp = 0 +handler.money = 0 + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return hours + " jam " + minutes + " menit " + seconds + " detik" +} \ No newline at end of file diff --git a/plugins/rpg-berlatih.js b/plugins/rpg-berlatih.js new file mode 100644 index 0000000000000000000000000000000000000000..efcf1c59ed45983f4f8def84d384d0f17b203ec0 --- /dev/null +++ b/plugins/rpg-berlatih.js @@ -0,0 +1,78 @@ +// Fungsi untuk mengubah waktu menjadi format jam:menit:detik +function clockString(ms) { + let h = Math.floor(ms / 3600000); + let m = Math.floor(ms / 60000) % 60; + let s = Math.floor(ms / 1000) % 60; + return [h, m, s].map(v => v.toString().padStart(2, '0')).join(':'); +} + +let handler = async (m, { conn, text }) => { + try { + let user = global.db.data.users[m.sender]; + + // Daftar atribut yang bisa dilatih + const attributes = ['attack', 'speed', 'strength', 'health', 'defense']; + + // Cek apakah atribut yang diminta valid + let attribute = text.toLowerCase().trim(); + if (!attributes.includes(attribute)) { + conn.reply(m.chat, `ไน‚ *B E R L A T I H*\n\nSilahkan pilih *Attribute* yang kamu ingin latih :\n\n- Attack\n- Speed\n- Strenght\n- Health\n- Defense\n\n_Example_ :\n.berlatih defense`, m, { + contextInfo: { + externalAdReply: { + mediaType: 1, + title: wm, + thumbnailUrl: 'https://telegra.ph/file/05daab7b42157c06636b3.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + } + } + }) + return; + } + + // Cek apakah pengguna memiliki cukup stamina + if (user.stamina < 10) { + conn.reply(m.chat, '๐ŸŒก๏ธ Anda tidak memiliki cukup stamina untuk berlatih. Stamina dibutuhkan: 10.', m); + return; + } + + // Kurangi stamina pengguna + user.stamina -= 10; + + // Hitung peningkatan atribut + let increase = 1; // Tetap menambahkan 1 ke atribut + + // Tambahkan peningkatan ke atribut yang diminta + user[attribute] += increase; + + // Pesan hasil latihan + let message = `๐Ÿ‹๏ธโ€โ™‚๏ธ Anda sedang berlatih ${attribute} dan mendapatkan peningkatan:\n\n`; + message += `โค๏ธ ${attribute} pengguna sekarang: ${user[attribute]}\n`; + message += `โœจ Peningkatan yang dihasilkan: ${increase}\n`; + message += `โšก Sisa stamina: ${user.stamina}\n`; + + conn.reply(m.chat, message, m, { + contextInfo: { + externalAdReply: { + mediaType: 1, + title: wm, + thumbnailUrl: 'https://telegra.ph/file/05daab7b42157c06636b3.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + } + } + }) + } catch (e) { + console.log(e); + conn.reply(m.chat, 'Error', m); + } +} + +handler.help = ['berlatih <atribut>']; +handler.tags = ['rpg']; +handler.command = /^berlatih$/i; +handler.limit = true; +handler.group = true; +handler.fail = null; + +module.exports = handler; diff --git a/plugins/rpg-berpetualang.js b/plugins/rpg-berpetualang.js new file mode 100644 index 0000000000000000000000000000000000000000..f6f9166d9a6f453b96c2b73f9b2cede1de258620 --- /dev/null +++ b/plugins/rpg-berpetualang.js @@ -0,0 +1,135 @@ +const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); + +function createAdventures() { + const areaNames = [ + "Hutan Belantara", "Desa Tersembunyi", "Gua Misterius", "Puncak Gunung", "Danau Terpencil", + "Lembah Hijau", "Kastil Terbengkalai", "Pulau Rahasia", "Hutan Gelap", "Reruntuhan Kuno", + "Kuil Terlupakan", "Ladang Pertempuran", "Kamp Pengungsi", "Hutan Bambu", "Desa Pantai", + "Hutan Salju", "Padang Gurun", "Gua Kristal", "Kamp Bajak Laut", "Rawa Berkabut", + "Gunung Berapi", "Gua Bawah Air", "Istana Es", "Lautan Badai", "Gua Naga" + ]; + + let adventures = areaNames.map((areaName, i) => ({ + area: `Petualangan di ${areaName}`, + txt: areaName.toLowerCase().replace(/ /g, "_"), + reward: { + exp: 50 + (i * 50), + loot: { + potion: Math.floor(Math.random() * 10) + 1, + diamond: Math.floor(Math.random() * 5) + 1, + emas: Math.floor(Math.random() * 10) + 1, + money: Math.floor(Math.random() * (50000 - 1000 + 1)) + 1000, + limit: Math.floor(Math.random() * 10) + 1 + } + } + })); + return adventures; +} + +function formatTime(ms) { + let d = isNaN(ms) ? '--' : Math.floor(ms / 86400000); + let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) % 24; + let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60; + let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60; + return ['\n' + d, ' *Hari โ˜€๏ธ*\n', h, ' *Jam ๐Ÿ•*\n', m, ' *Menit โฐ*\n', s, ' *Detik โฑ๏ธ*'].map(v => v.toString().padStart(2, 0)).join(''); +} + +async function handler(m, { conn, text }) { + conn.adventure = conn.adventure || {}; + let user = global.db.data.users[m.sender]; + + if (m.sender in conn.adventure) { + if (conn.adventure[m.sender].currentArea >= conn.adventure[m.sender].areas.length) { + return m.reply("๐Ÿ† Anda telah menyelesaikan semua area petualangan."); + } + return m.reply("โณ Anda masih memiliki area petualangan yang belum selesai. Silakan selesaikan terlebih dahulu."); + } else { + if (text === 'start') { + let adventures = createAdventures(); + + if (!user) return m.reply("๐Ÿ“ Silakan daftar untuk bermain game."); + if (user.healt === 0 || user.stamina === 0) return m.reply("โ— Stamina/health Anda kurang dari 100."); + if (typeof user.exp !== "number") global.db.data.users[m.sender].exp = 0; + if (typeof user.loot !== "object") global.db.data.users[m.sender].loot = { potion: 0, diamond: 0, emas: 0, money: 0, limit: 0 }; + if (typeof user.lastGameTime !== "number") global.db.data.users[m.sender].kerjasatu = 0; + + const cooldown = 5 * 60 * 1000; // 5 menit cooldown + let timers = cooldown - (Date.now() - (user.kerjasatu || 0)); + if (timers > 0) return m.reply(`Silakan tunggu ${formatTime(timers)} lagi sebelum memulai petualangan baru.`); + + let { area, txt, reward } = adventures[0]; // Start with the first area + let currentArea = 0; + let hasilPetualangan = 0; + let totalReward = { potion: 0, diamond: 0, emas: 0, money: 0, limit: 0 }; + + conn.adventure[m.sender] = { + areas: adventures, + currentArea, + hasilPetualangan, + lastPetualanganTime: Date.now(), + totalReward, + }; + + let caption = `๐Ÿž๏ธ *AREA PETUALANGAN:* ${area}\n\n๐Ÿช“ Ketik *'${txt}'* untuk memulai petualangan di area ini.\n๐Ÿ” Jumlah hasil petualangan yang didapatkan: ${hasilPetualangan}\n๐Ÿ’ฐ Exp yang didapatkan: ${reward.exp}\n๐ŸŽ Loot yang didapatkan: Potion: ${reward.loot.potion}, Diamond: ${reward.loot.diamond}, emas: ${reward.loot.emas}, Money: ${reward.loot.money}, Limit: ${reward.loot.limit}`; + + return m.reply(caption); + } else { + let instructions = "๐Ÿ… Selamat datang di game petualangan!\n"; + instructions += "Ketik *'berpetualang start'* untuk memulai petualangan.\n"; + instructions += "Ketik *'stop'* untuk menghentikan petualangan saat sedang bermain."; + + return m.reply(instructions); + } + } +} + +handler.before = async m => { + conn.adventure = conn.adventure || {}; + if (!(m.sender in conn.adventure)) return; + if (m.isBaileys) return; + + let { areas, currentArea, hasilPetualangan, lastPetualanganTime, totalReward } = conn.adventure[m.sender]; + const cooldown = 5 * 60 * 1000; // 5 menit cooldown + let user = global.db.data.users[m.sender]; + + let msg = m.text.toLowerCase(); + if (msg === 'stop') { + m.reply("โŒ Petualangan telah dihentikan. Ketik *'berpetualang start'* untuk memulai petualangan kembali."); + delete conn.adventure[m.sender]; + return false; + } else if (currentArea < areas.length) { + if (areas[currentArea].txt === msg) { + let { area, reward } = areas[currentArea]; + user.exp += reward.exp; + for (let item in reward.loot) { + user.loot[item] += reward.loot[item]; + totalReward[item] += reward.loot[item]; + } + hasilPetualangan++; + currentArea++; + conn.adventure[m.sender].currentArea = currentArea; + conn.adventure[m.sender].hasilPetualangan = hasilPetualangan; + conn.adventure[m.sender].totalReward = totalReward; + conn.adventure[m.sender].lastPetualanganTime = Date.now(); + + if (currentArea >= areas.length) { + m.reply(`๐ŸŽ‰ Selamat! Anda telah menyelesaikan semua area petualangan.\nTotal hasil petualangan: ${hasilPetualangan}\nExp yang didapatkan: ${reward.exp}\nTotal loot yang didapatkan: Potion: ${totalReward.potion}, Diamond: ${totalReward.diamond}, emas: ${totalReward.emas}, Money: ${totalReward.money}, Limit: ${totalReward.limit}`); + delete conn.adventure[m.sender]; + return false; + } else { + let nextArea = areas[currentArea].area; + let caption = `๐Ÿž๏ธ *AREA PETUALANGAN:* ${nextArea}\n\n๐Ÿช“ Ketik *'${areas[currentArea].txt}'* untuk memulai petualangan di area ini.\n๐Ÿ” Jumlah hasil petualangan yang didapatkan: ${hasilPetualangan}\n๐Ÿ’ฐ Exp yang didapatkan: ${reward.exp}\n๐ŸŽ Loot yang didapatkan: Potion: ${reward.loot.potion}, Diamond: ${reward.loot.diamond}, emas: ${reward.loot.emas}, Money: ${reward.loot.money}, Limit: ${reward.loot.limit}\n\n> ketik *stop* untuk berhenti`; + m.reply(caption); + return false; + } + } + } +}; + +handler.help = ['berpetualang']; +handler.tags = ['rpg']; +handler.command = /^(berpetualang)$/i; +handler.group = true; +handler.limit = true; +handler.register = true; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-bertarung.js b/plugins/rpg-bertarung.js new file mode 100644 index 0000000000000000000000000000000000000000..dc11924acf070d5f6f4c6bb7e2d8c2ddb016e2a2 --- /dev/null +++ b/plugins/rpg-bertarung.js @@ -0,0 +1,79 @@ +let handler = async (m, { conn, text }) => { + let user = global.db.data.users[m.sender] + let opponent = m.mentionedJid[0] + + if (!user || !global.db.data.users[opponent]) { + return conn.reply(m.chat, 'โ€ข *Example :* .bertarung @user', m) + } + + conn.sendMessage(m.chat, { + react: { + text: '๐Ÿ•’', + key: m.key, + } + }) + + let alasanKalah = `${pickRandom(['bodoh gitu doang aja kalah tolol lu di denda','lemah lu kontol mending lu di rumah aja dah lu di denda dek','Jangan beratem kalo cupu dek wkwkwk kamu di denda','Dasar tolol lawan itu doang aja ga bisa lu di denda','Hadehh sono lu mending di rumah aja deh lu di denda'])}` + let alasanMenang = `${pickRandom(['kamu berhasil menggunakan kekuatan elemental untuk menghancurkan pertahanan lawan dan mendapatkan','kamu berhasil melancarkan serangan mematikan dengan gerakan akrobatik yang membingungkan lawan, dan mendapatkan','Kamu berhasil menang karena baru selesai coli dan mendapatkan','Kamu berhasil menang karena menyogok lawan dan mendapatkan','Kamu berhasil menang karena bot merasa kasihan sama kamu dan mendapatkan','Kamu berhasil menang karena kamu melawan orang cupu dan mendapatkan'])}` + + let betAmount = Math.floor(Math.random() * (10000000 - 10000 + 1)) + 10000 + + if (user.money < betAmount) { + return conn.reply(m.chat, 'Uang Anda tidak mencukupi', m) + } + + if (user.lastWar && (new Date - user.lastWar) < 10000) { + let remainingTime = Math.ceil((10000 - (new Date() - user.lastWar)) / 1000) + return conn.reply(m.chat, `Anda harus menunggu ${remainingTime} detik sebelum dapat bertarung lagi`, m) + } + + conn.reply(m.chat, 'Mempersiapkan arena...', m) + + setTimeout(() => { + conn.reply(m.chat, 'Mendapatkan arena...', m) + + setTimeout(() => { + conn.reply(m.chat, 'Bertarung...', m) + + setTimeout(() => { + let result = Math.random() >= 0.5 + let wonAmount = result ? betAmount : -betAmount + + user.money += wonAmount + global.db.data.users[opponent].money -= wonAmount + + let opponentName = conn.getName(opponent) + + let caption = `โ *F I G H T*\n\n` + caption += `Lawan Anda Adalah: ${opponentName}\nLevel: [${global.db.data.users[m.sender].level}]\n\n` + + if (result) { + caption += `*Menang!*, ${alasanMenang},+${betAmount} Money\n` + caption += `Uang Anda saat ini: ${user.money}\n` + conn.sendFile(m.chat, 'https://telegra.ph/file/e3d5059b970d60bc438ac.jpg', 'You_Win.jpg', caption, m) + } else { + caption += `*kalah!*, ${alasanKalah},-${betAmount} Money\n` + caption += `Uang Anda saat ini: ${user.money}\n` + conn.sendFile(m.chat, 'https://telegra.ph/file/86b2dc906fb444b8bb6f7.jpg', 'You_Lose.jpg', caption, m) + } + + user.lastWar = new Date() + + setTimeout(() => { + conn.reply(m.chat, `Anda dapat bertarung lagi setelah 5 detik`, m) + }, 5000) // https://github.com/SazumiVicky/MakeMeow-Games + }, 2000) + }, 2000) + }, 2000) +} + +handler.help = ['bertarung *@user*', 'fight *@user*'] +handler.tags = ['rpg'] +handler.command = /^(fight|bertarung)$/i +handler.group = true + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} \ No newline at end of file diff --git a/plugins/rpg-betpvp.js b/plugins/rpg-betpvp.js new file mode 100644 index 0000000000000000000000000000000000000000..d8136c557bbf96a6bf839490e56b629af10e0612 --- /dev/null +++ b/plugins/rpg-betpvp.js @@ -0,0 +1,41 @@ +const items = [ 'money', 'diamond', 'emas', 'berlian' ] +let handler = async (m, { conn, args, usedPrefix, command }) => { + conn.judipvp = conn.judipvp ? conn.judipvp : {} + if (Object.values(conn.judipvp).find(room => room.id.startsWith('judipvp') && [room.p, room.p2].includes(m.sender))) throw 'Selesaikan judi mu yang sebelumnya' + if (Object.values(conn.judipvp).find(room => room.id.startsWith('judipvp') && [room.p, room.p2].includes(m.mentionedJid[0]))) throw `Orang yang kamu tantang sedang bermain judipvp bersama orang lain :(` + let musuh = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender.replace(/[^0-9]/g, '') + '@s.whatsapp.net' : false + let user = global.db.data.users + let item = items.filter(v => v in user[m.sender] && typeof user[m.sender][v] == 'number') + let type = (args[0] || '').toLowerCase() + let count = (args[1] && number(parseInt(args[1])) ? Math.max(parseInt(args[1]), 1): /all/i.test(args[1]) ? Math.floor(parseInt(user[type])): 1) * 1 + let id = 'judipvp_' + new Date() * 1 + if (user[m.sender][type] < count) return m.reply(`${type} kamu tidak cukup!`) + if (!item.includes(type)) return m.reply('Item yang tersedia\nโ€ข Money\nโ€ข diamond\nโ€ข emas\nโ€ข berlian') + if (!count || !musuh) return m.reply(`Masukan format dengan benar\n\nContoh :\n${usedPrefix + command} money 10000 ${m.sender.split('@')[0]}`) + conn.judipvp[id] = { + chat: await conn.reply(m.chat, `@${m.sender.split('@')[0]} Mengajak @${musuh.split('@')[0]} Berjudi Apakah Kamu Mau Menerimanya? (Y/N)`, m, { + contextInfo: { mentionedJid: [m.sender, musuh] } + }), + id: id, + p: m.sender, + p2: musuh, + type: type, + status: 'wait', + taruhan: count, + waktu: setTimeout(() => { + if (conn.judipvp[id]) conn.reply(m.chat, `_Waktu judi habis_`, m) + delete conn.judipvp[id] + }, 60000) + } +} +handler.help = ['judipvp <type> <count> <tag>'] +handler.tags = ['rpg'] +handler.command = /^(judipvp)$/i +handler.register = true +handler.group = true +module.exports = handler + +function number(x = 0) { + x = parseInt(x) + return !isNaN(x) && typeof x == 'number' +} \ No newline at end of file diff --git a/plugins/rpg-betpvp_and.js b/plugins/rpg-betpvp_and.js new file mode 100644 index 0000000000000000000000000000000000000000..d68350453d6ae018a76852c5829e93db53bc75bf --- /dev/null +++ b/plugins/rpg-betpvp_and.js @@ -0,0 +1,72 @@ +const delay = (time) => new Promise((res) => setTimeout(res, time)); + +function random(arr) { + return arr[Math.floor(Math.random() * arr.length)]; +} + +module.exports.before = async function (m) { + this.judipvp = this.judipvp ? this.judipvp : {}; + let room = Object.values(this.judipvp).find(room => room.id.startsWith('judipvp') && room.status && [room.p, room.p2].includes(m.sender)); + let user = db.data.users; + let score = Math.ceil(Math.random() * 100) * 1; + let score2 = Math.ceil(Math.random() * 100) * 1; + + if (room) { + if (m.sender === room.p2 && /y(a|es)?/i.test(m.text.toLowerCase()) && m.isGroup && room.status === 'wait') { + if (/n(o)?|tidak/i.test(m.text.toLowerCase())) { + this.reply(m.chat, `@${room.p2.split`@`[0]} menolak judipvp, judipvp dibatalkan`, m, { contextInfo: { mentionedJid: [room.p2] } }); + delete this.judipvp[room.id]; + } + if (user[room.p2][room.type] < room.taruhan) return m.reply(`Uang Kamu Kurang! Kamu membutuhkan ${room.taruhan} ${room.type}`); + if (user[room.p][room.type] < room.taruhan) return m.reply(`Uang Lawanmu Kurang! membutuhkan ${room.taruhan} ${room.type}`); + clearTimeout(room.waktu); + room.status = 'spin'; + room.asal = m.chat; + room.spin = room.p; + await this.reply(room.asal, `Silahkan Spin @${room.p.split('@')[0]}\n\nSpin dengan cara ketik *Spin/Judi*`, m, { contextInfo: { mentionedJid: [room.p] } }); + room.waktu = setTimeout(() => { + this.reply(m.chat, `Waktu habis @${room.spin.split('@')[0]} Tidak menjawab`, m, { contextInfo: { mentionedJid: [room.spin] } }); + delete this.judipvp[room.id]; + }, 60000); + } else if (room.status === 'spin' && /spin|judi/i.test(m.text)) { + if (m.sender !== room.spin) return m.reply('Sekarang bukan giliran kamu'); + if (user[room.spin][room.type] < room.taruhan) return m.reply(`Uang Kamu Kurang! Kamu membutuhkan ${room.taruhan} ${room.type}`); + if (user[room.p2][room.type] < room.taruhan) return m.reply(`Uang Lawanmu Kurang! membutuhkan ${room.taruhan} ${room.type}`); + clearTimeout(room.waktu); + room.score = score; + room.status = 'spinp'; + room.spin = room.p2; + room.waktu = setTimeout(() => { + this.reply(m.chat, `Waktu habis @${room.spin.split('@')[0]} Tidak menjawab`, m, { contextInfo: { mentionedJid: [room.spin] } }); + delete this.judipvp[room.id]; + }, 60000); + this.reply(room.asal, `@${m.sender.split('@')[0]} Berhasil mendapatkan score ${score}\nSekarang giliran @${room.p2.split('@')[0]} untuk spin\n\nSilahkan ketik *Spin/Judi* Untuk spin`, m, { contextInfo: { mentionedJid: [room.p, room.p2] } }); + } else if (room.status === 'spinp' && /spin|judi/i.test(m.text)) { + if (m.sender !== room.spin) return m.reply(room.asal, 'Sekarang bukan giliranmu!', m); + if (user[room.spin][room.type] < room.taruhan) return m.reply(`Uang Kamu Kurang! Kamu membutuhkan ${room.taruhan} ${room.type}`); + if (user[room.p][room.type] < room.taruhan) return m.reply(`Uang Lawanmu Kurang! membutuhkan ${room.taruhan} ${room.type}`); + clearTimeout(room.waktu); + if (room.score < score2) { + user[room.p2][room.type] += room.taruhan * 1; + user[room.p][room.type] -= room.taruhan * 1; + room.win = room.p2; + } else if (room.score > score2) { + user[room.p2][room.type] -= room.taruhan * 1; + user[room.p][room.type] += room.taruhan * 1; + room.win = room.p; + } else { + room.win = 'draw'; + } + this.reply(room.asal, ` +| *PLAYERS* | *POINT* | +*๐Ÿ‘ค @${room.p.split('@')[0]} :* ${room.score} +*๐Ÿ‘ค @${room.p2.split('@')[0]} :* ${score2} + +${room.win !== 'draw' ? `Pemenangnya adalah @${room.win.split('@')[0]} Dan mendapatkan ${room.taruhan * 1} ${room.type}` : `Draw Masing Masing Mendapatkan ${room.taruhan} ${room.type}`} +`.trim(), m, { contextInfo: { mentionedJid: [room.p, room.p2] } }); + delete this.judipvp[room.id]; + } + return true; + } + return true; +}; \ No newline at end of file diff --git a/plugins/rpg-bonus.js b/plugins/rpg-bonus.js new file mode 100644 index 0000000000000000000000000000000000000000..3555ecb0191557d221238275a7b7096b088ae8a3 --- /dev/null +++ b/plugins/rpg-bonus.js @@ -0,0 +1,30 @@ +let handler = async (m, { conn, usedPrefix, text }) => { + let user = global.db.data.users[m.sender] + let time = user.lastclaimb1 + 86400000 + if (new Date - user.lastclaimb1 < 86400000) throw `Kamu Sudah Ambil Bonus Hari Ini\nTunggu selama ${msToTime(time - new Date())} lagi` + let money = `${Math.floor(Math.random() * 5000000)}`.trim() + user.money += money * 1 + user.lastclaimb1 = new Date * 1 + m.reply(`Selamat Kamu Mendapatkan Bonus : \n+${money} Money`) +} +handler.help = ['bonus'] +handler.tags = ['rpg'] +handler.command = /^(bonus)/i +handler.register = true +handler.premium = true +handler.rpg = true +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return hours + " jam " + minutes + " menit " + seconds + " detik" +} diff --git a/plugins/rpg-buah.js b/plugins/rpg-buah.js new file mode 100644 index 0000000000000000000000000000000000000000..0c40a88cb68ce8ca2ce06f7c8a434d83be17c55d --- /dev/null +++ b/plugins/rpg-buah.js @@ -0,0 +1,18 @@ +let handler = async (m, { conn, usedPrefix }) => { +let user = global.db.data.users[m.sender] +let buah = `GUDANG BUAH + +๐ŸŒ ${user.pisang} Pisang +๐Ÿ‡ ${user.anggur} Anggur +๐Ÿฅญ ${user.mangga} Mangga +๐ŸŠ ${user.jeruk} Jeruk +๐ŸŽ ${user.apel} Apel + +Gunakan Command ${usedPrefix}sell Untuk Menjual Buah !` +conn.reply(m.chat, buah, m) +} +handler.help = ['buah'] +handler.tags = ['rpg'] +handler.command = /^(buah|listbuah)$/i + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-buyattack.js b/plugins/rpg-buyattack.js new file mode 100644 index 0000000000000000000000000000000000000000..a512bd1763b23445932dea5fc7f40e0d0aa49009 --- /dev/null +++ b/plugins/rpg-buyattack.js @@ -0,0 +1,34 @@ +let handler = async (m, { + conn, + args +}) => { + if (!args[0] || isNaN(args[0])) { + throw '*Example*: .buyattack 100'; + } + + /*conn.sendMessage(m.chat, { + react: { + text: 'โœ…', + key: m.key, + } + })*/ + + let count = parseInt(args[0]); + let hrg = 50000; + let price = count * hrg; + let users = global.db.data.users; + let user = users[m.sender]; + if (price > user.money) { + throw `Maaf, uang kamu tidak cukup untuk membeli ${count} attack. Harga 1 attack adalah ${hrg} money.\n\nMembutuhkan ${price} Money.`; + } + user.money -= price; + user.attack += count; + conn.reply(m.chat, `Berhasil membeli ${count} attack dengan harga ${price} money.`, m); +} + +handler.help = ['buyattack <jumlah>']; +handler.tags = ['rpg']; +handler.command = /^buyattack$/i; +handler.register = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-buydefense.js b/plugins/rpg-buydefense.js new file mode 100644 index 0000000000000000000000000000000000000000..5022706022c20b49048e4e8719af3dc3f109265a --- /dev/null +++ b/plugins/rpg-buydefense.js @@ -0,0 +1,34 @@ +let handler = async (m, { + conn, + args +}) => { + if (!args[0] || isNaN(args[0])) { + throw '*Example*: .buydefense 100'; + } + + /*conn.sendMessage(m.chat, { + react: { + text: 'โœ…', + key: m.key, + } + })*/ + + let count = parseInt(args[0]); + let hrg = 50000; + let price = count * hrg; + let users = global.db.data.users; + let user = users[m.sender]; + if (price > user.money) { + throw `Maaf, uang kamu tidak cukup untuk membeli ${count} defense. Harga 1 defense adalah ${hrg} money.\n\nMembutuhkan ${price} Money.`; + } + user.money -= price; + user.defense += count; + conn.reply(m.chat, `Berhasil membeli ${count} defense dengan harga ${price} money.`, m); +} + +handler.help = ['buydefense <jumlah>']; +handler.tags = ['rpg']; +handler.command = /^buydefense$/i; +handler.register = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-buyspeed.js b/plugins/rpg-buyspeed.js new file mode 100644 index 0000000000000000000000000000000000000000..dbd215a8e3542bffbf9ea2466b828c9a43bbed06 --- /dev/null +++ b/plugins/rpg-buyspeed.js @@ -0,0 +1,34 @@ +let handler = async (m, { + conn, + args +}) => { + if (!args[0] || isNaN(args[0])) { + throw '*Example*: .buyspeed 100'; + } + + /*conn.sendMessage(m.chat, { + react: { + text: 'โœ…', + key: m.key, + } + })*/ + + let count = parseInt(args[0]); + let hrg = 50000; + let price = count * hrg; + let users = global.db.data.users; + let user = users[m.sender]; + if (price > user.money) { + throw `Maaf, uang kamu tidak cukup untuk membeli ${count} speed. Harga 1 speed adalah ${hrg} money.\n\nMembutuhkan ${price} Money.`; + } + user.money -= price; + user.speed += count; + conn.reply(m.chat, `Berhasil membeli ${count} speed dengan harga ${price} money.`, m); +} + +handler.help = ['buyspeed <jumlah>']; +handler.tags = ['rpg']; +handler.command = /^buyspeed$/i; +handler.register = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-buystrenght.js b/plugins/rpg-buystrenght.js new file mode 100644 index 0000000000000000000000000000000000000000..9729f2e598eb2da8ac0040539dc0d3319f43af73 --- /dev/null +++ b/plugins/rpg-buystrenght.js @@ -0,0 +1,34 @@ +let handler = async (m, { + conn, + args +}) => { + if (!args[0] || isNaN(args[0])) { + throw '*Example*: .buystrenght 100'; + } + + /*conn.sendMessage(m.chat, { + react: { + text: 'โœ…', + key: m.key, + } + })*/ + + let count = parseInt(args[0]); + let hrg = 50000; + let price = count * hrg; + let users = global.db.data.users; + let user = users[m.sender]; + if (price > user.money) { + throw `Maaf, uang kamu tidak cukup untuk membeli ${count} strenght. Harga 1 strenght adalah ${hrg} money.\n\nMembutuhkan ${price} Money.`; + } + user.money -= price; + user.strenght += count; + conn.reply(m.chat, `Berhasil membeli ${count} strenght dengan harga ${price} money.`, m); +} + +handler.help = ['buystrenght <jumlah>']; +handler.tags = ['rpg']; +handler.command = /^buystrenght$/i; +handler.register = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-casino.js b/plugins/rpg-casino.js new file mode 100644 index 0000000000000000000000000000000000000000..9d85f905b884eb83289631cffb976f5d46f18b02 --- /dev/null +++ b/plugins/rpg-casino.js @@ -0,0 +1,98 @@ +let buatall = 1; +let handler = async (m, { conn, args, usedPrefix, DevMode }) => { + conn.casino = conn.casino ? conn.casino : {}; + if (m.chat in conn.casino) + return m.reply( + "Masih ada yang melakukan casino disini, tunggu sampai selesai!!" + ); + else conn.casino[m.chat] = true; + try { + let randomaku = `${Math.floor(Math.random() * 150)}`.trim(); + let randomkamu = `${Math.floor(Math.random() * 80)}`.trim(); //hehe Biar Susah Menang :v + let Aku = randomaku * 1; + let Kamu = randomkamu * 1; + let count = args[0]; + count = count + ? /all/i.test(count) + ? Math.floor(global.db.data.users[m.sender].money / buatall) + : parseInt(count) + : args[0] + ? parseInt(args[0]) + : 1; + count = Math.max(1, count); + if (args.length < 1) + return conn.reply( + m.chat, + usedPrefix + "casino <jumlah>\n " + usedPrefix + "casino 1000", + m + ); + if (global.db.data.users[m.sender].money >= count * 1) { + global.db.data.users[m.sender].money -= count * 1; + //await m.reply('') //Kwkwwkkwlwlw + if (Aku > Kamu) { + conn.reply( + m.chat, + `๐Ÿ’ฐ Casino ๐Ÿ’ฐ\n*Kamu:* ${Kamu} Point\n*Computer:* ${Aku} Point\n\n*You LOSE*\nKamu kehilangan ${count} Money`.trim(), + m + ); + } else if (Aku < Kamu) { + global.db.data.users[m.sender].money += count * 2; + conn.reply( + m.chat, + `๐Ÿ’ฐ Casino ๐Ÿ’ฐ\n*Kamu:* ${Kamu} Point\n*Computer:* ${Aku} Point\n\n*You Win*\nKamu mendapatkan ${ + count * 2 + } Money`.trim(), + m + ); + } else { + global.db.data.users[m.sender].money += count * 1; + conn.reply( + m.chat, + `๐Ÿ’ฐ Casino ๐Ÿ’ฐ\n*Kamu:* ${Kamu} Point\n*Computer:* ${Aku} Point\n\n*SERI*\nKamu mendapatkan ${ + count * 1 + } Uang`.trim(), + m + ); + } + } else + conn.reply( + m.chat, + `Uang kamu tidak mencukupi untuk Casino silahkan *#kerja* terlebih dahulu!`.trim(), + m + ); + } catch (e) { + console.log(e); + m.reply("Error!!"); + if (DevMode) { + for (let jid of global.owner + .map((v) => v.replace(/[^0-9]/g, "") + "@s.whatsapp.net") + .filter((v) => v != conn.user.jid)) { + conn.sendMessage( + jid, + "casino.js error\nNo: *" + + m.sender.split`@`[0] + + "*\nCommand: *" + + m.text + + "*\n\n*" + + e + + "*", + MessageType.text + ); + } + } + } finally { + delete conn.casino[m.chat]; + } +}; + +handler.help = ["casino <jumlah>"]; +handler.tags = ["rpg"]; +handler.command = /^(casino)$/i; +handler.register = true; +handler.group = true; +handler.limit = 10; +module.exports = handler; + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)]; +} \ No newline at end of file diff --git a/plugins/rpg-cekpoin.js b/plugins/rpg-cekpoin.js new file mode 100644 index 0000000000000000000000000000000000000000..246950e0ed32112273d5a06e1be5385d6c5d7378 --- /dev/null +++ b/plugins/rpg-cekpoin.js @@ -0,0 +1,11 @@ +let handler = async (m) => { + let poin = global.db.data.users[m.sender].poin || 0 + m.reply(`Poin kamu: ${poin}`) +} + +handler.help = ['cekpoin'] +handler.tags = ['rpg'] +handler.command = /^cekpoin$/i +handler.register = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-cheat.js b/plugins/rpg-cheat.js new file mode 100644 index 0000000000000000000000000000000000000000..f6863b6aab5cb224c561387e6ba112797a40fca6 --- /dev/null +++ b/plugins/rpg-cheat.js @@ -0,0 +1,18 @@ +let handler = async (m, { conn }) => { + if (global.db.data.users[m.sender].money > 20) { + let user = global.db.data.users[m.sender] + global.db.data.users[m.sender]. money = 999999999 + global.db.data.users[m.sender].limit = 999999999999 + global.db.data.users[m.sender].exp = 99999999999 + global.db.data.users[m.sender].level = 1000 + m.reply(`_*SUKSES CHEAT TELAH AKTIF GUNAKAN DENGAN BIJAK*_`) + } else { + conn.reply(m.chat, 'miskin money nge cheat yhahaha, minimal 2jt money bos!', m); + } +} +handler.command = /^(cheat)$/i +handler.owner = false +handler.premium = false + + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-checkjail.js b/plugins/rpg-checkjail.js new file mode 100644 index 0000000000000000000000000000000000000000..e90bd45d627ea18837112777deabce350c66e48f --- /dev/null +++ b/plugins/rpg-checkjail.js @@ -0,0 +1,35 @@ +let handler = async (m, { isPrems, conn, text, usedPrefix, command }) => { + const user = global.db.data.users[m.sender]; + + if (user.jail && (!user.perkerjaandua || user.pekerjaandua > Date.now())) { + if (user.pekerjaandua) { + let remainingTime = user.pekerjaandua - Date.now(); + let minutes = Math.floor((remainingTime / (1000 * 60)) % 60); + let seconds = Math.floor((remainingTime / 1000) % 60); + + if (m.sender === text) { + return m.reply(`_Kamu masih berada di penjara_\n*Sisa waktu penjara:* ${minutes} menit ${seconds} detik`); + } else { + return m.reply(`_kamu masih berada di penjara_\n*Sisa waktu penjara*: ${minutes} menit ${seconds} detik`, null, { mentions: [m.sender] }); + } + } + } else if (user.jail === true) { + if (m.sender === text) { + return m.reply('*Kamu dipenjara seumur hidup!*'); + } else { + return m.reply(`_kamu telah dipenjara seumur hidup_`, null, { mentions: [m.sender] }); + } + } else { + if (m.sender === text) { + return m.reply('*Kamu tidak sedang dipenjara*'); + } else { + return m.reply(`_kamu tidak sedang dalam penjara_`, null, { mentions: [m.sender] }); + } + } +} + +handler.help = ['checkjail', 'cj', 'statuspenjara', 'jailstatus'] +handler.tags = ['rpg'] +handler.command = /^(checkjail|cj|statuspenjara|jailstatus)$/i + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-checkrole.js b/plugins/rpg-checkrole.js new file mode 100644 index 0000000000000000000000000000000000000000..1839529931705b9c18663ed40d038424929a0f4e --- /dev/null +++ b/plugins/rpg-checkrole.js @@ -0,0 +1,74 @@ +//hapis skibidi + +let handler = async (m, { conn }) => { + let user = global.db.data.users[m.sender] + let role = (user.level <= 2) ? 'Newbie ใ‹ก' + : ((user.level >= 2) && (user.level <= 4)) ? 'Beginner Grade 1 โšŠยน' + : ((user.level >= 4) && (user.level <= 6)) ? 'Beginner Grade 2 โšŠยฒ' + : ((user.level >= 6) && (user.level <= 8)) ? 'Beginner Grade 3 โšŠยณ' + : ((user.level >= 8) && (user.level <= 10)) ? 'Beginner Grade 4 โšŠโด' + : ((user.level >= 10) && (user.level <= 20)) ? 'Private Grade 1 โšŒยน' + : ((user.level >= 20) && (user.level <= 30)) ? 'Private Grade 2 โšŒยฒ' + : ((user.level >= 30) && (user.level <= 40)) ? 'Private Grade 3 โšŒยณ' + : ((user.level >= 40) && (user.level <= 50)) ? 'Private Grade 4 โšŒโด' + : ((user.level >= 50) && (user.level <= 60)) ? 'Private Grade 5 โšŒโต' + : ((user.level >= 60) && (user.level <= 70)) ? 'Corporal Grade 1 โ˜ฐยน' + : ((user.level >= 70) && (user.level <= 80)) ? 'Corporal Grade 2 โ˜ฐยฒ' + : ((user.level >= 80) && (user.level <= 90)) ? 'Corporal Grade 3 โ˜ฐยณ' + : ((user.level >= 90) && (user.level <= 100)) ? 'Corporal Grade 4 โ˜ฐโด' + : ((user.level >= 100) && (user.level <= 110)) ? 'Corporal Grade 5 โ˜ฐโต' + : ((user.level >= 110) && (user.level <= 120)) ? 'Sergeant Grade 1 โ‰ฃยน' + : ((user.level >= 120) && (user.level <= 130)) ? 'Sergeant Grade 2 โ‰ฃยฒ' + : ((user.level >= 130) && (user.level <= 140)) ? 'Sergeant Grade 3 โ‰ฃยณ' + : ((user.level >= 140) && (user.level <= 150)) ? 'Sergeant Grade 4 โ‰ฃโด' + : ((user.level >= 150) && (user.level <= 160)) ? 'Sergeant Grade 5 โ‰ฃโต' + : ((user.level >= 160) && (user.level <= 170)) ? 'Staff Grade 1 ๏น€ยน' + : ((user.level >= 170) && (user.level <= 180)) ? 'Staff Grade 2 ๏น€ยฒ' + : ((user.level >= 180) && (user.level <= 190)) ? 'Staff Grade 3 ๏น€ยณ' + : ((user.level >= 190) && (user.level <= 200)) ? 'Staff Grade 4 ๏น€โด' + : ((user.level >= 200) && (user.level <= 210)) ? 'Staff Grade 5 ๏น€โต' + : ((user.level >= 210) && (user.level <= 220)) ? 'Sergeant Grade 1 ๏ธพยน' + : ((user.level >= 220) && (user.level <= 230)) ? 'Sergeant Grade 2 ๏ธพยฒ' + : ((user.level >= 230) && (user.level <= 240)) ? 'Sergeant Grade 3 ๏ธพยณ' + : ((user.level >= 240) && (user.level <= 250)) ? 'Sergeant Grade 4 ๏ธพโด' + : ((user.level >= 250) && (user.level <= 260)) ? 'Sergeant Grade 5 ๏ธพโต' + : ((user.level >= 260) && (user.level <= 270)) ? '2nd Lt. Grade 1 โ™ขยน' + : ((user.level >= 270) && (user.level <= 280)) ? '2nd Lt. Grade 2 โ™ขยฒ' + : ((user.level >= 280) && (user.level <= 290)) ? '2nd Lt. Grade 3 โ™ขยณ' + : ((user.level >= 290) && (user.level <= 300)) ? '2nd Lt. Grade 4 โ™ขโด' + : ((user.level >= 300) && (user.level <= 310)) ? '2nd Lt. Grade 5 โ™ขโต' + : ((user.level >= 310) && (user.level <= 320)) ? '1st Lt. Grade 1 โ™ขโ™ขยน' + : ((user.level >= 320) && (user.level <= 330)) ? '1st Lt. Grade 2 โ™ขโ™ขยฒ' + : ((user.level >= 330) && (user.level <= 340)) ? '1st Lt. Grade 3 โ™ขโ™ขยณ' + : ((user.level >= 340) && (user.level <= 350)) ? '1st Lt. Grade 4 โ™ขโ™ขโด' + : ((user.level >= 350) && (user.level <= 360)) ? '1st Lt. Grade 5 โ™ขโ™ขโต' + : ((user.level >= 360) && (user.level <= 370)) ? 'Major Grade 1 โœทยน' + : ((user.level >= 370) && (user.level <= 380)) ? 'Major Grade 2 โœทยฒ' + : ((user.level >= 380) && (user.level <= 390)) ? 'Major Grade 3 โœทยณ' + : ((user.level >= 390) && (user.level <= 400)) ? 'Major Grade 4 โœทโด' + : ((user.level >= 400) && (user.level <= 410)) ? 'Major Grade 5 โœทโต' + : ((user.level >= 410) && (user.level <= 420)) ? 'Colonel Grade 1 โœทโœทยน' + : ((user.level >= 420) && (user.level <= 430)) ? 'Colonel Grade 2 โœทโœทยฒ' + : ((user.level >= 430) && (user.level <= 440)) ? 'Colonel Grade 3 โœทโœทยณ' + : ((user.level >= 440) && (user.level <= 450)) ? 'Colonel Grade 4 โœทโœทโด' + : ((user.level >= 450) && (user.level <= 460)) ? 'Colonel Grade 5 โœทโœทโต' + : ((user.level >= 460) && (user.level <= 470)) ? 'Brigadier Early โœฐ' + : ((user.level >= 470) && (user.level <= 480)) ? 'Brigadier Silver โœฉ' + : ((user.level >= 480) && (user.level <= 490)) ? 'Brigadier gold โœฏ' + : ((user.level >= 490) && (user.level <= 500)) ? 'Brigadier Platinum โœฌ' + : ((user.level >= 500) && (user.level <= 600)) ? 'Brigadier Diamond โœช' + : ((user.level >= 600) && (user.level <= 700)) ? 'Legendary ๅฟ' + : ((user.level >= 700) && (user.level <= 800)) ? 'Legendary ๅฟๅฟ' + : ((user.level >= 800) && (user.level <= 900)) ? 'Legendary ๅฟๅฟๅฟ' + : ((user.level >= 900) && (user.level <= 1000)) ? 'Legendaryๅฟๅฟๅฟๅฟ' + : 'Master ์ˆ’ ร— Legendary ์ˆ’' + user.role = role + await conn.reply(m.chat, "Kamu adalah: " + user.role, m) +} +handler.help = ['role'] +handler.tags = ['rpg'] +handler.command = /^(role|levelrole|checkrole)$/i +handler.register = true +module.exports = handler + +//dana diff --git a/plugins/rpg-coinflip.js b/plugins/rpg-coinflip.js new file mode 100644 index 0000000000000000000000000000000000000000..89d47123cfe97d3df91b7affbc069adb5bd701a9 --- /dev/null +++ b/plugins/rpg-coinflip.js @@ -0,0 +1,70 @@ +const axios = require('axios'); +const { Sticker, StickerTypes } = require('wa-sticker-formatter'); + +const handler = async (m, { conn, args, text }) => { + var arr = ["atas", "bawah"]; + if (!arr.includes(args[0])) throw "Pilih Atas Atau Bawah? format .putarkoin atas/bawah"; + var terbang = arr[Math.floor(Math.random() * arr.length)]; + var res; + var pesan; + var stiker; + var MiliSecond = 3000; //1 second + + let coins = parseInt(Math.floor(Math.random() * 100000)); + let exp = parseInt(Math.floor(Math.random() * 10000)); + let player = global.db.data.users[m.sender]; + + if (terbang == "atas") { + res = "https://cdn-icons-png.flaticon.com/512/1490/1490832.png"; + stiker = await createSticker(false, res, wm, author, 30); + conn.sendFile(m.chat, stiker, 'sticker.webp', text); + + pesan = `*[ Menang ]* + +Kamu Mendapatkan: +${new Intl.NumberFormat('en-US').format(coins)} Money +${new Intl.NumberFormat('en-US').format(exp)} XP +`; + + setTimeout(function() { + conn.reply(m.chat, pesan, m); + }, MiliSecond); + + player.money += coins * 1; + player.exp += exp * 1; + global.db.data.users[m.sender].tiketcoin += 1; + } else if (terbang == "bawah") { + res = "https://cdn-icons-png.flaticon.com/512/4315/4315581.png"; + stiker = await createSticker(false, res, wm, author, 30); + conn.sendFile(m.chat, stiker, 'sticker.webp', text); + + pesan = `*[ Kalah ]* + +Kamu Kehilangan: +${new Intl.NumberFormat('en-US').format(coins)} Money +${new Intl.NumberFormat('en-US').format(exp)} XP +`; + + setTimeout(function() { + conn.reply(m.chat, pesan, m); + }, MiliSecond); + + player.money -= coins * 1; + player.exp -= exp * 1; + global.db.data.users[m.sender].tiketcoin -= 1; + } +} +handler.help = ["coinflip"]; +handler.tags = ["rpg"]; +handler.command = /^(coinflip|putarkoin)$/i; +module.exports = handler; + +async function createSticker(img, url, wm, author, quality) { + let stickerMetadata = { + type: 'full', + pack: wm, + author: author, + quality + }; + return (new Sticker(img ? img : url, stickerMetadata)).toBuffer(); +} \ No newline at end of file diff --git a/plugins/rpg-copet.js b/plugins/rpg-copet.js new file mode 100644 index 0000000000000000000000000000000000000000..7fdd071423e312f3e929a2312ab5e1ed3da9d55a --- /dev/null +++ b/plugins/rpg-copet.js @@ -0,0 +1,110 @@ +let handler = async (m, { +conn, +usedPrefix +}) => { + // let user = global.db.data.users[m.sender] + // let timers1 = (new Date - user.kerjatiga) + // let _timers = (10 - timers1) + // let timers = clockString(_timers) + + // if (user.stamina < 20) return m.reply(`Stamina anda tidak cukup untuk bekerja\nharap isi stamina anda dengan ${usedPrefix}eat`) + // if (user.kerjatiga > 10800000) return m.reply(`Kamu masih kelelahan untuk bekerja\nHarap tunggu ${timers} lagi untuk mencopet`) + + let __timers = (new Date - global.db.data.users[m.sender].kerjatiga) + let _timers = (9000000 - __timers) + let order = global.db.data.users[m.sender].ojek + let timers = clockString(_timers) + let user = global.db.data.users[m.sender] + if (new Date - global.db.data.users[m.sender].kerjatiga > 300000) { +let rndm1 = `${Math.floor(Math.random() * 10)}` +let rndm2 = `${Math.floor(Math.random() * 10)}` +.trim() + +let ran1 = (rndm1 * 1000) +let ran2 = (rndm2 * 10) + +let hmsil1 = `${ran1}` +let hmsil2 = `${ran2}` + +let jln = ` +๐Ÿšถ ๐Ÿš• + +โœ”๏ธ Mengincar target.... +` + +let jln2 = ` +๐Ÿšถ ๐Ÿšถ + +โž• Memulai aksi.... +` + +let jln3 = ` +๐Ÿšถ + +โž• Merampok.... +` + +let jln4 = ` + ๐Ÿš• + + + +๐Ÿšถ + +โž• ๐Ÿ’นBerhasil kabur.... +` + +let hsl = ` +*โ€”[ Hasil rob ]โ€”* + + โž• ๐Ÿ’น Uang = [ ${hmsil1} ] + โž• โœจ Exp = [ ${hmsil2} ] + โž• ๐Ÿ“ฆ Copet Selesai = +1 + +Dan stamina anda berkurang -20 +` +user.money += ran1 +user.exp += ran2 +user.stamina -= 20 +user.warn += 1 + +setTimeout(() => { + m.reply(`${hsl}`) + }, 27000) + + setTimeout(() => { + m.reply(`${jln4}`) + }, 25000) + + setTimeout(() => { + m.reply(`${jln3}`) + }, 20000) + + setTimeout(() => { + m.reply(`${jln2}`) + }, 15000) + + setTimeout(() => { + m.reply(`${jln}`) + }, 10000) + + setTimeout(() => { + m.reply(`๐Ÿ”Mencari orang.....`) + }, 0) + user.kerjatiga = new Date * 1 + } + else m.reply(`Sepertinya anda sudah kecapekan silahkan istirahat dulu sekitar\n*${timers}*`) +} +handler.help = ['copet'] +handler.tags = ['rpg'] +handler.command = /^(copet)$/i +handler.group = true +module.exports = handler + +function clockString(ms) { + let d = isNaN(ms) ? '--' : Math.floor(ms / 86400000) + let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) % 24 + let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 + let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 + return ['\n' + d, ' *Days โ˜€๏ธ*\n ', h, ' *Hours ๐Ÿ•*\n ', m, ' *Minute โฐ*\n ', s, ' *Second โฑ๏ธ* '].map(v => v.toString().padStart(2, 0)).join('') +} \ No newline at end of file diff --git a/plugins/rpg-craft.js b/plugins/rpg-craft.js new file mode 100644 index 0000000000000000000000000000000000000000..5ac8d6eb24283a6f42cf877eb6c541ed7fbc4b71 --- /dev/null +++ b/plugins/rpg-craft.js @@ -0,0 +1,183 @@ +let handler = async (m, { conn, command, args, usedPrefix }) => { + let type = (args[0] || '').toLowerCase(); + let _type = (args[0] || '').toLowerCase(); + let user = global.db.data.users[m.sender]; + + let caption = `*B L A C K S M I T H* + +> *L I S T - C R A F T* +*[ โ›๏ธ ]* โ€ข Pickaxe +*[ โš”๏ธ ]* โ€ข Sword +*[ ๐ŸŽฃ ]* โ€ข Fishingrod +*[ ๐Ÿฅผ ]* โ€ข Armor +*[ ๐Ÿฆฏ ]* โ€ข Katana +*[ ๐Ÿช“ ]* โ€ข Axe +*[ ๐Ÿน ]* โ€ข Bow +*[ ๐Ÿ”ช ]* โ€ข Pisau + +> *R E C E I P T* +*[ โ›๏ธ ]* โ€ข _Pickaxe_ +โ€ข _10_ || *Kayu* +โ€ข _5_ || *Batu* +โ€ข _5_ || *Iron* +โ€ข _20_ || *String* + +*[ ๐Ÿช“ ]* โ€ข _Axe_ +โ€ข _15_ || *Kayu* +โ€ข _10_ || *Batu* +โ€ข _15_ || *Iron* +โ€ข _10_ || *String* + +*[ โš”๏ธ ]* โ€ข _Sword_ +โ€ข _10_ || *Kayu* +โ€ข _15_ || *Iron* + +*[ ๐Ÿ”ช ]* โ€ข _Pisau_ +โ€ข _15_ || *Kayu* +โ€ข _20_ || *Iron* + +*[ ๐Ÿน ]* โ€ข _Bow_ +โ€ข _10_ || *Kayu* +โ€ข _5_ || *Iron* +โ€ข _10_ || *String* + +*[ ๐ŸŽฃ ]* โ€ข _Fishingrod_ +โ€ข _10_ || *Kayu* +โ€ข _2_ || *Iron* +โ€ข _20_ || *String* + +*[ ๐Ÿฅผ ]* โ€ข _Armor_ +โ€ข _5_ || *Iron* +โ€ข _1_ || *Diamond* + +*[ ๐Ÿฆฏ ]* โ€ข _Katana_ +โ€ข _10_ || *Kayu* +โ€ข _15_ || *Iron* +โ€ข _5_ || *Diamond* +โ€ข _3_ || *Emerald* + +> *H O W - C R A F T* +โ€ข _Example_ : +.craft _sword_ +`.trim(); + + try { + if (/craft|Crafting|blacksmith/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(99999999, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count); + switch (type) { + case 'pickaxe': + if (user.pickaxe > 0) return m.reply('Kamu sudah memilik ini'); + if (user.batu < 5 || user.kayu < 10 || user.iron < 5 || user.string < 20) return m.reply(`Barang tidak cukup!\nUntuk membuat pickaxe. Kamu memerlukan : ${user.kayu < 10 ? `\n${10 - user.kayu} kayu๐Ÿชต` : ''} ${user.iron < 5 ? `\n${5 - user.iron} ironโ›“` : ''}${user.string < 20 ? `\n${20 - user.string} String๐Ÿ•ธ๏ธ` : ''}${user.batu < 5 ? `\n${5 - user.batu} Batu ๐Ÿชจ` : ''}`); + user.kayu -= 10; + user.iron -= 5; + user.batu -= 5; + user.string -= 20; + user.pickaxe += 1; + user.pickaxedurability = 40; + m.reply("Sukses membuat 1 pickaxe ๐Ÿ”จ"); + break; + case 'sword': + if (user.sword > 0) return m.reply('Kamu sudah memilik ini'); + if (user.kayu < 10 || user.iron < 15) return m.reply(`Barang tidak cukup!\nUntuk membuat sword. Kamu memerlukan :${user.kayu < 10 ? `\n${10 - user.kayu} kayu๐Ÿชต` : ''}${user.iron < 15 ? `\n${15 - user.iron} ironโ›“๏ธ` : ''}`); + user.kayu -= 10; + user.iron -= 15; + user.sword += 1; + user.sworddurability = 40; + m.reply("Sukses membuat 1 sword ๐Ÿ—ก๏ธ"); + break; + case 'pisau': + if (user.pisau > 0) return m.reply('Kamu sudah memilik ini'); + if (user.kayu < 15 || user.iron < 20) return m.reply(`Barang tidak cukup!\nUntuk membuat pisau. Kamu memerlukan :${user.kayu < 15 ? `\n${15 - user.kayu} kayu๐Ÿชต` : ''}${user.iron < 20 ? `\n${20 - user.iron} ironโ›“๏ธ` : ''}`); + user.kayu -= 15; + user.iron -= 20; + user.pisau += 1; + user.pisaudurability = 40; + m.reply("Sukses membuat 1 pisau ๐Ÿ”ช"); + break; + case 'axe': + if (user.axe > 0) return m.reply('Kamu sudah memilik ini'); + if (user.batu < 10 || user.kayu < 15 || user.iron < 15 || user.string < 10) return m.reply(`Barang tidak cukup!\nUntuk membuat axe. Kamu memerlukan : ${user.kayu < 10 ? `\n${10 - user.kayu} kayu๐Ÿชต` : ''} ${user.iron < 5 ? `\n${5 - user.iron} ironโ›“` : ''}${user.string < 20 ? `\n${20 - user.string} String๐Ÿ•ธ๏ธ` : ''}${user.batu < 5 ? `\n${5 - user.batu} Batu ๐Ÿชจ` : ''}`); + user.kayu -= 15; + user.iron -= 15; + user.batu -= 10; + user.string -= 10; + user.axe += 1; + user.axedurability = 40; + m.reply("Sukses membuat 1 axe ๐Ÿช“"); + break; + case 'fishingrod': + if (user.fishingrod > 0) return m.reply('Kamu sudah memilik ini'); + if (user.kayu < 20 || user.iron < 5 || user.string < 20) return m.reply(`Barang tidak cukup!\nUntuk membuat pancingan. Kamu memerlukan :${user.kayu < 20 ? `\n${20 - user.kayu} kayu๐Ÿชต` : ''}${user.iron < 5 ? `\n${5 - user.iron} ironโ›“` : ''}${user.string < 20 ? `\n${20 - user.string} String๐Ÿ•ธ๏ธ` : ''}`); + user.kayu -= 10; + user.iron -= 2; + user.string -= 20; + user.fishingrod += 1; + user.fishingroddurability = 40; + m.reply("Sukses membuat 1 Pancingan ๐ŸŽฃ"); + break; + case 'bow': + if (user.bow > 0) return m.reply('Kamu sudah memilik ini'); + if (user.kayu < 10 || user.iron < 5 || user.string < 10) return m.reply(`Barang tidak cukup!\nUntuk membuat bow. Kamu memerlukan :${user.kayu < 20 ? `\n${20 - user.kayu} kayu๐Ÿชต` : ''}${user.iron < 5 ? `\n${5 - user.iron} ironโ›“` : ''}${user.string < 20 ? `\n${20 - user.string} String๐Ÿ•ธ๏ธ` : ''}`); + user.kayu -= 10; + user.iron -= 5; + user.string -= 10; + user.bow += 1; + user.bowdurability = 40; + m.reply("Sukses membuat 1 Bow ๐Ÿน"); + break; + case 'katana': + if (user.katana > 0) return m.reply('Kamu sudah memilik ini'); + if (user.kayu < 10 || user.iron < 15 || user.diamond < 5 || user.emerald < 3) return m.reply(`Barang tidak cukup!\nUntuk membuat katana. Kamu memerlukan :${user.kayu < 10 ? `\n${10 - user.kayu} kayu๐Ÿชต` : ''}${user.iron < 15 ? `\n${15 - user.iron} ironโ›“` : ''}${user.diamond < 5 ? `\n${5 - user.diamond} Diamond๐Ÿ’Ž` : ''}${user.emerald < 3 ? `\n${3 - user.emerald} Emerald ๐ŸŸฉ` : ''}`); + user.kayu -= 10; + user.iron -= 15; + user.diamond -= 5; + user.emerald -= 3; + user.katana += 1; + user.katanadurability = 40; + m.reply("Sukses membuat 1 Katana ๐Ÿฆฏ"); + break; + case 'armor': + if (user.armor > 0) return m.reply('Kamu sudah memilik ini'); + if (user.iron < 5 || user.diamond < 1) return m.reply(`Barang tidak cukup!\nUntuk membuat armor. Kamu memerlukan :${user.iron < 5 ? `\n${5 - user.iron} Iron โ›“๏ธ` : ''}${user.diamond < 1 ? `\n${1 - user.diamond} Diamond ๐Ÿ’Ž` : ''}`); + user.iron -= 5; + user.diamond -= 1; + user.armor += 1; + user.armordurability = 50; + m.reply("Sukses membuat 1 Armor ๐Ÿฅผ"); + break; + default: + await conn.reply(m.chat, caption, m, { + contextInfo: { + externalAdReply: { + mediaType: 1, + title: wm, + thumbnailUrl: 'https://telegra.ph/file/ed878d04e7842407c2b89.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + } + } + }); + } + } else if (/enchant|enchan/i.test(command)) { + const count = args[2] && args[2].length > 0 ? Math.min(99999999, Math.max(parseInt(args[2]), 1)) : !args[2] || args.length < 4 ? 1 : Math.min(1, count); + switch (_type) { + case 't': + break; + case '': + break; + default: + m.reply(caption); + } + } + } catch (err) { + m.reply("Error\n\n\n" + err.stack); + } +}; + +handler.help = ['craft', 'blacksmith']; +handler.tags = ['rpg']; +handler.command = /^(craft|crafting|chant|blacksmith)/i; +handler.register = true; +handler.group = true; + +module.exports = handler; diff --git a/plugins/rpg-dailymisi.js b/plugins/rpg-dailymisi.js new file mode 100644 index 0000000000000000000000000000000000000000..76e9d585083c4057546be27c982281ada25e5822 --- /dev/null +++ b/plugins/rpg-dailymisi.js @@ -0,0 +1,52 @@ +/** !! THIS CODE GENERATE BY RODOTZBOT !! **/ + +const moment = require('moment-timezone') + +let handler = async (m, { conn }) => { + let user = global.db.data.users[m.sender] + if (!user) throw 'Anda belum terdaftar di database' + + if (user.kerjalima && user.kerjalima > Date.now()) { + let remainingTime = (user.kerjalima - Date.now()) / 1000 + let hours = Math.floor(remainingTime / 3600) + remainingTime %= 3600 + let minutes = Math.floor(remainingTime / 60) + let seconds = Math.floor(remainingTime % 60) + let remainingTimeString = `${hours} jam ${minutes} menit ${seconds} detik` + throw `Anda masih memiliki misi yang sedang berlangsung. Silakan coba lagi dalam *${remainingTimeString}.*` + } + + m.reply('Anda sedang mengerjakan misi..') + await delay(2000) + + let randomMoney = Math.floor(Math.random() * (1000000 - 10000 + 1) + 10000) + let randomExp = Math.floor(Math.random() * (1000 - 100 + 1) + 100) + let randomLimit = Math.floor(Math.random() * (20 - 10 + 1) + 10) + + user.money += randomMoney + user.exp += randomExp + user.limit += randomLimit + + let replyMsg = `*Selamat Anda Telah Mengerjakan Misi Hari Ini* + +โ—ฆ *Money:* ${randomMoney} +โ—ฆ *Exp:* ${randomExp} +โ—ฆ *Limit:* ${randomLimit}` + + global.db.data.users[m.sender] = user + m.reply(replyMsg) + + user.kerjalima = Date.now() + 86400000 + global.db.data.users[m.sender] = user +} + +handler.help = ['dailymisi'] +handler.tags = ['rpg'] +handler.limit = true +handler.command = /^dailymisi$/i + +module.exports = handler + +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)) +} \ No newline at end of file diff --git a/plugins/rpg-dokter.js b/plugins/rpg-dokter.js new file mode 100644 index 0000000000000000000000000000000000000000..4e7e9b487c6fb05357c6e9a79f2cc5642fe7abca --- /dev/null +++ b/plugins/rpg-dokter.js @@ -0,0 +1,177 @@ +const STATES = { + IDLE: 0, + SEARCHING: 1, + FIGHTING: 2, +}; + +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +const handler = async (m, { conn, usedPrefix, command, args }) => { + const sender = m.sender; + const user = global.db.data.users[sender] + conn.playerr = conn.playerr || {}; + const player = conn.playerr[sender] || { Balance: 0, Pasien_Sembuh: 0, Waktu_Sembuh: 0, Obat_Super: 0, Lv: 1, State: STATES.IDLE }; + + if (command === "dokter") { + if (args.length === 0) { + conn.reply(m.chat, "*๐Ÿ‘จโ€โš• Cara Bermain Game Dokter Dan Pasien ๐Ÿ‘จโ€โš•*\n\n" + + "๐Ÿ” Gunakan perintah *.dokter cari* untuk mencari pasien secara acak.\n" + + "๐Ÿš‘ Anda akan menemukan jejak pencuri dan harus melakukan tindakan tertentu untuk menangkapnya.\n" + + "๐Ÿ’ฐ Anda akan mendapatkan imbalan jika berhasil menangkap pencuri.\n" + + "๐Ÿ’‰ Pilih tindakan dari: .dokter beriobat, rawat, suntik dan operasi.\n" + + "๐Ÿ” Gunakan perintah *.dokter <tindakan>* untuk merawat dan menyembuhkan pasien.\n" + + "๐Ÿ”Ž Anda dapat membeli obat super *.dokter item obat-super* untuk meningkatkan peluang menyembuhkan pasien.\n" + + "๐Ÿ† Cek peringkat Anda dengan perintah *.dokter leaderboard*.\n" + + "โ„น๏ธ Gunakan perintah *.dokter status* untuk melihat status Anda saat ini.", m, { + contextInfo: { +isForwarded: true, +forwardedNewsletterMessageInfo: { +newsletterJid: '120363197369767678@newsletter', +newsletterName: '>>RPG<<', +serverMessageId: -1 +}, + externalAdReply: { + mediaType: 1, + title: wm, + thumbnailUrl: 'https://telegra.ph/file/505b8d95fd7ee7b9481e3.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + } + } + }); + return; + } + + const subCommand = args[0]; + if (subCommand === "cari") { + if (player.State !== STATES.IDLE) { + return conn.reply(m.chat, "*๐Ÿ” Sedang dalam pencarian...*", m); + } + + if (Date.now() - player.Waktu_Sembuh < 30000) { + return conn.reply(m.chat, "*โฑ๏ธ Anda harus menunggu sebentar sebelum dapat mencari kembali.*", m); + } + + player.State = STATES.SEARCHING; + player.Waktu_Sembuh = Date.now(); + + const level = player.Lv; + const thiefActions = { + 1: ".dokter beriobat", + 2: ".dokter rawat", + 3: ".dokter suntik", + 4: ".dokter operasi", + }; + const thiefAction = thiefActions[level]; + + conn.reply(m.chat, `*๐Ÿ” Anda menemukan pasien level ${level}!* Untuk menyembuhkan pasien, lakukan tindakan: *${thiefAction.toUpperCase()}*.`, m); + + player.ThiefAction = thiefAction; + } else if (subCommand === "status") { + conn.reply(m.chat, `*๐Ÿ‘จโ€โš• Status Dokter ๐Ÿ‘จโ€โš•*\n\n๐Ÿ” Sedang Mencari Pasien: ${player.State === STATES.SEARCHING ? "Ya" : "Tidak"}\n๐Ÿš‘ Pasien Sembuh: ${player.Pasien_Sembuh}\n๐Ÿ’ฐ Balance: Rp${player.Balance.toLocaleString()}\n๐Ÿ† Level Pasien: ${player.Lv}`, m); + } else if (subCommand === "item") { + if (args.length === 1) { + conn.reply(m.chat, "*๐Ÿ›’ Item Shop ๐Ÿ›’*\n\nObat Super - 500 coins\n" + + `Gunakan *${usedPrefix}dokter item obat-super* untuk membeli kaca pembesar.`, m); + } else { + const item = args[1]?.toLowerCase(); + if (item === "obat-super") { + if (player.Obat_Super) { + return conn.reply(m.chat, "*๐Ÿ›’ Anda sudah memiliki obat super.*", m); + } + + if (player.Balance < 500) { + return conn.reply(m.chat, "*๐Ÿ›’ Balance Anda tidak cukup untuk membeli obat super.*", m); + } + + player.Obat_Super = 1; + player.Balance -= 500; + conn.reply(m.chat, "*๐Ÿ›’ Anda berhasil membeli obat super.* Gunakan '.dokter cari' untuk meningkatkan peluang menyembuhkan pasien.", m); + } else { + conn.reply(m.chat, "*๐Ÿ›’ Item yang dimaksud tidak ditemukan.*", m); + } + } + } else if (subCommand === "leaderboard") { + // Sort playerr based on the number of thieves caught (descending order) + const leaderboard = Object.entries(conn.playerr) + .map(([playerId, playerData]) => ({ id: playerId, Pasien_Sembuh: playerData.Pasien_Sembuh })) + .sort((a, b) => b.Pasien_Sembuh - a.Pasien_Sembuh) + .slice(0, 5); // Show top 5 playerr + + let leaderboardMsg = "*๐Ÿ† Leaderboard ๐Ÿ†*\n\n"; + for (let i = 0; i < leaderboard.length; i++) { + leaderboardMsg += `${i + 1}. @${leaderboard[i].id.split("@")[0]} - ${leaderboard[i].Pasien_Sembuh} Pasien Sembuh\n`; + } + + conn.reply(m.chat, leaderboardMsg, m); + } else if (subCommand === "stop") { + user.money += player.Balance * player.Pasien_Sembuh; + let skorMsg = `*๐Ÿ† Skor Akhir Anda ๐Ÿ†*\n\n๐Ÿš‘ Pasien Sembuh: ${player.Pasien_Sembuh}\n๐Ÿ’ฐ Total Balance: Rp${player.Balance.toLocaleString()}\n๐Ÿ† Level Pasien: ${player.Lv}`; + + conn.reply(m.chat, `*๐Ÿ‘จโ€โš• Sesi permainan Dokter dan Pasien telah dihentikan.*\n\n${skorMsg}`, m); + player.State = STATES.IDLE; + player.ThiefAction = undefined; + } else { + if (player.State !== STATES.SEARCHING) { + return conn.reply(m.chat, "*๐Ÿ” Anda harus mencari pasien terlebih dahulu dengan perintah '.dokter cari'.*", m); + } + + const dokterAction = subCommand.toLowerCase(); + const level = player.Lv; + const thiefActions = { + 1: [".dokter beriobat", ".dokter rawat", ".dokter suntik"], + 2: [".dokter rawat", ".dokter operasi"], + 3: [".dokter operasi"], + }; + + if (!thiefActions[level].includes(dokterAction)) { + return conn.reply(m.chat, `*๐Ÿš‘ Pilihan tindakan Anda (${dokterAction.toUpperCase()}) tidak sesuai dengan hasil yang dicari.*`, m); + } + + if (thiefActions[level].includes(player.ThiefAction)) { + let reward = 0; + switch (dokterAction) { + case "beriobat": + reward = 1000 * level; + break; + case "rawat": + reward = 2000 * level; + break; + case "suntik": + reward = 3000 * level; + break; + case "operasi": + reward = 5000 * level; + break; + } + + player.Pasien_Sembuh++; + player.Balance += reward; + user.money += reward; + if (player.Balance < 5000) { + player.Balance = 5000; + } + + conn.reply(m.chat, `*๐Ÿš‘ Anda berhasil merawat dan menyembuhkan pasien level ${level}!* Anda mendapatkan imbalan Rp${reward.toLocaleString()}. Total Balance Anda: Rp${player.Balance.toLocaleString()}.`, m); + } else { + conn.reply(m.chat, "*๐Ÿš‘ Tindakan Anda tidak tepat dan pasien meninggal dunia!*", m); + } + + player.State = STATES.IDLE; + player.ThiefAction = undefined; + } + + conn.playerr[sender] = player; + } else if (command === "info") { + conn.reply(m.chat, "*โ„น๏ธ Gunakan perintah '.dokter' untuk memulai game Dokter dan Pasien.*", m); + } +}; + +handler.help = ["dokter", "dokter cari", "dokter status", "dokter item <item>", "dokter leaderboard", "dokter stop"]; +handler.tags = ["rpg"]; +handler.group = true; +handler.command = ["dokter"]; + +module.exports = handler; diff --git a/plugins/rpg-dungeon.js b/plugins/rpg-dungeon.js new file mode 100644 index 0000000000000000000000000000000000000000..a4096682d6239319fc0a92d7d35815f6ac36cf2d --- /dev/null +++ b/plugins/rpg-dungeon.js @@ -0,0 +1,767 @@ +async function handler(m, { conn, usedPrefix, command, text }) { + let user = global.db.data.users[m.sender] + let SWORD = user.sword < 1 + let ARMOR = user.armor < 1 + let HEALT = user.healt < 90 + let prefix = usedPrefix + if (SWORD || ARMOR || HEALT) { + const danzz = [] + console.log({SWORD, ARMOR, HEALT}) + let thumb = 'https://telegra.ph/file/e7e06f759a0549bff9a64.jpg' + let kemii = `${prefix}shop buy armor\n\nUntuk membeli armor kamu!` + let anjy = `${prefix}shop buy sword\n\nUntuk membeli pedang kamu!` + let kemii1 = `${prefix} heal\n\nUntuk menambah darah kamu!` + if (SWORD) return conn.sendMessage(m.chat, { + text: anjy, + contextInfo: { + externalAdReply: { + title: 'D u n g e o n', + thumbnailUrl: 'https://telegra.ph/file/750e79e2764d529aea52e.jpg', + mediaType: 1, + renderLargerThumbnail: true + }}}) + if (ARMOR) return conn.sendMessage(m.chat, { + text: kemii, + contextInfo: { + externalAdReply: { + title: 'D u n g e o n', + thumbnailUrl: 'https://telegra.ph/file/750e79e2764d529aea52e.jpg', + mediaType: 1, + renderLargerThumbnail: true + }}}) + if (HEALT) return conn.sendMessage(m.chat, { + text: kemii1, + contextInfo: { + externalAdReply: { + title: 'D u n g e o n', + thumbnailUrl: 'https://telegra.ph/file/750e79e2764d529aea52e.jpg', + mediaType: 1, + renderLargerThumbnail: true + }}}) + + let lmao = item(user.sword * 1, user.armor * 1, user.healt * 1, usedPrefix) + if (danzz.length == 0) return conn.sendMessage(m.chat, { + text: lmao, + contextInfo: { + externalAdReply: { + title: 'D u n g e o n', + thumbnailUrl: 'https://telegra.ph/file/750e79e2764d529aea52e.jpg', + mediaType: 1, + renderLargerThumbnail: true + }}}) + } + global.dungeon = global.dungeon ? global.dungeon : {} + if (Object.values(global.dungeon).find(room => room.id.startsWith('dungeon') && [room.game.player1, room.game.player2, room.game.player3, room.game.player4].includes(m.sender))) return conn.reply(m.chat, 'Kamu masih di dalam Dungeon', m)// nek iseh neng njero dungeon + let timing = (new Date - (user.lastdungeon * 1)) * 1 + if (timing < 100) return conn.reply(m.chat, `Silahkan tunggu ${clockString(100 - timing)} untuk bisa ke Dungeon`, m)// Cooldown + let room = Object.values(global.dungeon).find(room => room.state === 'WAITING' && (text ? room.name === text : true)) + if (room) { + + // Biar simple :v + let p1 = room.game.player1 || '' + let p2 = room.game.player2 || '' + let p3 = room.game.player3 || '' + let p4 = room.game.player4 || '' + let c1 = room.player1 || '' + let c2 = room.player2 || '' + let c3 = room.player3 || '' + let c4 = room.player4 || '' + + if (!p2) { + room.player2 = m.chat + room.game.player2 = m.sender + } else if (!p3) { + room.player3 = m.chat + room.game.player3 = m.sender + } else if (!p4) { + room.player4 = m.chat + room.game.player4 = m.sender + room.state = 'PLAYING' + } + + + const buttons = [ + {buttonId: 'gass..', buttonText: {displayText: 'gass..'}, type: 1} + ] + + let lmao = `${!room.game.player4 ? `Menunggu ${!room.game.player3 && !room.game.player4 ? '2' : '1'} Partner lagi... ${room.name ? `mengetik command dibawah ini *${usedPrefix}${command} ${room.name}*` : ''}` : 'Semua partner telah lengkap...'}` + conn.sendMessage(m.chat, { + text: lmao, + contextInfo: { + externalAdReply: { + title: 'D u n g e o n', + thumbnailUrl: 'https://telegra.ph/file/750e79e2764d529aea52e.jpg', + mediaType: 1, + renderLargerThumbnail: true + }}}) + + if (room.game.player1 && room.game.player2 && room.game.player3 && room.game.player4) { + + // Hadiah ben do seneng :v + room.price.money += (Math.floor(Math.random() * 1000001)) * 1 + room.price.exp += (Math.floor(Math.random() * 500001)) * 1 + room.price.iron += (pickRandom([0, 0, 0, 0, 1, 0, 0, 0])) * 1 + room.game.diamond += (pickRandom([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0])) * 1 + room.game.sampah += (Math.floor(Math.random() * 101)) * 1 + room.price.string += (Math.floor(Math.random() * 2)) * 1 + room.price.kayu += (Math.floor(Math.random() * 2)) * 1 + room.price.batu += (Math.floor(Math.random() * 2)) * 1 + room.game.makananPet += (pickRandom([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0])) * 1 + room.game.common += (pickRandom([0, 0, 0, 1, 0, 0, 0, 0, 0, 0])) * 1 + room.game.uncommon += (pickRandom([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0])) * 1 + + let str = ` +Room ID: ${room.id} + +${M(p1)}, ${M(p2)}, ${M(p3)} dan ${M(p4)} + +Sedang berperang di dungeon... +`.trim() + + await m.reply(str, c1, { + contextInfo: { + mentionedJid: conn.parseMention(str) + } + }) + if (![c1, c3, c4].includes(c2)) m.reply(str, c2, { + contextInfo: { + mentionedJid: conn.parseMention(str) + } + }) + if (![c1, c2, c4].includes(c3)) m.reply(str, c3, { + contextInfo: { + mentionedJid: conn.parseMention(str) + } + }) + if (![c1, c2, c3].includes(c4)) m.reply(str, c4, { + contextInfo: { + mentionedJid: conn.parseMention(str) + } + }) + + setTimeout(async () => { + let users = global.db.data.users[m.sender] + let player = [p1, p2, p3, p4] + let { healt, sword } = room.less + let { exp, money, sampah, potion, diamond, iron, kayu, batu, string, common, uncommon, mythic, legendary, pet, makananPet } = room.price + let str2 = ` +Nyawa *${M(p1)}*, *${M(p2)}*, *${M(p3)}* dan *${M(p4)}* masing masing berkurang *-${healt * 1}*, dan durability Sword kalian masing masing berkurang *-${sword * 1}* karena kalian telah membunuh *${pickRandom(['Ender Dragon', 'Baby Dragon', 'Titan', 'Cacing dan Semut', 'PP Mikey', 'Orang', 'Kecoa', 'Semut', 'Siput', '....', 'Wither', 'Sekeleton', 'Ayam Emas', 'Temenmu', 'Sapi', 'Tidak Ada', 'Creeper', 'Zombie', 'Hewan Pelihraanmu','Diri Sendiri'])}* dan mendapatkan total +*Exp:* ${exp * 4} +*Uang:* ${money * 4} +*Sampah:* ${sampah * 4}${potion == 0 ? '' : '\n*Potion:* ' + potion * 4}${makananPet == 0 ? '' : '\n*Makanan Pet* ' + makananPet * 4}${kayu == 0 ? '' : '\n*Kayu:* ' + kayu * 4}${batu == 0 ? '' : '\n*Batu:* ' + batu * 4}${string == 0 ? '' : '\n*String:* ' + string * 4}${iron == 0 ? '' : '\n*Iron:* ' + iron * 4}${diamond == 0 ? '' : '\n*Diamond:* ' + diamond * 4}${common == 0 ? '' : '\n*Common Crate:* ' + common * 4}${uncommon == 0 ? '' : '\n*Uncommon Crate:* ' + uncommon * 4} + `.trim() + for (let i = 0; i < player.length; i++) { + let p = player[i] + setTimeout(() => { + users[p].healt -= healt * 1 + users[p].sworddurability -= sword * 1 + users[p].money += money * 1 + users[p].exp += exp * 1 + users[p].sampah += sampah * 1 + users[p].potion += potion * 1 + users[p].diamond += diamond * 1 + users[p].iron += iron * 1 + users[p].kayu += kayu * 1 + users[p].batu += batu * 1 + users[p].string += string * 1 + users[p].common += common * 1 + users[p].uncommon += uncommon * 1 + users[p].mythic += mythic * 1 + users[p].legendary += legendary * 1 + users[p].pet += pet * 1 + users[p].makananpet += makananPet * 1 + users[p].lastdungeon = new Date * 1 + + if ((users[p].healt * 1) < 1) users[p].healt = 0 + if ((users[p].sworddurability * 1) < 1) { + users[p].sword -= 1 + users[p].sworddurability = (users[p].sword * 1) * 50 + } + }, (i * 1) * 1500) + } + + await m.reply(str2, c1, { + contextInfo: { + mentionedJid: conn.parseMention(str2) + } + }) + if (![c1, c3, c4].includes(c2)) m.reply(str2, c2, { + contextInfo: { + mentionedJid: conn.parseMention(str2) + } + }) + if (![c1, c2, c4].includes(c3)) m.reply(str2, c3, { + contextInfo: { + mentionedJid: conn.parseMention(str2) + } + }) + if (![c1, c2, c3].includes(c4)) m.reply(str2, c4, { + contextInfo: { + mentionedJid: conn.parseMention(st2) + } + }) + + if (mythic > 0) { + let str3 = 'Selamat ' + M(p1) + ', ' + M(p2) + ', ' + M(p3) + ' dan ' + M(p4) +' kalian mendapatkan item Rare Total *' + mythic * 4 + '* ๐Ÿ“ฆMythic Crate' + await m.reply(str3, c1, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + if (![c1, c3, c4].includes(c2)) m.reply(str3, c2, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + if (![c1, c2, c4].includes(c3)) m.reply(str3, c3, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + if (![c1, c2, c3].includes(c4)) m.reply(str3, c4, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + } + + if (legendary > 0 || pet > 0) { + let str3 = (mythic > 0 ? 'Dan juga' : 'Selamat ' + M(p1) + ', ' + M(p2) + ', ' + M(p3) + ' dan ' + M(p4) + ' kalian') + ' mendapatkan item Epic Total ' + (pet > 0 && legendary > 0 ? `*${legendary * 4}* ๐ŸŽLegendary Crate dan *${pet * 4}* ๐Ÿ“ฆPet Crate` : pet > 0 && legendary < 1 ? `*${pet * 4}* ๐Ÿ“ฆPet Crate` : legendary > 0 && pet < 1 ? `*${legendary * 4}* ๐ŸŽLegendary Crate` : '') + await m.reply(str3, c1, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + if (![c1, c3, c4].includes(c2)) m.reply(str3, c2, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + if (![c1, c2, c4].includes(c3)) m.reply(str3, c3, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + if (![c1, c2, c3].includes(c4)) m.reply(str3, c4, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + } + + // Biar lebih simple + let _1 = users[p1] + let _2 = users[p2] + let _3 = users[p3] + let _4 = users[p4] + let _H1 = (_1.healt * 1) + let _H2 = (_2.healt * 1) + let _H3 = (_3.healt * 1) + let _H4 = (_4.healt * 1) + + // sd = SwordDurability :v + let _sd1 = (_1.sworddurability * 1) + let _sd2 = (_2.sworddurability * 1) + let _sd3 = (_3.sworddurability * 1) + let _sd4 = (_4.sworddurability * 1) + + //Peringatan kalau health nya 0 ataupun sword durabilitynya 0 + if ((_H1 || _H2 || _H3 || _H4 || _sd1 || _sd2 || _sd3 || _sd4) < 1) { + + //Sama kek atas biar simple aja :v + let s1 = (_sd1 * 1) < 1 + let s2 = (_sd2 * 1) < 1 + let s3 = (_sd3 * 1) < 1 + let s4 = (_sd4 * 1) < 1 + + //Buat nyimpen data sementara :v + let HEALT = [], SDH = [], SDM1L = [] + for (let siapa in player) { + if ((users[siapa].healt * 1) < 1) HEALT.push(siapa) + if ((users[siapa].sworddurability * 1) < 1 && (users[siapa].sword * 1) == 1) SDH.push(siapa) + if ((users[siapa].sworddurability * 1) < 1 && (users[siapa].sword * 1) !== 1) SDM1L.push(siapa) + } + + let sI = data(SDH) + let sH = data(SDM1L) + let H = data(HEALT) + + let str3 = `${((SDH || SDH.length > 0) || (SDM1L || SDM1L.length > 0)) ? `โš”๏ธSword ${((SDH || SDH.length > 0 ? sI + ' Hancur, silahkan crafting โš”๏ธSword kembali dengan mengetik *' + usedPrefix + 'craft sword*' : '') + (SDM1L || SDM1L.length > 0 ? (SDH || SDH.length > 0 ? ', Sedangkan โš”๏ธSword ' : '') + sH + ' Hancur, dan Menurun *1* Level' : ''))}` : ''}${HEALT || HEALT.length > 0 ? `โค๏ธNyawa ${H} habis, silahkan isi โค๏ธNyawa dengan mengetik ${usedPrefix}heal` : ''}` + await m.reply(str3, c1, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + if (![c1, c3, c4].includes(c2)) m.reply(str3, c2, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + if (![c1, c2, c4].includes(c3)) m.reply(str3, c3, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + if (![c1, c2, c3].includes(c4)) m.reply(str3, c4, { + contextInfo: { + mentionedJid: conn.parseMention(str3) + } + }) + } + + //Hapus annunya biar bisa main dungeon lagi :V + delete global.dungeon[room.id] + + }, pickRandom([1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000])) + if (global.dungeon && room.state == 'PLAYING') delete global.dungeon[room.id] //Pastiin lagi kalau masih ada bakal ilang :v + } + } else { + room = { + id: 'dungeon-' + (+ new Date), + player1: m.chat, + player2: '', + player3: '', + player4: '', + state: 'WAITING', + game: { + player1: m.sender, + player2: '', + player3: '', + player4: '', + }, + price: { + money: (Math.floor(Math.random() * 500001)) * 1, + exp: (Math.floor(Math.random() * 70001)) * 1, + sampah: (Math.floor(Math.random() * 201)) * 1, + potion: (Math.floor(Math.random() * 2)) * 1, + diamond: (pickRandom([0, 0, 0, 0, 1, 0, 0])) * 1, + iron: (Math.floor(Math.random() * 2)) * 1, + kayu: (Math.floor(Math.random() * 3)) * 1, + batu: (Math.floor(Math.random() * 2)) * 1, + string: (Math.floor(Math.random() * 2)) * 1, + common: (pickRandom([0, 0, 0, 1, 0, 0])) * 1, + uncommon: (pickRandom([0, 0, 0, 1, 0, 0, 0])) * 1, + mythic: (pickRandom([0, 0, 0, 1, 0, 0, 0, 0, 0])) * 1, + legendary: (pickRandom([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0])) * 1, + pet: (pickRandom([0, 0, 0, 1, 0, 0, 0, 0, 0, 0])) * 1, + makananPet: (pickRandom([0, 0, 0, 1, 0, 0, 0, 0])) * 1, + }, + less: { + healt: (Math.floor(Math.random() * 101)) * 1, + sword: (Math.floor(Math.random() * 50)) * 1, + } + } + if (text) room.name = text + + let lmao = 'Menunggu partner ' + (text ? `mengetik command dibawah ini +${usedPrefix}${command} ${text}` : '') + '\natau ketik *sendiri* untuk bermain sendiri' +conn.sendMessage(m.chat, { + text: lmao, + contextInfo: { + externalAdReply: { + title: 'D u n g e o n', + thumbnailUrl: 'https://telegra.ph/file/750e79e2764d529aea52e.jpg', + mediaType: 1, + renderLargerThumbnail: true + }}}) + global.dungeon[room.id] = room + } +} + +handler.before = function (m) { +global.dungeon = global.dungeon ? global.dungeon : {} +let room = Object.values(global.dungeon).find(room => room.id.startsWith('dungeon-') && [room.game.player1, room.game.player2, room.game.player3, room.game.player4].includes(m.sender) && room.state == 'WAITING') +if (room) { + + let p1 = room.game.player1 || '' + let p2 = room.game.player2 || '' + let p3 = room.game.player3 || '' + let p4 = room.game.player4 || '' + let c1 = room.player1 || '' + let c2 = room.player2 || '' + let c3 = room.player3 || '' + let c4 = room.player4 || '' + + let PLAYER = [room.game.player1] + if (room.game.player2) PLAYER.push(room.game.player2) + if (room.game.player3) PLAYER.push(room.game.player3) + if (room.game.player4) PLAYER.push(room.game.player4) + let P = data(PLAYER) + if (/^(sendiri|dewean|solo)$/i.test(m.text.toLowerCase())) { + let lmao = 'Kamu tidak bisa bermain sendiri karena memiliki partner. Silahkan ketik *gass* untuk bermain dengan partner lainnya...' + conn.sendMessage(m.chat, { + text: lmao, + contextInfo: { + externalAdReply: { + title: 'D u n g e o n', + thumbnailUrl: 'https://telegra.ph/file/750e79e2764d529aea52e.jpg', + mediaType: 1, + renderLargerThumbnail: true + }}}) + + if (room.player2 || room.player3 || room.player4) return this.sendMessage(m.chat, lmao, { quoted: m }) + room.state = 'PLAYING' + let str = ` +Room ID: ${room.id} + +${P} + +Sedang berperang di dungeon... +`.trim() + m.reply(str, room.player1, { + contextInfo: { + mentionedJid: this.parseMention(str) + } + }) + + setTimeout(async () => { + let users = global.db.data.users[p1] + let { healt, sword } = room.less + let { exp, money, sampah, potion, diamond, iron, kayu, batu, string, common, uncommon, mythic, legendary, pet, makananPet } = room.price + let str2 = ` +Nyawa Kamu berkurang -${healt * 1}, dan durability Sword Kamu -${sword * 1} karena kamu telah Membunuh ${pickRandom(['Ender Dragon', 'Baby Dragon', 'Titan', 'Cacing dan Semut', 'PP Mikey', 'Orang', 'Kecoa', 'Semut', 'Siput', '....', 'Wither', 'Sekeleton', 'Ayam Emas', 'Temenmu', 'Sapi', 'Tidak Ada', 'Creeper', 'Zombie', 'Hewan Pelihraanmu','Diri Sendiri'])} dan mendapatkan +*Exp:* ${exp} +*Uang:* ${money} +*Sampah:* ${sampah}${potion == 0 ? '' : '\n*Potion:* ' + potion}${makananPet == 0 ? '' : '\n*Makanan Pet* ' + makananPet * 1}${kayu == 0 ? '' : '\n*Kayu:* ' + kayu}${batu == 0 ? '' : '\n*Batu:* ' + batu}${string == 0 ? '' : '\n*String:* ' + string}${iron == 0 ? '' : '\n*Iron:* ' + iron}${diamond == 0 ? '' : '\n*Diamond:* ' + diamond}${common == 0 ? '' : '\n*Common Crate:* ' + common}${uncommon == 0 ? '' : '\n*Uncommon Crate:* ' + uncommon} +`.trim() + users.healt -= healt * 1 + users.sworddurability -= sword * 1 + users.money += money * 1 + users.exp += exp * 1 + users.sampah += sampah * 1 + users.potion += potion * 1 + users.diamond += diamond * 1 + users.iron += iron * 1 + users.kayu += kayu * 1 + users.batu += batu * 1 + users.string += string * 1 + users.common += common * 1 + users.uncommon += uncommon * 1 + users.mythic += mythic * 1 + users.legendary += legendary * 1 + users.pet += pet * 1 + users.makananpet += makananPet * 1 + users.lastdungeon = new Date * 1 + await m.reply(str2, room.player1) + if (mythic > 0) { + let str3 = 'Selamat Kamu Mendapatkan item Rare yaitu *' + mythic + '* Mythic Crate' + m.reply(str3, room.player1) + } + if (legendary > 0 || pet > 0) { + let str3 = (mythic > 0 ? 'Dan juga' : 'Selamat Kamu') + ' mendapatkan item Epic yaitu ' + (pet > 0 && legendary > 0 ? `*${legendary}* Legendary Crate dan *${pet}* Pet Crate` : pet > 0 && legendary < 1 ? `*${pet}* Pet Crate` : legendary > 0 && pet < 1 ? `*${legendary}* Legendary Crate` : '') + m.reply(str3, room.player1) + } + if ((users.healt * 1) < 1 || (users.sworddurability * 1) < 1) { + let sword1 = (users.sworddurability * 1) < 1 && (users.sword * 1) == 1 + let _sword1 = (users.sworddurability * 1) < 1 && (users.sword * 1) > 1 + let __sword1 = (users.sworddurability * 1) < 1 && (users.sword * 1) > 0 + let healt1 = (users.healt * 1) < 1 + if (__sword1) { + users[p1].sword -= 1 + users[p1].sworddurability = 0 + } + let str3 = `${__sword1 ? ` Sword Kamu ${_sword1 ? ` Level nya berkurang 1 karena hancur` : ` Hancur, dan silahkan crafting Sword kembali dengan mengetik ${usedPrefix}`}craft sword` : ''} ${healt1 ? `${__sword1 ? 'Dan ' : ''}Nyawa Kamu habis, silahkan isi kembali dengan ketik ${usedPrefix}heal` : ''}` + m.reply(str3, room.player1, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + } + delete global.dungeon[room.id] + }, pickRandom([1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000])) + if (global.dungeon && room.state == 'PLAYING') delete global.dungeon[room.id] + + } else if (/^(gass?s?s?s?.?.?.?|mulai|los?s?s?.?.?.?)$/i.test(m.text.toLowerCase())) { + let str = ` +Room ID: ${room.id} + +${P} + +Sedang berperang di dungeon... +`.trim() + m.reply(str, c1, { + contextInfo: { + mentionedJid: this.parseMention(str) + } + }) + if (c2 && ![c1, c3, c4].includes(c2)) m.reply(str, c2, { + contextInfo: { + mentionedJid: this.parseMention(str) + } + }) + if (c3 && ![c1, c2, c4].includes(c3)) m.reply(str, c3, { + contextInfo: { + mentionedJid: this.parseMention(str) + } + }) + if (c4 && ![c1, c2, c3].includes(c4)) m.reply(str, c4, { + contextInfo: { + mentionedJid: this.parseMention(str) + } + }) + + for (let _p of PLAYER) { + room.price.money += (Math.floor(Math.random() * 41)) * 1 + room.price.exp += (Math.floor(Math.random() * 76)) * 1 + room.game.sampah += (Math.floor(Math.random() * 16)) * 1 + room.price.string += (pickRandom([0, 0, 0, 1, 0, 0, 0, 0, 0, 0])) * 1 + room.price.kayu += (pickRandom([0, 0, 0, 1, 0, 0, 0, 0, 0, 0])) * 1 + room.price.batu += (pickRandom([0, 0, 0, 1, 0, 0, 0, 0, 0, 0])) * 1 + room.game.common += (pickRandom([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0])) * 1 + } + + let users = global.db.data.users[m.sender] + let orang = PLAYER.length + let { healt, sword } = room.less + let { exp, money, sampah, potion, diamond, iron, kayu, batu, string, common, uncommon, mythic, legendary, pet, makananPet } = room.price + + setTimeout(async () => { + let str2 =` +Nyawa ${P} masing masing berkurang *-${healt * 1}*, dan durability Sword kalian masing masing berkurang *-${sword * 1}* karena kalian telah membunuh *${pickRandom(['Ender Dragon', 'Baby Dragon', 'Titan', 'Cacing dan Semut', 'PP Mikey', 'Orang', 'Kecoa', 'Semut', 'Siput', '....', 'Wither', 'Sekeleton', 'Ayam Emas', 'Temenmu', 'Sapi', 'Tidak Ada', 'Creeper', 'Zombie', 'Hewan Pelihraanmu','Diri Sendiri'])}* dan mendapatkan total +*Exp:* ${exp * orang} +*Uang:* ${money * orang} +*Sampah:* ${sampah * orang}${potion == 0 ? '' : '\n*Potion:* ' + potion * orang}${makananPet == 0 ? '' : '\n*Makanan Pet* ' + makananPet * orang}${kayu == 0 ? '' : '\n*Kayu:* ' + kayu * orang}${batu == 0 ? '' : '\n*Batu:* ' + batu * orang}${string == 0 ? '' : '\n*String:* ' + string * orang}${iron == 0 ? '' : '\n*Iron:* ' + iron * orang}${diamond == 0 ? '' : '\n*Diamond:* ' + diamond * orang}${common == 0 ? '' : '\n*Common Crate:* ' + common * orang}${uncommon == 0 ? '' : '\n*Uncommon Crate:* ' + uncommon * orang} +`.trim() + await m.reply(str2, c1, { + contextInfo: { + mentionedJid: this.parseMention(str2) + } + }) + if (c2 && ![c1, c3, c4].includes(c2)) m.reply(str2, c2, { + contextInfo: { + mentionedJid: this.parseMention(str2) + } + }) + if (c3 && ![c1, c2, c4].includes(c3)) m.reply(str2, c3, { + contextInfo: { + mentionedJid: this.parseMention(str2) + } + }) + if (c4 && ![c1, c2, c3].includes(c4)) m.reply(str2, c4, { + contextInfo: { + mentionedJid: this.parseMention(str2) + } + }) + }, pickRandom([1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000])) + for (let i = 0; i < PLAYER.length; i++) { + let p = PLAYER[i] + setTimeout(() => { + users[p].healt -= healt * 1 + users[p].sworddurability -= sword * 1 + users[p].money += money * 1 + users[p].exp += exp * 1 + users[p].sampah += sampah * 1 + users[p].potion += potion * 1 + users[p].diamond += diamond * 1 + users[p].iron += iron * 1 + users[p].kayu += kayu * 1 + users[p].batu += batu * 1 + users[p].string += string * 1 + users[p].common += common * 1 + users[p].uncommon += uncommon * 1 + users[p].mythic += mythic * 1 + users[p].legendary += legendary * 1 + users[p].pet += pet * 1 + users[p].makananpet += makananPet * 1 + users[p].lastdungeon = new Date * 1 + + if ((users[p].healt * 1) < 1) users[p].healt = 0 + if ((users[p].sworddurability * 1) < 1) { + users[p].sword -= 1 + users[p].sworddurability = (users[p].sword * 1) * 50 + } + }, i * 1500) + } + + // Nak entok item Rare + if (mythic > 0) { + let str3 = 'Selamat ' + P + ' kalian mendapatkan item Rare Total *' + mythic * orang + '* Mythic Crate' + m.reply(str3, c1, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + if (c2 && ![c1, c3, c4].includes(c2)) m.reply(str3, c2, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + if (c3 && ![c1, c2, c4].includes(c3)) m.reply(str3, c3, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + if (c4 && ![c1, c2, c3].includes(c4)) m.reply(str3, c4, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + } + + // Nak entok item Epic + if (legendary > 0 || pet > 0) { + let str3 = (mythic > 0 ? 'Dan juga' : 'Selamat ' + P + ' kalian') + ' mendapatkan item Epic Total ' + (pet > 0 && legendary > 0 ? `*${legendary * orang}* ๐ŸŽLegendary Crate dan *${pet * orang}* ๐Ÿ“ฆPet Crate` : pet > 0 && legendary < 1 ? `*${pet * orang}* ๐Ÿ“ฆPet Crate` : legendary > 0 && pet < 1 ? `*${legendary * orang}* ๐ŸŽLegendary Crate` : '') + m.reply(str3, c1, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + if (c2 && ![c1, c3, c4].includes(c2)) m.reply(str3, c2, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + if (c3 && ![c1, c2, c4].includes(c3)) m.reply(str3, c3, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + if (c4 && ![c1, c2, c3].includes(c4)) m.reply(str3, c4, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + } + + // Biar lebih simple + let _1 = users && p1 && users[p1] ? users[p1] : {} + let _2 = users && p2 && users[p2] ? users[p2] : {} + let _3 = users && p3 && users[p3] ? users[p3] : {} + let _4 = users && p4 && users[p4] ? users[p4] : {} + let _H1 = _1 && _1.healt ? (_1.healt * 1) : 100 + let _H2 = _2 && _2.healt ? (_2.healt * 1) : 100 + let _H3 = _3 && _3.healt ? (_3.healt * 1) : 100 + let _H4 = _4 && _4.healt ? (_4.healt * 1) : 100 + + // sd = SwordDurability :v + let _sd1 = _1 && _1.sworddurability ? (_1.sworddurability * 1) : 100 + let _sd2 = _2 && _2.sworddurability ? (_2.sworddurability * 1) : 100 + let _sd3 = _3 && _3.sworddurability ? (_3.sworddurability * 1) : 100 + let _sd4 = _4 && _4.sworddurability ? (_4.sworddurability * 1) : 100 + + //Peringatan kalau health nya 0 ataupun sword durabilitynya 0 + if ((_H1 || _H2 || _H3 || _H4 || _sd1 || _sd2 || _sd3 || _sd4) < 1) { + + //Sama kek atas biar simple aja :v + let s1 = _sd1 ? (_sd1 * 1) < 1 : false + let s2 = _sd2 ? (_sd2 * 1) < 1 : false + let s3 = _sd3 ? (_sd3 * 1) < 1 : false + let s4 = _sd4 ? (_sd4 * 1) < 1 : false + + //Buat nyimpen data sementara :v + let HEALT = [], SDH = [], SDM1L = [] + for (let siapa in PLAYER) { + if ((users[siapa].healt * 1) < 1) HEALT.push(siapa) + if ((users[siapa].sworddurability * 1) < 1 && (users[siapa].sword * 1) == 1) SDH.push(siapa) + if ((users[siapa].sworddurability * 1) < 1 && (users[siapa].sword * 1) !== 1) SDM1L.push(siapa) + } + + // Convert Array to String + let sI = data(SDH) + let sH = data(SDM1L) + let H = data(HEALT) + + let str3 = `${((SDH || SDH.length > 0) || (SDM1L || SDM1L.length > 0)) ? `โš”๏ธSword ${((SDH || SDH.length > 0 ? sI + ' Hancur, silahkan crafting โš”๏ธSword kembali dengan mengetik *' + usedPrefix + 'craft sword*' : '') + (SDM1L || SDM1L.length > 0 ? (SDH || SDH.length > 0 ? ', Sedangkan โš”๏ธSword ' : '') + sH + ' Hancur, dan Menurun *1* Level' : ''))}` : ''}${HEALT || HEALT.length > 0 ? `โค๏ธNyawa ${H} habis, silahkan isi โค๏ธNyawa dengan mengetik ${usedPrefix}heal` : ''}` + m.reply(str3, c1, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + if (c2 && ![c1, c3, c4].includes(c2)) m.reply(str3, c2, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + if (c3 && ![c1, c2, c4].includes(c3)) m.reply(str3, c3, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + if (c4 && ![c1, c2, c3].includes(c4)) m.reply(str3, c4, { + contextInfo: { + mentionedJid: this.parseMention(str3) + } + }) + } + delete global.dungeon[room.id] + } + if (global.dungeon && room.state == 'PLAYING') delete global.dungeon[room.id] // Hapuss nek iseh ono neng dungeon +} + +return +} + +handler.help = ['dungeon'].map(v => v + ' *[nama room]*') +handler.tags = ['rpg'] +handler.command = /^(dungeon)$/i + +handler.mods = false + +module.exports = handler + +/** +* pickRandom from array +* @param {Array} list +* @returns * +*/ +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} + +/** +* Message if the conditions are not met +* @param {Number} sword +* @param {Number} armor +* @param {Number} healt +* @param {String} usedPrefix +* @returns String +*/ +function item(sword, armor, healt, usedPrefix) { +let sw = (sword * 1) < 1 +let a = (armor * 1) < 1 +let h = (healt * 1) < 90 +let str = ` +${sw ? 'Kamu belum memiliki โš”๏ธSword' : ''}${sw && a && h ? ',' : sw && a ? ' dan ' : ''} ${a ? '๐ŸฅผArmor' : ''}${sw && a && h ? ' dan Minimal 90 โคHealt' : h ? 'Minimal 90 โคHealt' : ''}${sw ? `\nuntuk mendapatkan โš”Sword ketik *${usedPrefix}craft sword*` : ''}${a ? `\nuntuk mendapatkan ๐ŸฅผArmor ketik *${usedPrefix}buy armor*` : ''}${h ? `\nuntuk menambah โคHealt ketik *${usedPrefix}heal*` : ''} +`.trim() +return str +} + +/** +* To split jid +* @param {String} jid +* @returns String +*/ +function M(jid) { +return '@' + jid.split('@')[0] +} + +/** +* To clock +* @param {Number} ms +* @returns String +*/ +function clockString(ms) { +let h = Math.floor(ms / 3600000) +let m = Math.floor(ms / 60000) % 60 +let s = Math.floor(ms / 1000) % 60 +console.log({ms,h,m,s}) +return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} + +/** +* Get data in Array +* @param {Array} DATA ( avaible array length is 4) +* @returns String +*/ +function data(DATA) { +let panjang = DATA.length * 1 +let msg = '' +DATA.forEach(player => { + if (panjang == 1) msg += `*${M(player)}*` + else { + if (DATA.indexOf(player) !== (panjang - 1)) msg += `*${M(player)}*, ` + else msg += `dan *${M(player)}*` + } +}) +return msg +} \ No newline at end of file diff --git a/plugins/rpg-feed.js b/plugins/rpg-feed.js new file mode 100644 index 0000000000000000000000000000000000000000..5e1a3c1b1494672520670f53c3566896e0c25c82 --- /dev/null +++ b/plugins/rpg-feed.js @@ -0,0 +1,182 @@ +let handler = async (m, { conn, args, usedPrefix }) => { + let info = ` +ไน‚ List Pet: +๐Ÿˆ โ€ข kucing +๐Ÿ• โ€ข anjing +๐ŸฆŠ โ€ข rubah +๐Ÿบ โ€ข serigala +๐Ÿฆโ€๐Ÿ”ฅ โ€ข phonix + +*โž  Example:* ${usedPrefix}feed kucing +`.trim() +let pesan = pickRandom(['ษดสแดœแดแดแด~', 'แด›สœแด€ษดแด‹s', 'แด›สœแด€ษดแด‹สแดแดœ ^-^', 'แด›สœแด€ษดแด‹ สแดแดœ~', 'แด€ส€ษชษขแด€แด›แดแดœ ^-^']) + let type = (args[0] || '').toLowerCase() + let emo = (type == 'rubah' ? '๐ŸฆŠ':'' || type == 'kucing' ? '๐Ÿˆ':'' || type == 'anjing' ? '๐Ÿ•':'' || type == 'serigala' ? '๐Ÿบ':'' || type == 'phonix'? '๐Ÿฆโ€๐Ÿ”ฅ':'' ) + let user = global.db.data.users[m.sender] + let rubah = global.db.data.users[m.sender].rubah + let kucing = global.db.data.users[m.sender].kucing + let anjing = global.db.data.users[m.sender].anjing + let serigala = global.db.data.users[m.sender].serigala + let phonix = global.db.data.users[m.sender].phonix + switch (type) { + case 'rubah': + if (rubah == 0) return m.reply('*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet') + if (rubah == 10) return m.reply('สแดแดœส€ แด˜แด‡แด› ษชs แดแด€x สŸแด‡แด แด‡สŸ !') + let __waktur = (new Date - user.rubahlastclaim) + let _waktur = (600000 - __waktur) + let waktur = clockString(_waktur) + if (new Date - user.rubahlastclaim > 600000) { + if (user.makananpet > 0) { + user.makananpet -= 1 + user.rubahexp += 20 + user.rubahlastclaim = new Date * 1 + m.reply(`า“แด‡แด‡แด…ษชษดษข *${type}*...\n*${emo} :* ${pesan}`) + if (rubah > 0) { + let naiklvl = ((rubah * 100) - 1) + if (user.rubahexp > naiklvl) { + user.rubah += 1 + user.rubahexp -= (rubah * 100) + m.reply(`*แด„แดษดษขส€แด€แด›s!* , สแดแดœส€ แด˜แด‡แด› สŸแด‡แด แด‡สŸแดœแด˜`) + } + } + } else m.reply(`*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet`) + } else m.reply(`สแดแดœส€ แด˜แด‡แด› ษชs า“แดœสŸสŸ, แด›ส€ส า“แด‡แด‡แด…ษชษดษข ษชแด› แด€ษขแด€ษชษด ษชษด\nโžž *${waktur}*`) + break + case 'kucing': + if (kucing == 0) return m.reply('*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet') + if (kucing == 10) return m.reply('สแดแดœส€ แด˜แด‡แด› ษชs แดแด€x สŸแด‡แด แด‡สŸ !') + let __waktuc = (new Date - user.kucinglastclaim) + let _waktuc = (600000 - __waktuc) + let waktuc = clockString(_waktuc) + if (new Date - user.kucinglastclaim > 600000) { + if (user.makananpet > 0) { + user.makananpet -= 1 + user.kucingexp += 20 + user.kucinglastclaim = new Date * 1 + m.reply(`า“แด‡แด‡แด…ษชษดษข *${type}*...\n*${emo} :* ${pesan}`) + + if (kucing > 0) { + let naiklvl = ((kucing * 100) - 1) + if (user.kucingexp > naiklvl) { + user.kucing += 1 + user.kucingexp -= (kucing * 100) + m.reply(`*แด„แดษดษขส€แด€แด›s!* , สแดแดœส€ แด˜แด‡แด› สŸแด‡แด แด‡สŸแดœแด˜`) + } + } + } else m.reply(`*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet`) + } else m.reply(`สแดแดœส€ แด˜แด‡แด› ษชs า“แดœสŸสŸ, แด›ส€ส า“แด‡แด‡แด…ษชษดษข ษชแด› แด€ษขแด€ษชษด ษชษด\nโžž *${waktuc}*`) + break + case 'serigala': + if (serigala == 0) return m.reply('*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet') + if (serigala == 10) return m.reply('สแดแดœส€ แด˜แด‡แด› ษชs แดแด€x สŸแด‡แด แด‡สŸ !') + let __waktub = (new Date - user.serigalalastclaim) + let _waktub = (600000 - __waktub) + let waktub = clockString(_waktub) + if (new Date - user.serigalalastclaim > 600000) { + if (user.makananpet > 0) { + user.makananpet -= 1 + user.serigalaexp += 20 + user.serigalalastclaim = new Date * 1 + m.reply(`า“แด‡แด‡แด…ษชษดษข *${type}*...\n*${emo} :* ${pesan}`) + + if (serigala > 0) { + let naiklvl = ((serigala * 100) - 1) + if (user.serigalaexp > naiklvl) { + user.serigala += 1 + user.serigalaexp -= (serigala * 100) + m.reply(`*แด„แดษดษขส€แด€แด›s!* , สแดแดœส€ แด˜แด‡แด› สŸแด‡แด แด‡สŸแดœแด˜`) + } + } + } else m.reply(`*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet`) + } else m.reply(`สแดแดœส€ แด˜แด‡แด› ษชs า“แดœสŸสŸ, แด›ส€ส า“แด‡แด‡แด…ษชษดษข ษชแด› แด€ษขแด€ษชษด ษชษด\nโžž *${waktub}*`) + break + case 'anjing': + if (anjing == 0) return m.reply('*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet') + if (anjing == 10) return m.reply('สแดแดœส€ แด˜แด‡แด› ษชs แดแด€x สŸแด‡แด แด‡สŸ !') + let __waktua = (new Date - user.anjinglastclaim) + let _waktua = (600000 - __waktua) + let waktua = clockString(_waktua) + if (new Date - user.anjinglastclaim > 600000) { + if (user.makananpet > 0) { + user.makananpet -= 1 + user.anjingexp += 20 + user.anjinglastclaim = new Date * 1 + m.reply(`า“แด‡แด‡แด…ษชษดษข *${type}*...\n*${emo} :* ${pesan}`) + if (anjing > 0) { + let naiklvl = ((anjing * 100) - 1) + if (user.anjingexp > naiklvl) { + user.anjing += 1 + user.anjingexp -= (anjing * 100) + m.reply(`*แด„แดษดษขส€แด€แด›s!* , สแดแดœส€ แด˜แด‡แด› สŸแด‡แด แด‡สŸแดœแด˜`) + } + } + } else m.reply(`*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet`) + } else m.reply(`สแดแดœส€ แด˜แด‡แด› ษชs า“แดœสŸสŸ, แด›ส€ส า“แด‡แด‡แด…ษชษดษข ษชแด› แด€ษขแด€ษชษด ษชษด\nโžž *${waktua}*`) + break + case 'phonix': + if (phonix == 0) return m.reply('*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet') + if (phonix == 10) return m.reply('สแดแดœส€ แด˜แด‡แด› ษชs แดแด€x สŸแด‡แด แด‡สŸ !') + let __waktuk = (new Date - user.phonixlastclaim) + let _waktuk = (600000 - __waktuk) + let waktuk = clockString(_waktuk) + if (new Date - user.phonixlastclaim > 600000) { + if (user.makananpet > 0) { + user.makananpet -= 1 + user.phonixexp += 20 + user.phonixlastclaim = new Date * 1 + m.reply(`า“แด‡แด‡แด…ษชษดษข *${type}*...\n*${emo} :* ${pesan}`) + if (phonix > 0) { + let naiklvl = ((phonix * 100) - 1) + if (user.phonixexp > naiklvl) { + user.phonix += 1 + user.phonixexp -= (phonix * 100) + m.reply(`*แด„แดษดษขส€แด€แด›s!* , สแดแดœส€ แด˜แด‡แด› สŸแด‡แด แด‡สŸแดœแด˜`) + } + } + } else m.reply(`*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet`) + } else m.reply(`สแดแดœส€ แด˜แด‡แด› ษชs า“แดœสŸสŸ, แด›ส€ส า“แด‡แด‡แด…ษชษดษข ษชแด› แด€ษขแด€ษชษด ษชษด\nโžž *${waktuk}*`) + break + case 'robo': + if (robot == 0) return m.reply('*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet') + if (robot == 10) return m.reply('สแดแดœส€ แด˜แด‡แด› ษชs แดแด€x สŸแด‡แด แด‡สŸ !') + let __wakturb = (new Date - user.robolastfeed) + let _wakturb = (600000 - __wakturb) + let wakturb = clockString(_wakturb) + if (new Date - user.robolastfeed > 600000) { + if (user.makananpet > 0) { + user.makananpet -= 1 + user.roboexp += 20 + user.robolastfeed = new Date * 1 + m.reply(`า“แด‡แด‡แด…ษชษดษข *${type}*...\n*${emo} :* ${pesan}`) + if (robot > 0) { + let naiklvl = ((robot * 100) - 1) + if (user.roboexp > naiklvl) { + user.robo += 1 + user.roboexp -= (robot * 100) + m.reply(`*แด„แดษดษขส€แด€แด›s!* , สแดแดœส€ แด˜แด‡แด› สŸแด‡แด แด‡สŸแดœแด˜`) + } + } + } else m.reply(`*kamu tidak memiliki makanan pet*\n\n> ketik .shop buy makananpet\nuntuk memberi makan pet`) + } else m.reply(`สแดแดœส€ แด˜แด‡แด› ษชs า“แดœสŸสŸ, แด›ส€ส า“แด‡แด‡แด…ษชษดษข ษชแด› แด€ษขแด€ษชษด ษชษด\nโžž *${wakturb}*`) + break + default: + return m.reply(info) + } +} +handler.help = ['feed'] +handler.tags = ['rpg'] +handler.command = /^(feed(ing)?)$/i + +handler.register = true +handler.rpg = true +module.exports = handler + +function clockString(ms) { + let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) + let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 + let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 + return [h, ' H ', m, ' M ', s, ' S'].map(v => v.toString().padStart(2, 0)).join('') +} +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} \ No newline at end of file diff --git a/plugins/rpg-gajian.js b/plugins/rpg-gajian.js new file mode 100644 index 0000000000000000000000000000000000000000..fa392a6dac4ba4f88d68c7023592910fdfd817be --- /dev/null +++ b/plugins/rpg-gajian.js @@ -0,0 +1,29 @@ +let handler = async (m, { conn, usedPrefix, text }) => { + let user = global.db.data.users[m.sender] + let time = user.lastclaimb2 + 86400000 + if (new Date - user.lastclaimb2 < 86400000) throw `Kamu Sudah Ambil Gaji Hari Ini\nTunggu selama ${msToTime(time - new Date())} lagi` + let money = `${Math.floor(Math.random() * 5000000)}`.trim() + user.money += 50000 + user.lastclaimb2 = new Date * 1 + m.reply(`Kamu Mendapatkan 50.000 Money`) +} +handler.help = ['gajian'] +handler.tags = ['rpg'] +handler.command = /^(gaji|gajian)/i +handler.register = true +handler.rpg = true +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return hours + " jam " + minutes + " menit " + seconds + " detik" +} \ No newline at end of file diff --git a/plugins/rpg-game-slot.js b/plugins/rpg-game-slot.js new file mode 100644 index 0000000000000000000000000000000000000000..26a5f4d882718efa4c36c4b2edef12d9021fef27 --- /dev/null +++ b/plugins/rpg-game-slot.js @@ -0,0 +1,84 @@ +//import db from '../lib/database.js' +let reg = 1000 +let handler = async (m, { conn, args, usedPrefix, command }) => { + let fa = ` +Berapa banyak yang ingin Anda pertaruhkan? + +๐Ÿ“Œ Contoh : +*${usedPrefix + command}* 100`.trim() + if (!args[0]) throw fa + if (isNaN(args[0])) throw fa + let apuesta = parseInt(args[0]) + let users = global.db.data.users[m.sender] + let time = users.lastslot + 5000 + if (new Date - users.lastslot < 5000) throw `โณ Tunggu *${msToTime(time - new Date())}* Untuk menggunakan lagi` + if (apuesta < 100) throw 'โœณ๏ธ tambahkan *MONEY* Untuk menggunakan lagi' + if (users.money < apuesta) { + throw `โœณ๏ธ Anda tidak memiliki cukup *MONEY*\nCek MONEY mu di *.balance*` + } + + let emojis = ["๐Ÿ•Š๏ธ", "๐Ÿฆ€", "๐ŸฆŽ"]; + let a = Math.floor(Math.random() * emojis.length); + let b = Math.floor(Math.random() * emojis.length); + let c = Math.floor(Math.random() * emojis.length); + let x = [], + y = [], + z = []; + for (let i = 0; i < 3; i++) { + x[i] = emojis[a]; + a++; + if (a == emojis.length) a = 0; + } + for (let i = 0; i < 3; i++) { + y[i] = emojis[b]; + b++; + if (b == emojis.length) b = 0; + } + for (let i = 0; i < 3; i++) { + z[i] = emojis[c]; + c++; + if (c == emojis.length) c = 0; + } + let end; + if (a == b && b == c) { + end = `๐ŸŽ *GACOR KANG!!!* WON\n *+${apuesta + apuesta} MONEY*` + users.money += apuesta + apuesta + } else if (a == b || a == c || b == c) { + end = `๐Ÿ”ฎ Lanjut lagi bang, belum stop kalau belum gacor ๐Ÿ’ฒ๐Ÿ’ฒ \nTambahan *+${reg} money*` + users.money += reg + } else { + end = `๐Ÿ˜” Rungkad *-${apuesta} money*` + users.money -= apuesta + } + users.lastslot = new Date * 1 + return await m.reply( + ` + ๐ŸŽฐ โ”ƒ *gacha money* + โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + ${x[0]} : ${y[0]} : ${z[0]} + ${x[1]} : ${y[1]} : ${z[1]} + ${x[2]} : ${y[2]} : ${z[2]} + โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + ๐ŸŽฐโ”ƒ๐ŸŽฐโ”ƒ ๐ŸŽฐ + +${end}`) +} +handler.help = ['slot <money>'] +handler.tags = ['game'] +handler.command = ['slot'] +handler.group = true + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return seconds + " detik" +} \ No newline at end of file diff --git a/plugins/rpg-gunshop.js b/plugins/rpg-gunshop.js new file mode 100644 index 0000000000000000000000000000000000000000..b714c4daec16ea10c95691e7c852f5758dd96456 --- /dev/null +++ b/plugins/rpg-gunshop.js @@ -0,0 +1,211 @@ +const cooldown = 30000; + + +const items = { + buygun: { + tombak: { money: 50000000 }, + busur: { money: 10000000 }, + anakpanah: { money: 8000000 }, + glock: { dana: 3000000 }, + ammo: { gopay: 3500000 }, + ak47: { dana: 6400000 }, + m4: { dana: 3400000 }, + m16: { dana: 8400000 }, + ar15: { ovo: 7700000 }, + scar: { gopay: 9000000 }, + famas: { ovo: 9000000 }, + aug: { dana: 9400000 }, + uzi: { dana: 5500000 }, + mp5: { ovo: 5000000 }, + p90: { money: 6400000 }, + mac10: { money: 4000000 }, + vector: { gopay: 4200000 }, + barrettm82: { money: 19900000 }, + remington700: { ovo: 2000000 }, + dragunovsvd: { dana: 88000000 }, + m40: { ovo: 40000000 }, + m24: { ovo: 40000000 } + }, + sellgun: { + tombak: { money: 2500000 }, + busur: { money: 500000 }, + anakpanah: { money: 400000 }, + glock: { money: 1500000 }, + ammo: { money: 1750000 }, + ak47: { money: 3200000 }, + m4: { money: 170000 }, + m16: { money: 420000 }, + ar15: { money: 385000 }, + scar: { money: 450000 }, + famas: { money: 450000 }, + aug: { money: 470000 }, + uzi: { money: 275000 }, + mp5: { money: 250000 }, + p90: { money: 320000 }, + mac10: { money: 200000 }, + vector: { money: 210000 }, + barrettm82: { money: 9950000 }, + remington700: { money: 100000 }, + dragunovsvd: { money: 4400000 }, + m40: { money: 200000 }, + m24: { money: 200000 } + } +}; + +const handler = async (m, { conn, command, usedPrefix, args, text, isPrems }) => { + global.db.users = global.db.users || {}; // Ensure the users object is initialized + let user = global.db.users[m.sender] = global.db.users[m.sender] || {}; + + if (user.jail === true) { + throw '*Kamu tidak bisa melakukan aktivitas karena masih dalam penjara!*'; + } + + if (new Date() - user.pekerjaantiga < cooldown) { + const remainingTime = new Date(user.pekerjaantiga + cooldown) - new Date(); + const formattedTime = new Date(remainingTime).toISOString().substr(11, 8); + throw `Kamu baru saja pergi ke toko! Tunggu selama *${formattedTime}*`; + } + + if (command.toLowerCase() == 'gunshop') { + let text = ` +*๐Ÿช Gun Shop* + +Ingin menggunakan *Toko Senjata*? +Ketik _.buygun_ bila ingin membeli senjata! +Ketik _.sellgun_ bila ingin menjual senjata! + `.trim(); + conn.reply(m.chat, text, m); + return; +} + +const listItems = Object.fromEntries(Object.entries(items[command.toLowerCase()]) + .filter(([v, { money, dana, gopay, ovo }]) => { + if (money && user.money < money) return false; + if (dana && user.dana < dana) return false; + if (gopay && user.gopay < gopay) return false; + if (ovo && user.ovo < ovo) return false; + return v && v in user; + })); + +const info = ` +*Contoh penggunaan:* ${usedPrefix}${command} ak47 1 + +*Daftar Senjata:* +${Object.keys(items[command.toLowerCase()]).map((v) => { + let paymentMethod = Object.keys(items[command.toLowerCase()][v])[0]; + return `${emojis(v)}${capitalizeFirstLetter(v)} | ${toSimple(items[command.toLowerCase()][v][paymentMethod])} ${emojis(paymentMethod)}${capitalizeFirstLetter(paymentMethod)}`.trim(); + }).join('\n')} +`.trim(); + +const item = (args[0] || '').toLowerCase(); + +if (!items[command.toLowerCase()][item]) { + return m.reply(info); +} + +if (!args[1]) { + m.reply(info); + return; +} + +let total = Math.floor(isNumber(args[1]) ? Math.min(Math.max(parseInt(args[1]), 1)) : 1) * ({"K": 1e3, "M": 1e6, "B": 1e9, "T": 1e12, "QA": 1e15, "QI": 1e18, "SX": 1e21, "SP": 1e24, "OC": 1e27, "N": 1e30, "DC": 1e33, "UD": 1e36, "DD": 1e39, "TD": 1e42, "QUA": 1e45, "QUI": 1e48, "SXD": 1e51, "SPD": 1e54, "OCD": 1e57, "NOD": 1e60, "VG": 1e63}[args[1].toUpperCase().replace(/[^KMBTQAISXONDCUP]/g, '')] || 1); + +if (command.toLowerCase() == 'buygun') { + const paymentMethods = ['money', 'dana', 'gopay', 'ovo']; + const paymentMethod = paymentMethods[Math.floor(Math.random() * paymentMethods.length)]; + if (user[paymentMethod] < items[command.toLowerCase()][item][paymentMethod] * total) { + return m.reply(`Kamu tidak memiliki cukup ${emojis(paymentMethod)}${paymentMethod} untuk membeli *${toSimple(total)}* ${emojis(item)}${capitalizeFirstLetter(item)}. Kamu memerlukan *${toSimple((items[command.toLowerCase()][item][paymentMethod] * total) - user[paymentMethod])}* ${paymentMethod} lagi untuk dapat membeli`); + } + + user[paymentMethod] -= items[command.toLowerCase()][item][paymentMethod] * total; + user[item] = (user[item] || 0) + total; + user.pekerjaantiga = new Date() * 1; + + return m.reply(`Kamu telah membeli *${toSimple(total)}* ${emojis(item)}${capitalizeFirstLetter(item)} menggunakan ${emojis(paymentMethod)}${paymentMethod}`); +} else if (command.toLowerCase() == 'sellgun') { + if (isPrems && /all/i.test(args[1])) { + total = user[item]; + } + if (user[item] < total) { + return m.reply(`Kamu tidak memiliki cukup *${emojis(item)}${capitalizeFirstLetter(item)}* untuk dijual. Anda hanya memiliki ${toSimple(user[item])} item`); + } + const reward = items[command.toLowerCase()][item]; + const rewardKey = Object.keys(reward)[0]; + if (!(rewardKey in user)) { + throw new Error(`Pengguna tidak memiliki ${rewardKey} dalam database mereka, tetapi hadiah memberikannya!`); + } + + user[item] -= total; + user[rewardKey] += items[command.toLowerCase()][item][rewardKey] * total; + user.pekerjaantiga = new Date() * 1; + + return m.reply(`Kamu telah menjual *${toSimple(total)}* ${emojis(item)}${capitalizeFirstLetter(item)} dan mendapatkan *${toSimple(items[command.toLowerCase()][item][rewardKey] * total)}* ${emojis(rewardKey)}`); +} +return; +}; + +handler.help = ['gunshop'].map(v => v + ''); +handler.tags = ['rpg']; +handler.command = /^(gunshop|buygun|sellgun)$/i; +handler.cooldown = cooldown; + +module.exports = handler; + +function isNumber(number) { + if (!number) return number; + number = parseInt(number); + return typeof number == 'number' && !isNaN(number); +} + +function toSimple(number) { + if (isNaN(parseFloat(number))) return number; + if (parseFloat(number) === 0) return '0'; + number = parseFloat(number).toFixed(0); + const suffixes = ['', 'K', 'JT', 'M', 'T']; + const base = 1000; + const exponent = Math.floor(Math.log10(Math.abs(number)) / 3); + const suffix = suffixes[exponent] || ''; + const simplified = number / Math.pow(base, exponent); + const formatter = Intl.NumberFormat('en', { maximumFractionDigits: 1 }); + return formatter.format(simplified) + suffix; +} + +function emojis(item) { + switch (item.toLowerCase()) { + case 'tombak': return '๐Ÿช“'; + case 'busur': return '๐Ÿน'; + case 'anakpanah': return '๐Ÿน'; + case 'glock': return '๐Ÿ”ซ'; + case 'ammo': return '๐Ÿ”ซ'; + case 'ak47': return '๐Ÿ”ซ'; + case 'm4': return '๐Ÿ”ซ'; + case 'm16': return '๐Ÿ”ซ'; + case 'ar15': return '๐Ÿ”ซ'; + case 'scar': return '๐Ÿ”ซ'; + case 'famas': return '๐Ÿ”ซ'; + case 'aug': return '๐Ÿ”ซ'; + case 'uzi': return '๐Ÿ”ซ'; + case 'mp5': return '๐Ÿ”ซ'; + case 'p90': return '๐Ÿ”ซ'; + case 'mac10': return '๐Ÿ”ซ'; + case 'vector': return '๐Ÿ”ซ'; + case 'barrettm82': return '๐Ÿ”ซ'; + case 'remington700': return '๐Ÿ”ซ'; + case 'dragunovsvd': return '๐Ÿ”ซ'; + case 'm40': return '๐Ÿ”ซ'; + case 'm24': return '๐Ÿ”ซ'; + case 'money': return '๐Ÿ’ต'; + case 'dana': return '๐Ÿ’ฐ'; + case 'gopay': return '๐Ÿ’ณ'; + case 'ovo': return '๐Ÿ“ฑ'; + default: return ''; + } +} + +function capitalizeFirstLetter(str) { + let words = str.split(" "); + for (let i = 0; i < words.length; i++) { + words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1).toLowerCase(); + } + return words.join(" "); +} \ No newline at end of file diff --git a/plugins/rpg-health.js b/plugins/rpg-health.js new file mode 100644 index 0000000000000000000000000000000000000000..561741eeb31e4bf0584b295b43f6b0a7d244ef37 --- /dev/null +++ b/plugins/rpg-health.js @@ -0,0 +1,30 @@ +let handler = async (m, { args, usedPrefix }) => { + let user = global.db.data.users[m.sender] + if (user.healt >= 10000) return m.reply(` +Your โค๏ธhealt is full! +`.trim()) + const heal = 50 + let count = Math.max(1, Math.min(Number.MAX_SAFE_INTEGER, (isNumber(args[0]) && parseInt(args[0]) || Math.round((100 - user.health) / heal)))) * 1 + if (user.potion < count) return m.reply(` +Your ๐ŸงƒPotion is not enough, you only have *${user.potion}* ๐ŸงƒPotion +type *${usedPrefix}buy potion ${count - user.potion}* to buy ๐ŸงƒPotion +`.trim()) + user.potion -= count * 1 + user.healt += heal * count + m.reply(` +Successful use of *${count}* ๐ŸงƒPotion(s) +`.trim()) +} + +handler.help = ['heal *jumlah*'] +handler.tags = ['rpg'] +handler.command = /^(heal|use)$/i +handler.limit = true + +module.exports = handler + +function isNumber(number) { + if (!number) return number + number = parseInt(number) + return typeof number == 'number' && !isNaN(number) +} diff --git a/plugins/rpg-hitman.js b/plugins/rpg-hitman.js new file mode 100644 index 0000000000000000000000000000000000000000..3d9650814b15f2ffd218bfb10e581611ca34839f --- /dev/null +++ b/plugins/rpg-hitman.js @@ -0,0 +1,94 @@ +let handler = async (m, { conn }) => { + let __timers = (new Date - global.db.data.users[m.sender].kerjaempat) + let _timers = (3600000 - __timers) + let timers = clockString(_timers) + let name = conn.getName(m.sender) + let user = global.db.data.users[m.sender] + let id = m.sender + let kerja = 'Bunuh' + conn.misi = conn.misi ? conn.misi : {} + if (id in conn.misi) { + conn.reply(m.chat, `Selesaikan Misi ${conn.misi[id][0]} Terlebih Dahulu`, m) + throw false + } + if (new Date - global.db.data.users[m.sender].kerjaempat > 3600000) { + let randomaku4 = Math.floor(Math.random() * 10) + let randomaku5 = Math.floor(Math.random() * 10) + + let rbrb4 = (randomaku4 * 100000) + let rbrb5 = (randomaku5 * 1000) + + var dimas = ` +๐Ÿ•ต๏ธ Mendapatkan Target..... +`.trim() + + var dimas2 = ` +โš”๏ธ Menusuk Tubuhnya..... +`.trim() + + var dimas3 = ` +โ˜ ๏ธ Target meninggal\nDan kamu mengambil barangยฒ nya +`.trim() + + var dimas4 = ` +๐Ÿ’ผ Hasil dari membunuh.... +`.trim() + + var hsl = ` +*โ€”[ Hasil ${name} ]โ€”* +โž• ๐Ÿ’น Uang = [ ${rbrb4} ] +โž• โœจ Exp = [ ${rbrb5} ] +โž• ๐Ÿ‘ฎ Pelanggaran +1 +โž• โ˜‘๏ธ Misi Berhasil = +1 +`.trim() + + user.money += rbrb4 + user.exp += rbrb5 + user.warn += 1 + + conn.misi[id] = [ + kerja, + setTimeout(() => { + delete conn.misi[id] + }, 27000) + ] + setTimeout(() => { + m.reply(hsl) + }, 27000) + + setTimeout(() => { + m.reply(dimas4) + }, 25000) + + setTimeout(() => { + m.reply(dimas3) + }, 20000) + + setTimeout(() => { + m.reply(dimas2) + }, 15000) + + setTimeout(() => { + m.reply(dimas) + }, 10000) + + setTimeout(() => { + m.reply('๐Ÿ”Mencari Target pembunuhan.....') + }, 0) + user.kerjaempat = new Date * 1 + } else m.reply(`Silahkan Menunggu Selama ${timers}, Untuk Menyelesaikan Misi Kembali`) +} +handler.help = ['hitman'] +handler.tags = ['rpg'] +handler.command = /^(bunuh|hitman)$/i +handler.register = true +handler.group = true +handler.level = 10 +module.exports = handler + + function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-hunter.js b/plugins/rpg-hunter.js new file mode 100644 index 0000000000000000000000000000000000000000..ae964ff95fdd589ebaf617a4f1844842035abf7a --- /dev/null +++ b/plugins/rpg-hunter.js @@ -0,0 +1,132 @@ +let handler = async (m, { conn, text }) => { + let monsters = [ + { area: 1, name: "Goblin" }, + { area: 1, name: "Slime" }, + { area: 1, name: "Wolf" }, + { area: 2, name: "Nymph" }, + { area: 2, name: "Skeleton" }, + { area: 2, name: "Wolf" }, + { area: 3, name: "Baby Demon" }, + { area: 3, name: "Ghost" }, + { area: 3, name: "Zombie" }, + { area: 4, name: "Imp" }, + { area: 4, name: "Witch" }, + { area: 4, name: "Zombie" }, + { area: 5, name: "Ghoul" }, + { area: 5, name: "Giant Scorpion" }, + { area: 5, name: "Unicorn" }, + { area: 6, name: "Baby Robot" }, + { area: 6, name: "Sorcerer" }, + { area: 6, name: "Unicorn" }, + { area: 7, name: "Cecaelia" }, + { area: 7, name: "Giant Piranha" }, + { area: 7, name: "Mermaid" }, + { area: 8, name: "Giant Crocodile" }, + { area: 8, name: "Nereid" }, + { area: 8, name: "Mermaid" }, + { area: 9, name: "Demon" }, + { area: 9, name: "Harpy" }, + { area: 9, name: "Killer Robot" }, + { area: 10, name: "Dullahan" }, + { area: 10, name: "Manticore" }, + { area: 10, name: "Killer Robot" }, + { area: 11, name: "Baby Dragon" }, + { area: 11, name: "Young Dragon" }, + { area: 11, name: "Scaled Baby Dragon" }, + { area: 12, name: "Kid Dragon" }, + { area: 12, name: "Not so young Dragon" }, + { area: 12, name: "Scaled Kid Dragon" }, + { area: 13, name: "Definitely not so young Dragon" }, + { area: 13, name: "Teen Dragon" }, + { area: 13, name: "Scaled Teen Dragon" }, + ] + let player = global.db.data.users[m.sender] + let pengirim = m.sender.split("@")[0] + +// let cdm = `${MeNit(new Date - player.lasthunt)}` +// let cds = `${DeTik(new Date - player.lasthunt)}` + // let cd1 = Math.ceil(01 - cdm) + // let cd2 = Math.ceil(60 - cds) + let __timers = (new Date - global.db.data.users[m.sender].lasthunt) + let _timers = (1200000 - __timers) + let timers = clockString(_timers) + + let area_monsters = monsters[Math.floor(Math.random() * monsters.length)] + let monster = area_monsters.name + area_monsters = area_monsters.area + let monsterName = monster.toUpperCase() + + if (new Date - global.db.data.users[m.sender].lasthunt > 1200000) { + // if (global.db.data.users[m.sender].health > 99) { +// if (global.db.data.users[m.sender].sword > 9) { + let coins = parseInt(Math.floor(Math.random() * 100000)) + let exp = parseInt(Math.floor(Math.random() * 10000)) + let _healing = `${Math.floor(Math.random() * 100)}`.trim() + let healing = (_healing * 1) + + /*let sum = 82 * player.area - 59 + let dmg = (player.sword * 5 + player.armor * 5 - sum) + dmg = dmg < 0 ? Math.abs(dmg) : 0*/ + + player.health -= healing + player.lasthunt = new Date * 1 // waktu hunt 2menit + + if (player.health < 0) { + let msg = `*@${pengirim}* Anda Mati Di Bunuh Oleh ${monsterName}` + if (player.level > 0) { + if (player.sword > 0) { + player.level -= 1 + player.sword -= 5 + player.exp -= exp * 1 + msg += `\nLevel Anda Turun 1 Karena Mati Saat Berburu!\nSword Anda Berkurang 5 Karena Mati Saat Berburu!` + } + } + player.health = 100 + conn.reply(m.chat, msg, m) + return + } + + player.money += coins * 1 + player.exp += exp * 1 + global.db.data.users[m.sender].tiketcoin += 1 + + let pesan = `Berhasil menemukan *${monsterName}* +*@${pengirim}* Kamu sudah membunuhnya +Mendapatkan: +${new Intl.NumberFormat('en-US').format(coins)} Money +${new Intl.NumberFormat('en-US').format(exp)} XP +Berkurang -${healing} Health, Tersisa ${player.health} Health + ++1 Tiketcoin` + conn.reply(m.chat, pesan, m) +// } else m.reply(`Minimal sword mu 10 untuk bisa berburu monster`) +// } else m.reply(`Minimal health mu 100 untuk bisa berburu monster`) + } else return conn.reply(m.chat, `Tunggu *${timers}* Untuk Berburu Lagi`, m) +} + +handler.help = ['hunter'] +handler.tags = ['rpg'] +handler.command = /^hunter/i +handler.limit = true +handler.group = true +handler.fail = null + +module.exports = handler + +/*function MeNit(ms) { + let m = isNaN(ms) ? '02' : Math.floor(ms / 1000) % 60 + return [m].map(v => v.toString().padStart(2, 0)).join(':') +} + +function MeNit(ms) { + let s = isNaN(ms) ? '01' : Math.floor(ms / 1000) % 60 + return [s].map(v => v.toString().padStart(2, 0)).join(':') +}*/ + +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ms,h,m,s}) + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-inv.js b/plugins/rpg-inv.js new file mode 100644 index 0000000000000000000000000000000000000000..5b89bc6dc7a168a8e2df12d03d21987da069d145 --- /dev/null +++ b/plugins/rpg-inv.js @@ -0,0 +1,102 @@ +let handler = async (m, { conn, args }) => { + let target = m.mentionedJid[0] || m.sender + let user = global.db.data.users[target] + + let armor = user.armor + let sword = user.sword + let fishingrod = user.fishingrod + let pickaxe = user.pickaxe + let katana = user.katana + let bow = user.bow + let axe = user.axe + + let capt = ` +*INVENTORY - USER* + +*Username* : ${user.name} +*Role* : ${user.role} +*Level* : ${user.level} +*Exp* : ${user.exp} +*Limit* : ${user.limit} +*Money* : ${user.money} +*Title* : ${user.titlein} +*Skill* : ${user.skill ? user.skill : 'Tidak Ada'} + +โ”โ”โ”โ•บโ•บใ€Œ *Status* ใ€โ•ธโ•ธโ”โ”โ” +*Health* : ${user.healt} +*Energi* : ${user.energi} +*Stamina* : ${user.stamina} +*Speed* : ${user.speed} +*Strength* : ${user.strenght} +*Attack* : ${user.attack} +*Defense* : ${user.defense} + +โ”โ”โ”โ•บโ•บใ€Œ *Backpack* ใ€โ•ธโ•ธโ”โ”โ” +*Potion* : ${user.potion} +*Diamond* : ${user.diamond} +*Emas* : ${user.emas} +*Iron* : ${user.iron} +*Berlian* : ${user.berlian} +*Emerald* : ${user.emerald} +*Litecoin* : ${user.litecoin} +*Tiketcoin* : ${user.tiketcoin} +*Batu* : ${user.batu} +*Kayu* : ${user.kayu} +*String* : ${user.string} +*Coal* : ${user.coal} + +โ”โ”โ”โ•บโ•บใ€Œ *Senjata* ใ€โ•ธโ•ธโ”โ”โ” +*Armor* : ${armor == 0 ? 'Tidak Punya' : '' || armor == 1 ? 'Leather Armor' : '' || armor == 2 ? 'Iron Armor' : '' || armor == 3 ? 'Gold Armor' : '' || armor == 4 ? 'Diamond Armor' : '' || armor == 5 ? 'Emerald Armor' : '' || armor == 6 ? 'Crystal Armor' : '' || armor == 7 ? 'Obsidian Armor' : '' || armor == 8 ? 'Netherite Armor' : '' || armor == 9 ? 'Wither Armor' : '' || armor == 10 ? 'Dragon Armor' : '' || armor == 11 ? 'Hacker Armor' : '' || armor == 12 ? 'GOD Armor' : ''} +*Sword* : ${sword == 0 ? 'Tidak Punya' : '' || sword == 1 ? 'Wooden Sword' : '' || sword == 2 ? 'Iron Sword' : '' || sword == 3 ? 'Gold Sword' : '' || sword == 4 ? 'Diamond Sword' : '' || sword == 5 ? 'Netherite Sword' : '' || armor == 6 ? 'Crystal Sword' : '' || sword == 7 ? 'Obsidian Sword' : '' || sword == 8 ? 'Netherite Sword' : '' || sword == 9 ? 'Wither Sword' : '' || sword == 10 ? 'Dragon Sword' : '' || sword == 11 ? 'Hacker Sword' : '' || sword == 12 ? 'GOD Sword' : ''} +*FishingRod* : ${fishingrod == 0 ? 'Tidak Punya' : '' || fishingrod == 1 ? 'Wood FishingRod' : '' || fishingrod == 2 ? 'Iron FishingRod' : '' || fishingrod == 3 ? 'Gold FishingRod' : '' || fishingrod == 4 ? 'Diamond FishingRod' : '' || fishingrod == 5 ? 'Netherite FishingRod' : '' || fishingrod == 6 ? 'Crystal FishingRod' : '' || fishingrod == 7 ? 'Obsidian FishingRod' : '' || fishingrod == 8 ? 'Netherite FishingRod' : '' || fishingrod == 9 ? 'Wither FishingRod' : '' || fishingrod == 10 ? 'Dragon FishingRod' : '' || fishingrod == 11 ? 'Hacker FishingRod' : '' || fishingrod == 12 ? 'GOD FishingRod' : ''} +*Pickaxe* : ${pickaxe == 0 ? 'Tidak Punya' : '' || pickaxe == 1 ? 'Wood Pickaxe' : '' || pickaxe == 2 ? 'Iron Pickaxe' : '' || pickaxe == 3 ? 'Gold Pickaxe' : '' || pickaxe == 4 ? 'Diamond Pickaxe' : '' || pickaxe == 5 ? 'Netherite Pickaxe' : '' || pickaxe == 6 ? 'Crystal Pickaxe' : '' || pickaxe == 7 ? 'Obsidian Pickaxe' : '' || pickaxe == 8 ? 'Netherite Pickaxe' : '' || pickaxe == 9 ? 'Wither Pickaxe' : '' || pickaxe == 10 ? 'Dragon Pickaxe' : '' || pickaxe == 11 ? 'Hacker Pickaxe' : '' || pickaxe == 12 ? 'GOD Pickaxe' : ''} +*Katana* : ${katana == 0 ? 'Tidak Punya' : '' || katana == 1 ? 'Wood Katana' : '' || katana == 2 ? 'Iron Katana' : '' || katana == 3 ? 'Gold Katana' : '' || katana == 4 ? 'Diamond Katana' : '' || katana == 5 ? 'Netherite Katana' : '' || katana == 6 ? 'Crystal Katana' : '' || katana == 7 ? 'Obsidian Katana' : '' || katana == 8 ? 'Netherite Katana' : '' || katana == 9 ? 'Wither Katana' : '' || katana == 10 ? 'Dragon Katana' : '' || katana == 11 ? 'Hacker Katana' : '' || katana == 12 ? 'GOD Katana' : ''} +*Axe* : ${axe== 0 ? 'Tidak Punya' : '' || axe== 1 ? 'Wood Axe' : '' || axe== 2 ? 'Iron Axe' : '' || axe== 3 ? 'Gold Axe' : '' || axe== 4 ? 'Diamond Axe' : '' || axe== 5 ? 'Netherite Axe' : '' || axe== 6 ? 'Crystal Axe' : '' || axe== 7 ? 'Obsidian Axe' : '' || axe== 8 ? 'Netherite Axe' : '' || axe== 9 ? 'Wither Axe' : '' || axe== 10 ? 'Dragon Axe' : '' || axe== 11 ? 'Hacker Axe' : '' || axe== 12 ? 'GOD Axe' : ''} +*Bow* : ${bow == 0 ? 'Tidak Punya' : '' || bow == 1 ? 'Wood Bow' : '' || bow == 2 ? 'Iron Bow' : '' || bow == 3 ? 'Gold Bow' : '' || bow == 4 ? 'Diamond Bow' : '' || bow == 5 ? 'Netherite Bow' : '' || bow == 6 ? 'Crystal Bow' : '' || bow == 7 ? 'Obsidian Bow' : '' || bow == 8 ? 'Netherite Bow' : '' || bow == 9 ? 'Wither Bow' : '' || bow == 10 ? 'Dragon Bow' : '' || bow == 11 ? 'Hacker Bow' : '' || bow == 12 ? 'GOD Bow' : ''} + +โ”โ”โ”โ•บโ•บใ€Œ *Durability* ใ€โ•ธโ•ธโ”โ”โ” +*Armor* : ${user.armordurability} +*Sword* : ${user.sworddurability} +*Fishingrod* : ${user.fishingroddurability} +*Pickaxe* : ${user.pickaxedurability} +*Katana* : ${user.katanadurability} +*Axe* : ${user.axedurability} +*Bow* : ${user.bowdurability} + +โ”โ”โ”โ•บโ•บใ€Œ *User Box* ใ€โ•ธโ•ธโ”โ”โ” +*Common* : ${user.common} +*Uncommon* : ${user.uncommon} +*Mythic* : ${user.mythic} +*Legendary* : ${user.legendary} +*Total Box* : ${user.common + user.uncommon + user.mythic + user.legendary} + +โ”โ”โ”โ•บโ•บใ€Œ *User Pets* ใ€โ•ธโ•ธโ”โ”โ” +*Pet token* : ${user.pet} +*Makanan pet* : ${user.makananpet} + +*Kucing* : Lv. ${user.kucing} +*Anjing* : Lv. ${user.anjing} +*Rubah* : Lv. ${user.rubah} +*Serigala* : Lv. ${user.serigala} +*Phonix* : Lv. ${user.phonix} +` + +/*conn.sendMessage(m.chat, { +text: capt, +contextInfo: { +externalAdReply: { +title: 'I N V E N T O R Y', +thumbnailUrl: 'https://telegra.ph/file/ea3ee889b63edfb616c2d.jpg', +mediaType: 1, +renderLargerThumbnail: true +}}}, { quoted: m })*/ + +conn.fakeReply(m.chat, capt, '0@s.whatsapp.net', 'Inventory', 'status@broadcast') + //conn.sendFile(m.chat, 'https://telegra.ph/file/5488aa5c5b3c28cd35e0e.jpg', 'balance.jpg', caption, m) +} + +handler.help = ['inventory *@user*'] +handler.tags = ['rpg'] +handler.command = /^inv|inventory$/i + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-job.js b/plugins/rpg-job.js new file mode 100644 index 0000000000000000000000000000000000000000..8dbb7d8742964757c3d08e9b568de6e3250b3d45 --- /dev/null +++ b/plugins/rpg-job.js @@ -0,0 +1,112 @@ +let handler = async (m, { isPrems, conn, text, usedPrefix, command }) => { + const user = global.db.data.users[m.sender]; + const who = m.mentionedJid && m.mentionedJid[0] ? m.mentionedJid[0] : text ? text.replace(/[@ .+-]/g, '').replace(/^\+/, '').replace(/-/g, '') + '@s.whatsapp.net' : m.sender; + + // Jika user belum melamar pekerjaan + if (user.job === '-') { + throw 'Kamu belum melamar kerja. Silahkan melamar kerja terlebih dahulu untuk memulai job. Contoh: .lamarkerja _gojek_'; + } + + // Pastikan jobexp terdefinisi + if (user.jobexp === undefined) { + user.jobexp = 0; + } + + let job = `${user.job}`; + let kapital = capitalizeFirstLetter(job); + + if (user.jail === true) { + throw '*Kamu tidak bisa melakukan aktivitas karena masih dalam penjara!*'; + } + + let jobs = { + 'gojek': { + thumb: 'https://telegra.ph/file/1bb2e5ff8e3b434b379dc.jpg', + special: '*.ngojek*' + }, + 'kurir': { + thumb: 'https://telegra.ph/file/64d8e80ee172257f1b8ca.jpg', + special: '-' + }, + 'sopir': { + thumb: 'https://telegra.ph/file/57f5f98cae56774fc398b.jpg', + special: '-' + }, + 'karyawan indomaret': { + thumb: 'https://telegra.ph/file/59ccf16e7d753698b674b.jpg', + special: '-' + }, + 'kantoran': { + thumb: 'https://telegra.ph/file/1b2398b334d1cc7a74cb0.jpg', + special: '-' + }, + 'dokter': { + thumb: 'https://telegra.ph/file/951334d75d222eb7fa1b3.jpg', + special: '*.healing*' + }, + 'frontend developer': { + thumb: 'https://telegra.ph/file/3b28a547ba457c1681544.jpg', + special: '-' + }, + 'web developer': { + thumb: 'https://telegra.ph/file/dae4c03250e6c43e92a72.jpg', + special: '-' + }, + 'backend developer': { + thumb: 'https://telegra.ph/file/ccc87e4468bf754d312cb.jpg', + special: '-' + }, + 'fullstack developer': { + thumb: 'https://telegra.ph/file/1c8111cef2063b9db5d66.jpg', + special: '-' + }, + 'game developer': { + thumb: 'https://telegra.ph/file/e621f007affe38df8e748.jpg', + special: '-' + }, + 'pemain sepak bola': { + thumb: 'https://telegra.ph/file/5a72645b7cd852b87493d.jpg', + special: '-' + }, + 'trader': { + thumb: 'https://telegra.ph/file/ed5c581836d61c70298bd.jpg', + special: '-' + }, + 'hunter': { + thumb: 'https://telegra.ph/file/2ba7ade78cbd36e3f35a4.jpg', + special: '*.berburu*' + }, + 'polisi': { + thumb: 'https://telegra.ph/file/d34aa031a8035e13b5bbb.jpg', + special: '*.penjara*' + } + }; + + let jobInfo = jobs[user.job]; + if (jobInfo) { + let caption = `*JOB INFO* + Pekerjaan : ${kapital} + Tingkat Kerja Keras : ${user.jobexp}% / 500% + +Tingkat kerja keras akan meningkat setiap 1% melalui perintah *.jobkerja*. Dan command spesial kamu adalah ${jobInfo.special} +`.trim(); + + await conn.sendFile(m.chat, jobInfo.thumb, `${user.job}.jpg`, caption, m); + } else { + throw 'Pekerjaan tidak ditemukan atau tidak valid!'; + } +}; + +handler.help = ['job']; +handler.tags = ['rpg']; +handler.command = /^(job)$/i; + +module.exports = handler; + +function capitalizeFirstLetter(str) { + let words = str.split(" "); + for (let i = 0; i < words.length; i++) { + words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1).toLowerCase(); + } + return words.join(" "); +} \ No newline at end of file diff --git a/plugins/rpg-jobkerja.js b/plugins/rpg-jobkerja.js new file mode 100644 index 0000000000000000000000000000000000000000..060802e06d23680fe0aabf53e4f7d7ba42d6859c --- /dev/null +++ b/plugins/rpg-jobkerja.js @@ -0,0 +1,69 @@ +const cooldown = 300000; // Cooldown default (5 menit dalam milidetik) +const cooldownAfterWork = 5 * 60 * 1000; // Cooldown setelah bekerja selama 5 menit (dalam milidetik) + +let handler = async (m, { isPrems, conn, text, usedPrefix, command }) => { + const user = global.db.data.users[m.sender]; + + if (user.jail === true) { + throw '*Kamu tidak bisa melakukan aktivitas karena masih dalam penjara!*'; + } + + // Cek cooldown antara pekerjaan dan cooldown setelah bekerja selama 5 menit + if (new Date() - user.pekerjaansatu < cooldown || user.pekerjaansatu + cooldownAfterWork > new Date()) { + let remainingTime; + if (new Date() - user.pekerjaansatu < cooldown) { + remainingTime = user.pekerjaansatu + cooldown - new Date(); + } else { + remainingTime = user.pekerjaansatu + cooldownAfterWork - new Date(); + } + let formattedTime = new Date(remainingTime).toISOString().substr(11, 8); + throw `Kamu sudah pergi bekerja sebelumnya. Tunggu selama *${formattedTime}* untuk bekerja lagi`; + } + + if (user.job == '-') { + throw 'Kamu belum mempunyai pekerjaan. Ketik */lamarkerja* untuk melamar pekerjaan'; + } + + const jobList = { + 'gojek': [11000, 10000, 10000], + 'kantoran': [32000, 32000, 40000], + 'game developer': [420000, 410000, 400000], + 'backend developer': [130000, 130000, 140000], + 'web developer': [72000, 72000, 80000], + 'sopir': [26000, 25000, 25000], + 'kurir': [15000, 14000, 14000], + 'frontend developer': [52000, 52000, 60000], + 'fullstack developer': [210000, 210000, 200000], + 'pemain sepak bola': [900000, 900000, 1000000], + 'karyawan indomaret': [27000, 27000, 30000], + 'polisi': [31000, 31000, 40000], + 'trader': [1700000, 1700000, 2000000], + 'dokter': [1700000, 1700000, 2000000], + 'hunter': [1700000, 1700000, 2000000] + }; + + if (jobList[user.job]) { + let [moneyMax, expMax, bankMax] = jobList[user.job]; + let money = Math.floor(Math.random() * moneyMax); + let exp = Math.floor(Math.random() * expMax); + let bank = Math.floor(Math.random() * bankMax); + + user.money += money; + user.exp += exp; + user.jobexp += 1; + user.pekerjaansatu = new Date().getTime(); + + let message = `*Berikut pendapatan dari pekerjaan ${user.job}* + \nโ€ข Money : Rp. ${money} + \nโ€ข Exp : ${exp} + \nโ€ข Tingkat Kerja Keras : +1 ๐ŸงŸโ€โ™‚๏ธ`; + + conn.reply(m.chat, message, m); + } +}; +handler.help = ['jobkerja']; +handler.tags = ['rpg']; +handler.command = /^(jobkerja)$/i; +handler.limit = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-judi.js b/plugins/rpg-judi.js new file mode 100644 index 0000000000000000000000000000000000000000..3ed46919e3fbe04e3da325906c34f7959619f32f --- /dev/null +++ b/plugins/rpg-judi.js @@ -0,0 +1,59 @@ +let buatall = 1 +let handler = async (m, { conn, args, usedPrefix, isOwner }) => { + conn.judi = conn.judi ? conn.judi : {} + if (m.chat in conn.judi) return conn.reply (m.chat, 'Masih ada yang melakukan judi disini, tunggu sampai selesai!!', m) + else conn.judi[m.chat] = true + try { + let __waktutionskh = (new Date - global.db.data.users[m.sender].judilast) + let _waktutionskh = (5000 - __waktutionskh) + let waktutionskh = clockString(_waktutionskh) + if (new Date - global.db.data.users[m.sender].judilast > 5000) { + global.db.data.users[m.sender].judilast = new Date * 1 + let randomaku = `${Math.floor(Math.random() * 350)}`.trim() + let randomkamu = `${Math.floor(Math.random() * 50)}`.trim() //hehe Biar Susah Menang :v + let Aku = (randomaku * 1) + let Kamu = (randomkamu * 1) + let count = args[0] + count = count ? /all/i.test(count) ? Math.floor(global.db.data.users[m.sender].money / buatall) : parseInt(count) : args[0] ? parseInt(args[0]) : 1 + count = Math.max(1, count) + if (args.length < 1) return conn.reply(m.chat, 'โ€ข *Example :* .judi 1000', m) + if (global.db.data.users[m.sender].money >= count * 1) { + global.db.data.users[m.sender].money -= count * 1 + if (Aku > Kamu) { + conn.reply(m.chat, `aku roll:${Aku}\nKamu roll: ${Kamu}\n\nkamu *Kalah*, kamu kehilangan ${count} money`.trim(), m) + } else if (Aku < Kamu) { + global.db.data.users[m.sender].money += count * 2 + conn.reply(m.chat, `aku roll:${Aku}\nKamu roll: ${Kamu}\n\nkamu *Menang*, kamu Mendapatkan ${count * 2} money`.trim(), m) + } else { + global.db.data.users[m.sender].money += count * 1 + conn.reply(m.chat, `aku roll:${Aku}\nKamu roll: ${Kamu}\n\nkamu *Seri*, kamu Mendapatkan ${count * 1} money`.trim(), m) + } + } else conn.reply(m.chat, `Money kamu tidak cukup untuk melakukan judi sebesar ${count} money`.trim(), m) + } else conn.reply(m.chat, `Kamu sudah judi, tidak bisa judi kembali..\nMohon tunggu ${waktutionskh} lagi untuk judi kembali `, m) + } catch (e) { + console.log(e) + conn.reply(m.chat, 'Error!!', m) + } finally { + delete conn.judi[m.chat] + } + } +handler.help = ['judi'] +handler.tags = ['rpg'] +handler.command = /^(judi)$/i +handler.group = true + +handler.fail = null + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} + +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ms,h,m,s}) + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-kandang.js b/plugins/rpg-kandang.js new file mode 100644 index 0000000000000000000000000000000000000000..22f775b92d5e668490f90c62fbddbcb64e84f4f3 --- /dev/null +++ b/plugins/rpg-kandang.js @@ -0,0 +1,29 @@ +let handler = async (m, { conn, usedPrefix }) => { + let user = global.db.data.users[m.sender] + let cap = `*โ”โ”โ” โจ Kandang Buruan โฉ โ”โ”โ”„โ”ˆ* + +=> *Berikut Kandang :* @${m.sender.split`@`[0]} + +*๐Ÿ‚ = [ ${user.banteng} ] banteng* +*๐Ÿ… = [ ${user.harimau} ] harimau* +*๐Ÿ˜ = [ ${user.gajah} ] gajah* +*๐Ÿ = [ ${user.kambing} ] kambing* +*๐Ÿผ = [ ${user.panda} ] panda* +*๐ŸŠ = [ ${user.buaya} ] buaya* +*๐Ÿƒ = [ ${user.kerbau} ] kerbau* +*๐Ÿฎ = [ ${user.sapi} ] sapi* +*๐Ÿ’ = [ ${user.monyet} ] monyet* +*๐Ÿ— = [ ${user.babihutan} ] babihutan* +*๐Ÿ– = [ ${user.babi} ] babi* +*๐Ÿ“ = [ ${user.ayam} ] ayam* + +Gunakan *${usedPrefix}pasar* untuk dijual atau *${usedPrefix}cook* untuk dijadikan bahan masakan.` + + conn.reply(m.chat, cap, m, { mentions: await conn.parseMention(cap) } ) +} + +handler.help = ['kandang'] +handler.tags = ['rpg'] +handler.command = /^(kandang)$/i + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-karung.js b/plugins/rpg-karung.js new file mode 100644 index 0000000000000000000000000000000000000000..cb2c0c402a4188b8523917f7e3612ee95f809423 --- /dev/null +++ b/plugins/rpg-karung.js @@ -0,0 +1,21 @@ +let handler = async (m, { conn, usedPrefix }) => { + let user = global.db.data.users[m.sender] + let cap = `*โ” โจ Karung Hasil Mulung โฉ โ”* + +=> *Berikut Karung :* @${m.sender.split`@`[0]} + +*Kaleng = [ ${user.kaleng} ]* +*Botol = [ ${user.botol} ]* +*Kardus = [ ${user.kardus} ]* +*Sampah = [ ${user.sampah} ]* + +Gunakan *${usedPrefix}sell* untuk dijual` + + conn.reply(m.chat, cap, m, { mentions: await conn.parseMention(cap) } ) +} + +handler.help = ['karung'] +handler.tags = ['rpg'] +handler.command = /^(karung)$/i + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-kencan.js b/plugins/rpg-kencan.js new file mode 100644 index 0000000000000000000000000000000000000000..9240b1f9e7c203338d69a7b8c190b7cab4bfbf70 --- /dev/null +++ b/plugins/rpg-kencan.js @@ -0,0 +1,65 @@ +let handler = async (m, { conn, text }) => { + const userId = m.sender; + const user = global.db.data.users[userId]; + const lastDate = user.lastdate || 0; + const currentTime = new Date().getTime(); + const timeDiff = currentTime - lastDate; + + if (timeDiff < 600000) { + const remainingTime = 600000 - timeDiff; + conn.reply(m.chat, `Anda harus menunggu ${remainingTime / 1000} detik lagi sebelum berkencan lagi. โณ`, m); + return; + } + + if (text) { + const selectedCharacterIndex = parseInt(text) - 1; + const characterOptions = getCharacterOptions(); + + if (selectedCharacterIndex >= 0 && selectedCharacterIndex < characterOptions.length) { + const selectedCharacter = characterOptions[selectedCharacterIndex]; + const partnerName = selectedCharacter; + const dateLocation = generateRandomLocation(); + const dateInfo = ` +๐Ÿ’‘ *Informasi Kencan* ๐Ÿ’‘ +๐Ÿ‘ค Nama Pasangan: ${partnerName} +๐Ÿ“ Tempat Kencan: ${dateLocation} + `; + + setTimeout(() => { + let ending = "Akhir yang Bahagia"; + conn.reply(m.chat, `Kencan selesai!\n\n${dateInfo}\n\n${ending}`, m); + }, 30000); + + conn.reply(m.chat, `Anda sedang berkencan dengan ${partnerName}!\n\n${dateInfo}`, m); + + user.lastdate = currentTime; + } else { + conn.reply(m.chat, 'Pilihan karakter tidak valid. Berkencan dibatalkan.', m); + } + } else { + const characterList = getCharacterOptions().map((char, index) => `${index + 1}. ${char}`).join('\n'); + conn.reply(m.chat, `Silakan pilih karakter dengan format .kencan [nomor karakter].\n\nList Karakter:\n${characterList}`, m); + } +}; + +handler.help = ['kencan']; +handler.tags = ['rpg']; +handler.command = /^kencan$/i; +handler.register = true; +handler.group = true; + +module.exports = handler; + +function getCharacterOptions() { + return [ + 'Sakura', 'Asuna', 'Mikasa', 'Kagome', 'Saber', + 'Rei', 'Rem', 'Mio', 'Erza', 'Haruhi', + 'Lucy', 'Nami', 'Hinata', 'Rias', 'Rukia', + 'Inori', 'Zero Two', 'Nanami', 'Nezuko', 'Holo', 'Axel', + ]; +} + +function generateRandomLocation() { + const locations = ['Taman', 'Pantai', 'Kafe', 'Museum', 'Bioskop', 'Restoran Mewah', 'Pasar Malam', 'Taman Air', 'Pusat Perbelanjaan', 'Tempat Karaoke', 'nightclub', 'oyo']; + return locations[Math.floor(Math.random() * locations.length)]; +} \ No newline at end of file diff --git a/plugins/rpg-kerja.js b/plugins/rpg-kerja.js new file mode 100644 index 0000000000000000000000000000000000000000..6a2b24825ff4fa3c3bd26f3cd43fc1a1707765ff --- /dev/null +++ b/plugins/rpg-kerja.js @@ -0,0 +1,171 @@ +let handler = async (m, { conn, command, args, usedPrefix }) => { + let type = (args[0] || '').toLowerCase() + let users = global.db.data.users[m.sender] + let time = users.lastkerja + 300000 + let __timers = (new Date - users.lastkerja) + let _timers = (0 - __timers) + let timers = clockString(_timers) + let penumpan = ['mas mas', 'bapak bapak', 'cewe sma', 'bocil epep', 'emak emak'] + let penumpang = penumpan[Math.floor(Math.random() * penumpan.length)] + let daganga = ['wortel', 'sawi', 'selada', 'tomat', 'seledri', 'cabai', 'daging', 'ikan', 'ayam'] + let dagangan = daganga[Math.floor(Math.random() * daganga.length)] + let pasie = ['sakit kepala', 'cedera', 'luka bakar', 'patah tulang'] + let pasien = pasie[Math.floor(Math.random() * pasie.length)] + let pane = ['Wortel', 'Kubis', 'stowbery', 'teh', 'padi', 'jeruk', 'pisang', 'semangka', 'durian', 'rambutan'] + let panen = pane[Math.floor(Math.random() * pane.length)] + let bengke = ['mobil', 'motor', 'becak', 'bajai', 'bus', 'angkot', 'becak', 'sepeda'] + let bengkel = bengke[Math.floor(Math.random() * bengke.length)] + let ruma = ['Membangun Rumah', 'Membangun Gedung', 'Memperbaiki Rumah', 'Memperbaiki Gedung', 'Membangun Fasilitas Umum', 'Memperbaiki Fasilitas Umum'] + let rumah = ruma[Math.floor(Math.random() * ruma.length)] + let pnjh = ['pencuri', 'pelanggar aturan lalu lintas', 'perampok bank', 'copet', 'koruptor'] + let pnjht = pnjh[Math.floor(Math.random() * pnjh.length)] + + if (/kerjadulu|kerja|work/i.test(command)) { + switch (type) { + case 'ojek': + if (new Date - users.lastkerja < 300000) return m.reply(`Kamu sudah bekerja\nSaatnya istirahat selama ${clockString(time - new Date())}`) + let hasilojek = Math.floor(Math.random() * 5000000) + m.reply(`Kamu Sudah Mengantarkan *${penumpang}* ๐Ÿš—\nDan mendapatkan uang senilai *Rp ${hasilojek} money*`).then(() => { + users.money += hasilojek + users.lastkerja = new Date * 1 + }) + break + case 'pedagang': + if (new Date - users.lastkerja < 300000) return m.reply(`Kamu sudah bekerja,Saatnya istirahat selama\n๐Ÿ•œ ${clockString(time - new Date())}`) + let hasildagang = Math.floor(Math.random() * 5000000) + m.reply(`Ada pembeli yg membeli *${dagangan}* ๐Ÿ›’\nDan mendapatkan uang senilai *Rp ${hasildagang} money*`).then(() => { + users.money += hasildagang + users.lastkerja = new Date * 1 + }) + break + case 'dokter': + if (new Date - users.lastkerja < 300000) return m.reply(`Kamu sudah bekerja,Saatnya istirahat selama\n๐Ÿ•œ ${clockString(time - new Date())}`) + let hasildokter = Math.floor(Math.random() * 5000000) + m.reply(`Kamu menyembuhkan pasien *${pasien}* ๐Ÿ’‰\nDan mendapatkan uang senilai *Rp ${hasildokter}* money`).then(() => { + users.money += hasildokter + users.lastkerja = new Date * 1 + }) + break + case 'petani': + if (new Date - users.lastkerja < 300000) return m.reply(`Kamu sudah bekerja,Saatnya istirahat selama\n๐Ÿ•œ ${clockString(time - new Date())}`) + let hasiltani = Math.floor(Math.random() * 5000000) + m.reply(`${panen} Sudah Panen !๐ŸŒฝ Dan menjualnya ๐Ÿงบ\nDan mendapatkan uang senilai Rp *${hasiltani} money*`).then(() => { + users.money += hasiltani + users.lastkerja = new Date * 1 + }) + break + case 'montir': + if (new Date - users.lastkerja < 300000) return m.reply(`Kamu sudah bekerja,Saatnya istirahat selama\n๐Ÿ•œ ${clockString(time - new Date())}`) + let hasilmontir = Math.floor(Math.random() * 5000000) + m.reply(`Kamu Baru saja mendapatkan pelanggan dan memperbaiki *${bengkel} ๐Ÿ”ง*\nDan kamu mendapatkan uang senilai *Rp ${hasilmontir}* money`).then(() => { + users.money += hasilmontir + users.lastkerja = new Date * 1 + }) + break + case 'kuli': + if (new Date - users.lastkerja < 300000) return m.reply(`Kamu sudah bekerja,Saatnya istirahat selama\n๐Ÿ•œ ${clockString(time - new Date())}`) + let hasilkuli = Math.floor(Math.random() * 5000000) + m.reply(`Kamu baru saja selesai ${rumah} ๐Ÿ”จ\nDan mendapatkan uang senilai *Rp ${hasilkuli} money*`).then(() => { + users.money += hasilkuli + users.lastkerja = new Date * 1 + }) + break + case 'polisi': + if (new Date - users.lastkerja < 300000) return m.reply(`Kamu sudah bekerja,Saatnya istirahat selama\n๐Ÿ•œ ${clockString(time - new Date())}`) + let hasilpolis = Math.floor(Math.random() * 5000000) + m.reply(`Kamu baru saja menangkap ${pnjht} ๐Ÿšจ\nDan mendapatkan uang senilai *Rp ${hasilpolis} money*`).then(() => { + users.money += hasilpolis + users.lastkerja = new Date * 1 + }) + break + default: + //return m.reply(`_*Pilih Pekerjaan Yang Kamu Inginkan*_\n\n_โ€ข Kuli_ \n_โ€ข Montir_ \n_โ€ข Petani_ \n_โ€ข Dokter_ \n_โ€ข Pedagang_ \n_โ€ข Ojek_ \n\nContoh Penggunaan :\n${usedPrefix}kerja Kuli`) +let judul = ` +_*Pilih Pekerjaan Yang Kamu Inginkan*_ + +- Dokter [๐Ÿ‘จโ€โš•] +- Pedagang [๐Ÿ‘จ๐Ÿปโ€๐Ÿณ] +- Ojek[๐Ÿ›ต] +- Kuli [๐Ÿ‘ทโ€โ™‚๏ธ] +- Montir [๐Ÿ‘จโ€๐Ÿ”ง] +- Petani [๐Ÿ‘จโ€๐ŸŒพ] +- Polisi [๐Ÿ‘ฎ] +` + let msg = { + viewOnceMessage: { + message: { + messageContextInfo: { + deviceListMetadata: {}, + deviceListMetadataVersion: 2, + }, + interactiveMessage: { + body: { + text: judul, + }, + footer: { + text: `by Killua Fourteen`, + }, + header: { + title: '', + subtitle: '', + hasMediaAttachment: false + }, + nativeFlowMessage: { + buttons: [ + { + "name": "single_select", + "buttonParamsJson": +JSON.stringify({ + "title": "Pilih Pekerjaan", +"sections": [ + { + title: 'List Pekerjaan', + highlight_label: 'Select', /*personal*/ + rows: [ + { "header": "", "title": 'Dokter [๐Ÿ‘จโ€โš•]', "description": "Menjadi Seorang Dokter", "id": `.kerja dokter` }, + { "header": "", "title": 'Pedagang [๐Ÿ‘จ๐Ÿปโ€๐Ÿณ]', "description": "Menjadi Seorang Pedagang", "id": `.kerja pedagang` }, + { "header": "", "title": 'Ojek[๐Ÿ›ต]', "description": "Menjadi Seorang Gojek", "id": `.kerja ojek` }, + { "header": "", "title": 'Kuli [๐Ÿ‘ทโ€โ™‚๏ธ]', "description": "Menjadi Seorang Kuli Bangunan", "id": `.kerja kuli` }, + { "header": "", "title": 'Montir [๐Ÿ‘จโ€๐Ÿ”ง]', "description": "Menjadi Seorang Montir", "id": `.kerja montir` }, + { "header": "", "title": 'Petani [๐Ÿ‘จโ€๐ŸŒพ]', "description": "Menjadi Seorang Petani", "id": `.kerja petani` }, + { "header": "", "title": 'Polisi [๐Ÿ‘ฎ]', "description": "Menjadi Seorang Polisi", "id": `.kerja polisi` }, + ] + } + ] + }) + } + ], + }, + contextInfo: { + quotedMessage: m.message, + participant: m.sender, + ...m.key + }, + + }, + }, + }, + }; + return conn.relayMessage(m.chat,ย msg,ย {ย }); + } + } +} +handler.help = ['kerja'] +handler.tags = ['rpg'] +handler.command = /^kerja$/i + +handler.register = true +handler.group = true + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ms,h,m,s}) + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-kill.js b/plugins/rpg-kill.js new file mode 100644 index 0000000000000000000000000000000000000000..e5f4e14c0ba65948626470baedd1a3a33b4bc9c0 --- /dev/null +++ b/plugins/rpg-kill.js @@ -0,0 +1,48 @@ +const timeout = 604800000 + +let handler = async (m, { conn, usedPrefix, text }) => { + let time = global.db.data.users[m.sender].lastkill + 604800000 + if (new Date - global.db.data.users[m.sender].lastkill< 604800000) return conn.reply(m.chat, `Anda sudah menggunakan kill\nTunggu selama ${msToTime(time - new Date())} lagi`, m) + let nabung = global.db.data.users[m.sender].nabung += 100000 +let bank = global.db.data.users[m.sender].bank += 1000000 + let money = `${Math.floor(Math.random() * 30000)}`.trim() + let exp = `${Math.floor(Math.random() * 999)}`.trim() + let kardus = `${Math.floor(Math.random() * 1000)}`.trim() + global.db.data.users[m.sender].money += money * 1 + global.db.data.users[m.sender].exp += exp * 1 + global.db.data.users[m.sender].kardus += kardus * 1 + global.db.data.users[m.sender].lastkill = new Date * 1 + conn.reply(m.chat, `Selamat kamu mendapatkan : \n+${money} Money\n+${kardus} Kardus\n+${exp} Exp\n+${bank} Bank\n+${nabung} Nabung`, m) +} +handler.help = ['kill'] +handler.tags = ['rpg'] +handler.command = /^(kill)/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.limit = false +handler.exp = 0 +handler.money = 0 + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return hours + " jam " + minutes + " menit " + seconds + " detik" +} \ No newline at end of file diff --git a/plugins/rpg-koboy.js b/plugins/rpg-koboy.js new file mode 100644 index 0000000000000000000000000000000000000000..99bad0e68e29364360d6485bb9146b0fb88626e3 --- /dev/null +++ b/plugins/rpg-koboy.js @@ -0,0 +1,146 @@ +const handler = async (m, { conn }) => { + conn.koboy = conn.koboy || {}; + const user = global.db.data.users[m.sender]; + + const cooldownPeriod = 5 * 60 * 60 * 1000; // 5 jam dalam milidetik + const lastPlayed = user.lastKoboy || 0; + const now = Date.now(); + + if (now - lastPlayed < cooldownPeriod) { + const remainingTime = cooldownPeriod - (now - lastPlayed); + const hours = Math.floor(remainingTime / (60 * 60 * 1000)); + const minutes = Math.floor((remainingTime % (60 * 60 * 1000)) / (60 * 1000)); + const seconds = Math.floor((remainingTime % (60 * 1000)) / 1000); + return m.reply(`Anda sudah menangkap penjahat. Tunggu ${hours} jam ${minutes} menit ${seconds} detik lagi.`); + } + + if (conn.koboy[m.chat]) return m.reply('Kamu sedang bermain game Koboy!'); + + let playerPosition, criminalPosition; + do { + playerPosition = Math.floor(Math.random() * 6); + criminalPosition = Math.floor(Math.random() * 6); + } while (playerPosition === criminalPosition); + + let gameState = `๐Ÿค  Koboy Mengejar Penjahat ๐Ÿƒโ€โ™‚๏ธ + +Wilayah saya: +${"ใƒป".repeat(playerPosition)}๐Ÿค ${"ใƒป".repeat(5 - playerPosition)} +Wilayah penjahat: +${"ใƒป".repeat(criminalPosition)}๐Ÿƒโ€โ™‚๏ธ${"ใƒป".repeat(5 - criminalPosition)} +Ketik *'kanan'* untuk bergerak ke kanan. +Ketik *'kiri'* untuk bergerak ke kiri.`; + + let { key } = await conn.reply(m.chat, gameState, m); + + conn.koboy[m.chat] = { + playerPosition, + criminalPosition, + key, + oldkey: key, + earnedExp: 10000, + earnedMoney: 1000000, + sender: m.sender, + moveCount: 0, + maxMoves: 5, + roomId: m.chat, + timeout: setTimeout(() => { + if (conn.koboy && conn.koboy[m.chat] && conn.koboy[m.chat].roomId === m.chat) { + conn.sendMessage(m.chat, { delete: key }); + delete conn.koboy[m.chat]; + } + }, 60000 * 2), + }; + + user.lastKoboy = now; // Simpan waktu terakhir kali permainan dimulai +}; + +handler.before = async (m, { conn }) => { + conn.koboy = conn.koboy || {}; + let user = global.db.data.users[m.sender]; + if (!conn.koboy[m.chat] || conn.koboy[m.chat].roomId !== m.chat || !['kiri', 'kanan'].includes(m.text.toLowerCase())) return; + + let gameData = conn.koboy[m.chat]; + let { playerPosition, criminalPosition, key, oldkey, moveCount, maxMoves, timeout, earnedExp, earnedMoney, sender } = gameData; + + if (m.quoted || m.quoted.id == key) { + if (m.text.toLowerCase() === 'kiri') { + if (playerPosition > 0) { + playerPosition--; + moveCount++; + } else { + return m.reply('Anda sudah berada di batas kiri!'); + } + } else if (m.text.toLowerCase() === 'kanan') { + if (playerPosition < 5) { + playerPosition++; + moveCount++; + } else { + return m.reply('Anda sudah berada di batas kanan!'); + } + } + + if (playerPosition === criminalPosition) { + conn.sendMessage(m.chat, { delete: oldkey }); + let earnedMoneys = randomMoney(earnedMoney, 1); + let earnedExps = randomMoney(earnedExp, 1); + user.money = (user.money || 0) + earnedMoneys; + user.exp = (user.exp || 0) + earnedExps; + delete conn.koboy[m.chat]; + return conn.reply(m.chat, `๐ŸŽ‰ Selamat! @${sender.split('@')[0]} berhasil mengejar penjahat! ๐ŸŽ‰\n\n๐Ÿ’ฐ Mendapatkan uang senilai *${formatRupiah(earnedMoneys)}*\n๐Ÿ”ง Dapatkan *${earnedExps}* EXP\n`, m, { mentions: [sender] }); + } else if (moveCount === maxMoves) { + conn.sendMessage(m.chat, { delete: oldkey }); + delete conn.koboy[m.chat]; + return conn.reply(m.chat, `๐Ÿ˜ž Kamu kalah! @${sender.split('@')[0]} sudah mencapai batas maksimum gerakan.`, m, { mentions: [sender] }); + } + + let gameState = `๐Ÿค  Koboy Mengejar Penjahat ๐Ÿƒโ€โ™‚๏ธ + +Wilayah saya: +${"ใƒป".repeat(playerPosition)}๐Ÿค ${"ใƒป".repeat(5 - playerPosition)} +Wilayah penjahat: +${"ใƒป".repeat(criminalPosition)}๐Ÿƒโ€โ™‚๏ธ${"ใƒป".repeat(5 - criminalPosition)} +Ketik *'kanan'* untuk bergerak ke kanan. +Ketik *'kiri'* untuk bergerak ke kiri.`; + + let msg = await conn.relayMessage(m.chat, { + protocolMessage: { + key: key, + type: 14, + editedMessage: { + conversation: gameState + } + } + }, {}); + + let additionalData = { + ...gameData, + playerPosition, + moveCount, + key: { id: msg } + }; + + conn.koboy[m.chat] = Object.assign({}, conn.koboy[m.chat], additionalData); + } +}; + +handler.help = ['koboy']; +handler.tags = ['rpg']; +handler.command = /^(koboy)$/i; +handler.group = true; + +module.exports = handler; + +function randomMoney(max, min) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function formatRupiah(number) { + const formatter = new Intl.NumberFormat('id-ID', { + style: 'currency', + currency: 'IDR', + minimumFractionDigits: 0, + }); + + return formatter.format(number); +} \ No newline at end of file diff --git a/plugins/rpg-kolam.js b/plugins/rpg-kolam.js new file mode 100644 index 0000000000000000000000000000000000000000..84aa06f3f5e2ac157406a7c4d2368ec33bd72108 --- /dev/null +++ b/plugins/rpg-kolam.js @@ -0,0 +1,37 @@ +let handler = async (m, { conn, usedPrefix }) => { + let paus = global.db.data.users[m.sender].paus + let kepiting = global.db.data.users[m.sender].kepiting + let gurita = global.db.data.users[m.sender].gurita + let cumi = global.db.data.users[m.sender].cumi + let buntal = global.db.data.users[m.sender].buntal + let dory = global.db.data.users[m.sender].dory + let lumba = global.db.data.users[m.sender].lumba + let lobster = global.db.data.users[m.sender].lobster + let hiu = global.db.data.users[m.sender].hiu + let udang = global.db.data.users[m.sender].udang + let ikan = global.db.data.users[m.sender].ikan + let orca = global.db.data.users[m.sender].orca + let dann = ` +*Fish Pond* +Hiu: ${hiu} +Ikan: ${ikan} +Dory: ${dory} +Orca: ${orca} +Paus: ${paus} +Cumi: ${cumi} +Gurita: ${gurita} +Buntal: ${buntal} +Udang: ${udang} +Lumbaยฒ: ${lumba} +Lobster: ${lobster} +Kepiting: ${kepiting} +`.trim() + +conn.reply(m.chat, dann, m) +} + +handler.help = ['kolam'] +handler.tags = ['rpg'] +handler.command = /^(kolam)$/i +handler.group = true +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-kulkas.js b/plugins/rpg-kulkas.js new file mode 100644 index 0000000000000000000000000000000000000000..496713eb4b252eaef77c250db8df8da84598f21b --- /dev/null +++ b/plugins/rpg-kulkas.js @@ -0,0 +1,33 @@ +let handler = async (m, {command, usedPrefix, args}) => { + + let user = global.db.data.users[m.sender] + + const list = `โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +โ”‚โฌก ๐Ÿ– *Ayambakar* : ${user.ayambakar} +โ”‚โฌก ๐Ÿ– *ikan bakar* : ${user.ikanbakar} +โ”‚โฌก ๐Ÿ– *lele bakar* : ${user.lelebakar} +โ”‚โฌก ๐Ÿ– *nila bakar* : ${user.nilabakar} +โ”‚โฌก ๐Ÿ– *bawal bakar* : ${user.bawalbakar} +โ”‚โฌก ๐Ÿ– *udang bakar* : ${user.udangbakar} +โ”‚โฌก ๐Ÿ– *paus bakar* : ${user.pausbakar} +โ”‚โฌก ๐Ÿ– *kepiting bakar* : ${user.kepitingbakar} +โ”‚โฌก ๐Ÿ— *Ayamgoreng* : ${user.ayamgoreng} +โ”‚โฌก ๐Ÿฅ˜ *Rendang* : ${user.rendang} +โ”‚โฌก ๐Ÿฅฉ *Steak* : ${user.steak} +โ”‚โฌก ๐Ÿฅ  *Babipanggang* : ${user.babipanggang} +โ”‚โฌก ๐Ÿฒ *Gulaiayam* : ${user.gulai} +โ”‚โฌก ๐Ÿœ *Oporayam* : ${user.oporayam} +โ”‚โฌก ๐Ÿž *Roti* : ${user.roti} +โ”‚โฌก ๐Ÿฃ *Sushi* : ${user.sushi} +โ”‚โฌก ๐Ÿท *Vodka* : ${user.vodka} +โ”‚โฌก ๐Ÿ’‰ *Bandage* : ${user.bandage} +โ”‚โฌก โ˜˜๏ธ *Ganja* : ${user.ganja} +โ”‚โฌก ๐Ÿบ *Soda* : ${user.soda} +โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€` +m.reply(list) + +} +handler.help = handler.command = ['kulkas'] +handler.tags = ['rpg'] +handler.register = true +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-lamarkerja.js b/plugins/rpg-lamarkerja.js new file mode 100644 index 0000000000000000000000000000000000000000..819440c7655a05a2b6525e7f0b366e48987bea10 --- /dev/null +++ b/plugins/rpg-lamarkerja.js @@ -0,0 +1,110 @@ +let handler = async (m, { isPrems, args, conn, text, command, usedPrefix }) => { + let user = global.db.data.users[m.sender]; + + const jobRequirements = { + 'gojek': { min: 10, max: 100000 }, + 'kurir': { min: 10, max: 200000 }, + 'sopir': { min: 10, max: 200000 }, + 'karyawan indomaret': { min: 20, max: 300000 }, + 'kantoran': { min: 30, max: 400000 }, + 'dokter': { min: 50, max: 100000 }, + 'frontend developer': { min: 40, max: 600000 }, + 'web developer': { min: 40, max: 600000 }, + 'backend developer': { min: 40, max: 600000 }, + 'fullstack developer': { min: 50, max: 700000 }, + 'game developer': { min: 40, max: 600000 }, + 'pemain sepak bola': { min: 30, max: 500000 }, + 'trader': { min: 40, max: 60000 }, + 'hunter': { min: 20, max: 300000 }, + 'polisi': { min: 100, max: 100000 } + }; + + function capitalizeFirstLetter(str) { + let words = str.split(" "); + for (let i = 0; i < words.length; i++) { + words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1).toLowerCase(); + } + return words.join(" "); + } + + //const COOLDOWN_PERIOD = 3 * 24 * 60 * 60 * 1000; // 3 days in milliseconds + + // Memeriksa apakah pengguna dalam periode cooldown + /*if (user.lastjobchange) { + let lastjobchange = new Date(lastjobchange); + let now = new Date(); + if (now - lastjobchange < COOLDOWN_PERIOD) { + let timeLeft = COOLDOWN_PERIOD - (now - lastjobchange); + let daysLeft = Math.floor(timeLeft / (24 * 60 * 60 * 1000)); + let hoursLeft = Math.floor((timeLeft % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000)); + let minutesLeft = Math.floor((timeLeft % (60 * 60 * 1000)) / (60 * 1000)); + throw `Anda telah mengganti pekerjaan baru-baru ini. Silakan tunggu ${daysLeft} hari, ${hoursLeft} jam, dan ${minutesLeft} menit lagi sebelum mengganti pekerjaan lagi.`; + } + }*/ + + // Memeriksa apakah teks yang dimasukkan pengguna adalah pekerjaan yang valid + if (!text || !Object.keys(jobRequirements).includes(text.toLowerCase())) { + let kerjaan = `ไน‚ *L I S T - J O B* + +โ€ข Gojek +โ€ข Kurir +โ€ข Sopir +โ€ข Karyawan Indomaret +โ€ข Kantoran +โ€ข Dokter +โ€ข Frontend Developer +โ€ข Web Developer +โ€ข Backend Developer +โ€ข Fullstack Developer +โ€ข Game Developer +โ€ข Pemain Sepak Bola +โ€ข Trader +โ€ข Hunter +โ€ข Polisi + +โ€ข _Example_ : ${usedPrefix}${command} gojek`.trim(); + conn.reply(m.chat, kerjaan, m); + return; + } + + let job = text.toLowerCase(); + let kapital = capitalizeFirstLetter(job); + let jobLevelRange = jobRequirements[job]; + + // Memeriksa apakah level pengguna berada dalam rentang level yang dibutuhkan untuk pekerjaan yang dipilih + if (user.level < jobLevelRange.min || user.level > jobLevelRange.max) { + throw `Maaf, level Anda tidak mencukupi untuk menjadi ${kapital}. Level yang dibutuhkan adalah antara ${jobLevelRange.min} dan ${jobLevelRange.max}. Level Anda saat ini adalah ${user.level}.`; + } + + // Memberikan pesan bahwa pengguna telah memilih pekerjaan dan menunggu persetujuan + setTimeout(() => { + let lamarkerja1 = `Kamu telah memilih *${kapital}* sebagai pekerjaanmu + +โคท Tunggulah persetujuan dari pihak perusahaan dalam 1 menit agar diterima untuk bekerja.`.trim(); + conn.reply(m.chat, lamarkerja1, m); + }, 0); + + // Memberikan pesan bahwa lamaran pekerjaan telah diterima dan menandai pengguna sebagai bekerja + setTimeout(() => { + let lamarkerja2 = `๐ŸŽ‰ Selamat, lamaran kerja kamu telah diterima oleh pihak perusahaan dan sekarang kamu dapat memulai untuk bekerja hari ini. + +โคท Ketik *.job* untuk melihat detail pekerjaan.`.trim(); + + // Menyimpan pekerjaan pengguna, menandai mereka sebagai bekerja, dan mencatat waktu pergantian pekerjaan terakhir + user.job = job; + }, 30000); +}; + +handler.help = ['lamarkerja']; +handler.tags = ['rpg']; +handler.command = /^lamarkerja$/i; + +module.exports = handler; + +function capitalizeFirstLetter(str) { + let words = str.split(" "); + for (let i = 0; i < words.length; i++) { + words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1).toLowerCase(); + } + return words.join(" "); +} \ No newline at end of file diff --git a/plugins/rpg-listpenjara.js b/plugins/rpg-listpenjara.js new file mode 100644 index 0000000000000000000000000000000000000000..3ea9ce3354399cc8d4cd1c5a037468cbabe9d9aa --- /dev/null +++ b/plugins/rpg-listpenjara.js @@ -0,0 +1,19 @@ +let handler = async (m, { conn, usedPrefix }) => { + + let user = global.db.data.users[m.sender] + if (user.job !== 'polisi') throw 'Anda harus menjadi polisi untuk melakukan tindakan ini.' + + let penjaraList = Object.entries(global.db.data.users).filter(user => user[1].jail) + + conn.reply(m.chat, ` +ไน‚ โ€ข *P E N J A R A*\n +- Total : _${penjaraList.length} User_ + ${penjaraList ? '\n' + penjaraList.map(([jid], i) => ` + ${i + 1}. @${jid.split`@`[0]} +`.trim()).join('\n') : ''} +`, m) +} +handler.help = ['listpenjara'] +handler.tags = ['rpg'] +handler.command = /^penjaralist|listpenjara$/i +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-makan.js b/plugins/rpg-makan.js new file mode 100644 index 0000000000000000000000000000000000000000..ee2dbf83cceb8287286612c8b4e8586762071bc6 --- /dev/null +++ b/plugins/rpg-makan.js @@ -0,0 +1,253 @@ +let handler = async (m, { + command, + usedPrefix, + args +}) => { + let user = global.db.data.users[m.sender] + let author = global.author + let upgrd = (args[0] || '').toLowerCase() + let type = (args[0] || '').toLowerCase() + let _type = (args[1] || '').toLowerCase() + let jualbeli = (args[0] || '').toLowerCase() + const list = `ใ€Œ *E A T I N G* ใ€ +โ•ญโ”€โ”€ใ€Ž า“แดแดแด… ใ€ +โ”‚โฌก typing commandโ†“ +โ”‚ ${usedPrefix + command } rendang +โ”‚ +โ”‚โฌก ๐Ÿ– *Ayambakar* : ${user.ayambakar} +โ”‚โฌก ๐Ÿ— *Ayamgoreng* : ${user.ayamgoreng} +โ”‚โฌก ๐Ÿฅ˜ *Rendang* : ${user.rendang} +โ”‚โฌก ๐Ÿฅฉ *Steak* : ${user.steak} +โ”‚โฌก ๐Ÿฅ  *Babipanggang* : ${user.babipanggang} +โ”‚โฌก ๐Ÿฒ *Gulaiayam* : ${user.gulai} +โ”‚โฌก ๐Ÿœ *Oporayam* : ${user.oporayam} +โ”‚โฌก ๐Ÿท *Vodka* : ${user.vodka} +โ”‚โฌก ๐Ÿฃ *Sushi* : ${user.sushi} +โ”‚โฌก ๐Ÿ’‰ *Bandage* : ${user.bandage} +โ”‚โฌก โ˜˜๏ธ *Ganja* : ${user.ganja} +โ”‚โฌก ๐Ÿบ *Soda* : ${user.soda} +โ”‚โฌก ๐Ÿž *Roti* : ${user.roti} +โ”‚โฌก ๐Ÿ– *ikan bakar* : ${user.ikanbakar} +โ”‚โฌก ๐Ÿ– *lele bakar* : ${user.lelebakar} +โ”‚โฌก ๐Ÿ– *nila bakar* : ${user.nilabakar} +โ”‚โฌก ๐Ÿ– *bawal bakar* : ${user.bawalbakar} +โ”‚โฌก ๐Ÿ– *udang bakar* : ${user.udangbakar} +โ”‚โฌก ๐Ÿ– *paus bakar* : ${user.pausbakar} +โ”‚โฌก ๐Ÿ– *kepiting bakar* : ${user.kepitingbakar} +โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +โ€ข *Example :* .makan ayamgoreng + +gunakan spasi +`.trim() + //try { + if (/makan|eat/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(99999999, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count) + switch (type) { + case 'ayamgoreng': + if (user.stamina < 100) { + if (user.ayamgoreng >= count * 1) { + user.ayamgoreng -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` Ayam goreng kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'ayambakar': + if (user.stamina < 100) { + if (user.ayambakar >= count * 1) { + user.ayambakar -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` Ayam bakar kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'oporayam': + if (user.stamina < 100) { + if (user.oporayam >= count * 1) { + user.oporayam -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` Opor ayam kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'rendang': + if (user.stamina < 100) { + if (user.rendang >= count * 1) { + user.rendang -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` Rendang kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'steak': + if (user.stamina < 100) { + if (user.steak >= count * 1) { + user.steak -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` Steak kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'gulaiayam': + if (user.stamina < 100) { + if (user.gulai >= count * 1) { + user.gulai -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` Gulai ayam kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'babipanggang': + if (user.stamina < 100) { + if (user.babipanggang >= count * 1) { + user.babipanggang -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` Babi panggang kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'soda': + if (user.stamina < 100) { + if (user.soda >= count * 1) { + user.soda -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Glek glek glek`, m) + } else conn.reply(m.chat, ` Soda kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'vodka': + if (user.stamina < 100) { + if (user.vodka >= count * 1) { + user.vodka -= count * 1 + user.stamina += 25 * count + conn.reply(m.chat, `Glek Glek Glek`, m) + } else conn.reply(m.chat, ` Vodka kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'ganja': + if (user.stamina < 100) { + if (user.ganja >= count * 1) { + user.ganja -= count * 1 + user.healt += 90 * count + conn.reply(m.chat, `ngefly`, m) + } else conn.reply(m.chat, ` Ganja kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'bandage': + if (user.stamina < 100) { + if (user.bandage >= count * 1) { + user.bandage -= count * 1 + user.healt += 25 * count + conn.reply(m.chat, `Sretset`, m) + } else conn.reply(m.chat, ` Bandage kamu kurang` ,m) + } else conn.reply( m.chat, `Healt kamu sudah penuh`, m) + break + case 'sushi': + if (user.stamina < 100) { + if (user.sushi >= count * 1) { + user.sushi -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` Sushi kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + break + case 'roti': + if (user.stamina < 100) { + if (user.roti >= count * 1) { + user.roti -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` Roti kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'ikanbakar': + if (user.stamina < 100) { + if (user.ikanbakar >= count * 1) { + user.ikanbakar -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` ikan bakar kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'lelebakar': + if (user.stamina < 100) { + if (user.lelebakar >= count * 1) { + user.lelebakar -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` lele bakar kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'nilabakar': + if (user.stamina < 100) { + if (user.nilabakar >= count * 1) { + user.nilabakar -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` nila bakar kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'bawalbakar': + if (user.stamina < 100) { + if (user.bawalbakar >= count * 1) { + user.bawalbakar -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` bawal bakar kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'udangbakar': + if (user.stamina < 100) { + if (user.udangbakar >= count * 1) { + user.udangbakar -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` udang bakar kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'pausbakar': + if (user.stamina < 100) { + if (user.pausbakar >= count * 1) { + user.pausbakar -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` paus bakar kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + case 'kepitingbakar': + if (user.stamina < 100) { + if (user.kepitingbakar >= count * 1) { + user.kepitingbakar -= count * 1 + user.stamina += 20 * count + conn.reply(m.chat, `Nyam nyam`, m) + } else conn.reply(m.chat, ` kepiting bakar kamu kurang` ,m) + } else conn.reply( m.chat, `Stamina kamu sudah penuh`, m) + break + default: + await conn.reply(m.chat, list, m) + } + } else if (/p/i.test(command)) { + const count = args[2] && args[2].length > 0 ? Math.min(99999999, Math.max(parseInt(args[2]), 1)) : !args[2] || args.length < 4 ? 1 :Math.min(1, count) + switch (_type) { + case 'p': + break + default: + return conn.reply(m.chat, list,m) + } + + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'shop.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*',m) + + } + } + } +} + +handler.help = ['eat', 'makan'] +handler.tags = ['rpg'] +handler.register = true +handler.command = /^(eat|makan)$/i +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-maling.js b/plugins/rpg-maling.js new file mode 100644 index 0000000000000000000000000000000000000000..9c3a37ca6fceb053b0c0623ddcfcc15d7b6619fc --- /dev/null +++ b/plugins/rpg-maling.js @@ -0,0 +1,46 @@ +const timeout = 604800000 + +let handler = async (m, { conn, usedPrefix, text }) => { + let time = global.db.data.users[m.sender].lastmaling + 604800000 + if (new Date - global.db.data.users[m.sender].lastmaling< 604800000) return conn.reply(m.chat, `Anda sudah merampok bank\nTunggu selama ${msToTime(time - new Date())} lagi`, m) + let money = `${Math.floor(Math.random() * 30000)}`.trim() + let exp = `${Math.floor(Math.random() * 999)}`.trim() + let kardus = `${Math.floor(Math.random() * 1000)}`.trim() + global.db.data.users[m.sender].money += money * 1 + global.db.data.users[m.sender].exp += exp * 1 + global.db.data.users[m.sender].kardus += kardus * 1 + global.db.data.users[m.sender].lastmaling = new Date * 1 + conn.reply(m.chat, `Selamat kamu mendapatkan : \n+${money} Money\n+${kardus} Kardus\n+${exp} Exp`, m) +} +handler.help = ['maling'] +handler.tags = ['rpg'] +handler.command = /^(maling)/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.limit = false +handler.exp = 0 +handler.money = 0 + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return hours + " jam " + minutes + " menit " + seconds + " detik" +} \ No newline at end of file diff --git a/plugins/rpg-mancing.js b/plugins/rpg-mancing.js new file mode 100644 index 0000000000000000000000000000000000000000..3a679e25f329d3ca6a45976afa0a8e31a5c16b01 --- /dev/null +++ b/plugins/rpg-mancing.js @@ -0,0 +1,92 @@ +let { + MessageType +} = require('@adiwajshing/baileys'); + +let wm = global.wm; +let handler = async (m, { + conn, + usedPrefix, + owner +}) => { + let lastFishingTime = global.db.data.users[m.sender].lastmancing || 0; + let timeDiff = Date.now() - lastFishingTime; + let remainingTime = 180000 - timeDiff; + + if (global.db.data.users[m.sender].fishingrod > 0) { + if (timeDiff >= 180000) { + let ikan = Math.floor(Math.random() * 30); + let lele = Math.floor(Math.random() * 15); + let nila = Math.floor(Math.random() * 10); + let bawal = Math.floor(Math.random() * 10); + let udang = Math.floor(Math.random() * 39); + let paus = Math.floor(Math.random() * 2); + let kepiting = Math.floor(Math.random() * 27); + + let imageUrl = 'https://pomf2.lain.la/f/arit56zv.jpg'; + let totalCatch = nila + bawal + ikan + lele + udang + paus + kepiting; + + let mcng = `โ€ข *Hasil Mancing:* + +โ—ฆ ๐ŸŸ Ikan nila: ${nila} +โ—ฆ ๐Ÿก Bawal: ${bawal} +โ—ฆ ๐ŸŸ Lele: ${lele} +โ—ฆ ๐ŸŸ Ikan: ${ikan} +โ—ฆ ๐Ÿฆ Udang: ${udang} +โ—ฆ ๐Ÿ‹ Paus: ${paus} +โ—ฆ ๐Ÿฆ€ Kepiting: ${kepiting}`; + + setTimeout(() => { + conn.sendFile(m.chat, imageUrl, 'mancing.jpg', mcng, m); + }, 28000); + setTimeout(() => { + conn.reply(m.chat, `umpan di makan ikan!!, kamu tarik pancing nya!`, m) + }, 18000); + setTimeout(() => { + conn.reply(m.chat, `tunggu sampai ikan makan umpan`, m) + }, 8000); + setTimeout(() => { + conn.reply(m.chat, `pergi mancing๐ŸŽฃ`, m) + }, 0); + + global.db.data.users[m.sender].nila += nila; + global.db.data.users[m.sender].ikan += ikan; + global.db.data.users[m.sender].lele += lele; + global.db.data.users[m.sender].bawal += bawal; + global.db.data.users[m.sender].udang += udang; + global.db.data.users[m.sender].lastmancing = Date.now(); + global.db.data.users[m.sender].udang += udang; + global.db.data.users[m.sender].paus += paus ; + global.db.data.users[m.sender].udang += udang; + global.db.data.users[m.sender].kepiting += kepiting ; + global.db.data.users[m.sender].fishingrod -= 1; + global.db.data.users[m.sender].totalPancingan += totalCatch; + } else { + let remainingTimeStr = formatTime(remainingTime); + conn.reply(m.chat, `kamu baru mancing, tunggu selama ${remainingTimeStr}`, m); + } + } else { + conn.reply(m.chat, '[โ—] kamu gak punya pancingan\' bikin dulu di craft ๐ŸŽฃ', m); + } +} + +handler.help = ['mancing']; +handler.tags = ['rpg']; +handler.command = /^(mancing|memancing)$/i; + +module.exports = handler; + +function formatTime(ms) { + let seconds = Math.floor(ms / 1000); + let minutes = Math.floor(seconds / 60); + let hours = Math.floor(minutes / 60); + + seconds %= 60; + minutes %= 60; + hours %= 24; + + let hStr = hours.toString().padStart(2, '0'); + let mStr = minutes.toString().padStart(2, '0'); + let sStr = seconds.toString().padStart(2, '0'); + + return `${hStr}:${mStr}:${sStr}`; +} diff --git a/plugins/rpg-masak.js b/plugins/rpg-masak.js new file mode 100644 index 0000000000000000000000000000000000000000..382b6224fd1c223c1edf01569ede33c9e6320d89 --- /dev/null +++ b/plugins/rpg-masak.js @@ -0,0 +1,199 @@ +let handler = async (m, { + command, + usedPrefix, + DevMode, + args +}) => { + let type = (args[0] || '').toLowerCase() + let msk = (args[0] || '').toLowerCase() + let user = global.db.data.users[m.sender] + let author = global.author +let cok = `ใ€Œ *C O O K I N G* ใ€ + + +โ–ง ayambakar ๐Ÿ– +ใ€‰Need 2 ayam ๐Ÿ“ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง ayamgoreng ๐Ÿ— +ใ€‰Need 2 ayam ๐Ÿ“ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง oporayam ๐Ÿœ +ใ€‰Need 2 ayam ๐Ÿ“ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง steak ๐Ÿฅฉ +ใ€‰Need 2 sapi ๐Ÿฎ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง rendang ๐Ÿฅ˜ +ใ€‰Need 2 sapi ๐Ÿฎ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง gulaiayam ๐Ÿฒ +ใ€‰Need 2 ayam ๐Ÿ“ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง babipanggang ๐Ÿฅ  +ใ€‰Need 2 babi ๐Ÿ– & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง ikan bakar ๐ŸŸ +ใ€‰Need 2 ikan ๐ŸŸ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง lele bakar ๐ŸŸ +ใ€‰Need 2 lele ๐ŸŸ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง nila bakar ๐ŸŸ +ใ€‰Need 2 nila ๐ŸŸ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง bawal bakar ๐ŸŸ +ใ€‰Need 2 bawal ๐ŸŸ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง udang bakar ๐Ÿฆ +ใ€‰Need 2 udang ๐Ÿฆ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง paus bakar ๐Ÿณ +ใ€‰Need 2 paus ๐Ÿณ & 1 Coal ๐Ÿ•ณ๏ธ +โ–ง kepiting bakar ๐Ÿฆ€ +ใ€‰Need 2 kepiting ๐Ÿฆ€ & 1 Coal ๐Ÿ•ณ๏ธ + +โ€ข *Example :* .masak ayambakar + +gunakan spasi` + +try { + if (/masak|cook/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(5, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count) + switch (type) { + case 'ayambakar': + if (user.ayam < count * 2 || user.coal < 1 * count) { + user.ayam >= count * 1 + user.ayam -= count * 2 + user.coal -= count * 1 + user.ayambakar += count * 1 + conn.reply(m.chat, `Sukses memasak ${count} ayam bakar๐Ÿ–`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak ayam bakar\nAnda butuh 2 ayam dan 1 coal untuk memasak`, m) + break + case 'gulaiayam': + if (user.ayam < count * 2 || user.coal < 1 * count) { + user.ayam >= count * 1 + user.ayam -= count * 2 + user.coal -= count * 1 + user.gulai += count * 1 + conn.reply(m.chat, `Sukses memasak ${ count } Gulai Ayam๐Ÿœ`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak gulai ayam\nAnda butuh 2 ayam dan 1 coal untuk memasak`, m) + break + case 'rendang': + if (user.sapi < count * 2 || user.coal < 1 * count) { + user.sapi >= count * 1 + user.sapi -= count * 2 + user.coal -= count * 1 + user.rendang += count * 1 + conn.reply(m.chat, `Sukses memasak ${ count } Rendang ๐Ÿœ`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak dimasak rendang\nAnda butuh 2 sapi dan 1 coal untuk memasak`, m) + break + case 'ayamgoreng': + if (user.ayam < count * 2 || user.coal < 1 * count) { + user.ayam >= count * 1 + user.ayam -= count * 2 + user.coal -= count * 1 + user.ayamgoreng += count * 1 + conn.reply(m.chat, `Sukses memasak ${ count } ayam goreng๐Ÿ—`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak ayam goreng\nAnda butuh 2 ayam dan 1 coal untuk memasak`, m) + break + case 'oporayam': + if (user.ayam < count * 2 || user.coal < 1 * count) { + user.ayam >= count * 1 + user.ayam -= count * 2 + user.coal -= count * 1 + user.oporayam += count * 1 + conn.reply(m.chat, `Sukses memasak ${ count } opor ayam`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak opor ayam\nAnda butuh 2 ayam dan 1 coal untuk memasak`, m) + break + case 'steak': + if (user.sapi < count * 2 || user.coal < 1 * count) { + user.sapi >= count * 1 + user.sapi -= count * 2 + user.coal -= count * 1 + user.steak += count * 1 + conn.reply(m.chat, `Sukses memasak ${ count } Steak`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak steak\nAnda butuh 2 sapi dan 1 coal untuk memasak`, m) + break + case 'babipanggang': + if (user.babi < count * 2 || user.coal < 1 * count) { + user.babi >= count * 1 + user.babi -= count * 2 + user.coal -= count * 1 + user.babipanggang += count * 1 + conn.reply(m.chat, `Sukses memasak ${ count } babi panggang`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak babi panggang\nAnda butuh 2 babi dan 1 coal untuk memasak`, m) + break + case 'ikanbakar': + if (user.ikan < count * 2 || user.coal < 1 * count) { + user.ikan >= count * 1 + user.ikan -= count * 2 + user.coal -= count * 1 + user.ikanbakar += count * 1 + conn.reply(m.chat, `Sukses memasak ${count} ikan bakar๐Ÿ–`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak ikan bakar\nAnda butuh 2 ikan dan 1 coal untuk memasak`, m) + break + case 'lelebakar': + if (user.lele < count * 2 || user.coal < 1 * count) { + user.lele >= count * 1 + user.lele -= count * 2 + user.coal -= count * 1 + user.lelebakar += count * 1 + conn.reply(m.chat, `Sukses memasak ${count} lele bakar๐Ÿ–`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak lele bakar\nAnda butuh 2 lele dan 1 coal untuk memasak`, m) + break + case 'nilabakar': + if (user.nila < count * 2 || user.coal < 1 * count) { + user.nila >= count * 1 + user.nila -= count * 2 + user.coal -= count * 1 + user.nilabakar += count * 1 + conn.reply(m.chat, `Sukses memasak ${count} nila bakar๐Ÿ–`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak nila bakar\nAnda butuh 2 nila dan 1 coal untuk memasak`, m) + break + case 'bawalbakar': + if (user.bawal < count * 2 || user.coal < 1 * count) { + user.bawal >= count * 1 + user.bawal -= count * 2 + user.coal -= count * 1 + user.bawalbakar += count * 1 + conn.reply(m.chat, `Sukses memasak ${count} bawal bakar๐Ÿ–`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak bawal bakar\nAnda butuh 2 bawal dan 1 coal untuk memasak`, m) + break + case 'udangbakar': + if (user.udang < count * 2 || user.coal < 1 * count) { + user.udang >= count * 1 + user.udang -= count * 2 + user.coal -= count * 1 + user.udangbakar += count * 1 + conn.reply(m.chat, `Sukses memasak ${count} udang bakar๐Ÿ–`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak udang bakar\nAnda butuh 2 udang dan 1 coal untuk memasak`, m) + break + case 'pausbakar': + if (user.paus < count * 2 || user.coal < 1 * count) { + user.paus >= count * 1 + user.paus -= count * 2 + user.coal -= count * 1 + user.pausbakar += count * 1 + conn.reply(m.chat, `Sukses memasak ${count} paus bakar๐Ÿ–`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak paus bakar\nAnda butuh 2 paus dan 1 coal untuk memasak`, m) + break + case 'kepitingbakar': + if (user.kepiting < count * 2 || user.coal < 1 * count) { + user.kepiting >= count * 1 + user.kepiting -= count * 2 + user.coal -= count * 1 + user.kepitingbakar += count * 1 + conn.reply(m.chat, `Sukses memasak ${count} kepiting bakar๐Ÿ–`, m) + } else conn.reply(m.chat, `Anda tidak memiliki bahan untuk memasak kepiting bakar\nAnda butuh 2 kepiting dan 1 coal untuk memasak`, m) + break + default: + await conn.reply(m.chat, cok, m) + + // }) + } + } + } catch (e) { + conn.reply(m.chat, `Sepertinya ada yg eror,coba laporin ke owner deh`, m) + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'shop.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', MessageType.text) + } + } + } +} + +handler.help = ['masak <masakan> <args>', 'cook <masakan> <args>'] +handler.tags = ['rpg'] +handler.group = true +handler.command = /^(masak|cook)$/i + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-membunuh.js b/plugins/rpg-membunuh.js new file mode 100644 index 0000000000000000000000000000000000000000..de3f81bc4845049b9b71fb03dcfebd46c4207345 --- /dev/null +++ b/plugins/rpg-membunuh.js @@ -0,0 +1,43 @@ +// let pajak = 0.02 +let handler = async (m, { conn, text, usedPrefix, command }) => { +let dapat = (Math.floor(Math.random() * 100000)) +let healtu = (Math.floor(Math.random() * 100)) +let nomors = m.sender + let who + if (m.isGroup) who = m.mentionedJid[0] + else who = m.chat + if (!who) return conn.reply(m.chat, 'Tag salah satu lah', m) + if (typeof db.data.users[who] == 'undefined') throw 'Pengguna tidak ada didalam data base' + let __timers = (new Date - global.db.data.users[m.sender].lastbunuhi) + let _timers = (3600000 - __timers) + let timers = clockString(_timers) + let users = global.db.data.users + if (new Date - global.db.data.users[m.sender].lastbunuhi > 3600000){ + if (10 > users[who].healt) throw 'Target sudah tidak memiliki healt' + if (100 > users[who].money) throw 'Target tidak memiliki apapun :(' + users[who].healt -= healtu * 1 + users[who].money -= dapat * 1 + users[m.sender].money += dapat * 1 + global.db.data.users[m.sender].lastbunuhi = new Date * 1 + conn.reply(m.chat, `Target berhasil di bunuh dan kamu mengambil money target sebesar\n${dapat} Money\nDarah target berkurang -${healtu} Healt`, m) +}else conn.reply(m.chat, `Anda sudah membunuh orang dan berhasil sembunyi , tunggu ${timers} untuk membunuhnya lagi`, m) +} + +handler.help = ['membunuh *@user*'] +handler.tags = ['rpg'] +handler.command = /^membunuh$/ +handler.limit = true +handler.group = true + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ms,h,m,s}) + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-merampok.js b/plugins/rpg-merampok.js new file mode 100644 index 0000000000000000000000000000000000000000..603a92f7875092ffa2bcac6bd696c7c6ff361af5 --- /dev/null +++ b/plugins/rpg-merampok.js @@ -0,0 +1,40 @@ +// let pajak = 0.02 +let handler = async (m, { conn, text, usedPrefix, command }) => { +let dapat = (Math.floor(Math.random() * 100000)) +let nomors = m.sender + let who + if (m.isGroup) who = m.mentionedJid[0] + else who = m.chat + if (!who) return conn.reply(m.chat, 'Tag salah satu lah', m) + if (typeof db.data.users[who] == 'undefined') throw 'Pengguna tidak ada didalam data base' + let __timers = (new Date - global.db.data.users[m.sender].lastrob) + let _timers = (3600000 - __timers) + let timers = clockString(_timers) + let users = global.db.data.users + if (new Date - global.db.data.users[m.sender].lastrob > 3600000){ + if (10000 > users[who].money) throw 'Target Gaada Uang bodoh, Kismin dia' + users[who].money -= dapat * 1 + users[m.sender].money += dapat * 1 + global.db.data.users[m.sender].lastrob = new Date * 1 + conn.reply(m.chat, `Berhasil Merampok Money Target Sebesar ${dapat}`, m) + +}else conn.reply(m.chat, `Anda Sudah merampok dan berhasil sembunyi , tunggu ${timers} untuk merampok lagi`, m) +} +handler.help = ['merampok *@user*'] +handler.tags = ['rpg'] +handler.command = /^merampok$/ +handler.limit = true +handler.group = true + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ms,h,m,s}) + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-moneytopoin.js b/plugins/rpg-moneytopoin.js new file mode 100644 index 0000000000000000000000000000000000000000..92069a3ccc588f802e9c114f495923fd4b874501 --- /dev/null +++ b/plugins/rpg-moneytopoin.js @@ -0,0 +1,31 @@ +let handler = async (m, { args }) => { + if (args.length !== 1) { + return conn.reply(m.chat, 'Silakan masukkan jumlah uang yang ingin diubah menjadi poin! Contoh: .moneytopoin 1000', m) + } + let money = parseInt(args[0]) + if (isNaN(money) || money <= 0) { + throw 'Jumlah uang yang dimasukkan harus angka positif!' + } + let fee = Math.floor(money * 0.5) + let poin = Math.floor(money * 0.5) + let message = `โ€ข Kamu menconvert uang senilai ${money}\n` + message += `โ€ข Dan kamu mendapatkan poin senilai ${poin}\n` + message += `โ€ข Biaya fee kamu adalah ${fee}` + let user = global.db.data.users[m.sender] + if (!user) { + user = { poin: 0 } + global.db.data.users[m.sender] = user + } + user.poin = (user.poin || 0) + poin + user.money -= money + global.db.write() + conn.reply(m.chat, message, m) +} + +handler.help = ['moneytopoin *<amount>*'] +handler.tags = ['rpg'] +handler.command = /^moneytopoin$/i +handler.register = true +handler.limit = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-mulung.js b/plugins/rpg-mulung.js new file mode 100644 index 0000000000000000000000000000000000000000..d9ddafdc11089c968c0ae9fc1ee2ded64ef30809 --- /dev/null +++ b/plugins/rpg-mulung.js @@ -0,0 +1,39 @@ +const timeout = 28800000 + +let handler = async (m, { conn, usedPrefix, text }) => { + let time = global.db.data.users[m.sender].lastturu + 28800000 + if (new Date - global.db.data.users[m.sender].lastturu< 28800000) throw `Anda sudah memulung\nMohon tunggu selama ${msToTime(time - new Date())} untuk mulung lagi` + let botolnye = `${Math.floor(Math.random() * 1000)}`.trim() + let kalengnye = `${Math.floor(Math.random() * 1000)}`.trim() + let kardusnye = `${Math.floor(Math.random() * 1000)}`.trim() + global.db.data.users[m.sender].botol += botolnye * 1 + global.db.data.users[m.sender].kaleng += kalengnye * 1 + global.db.data.users[m.sender].kardus += kardusnye * 1 + global.db.data.users[m.sender].lastturu = new Date * 1 + conn.reply(m.chat, `Selamat kamu mendapatkan : \n+${botolnye} Botol\n+${kardusnye} Kardus\n+${kalengnye} Kaleng`, m) +} +handler.help = ['mulung'] +handler.tags = ['rpg'] +handler.command = /^(mulung)/i +handler.group = true + +handler.fail = null +handler.limit = true +handler.exp = 0 +handler.money = 0 + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return hours + " jam " + minutes + " menit " + seconds + " detik" +} \ No newline at end of file diff --git a/plugins/rpg-nambang.js b/plugins/rpg-nambang.js new file mode 100644 index 0000000000000000000000000000000000000000..c7c13a519522f779d6c7e5c6ec51877739c13bb1 --- /dev/null +++ b/plugins/rpg-nambang.js @@ -0,0 +1,50 @@ +const timeout = 28800000 + +let handler = async (m, { conn, usedPrefix, text }) => { + // let timerand = `${Math.floor(Math.random() * 259200000)}`.trim() + let time = global.db.data.users[m.sender].lastnambang + 28800000 + if (new Date - global.db.data.users[m.sender].lastnambang< 28800000) throw `Anda sudah menambang\nMohon tunggu hasil pertambangan mu\nTunggu selama ${msToTime(time - new Date())} lagi` + // if (global.db.data.users[m.sender].aqua > 9) { + // let aquah = `${Math.floor(Math.random() * 5)}`.trim() + let berlians = `${Math.floor(Math.random() * 3)}`.trim() + let emasbiasas = `${Math.floor(Math.random() * 4)}`.trim() + let emasbatangs = `${Math.floor(Math.random() * 3)}`.trim() + // global.db.data.users[m.sender].aqua -= aquah * 1 + global.db.data.users[m.sender].berlian += berlians * 1 + global.db.data.users[m.sender].emas += emasbiasas * 1 + global.db.data.users[m.sender].diamond += emasbatangs * 1 + global.db.data.users[m.sender].tiketcoin += 1 + /*let pisangnye = `${Math.floor(Math.random(global.db.data.users[m.sender].pisang = pisangpoin) * 1)}`.trim() + let jeruknye = `${Math.floor(Math.random(global.db.data.users[m.sender].jeruk = jerukpoin) * 1)}`.trim() + let mangganye = `${Math.floor(Math.random(global.db.data.users[m.sender].mangga = manggapoin) * 1)}`.trim() + let anggurnye = `${Math.floor(Math.random(global.db.data.users[m.sender].anggur = anggurpoin) * 1)}`.trim() + let apelnye = `${Math.floor(Math.random(global.db.data.users[m.sender].apel = apelpoin) * 10000)}`.trim()*/ + global.db.data.users[m.sender].lastnambang = new Date * 1 + // else conn.reply(m.chat, 'Minimal 10 Aqua untuk kamu menambang, karena menambang membutuhkan energi, seperti mendapat dia >,,<', m) + conn.reply(m.chat, `Selamat kamu mendapatkan : \n+${berlians} Berlian\n+${emasbiasas} Emas\n+${emasbatangs} Diamond\n\n+1 Tiketcoin`, m) +} +handler.help = ['nambang'] +handler.tags = ['rpg'] +handler.command = /^(nambang)/i +handler.group = true + +handler.fail = null +handler.limit = true +handler.exp = 0 +handler.money = 0 + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return hours + " jam " + minutes + " menit " + seconds + " detik" +} \ No newline at end of file diff --git a/plugins/rpg-nebang.js b/plugins/rpg-nebang.js new file mode 100644 index 0000000000000000000000000000000000000000..089741b963070563dd451e91d4c30fa0e60c73a5 --- /dev/null +++ b/plugins/rpg-nebang.js @@ -0,0 +1,44 @@ +const timeout = 28800000 + +let handler = async (m, { conn, usedPrefix, text }) => { + // let timerand = `${Math.floor(Math.random() * 259200000)}`.trim() + let time = global.db.data.users[m.sender].lastnebang + 28800000 + if (new Date - global.db.data.users[m.sender].lastnebang< 28800000) throw `Anda sudah nebang\nMohon tunggu hasil nebang mu\nTunggu selama ${msToTime(time - new Date())} lagi` + // if (global.db.data.users[m.sender].aqua > 9) { + // let aquah = `${Math.floor(Math.random() * 5)}`.trim() + let kayu = `${Math.floor(Math.random() * 45)}`.trim() + // global.db.data.users[m.sender].aqua -= aquah * 1 + global.db.data.users[m.sender].kayu += kayu * 1 + /*let pisangnye = `${Math.floor(Math.random(global.db.data.users[m.sender].pisang = pisangpoin) * 1)}`.trim() + let jeruknye = `${Math.floor(Math.random(global.db.data.users[m.sender].jeruk = jerukpoin) * 1)}`.trim() + let mangganye = `${Math.floor(Math.random(global.db.data.users[m.sender].mangga = manggapoin) * 1)}`.trim() + let anggurnye = `${Math.floor(Math.random(global.db.data.users[m.sender].anggur = anggurpoin) * 1)}`.trim() + let apelnye = `${Math.floor(Math.random(global.db.data.users[m.sender].apel = apelpoin) * 10000)}`.trim()*/ + global.db.data.users[m.sender].lastnebang = new Date * 1 + conn.reply(m.chat, `Selamat kamu mendapatkan : \n๐ŸชตKayu\n+sebanyak: ${kayu}`, m) +} +handler.help = ['nebang'] +handler.tags = ['rpg'] +handler.command = /^(nebang)/i +handler.group = true + +handler.fail = null +handler.limit = true +handler.exp = 0 +handler.money = 0 + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return hours + " jam " + minutes + " menit " + seconds + " detik" +} \ No newline at end of file diff --git a/plugins/rpg-ngaji.js b/plugins/rpg-ngaji.js new file mode 100644 index 0000000000000000000000000000000000000000..ed54d86ecbb2e6f6c7f4d050b4e5615002e28929 --- /dev/null +++ b/plugins/rpg-ngaji.js @@ -0,0 +1,88 @@ +let handler = async (m, { conn }) => { + let lastngaji = global.db.data.users[m.sender]?.lastngaji || 0 + let timers = 300000 - (Date.now() - lastngaji) + let name = conn.getName(m.sender) + let user = global.db.data.users[m.sender] + + if (timers <= 0) { + let randomaku1 = Math.floor(Math.random() * 10) + let randomaku2 = Math.floor(Math.random() * 10) + let randomaku4 = Math.floor(Math.random() * 5) + let randomaku3 = Math.floor(Math.random() * 10) + let randomaku5 = Math.floor(Math.random() * 10) + + let rbrb1 = randomaku1 * 2 + let rbrb2 = randomaku2 * 10 + let rbrb3 = randomaku3 * 1 + let rbrb4 = randomaku4 * 15729 + let rbrb5 = randomaku5 * 20000 + + var dimas = ` +Ketemu ustadz... +` + + var dimas2 = ` +Mulai mengaji +` + + var dimas3 = ` +Diajarin tajwid +` + + var dimas4 = ` +Ngasih tau, kalo qalqalah itu dipantulkan +` + + var hsl = ` +*โ€”[ Hasil Ngaji ${name} ]โ€”* +โž•๐Ÿ’น Uang jajan: ${rbrb4} +โž•โœจ Exp: ${rbrb5} +โž•๐Ÿคฌ Dimarahin: -1 +` + + user.warn -= 1 + user.money += rbrb4 + user.exp += rbrb5 + + setTimeout(() => { + conn.reply(m.chat, `${hsl}`, m) + }, 27000) + + setTimeout(() => { + conn.reply(m.chat, `${dimas4}`, m) + }, 25000) + + setTimeout(() => { + conn.reply(m.chat, `${dimas3}`, m) + }, 20000) + + setTimeout(() => { + conn.reply(m.chat, `${dimas2}`, m) + }, 15000) + + setTimeout(() => { + conn.reply(m.chat, `${dimas}`, m) + }, 10000) + + setTimeout(() => { + conn.reply(m.chat, `Mencari Guru Ngaji.....`, m) + }, 0) + user.lastngaji = Date.now() + } else { + let clock = clockString(timers) + conn.reply(m.chat, `Sepertinya Kamu Sudah Kecapekan Silahkan Istirahat Dulu Selama\n*${clock}*`, m) + } +} +handler.help = ['mengaji', 'ngaji'] +handler.tags = ['rpg'] +handler.command = /^(mengajikeliling|mengaji|ngaji|ustad|ustadz|ustaz)$/i +handler.register = true + +module.exports = handler + +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + return [h, m, s].map(v => v.toString().padStart(2, '0')).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-ngentot.js b/plugins/rpg-ngentot.js new file mode 100644 index 0000000000000000000000000000000000000000..008ca35989a10f96d5b88c14643b6d114337895b --- /dev/null +++ b/plugins/rpg-ngentot.js @@ -0,0 +1,129 @@ +let handler = async (m, { conn, usedPrefix }) => { + let __timers = new Date() - global.db.data.users[m.sender].lastngewe; + let _timers = 3600000 - __timers; + let order = global.db.data.users[m.sender].ngewe + let user = global.db.data.users[m.sender]; + let timers = clockString(_timers); + let name = user.registered ? user.name : conn.getName(m.sender); + let id = m.sender; + let kerja = "openbo"; + conn.misi = conn.misi ? conn.misi : {}; + if (id in conn.misi) { + conn.reply( + m.chat, + `Selesaikan Misi ${conn.misi[id][0]} Terlebih Dahulu`, + m + ); + throw false; + } + if (user.healt < 80) return m.reply(`Anda Harus Memiliki Minimal 80Healt`); + if (user.stamina < 50) + return m.reply( + `Stamina Mu Tidak Cukup Cobalah Makan / minum Sesuatu .`.trim() + ); + //if (user.kondom == 0) + //return m.reply("Kamu Tidak Memiliki Kondom Beli Lah Terlebih Dahulu"); + if (new Date() - global.db.data.users[m.sender].lastngewe > 3600000) { + let ngerok4 = Math.floor(Math.random() * 10); + let ngerok5 = Math.floor(Math.random() * 10); + + let ngrk4 = ngerok4 * 100000; + let ngrk5 = ngerok5 * 1000; + + let rokit = `๐Ÿ“ฒ Orderan Masuk dari [ Om Teguh ] + +แด‹แด€แดแดœ แด…แด€ษด แดแด แด›แด‡ษขแดœสœ แดแด‡แดส™แดแดแด‹ษชษดษข สœแดแด›แด‡สŸ +โ–’โ–’[แดสแด]โ–’โ–’ +โ–’โ–’โ–„โ–„โ–„โ–’โ–’ Kalian Berdua Masuk Ke kamar +โ–’โ–ˆโ–€โ–ˆโ–€โ–ˆโ–’ kamu Membuka bh mu +โ–‘โ–ˆโ–€โ–ˆโ–€โ–ˆโ–‘ Tete Mu diremas oleh om tgh +โ–‘โ–ˆโ–€โ–ˆโ–€โ–ˆโ–‘ ( . )( . ) +โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ. | ๐Ÿคš | + + +Om Teguh Mulai Memasukan Kelamin nya ke dalam vagina mu.... +`.trim(); + + let rokit2 = `Kamu Kesakitan ... + +(_)(_)=====D \()/ + +Rahim mu terasa hangat +`.trim(); + + let rokit3 = `Om teguh pun crott + +()()=====D ๐Ÿ’ฆ๐Ÿ’ฆ๐Ÿ’ฆ + + +โœ… Orderan Selesai +`.trim(); + + let rokit4 = `Om Teguh Memberimu Uang Lebih karena Goyanganmu Sangat unik ๐Ÿ˜ +`.trim(); + + let hsl = ` +*โ€”[ Hasil Ngentot ${name} ]โ€”* +โž• ๐Ÿ’น Uang = [ ${ngrk4} ] +โž• โœจ Exp = [ ${ngrk5} ] +โž• ๐Ÿ˜ Order BO Selesai = +1 +โž• ๐Ÿ“ฅTotal Bookingan : ${order} +`.trim(); + + user.money += ngrk4; + user.exp += ngrk5; + user.warn += 1; + user.ngewe += 1; + user.healt -= 80; + user.stamina -= 40; + + conn.misi[id] = [ + kerja, + setTimeout(() => { + delete conn.misi[id]; + }, 27000), + ]; + + setTimeout(() => { + conn.reply(m.chat, hsl, m); + }, 27000); + + setTimeout(() => { + conn.reply(m.chat, rokit4, m); + }, 25000); + + setTimeout(() => { + conn.reply(m.chat, rokit3, m); + }, 20000); + + setTimeout(() => { + conn.reply(m.chat, rokit2, m); + }, 15000); + + setTimeout(() => { + conn.reply(m.chat, rokit, m); + }, 10000); + + setTimeout(() => { + conn.reply(m.chat, `๐Ÿ” ${name} Mencari Om Om.....`, m); + }, 0); + user.lastngewe = new Date() * 1; + } else + m.reply( + `Silahkan Menunggu Selama ${timers}, Untuk Melakukan ngentot lagi` + ); +}; +handler.help = ["ngentot"]; +handler.tags = ["rpg"]; +handler.command = /^(ngentot)$/i; +handler.register = true; +handler.group = true; +handler.level = 70; +module.exports = handler; + +function clockString(ms) { + let h = Math.floor(ms / 3600000); + let m = Math.floor(ms / 60000) % 60; + let s = Math.floor(ms / 1000) % 60; + return [h, m, s].map((v) => v.toString().padStart(2, 0)).join(":"); +} \ No newline at end of file diff --git a/plugins/rpg-ngepet.js b/plugins/rpg-ngepet.js new file mode 100644 index 0000000000000000000000000000000000000000..5c2db73afcbbf2212d6c6513917383bc071f60ab --- /dev/null +++ b/plugins/rpg-ngepet.js @@ -0,0 +1,92 @@ +let handler = async (m, { conn, args, usedPrefix }) => { + try { + global.DATABASE.data.users[m.sender].lastngepet = global.db.data.users[m.sender].lastngepet || 0 + let randomaku = `${Math.floor(Math.random() * 150)}`.trim() + let randomkamu = `${Math.floor(Math.random() * 20)}`.trim() // Increased chances of failure + let Aku = (randomaku * 1) + let Kamu = (randomkamu * 1) + let temout = 'https://telegra.ph/file/d9fdd23790ab42280ca30.jpg' + let kngepet = 'https://telegra.ph/file/eff11a638fed2a3260b8f.jpg' + let mngepet = 'https://telegra.ph/file/a1410ce010b59486bc122.jpg' + + let botol = global.wm + + let __timers = (new Date - global.db.data.users[m.sender].lastngepet) + let _timers = (18000000 - __timers) + let timers = clockString(_timers) + let user = global.db.data.users[m.sender] + if (new Date - global.db.data.users[m.sender].lastngepet > 18000000) { // Changed to 5 hours + if (Aku > Kamu) { + conn.sendMessage(m.chat, { + text: `Kamu lengah Saat Ngepet, Dan Kamu Mines -10 juta`, + contextInfo: { + externalAdReply: { + title: 'Nooo, Kamu sekarang memiliki hutang 10JT ๐Ÿ˜ž', + body: wm, + thumbnailUrl: 'https://telegra.ph/file/c6c4a6946a354317fe970.jpg', + mediaType: 1, + showAdAttribution: true, + renderLargerThumbnail: true + } + } + }) + user.money -= 10000000 // Penalty for failed robbery is -20 million + global.db.data.users[m.sender].lastngepet = new Date * 1 + } else if (Aku < Kamu) { + user.money += 5000000 // Reward for successful robbery is 10 million + conn.sendMessage(m.chat, { + text: `Kamu berhasil Ngepet, Dan kamu mendapatkan 5 Juta rupiah`, + contextInfo: { + externalAdReply: { + title: 'Selamat Telah Mendapatkan 5JT', + body: wm, + thumbnailUrl: 'https://telegra.ph/file/6a6a440d7f123bed78263.jpg', + mediaType: 1, + showAdAttribution: true, + renderLargerThumbnail: true + } + } + }) + global.db.data.users[m.sender].lastngepet = new Date * 1 + } else { + conn.sendMessage(m.chat, `Maaf kamu tidak mendapatkan *Duit* dan kamu tidak masuk Dunia Lain karna melarikan diri\n${botol}`, m) + global.db.data.users[m.sender].lastngepet = new Date * 1 + } + } else conn.sendMessage(m.chat, { + text: `Kamu sudah melakukan *ngepet*\nDan kamu harus menunggu selama agar bisa ngepet kembali ${timers}`, + contextInfo: { + externalAdReply: { + title: 'C O O L D O W N', + body: `${timers}`, + thumbnailUrl: 'https://telegra.ph/file/295949ff5494f3038f48c.jpg', + mediaType: 1, + showAdAttribution: true, + renderLargerThumbnail: true + } + } + }) + } catch (e) { + throw `${e}` + } +} + +handler.help = ['ngepet'] +handler.tags = ['rpg'] +handler.command = /^(ngepet|ngefet)$/i +handler.premium = true +handler.group = true + +handler.fail = null + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(Math.random() * list.length)] +} +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ms,h,m,s}) + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-ngewe.js b/plugins/rpg-ngewe.js new file mode 100644 index 0000000000000000000000000000000000000000..38999662d3ae8af5c7ff77ca535f0b810f4b0a47 --- /dev/null +++ b/plugins/rpg-ngewe.js @@ -0,0 +1,75 @@ +let handler = async (m, { conn }) => { + let __timers = (new Date - global.db.data.users[m.sender].lastngewe) + let _timers = (300000 - __timers) + let order = global.db.data.users[m.sender].ngewe + let timers = clockString(_timers) +let name = conn.getName(m.sender) + let user = global.db.data.users[m.sender] + + if (new Date - global.db.data.users[m.sender].lastngewe > 300000) { +let randomaku1 = `${Math.floor(Math.random() * 10)}` +let randomaku2 = `${Math.floor(Math.random() * 10)}` +let randomaku4 = `${Math.floor(Math.random() * 5)}` +let randomaku3 = `${Math.floor(Math.random() * 10)}` +let randomaku5 = `${Math.floor(Math.random() * 10)}` + +.trim() + +let rbrb1 = (randomaku1 * 2) +let rbrb2 = (randomaku2 * 10) +let rbrb3 = (randomaku3 * 1) +let rbrb4 = (randomaku4 * 15729) +let rbrb5 = (randomaku5 * 20000) + +var zero1 = `${rbrb1}` +var zero2 = `${rbrb2}` +var zero3 = `${rbrb3}` +var zero4 = `${rbrb4}` +var zero5 = `${rbrb5}` + +let arr = [ +"โœ”๏ธ Mendapatkan pelanggan....", +"๐Ÿฅต Mulai mengocok.....", +`๐ŸฅตAhhhh, Sakitttt!! >////< + ๐Ÿ’ฆCrotttt.....`, +"๐Ÿฅต๐Ÿ’ฆ๐Ÿ’ฆAhhhhhh๐Ÿ˜ซ", +`*โ€”[ Hasil Ngewe ${name} ]โ€”* +โž• ๐Ÿ’น Uang = [ ${zero4} ] +โž• โœจ Exp = [ ${zero5} ] +โž• ๐Ÿ“› Warn = +1 +โž• ๐Ÿ˜ Order Selesai = +1 +โž• ๐Ÿ“ฅTotal Order Sebelumnya : ${order} +${wm}`, +] + +let { key } = await conn.sendMessage(m.chat, {text: '๐Ÿ”Mencari pelanggan.....'}) +for (let i = 0; i < arr.length; i++) { + await new Promise(resolve => setTimeout(resolve, 10000)); + await conn.sendMessage(m.chat, { text: arr[i], edit: key }); +} + +global.db.data.users[m.sender].warn += 1 +global.db.data.users[m.sender].money += rbrb4 +global.db.data.users[m.sender].exp += rbrb5 +global.db.data.users[m.sender].ngewe += 1 + + + user.lastngewe = new Date * 1 + } else m.reply(`Kamu sudah ngewe dengan seseorang cewe\nHarap tunggu ${timers} untuk kembali ngewe`) +} +handler.help = ['ngewe'] +handler.tags = ['rpg'] +handler.command = /^(ngewe|anu)$/i +handler.register = true +handler.premium = false + +module.exports = handler + + +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ms,h,m,s}) + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-ngojekk.js b/plugins/rpg-ngojekk.js new file mode 100644 index 0000000000000000000000000000000000000000..0b570e7dc7b5a3768f250a6450e6ac998dc0ab8b --- /dev/null +++ b/plugins/rpg-ngojekk.js @@ -0,0 +1,77 @@ +let handler = async (m, { conn }) => { + let __timers = (new Date - global.db.data.users[m.sender].lastngojek) + let _timers = (300000 - __timers) + let order = global.db.data.users[m.sender].ojek + let timers = clockString(_timers) +let name = conn.getName(m.sender) + let user = global.db.data.users[m.sender] + + if (new Date - global.db.data.users[m.sender].lastngojek > 300000) { +let randomaku1 = `${Math.floor(Math.random() * 10)}` +let randomaku2 = `${Math.floor(Math.random() * 10)}` +let randomaku4 = `${Math.floor(Math.random() * 5)}` +let randomaku3 = `${Math.floor(Math.random() * 10)}` +let randomaku5 = `${Math.floor(Math.random() * 10)}` + +.trim() + +let rbrb1 = (randomaku1 * 2) +let rbrb2 = (randomaku2 * 10) +let rbrb3 = (randomaku3 * 1) +let rbrb4 = (randomaku4 * 15729) +let rbrb5 = (randomaku5 * 200) + +var zero1 = `${rbrb1}` +var zero2 = `${rbrb2}` +var zero3 = `${rbrb3}` +var zero4 = `${rbrb4}` +var zero5 = `${rbrb5}` + +let arr = [ +`Mendapatkan Orderan...`, +`๐Ÿšถ๐Ÿ›ตโฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ› +โฌ›โฌœโฌœโฌœโฌ›โฌœโฌœโฌœโฌ›โฌ› +โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ› +๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐ŸŒณ ๐ŸŒณ ๐Ÿ˜๏ธ \n\n\nโž• Mengantar ke tujuan....`, +`โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ› +โฌ›โฌœโฌœโฌ›โฌ›โฌœโฌœโฌœโฌ›โฌ› +โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›๐Ÿ›ตโฌ›โฌ› +๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐ŸŒณ ๐ŸŒณ ๐Ÿ˜๏ธ \n\n\nโž• Sampai di tujuan...`, +`โž• ๐Ÿ’นMenerima gaji....`, +`*โ€”[ Hasil Ngojek ${name} ]โ€”* + โž• ๐Ÿ’น Uang = [ ${zero4} ] + โž• โœจ Exp = [ ${zero5} ] + โž• ๐Ÿ˜ Order Selesai = +1 +โž• ๐Ÿ“ฅTotal Order Sebelumnya : ${order} +${wm}` +] + +let { key } = await conn.sendMessage(m.chat, {text: 'Mencari pelanggan.....'}) +for (let i = 0; i < arr.length; i++) { + await new Promise(resolve => setTimeout(resolve, 10000)); + await conn.sendMessage(m.chat, { text: arr[i], edit: key }); +} + +global.db.data.users[m.sender].money += rbrb4 +global.db.data.users[m.sender].exp += rbrb5 +global.db.data.users[m.sender].ojek += 1 + + + user.lastngojek = new Date * 1 + } else m.reply(`Sepertinya anda sudah kecapekan silahkan istirahat dulu sekitar\n*${timers}*`) +} +handler.help = ['ojek'] +handler.tags = ['rpg'] +handler.command = /^(ojek|ngojek|gojek)$/i +handler.register = true + +module.exports = handler + + +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + console.log({ms,h,m,s}) + return [h, m, s].map(v => v.toString().padStart(2, 0) ).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-nyawer.js b/plugins/rpg-nyawer.js new file mode 100644 index 0000000000000000000000000000000000000000..df7b80410cd5c748b8d3bc880fe1c7023bf48296 --- /dev/null +++ b/plugins/rpg-nyawer.js @@ -0,0 +1,26 @@ +let handler = async(m, { groupMetadata, command, conn, text, args, usedPrefix }) => { + //if (!Number(text)) throw 'Masukkan Angka'; + if (!args[0] || isNaN(args[0])) { + throw '*Example*: .sawer 1000'; + }; + let count = parseInt(args[0]); + let ps = groupMetadata.participants.map(v => v.id); + let a = ps[Math.floor(Math.random() * ps.length)]; // Memilih secara acak peserta dari array ps + let name = await conn.getName(m.sender); + let user = global.db.data.users[m.sender]; + let aa = global.db.data.users[a]; + + if (user.money < count) return m.reply(`money kamu tidak cukup untuk sawer sebanyak ${count}`) + + let hsl = `*@${a.split`@`[0]}* Kamu mendapatkan saweran dari @${m.sender.split`@`[0]} sebesar *${count}* `; + user.money -= count; + aa.money += count; + + conn.reply(m.chat, hsl, m); +} + +handler.help = ['sawer']; +handler.tags = ['rpg']; +handler.command = /^(sawer|nyawer)$/i; +handler.group = true; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-opebo.js b/plugins/rpg-opebo.js new file mode 100644 index 0000000000000000000000000000000000000000..dc1d66a9fd345aebc63a6f5c32392ab2514a0495 --- /dev/null +++ b/plugins/rpg-opebo.js @@ -0,0 +1,53 @@ +let handler = async (m, { + conn +}) => { + let __timers = (new Date - global.db.data.users[m.sender].lastngewe) + let _timers = (500000 - __timers) + let timers = clockString(_timers) + let user = global.db.data.users[m.sender] + if (new Date - global.db.data.users[m.sender].lastngewe > 500000) { + let hsl = `Kamu Terbaring Lemas Karna Melakukan Skidipapap 24 Jam Tetapi Kamu Mendapatkan: +3000 Koin +1000 Exp +10 Limit +Dan Gratis Boba + Nasi Padang +` + global.db.data.users[m.sender].koin += 3000 + global.db.data.users[m.sender].exp += 1000 + global.db.data.users[m.sender].limit += 10 + + setTimeout(() => { + conn.reply(m.chat, hsl, m) + }, 20000) + + setTimeout(() => { + conn.reply(m.chat, `Kamu Di Paksa Untuk Melayaninya 24 Jam`, m) + }, 18000) + + setTimeout(() => { + conn.reply(m.chat, `Kamu Mulai Melakukan Skidipapap Dengannya`, m) + }, 15000) + + setTimeout(() => { + conn.reply(m.chat, `Kamu Mendapatkan Pelanggan Dan Pergi Ke Hotel`, m) + }, 14000) + + setTimeout(() => { + conn.reply(m.chat, `Sedang Mencari Pelanggan`, m) + }, 0) + user.lastngewe = new Date * 1 + } else conn.reply(m.chat, `*Kamu Sudah Kecapekan*\n*Silahkan Istirahat Dulu Selama* ${timers}`, m) +} +handler.help = ['openbo'] +handler.tags = ['rpg'] +handler.command = /^(openbo)$/i +handler.group = true +module.exports = handler + +function clockString(ms) { + let d = isNaN(ms) ? '--' : Math.floor(ms / 86400000) + let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) % 24 + let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 + let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 + return ['\n' + d, ' *Hari*\n ', h, ' *Jam*\n ', m, ' *Menit*\n ', s, ' *Detik* '].map(v => v.toString().padStart(2, 0)).join('') +} \ No newline at end of file diff --git a/plugins/rpg-open.js b/plugins/rpg-open.js new file mode 100644 index 0000000000000000000000000000000000000000..910b1d635d1586dd9bd4b9f3f868354796145249 --- /dev/null +++ b/plugins/rpg-open.js @@ -0,0 +1,460 @@ +let handler = async (m, { conn, command, args, text, usedPrefix }) => { + try { + let bruh = `${usedPrefix}open <crate name> < 10 | 100 | 1000 >\n\nContoh penggunaan: *${usedPrefix}open common 10*\n\nlist crate:\n*common*\n*uncommon*\n*mythic*\n*legendary*` + let _lmao = args[0] + let Lmao = `Hanya support 10, 100, 1000\nContoh penggunaan: *${usedPrefix}open ${args > 2 ? _lmao : pickRandom(['common', 'uncommon', 'mythic', 'legendary'])} 10*` + let type = (args[0] || '').toLowerCase() + let jumlah = (args[1] || '').toLowerCase() + switch (type) { + case 'common': + switch (jumlah) { + case '10': + case 'crate': + let _cm1 = `${Math.floor(Math.random() * 500)}`.trim() + let _cc1 = `${Math.floor(Math.random() * 5)}`.trim() + let _cp1 = `${Math.floor(Math.random() * 3)}`.trim() + let _ce1 = `${Math.floor(Math.random() * 700)}`.trim() + let _cu1 = `${Math.floor(Math.random() * 3)}`.trim() + let cm1 = (_cm1 * 1) + let cc1 = (_cc1 * 1) + let cp1 = (_cp1 * 1) + let ce1 = (_ce1 * 1) + let cu1 = (_cu1 * 1) + let Hcom1 = ` +Anda telah membuka *๐Ÿ“ฆCommon crate* dan mendapatkan:${cm1 > 0 ? `\n๐Ÿ’ตmoney: ${cm1}` : ''}${ce1 > 0 ? `\nโšœ๏ธExp: ${ce1} *exp*` : ''}${cp1 > 0 ? `\n๐ŸฅคPotion: ${cp1} *potion*` : ''}${cc1 > 0 ? `\n๐Ÿ“ฆcommon crate: ${cc1} *crate*` : ''}${cu1 > 0 ? `\n๐Ÿ“ฆUncommon crate: ${cu1} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].common >= 10) { + global.db.data.users[m.sender].common -= 10 + global.db.data.users[m.sender].money += cm1 * 1 + global.db.data.users[m.sender].exp += ce1 * 1 + global.db.data.users[m.sender].potion += cp1 * 1 + global.db.data.users[m.sender].uncommon += cu1 * 1 + global.db.data.users[m.sender].common += cc1 * 1 + conn.reply(m.chat, Hcom1, m) + } else conn.reply(m.chat, '๐Ÿ“ฆCommon crate anda tidak cukup', m) + break + case '100': + let _cm2 = `${Math.floor(Math.random() * 5000)}`.trim() + let _cc2 = `${Math.floor(Math.random() * 50)}`.trim() + let _cp2 = `${Math.floor(Math.random() * 20)}`.trim() + let _ce2 = `${Math.floor(Math.random() * 7500)}`.trim() + let _cu2 = `${Math.floor(Math.random() * 30)}`.trim() + let cm2 = (_cm2 * 1) + let cc2 = (_cc2 * 1) + let cp2 = (_cp2 * 1) + let ce2 = (_ce2 * 1) + let cu2 = (_cu2 * 1) + let Hcom2 = ` +Anda telah membuka *๐Ÿ“ฆCommon crate* dan mendapatkan:${cm2 > 0 ? `\n๐Ÿ’ตmoney: ${cm2}` : ''}${ce2 > 0 ? `\nโšœ๏ธExp: ${ce2} *exp*` : ''}${cp2 > 0 ? `\n๐ŸฅคPotion: ${cp2} *potion*` : ''}${cc2 > 0 ? `\n๐Ÿ“ฆcommon crate: ${cc2} *crate*` : ''}${cu2 > 0 ? `\n๐Ÿ“ฆUncommon crate: ${cu2} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].common >= 100) { + global.db.data.users[m.sender].common -= 100 + global.db.data.users[m.sender].money += cm2 * 1 + global.db.data.users[m.sender].exp += ce2 * 1 + global.db.data.users[m.sender].potion += cp2 * 1 + global.db.data.users[m.sender].uncommon += cu2 * 1 + global.db.data.users[m.sender].common += cc2 * 1 + conn.reply(m.chat, Hcom2, m) + } else conn.reply(m.chat, '๐Ÿ“ฆCommon crate anda tidak cukup', m) + break + case '1000': + let _cm3 = `${Math.floor(Math.random() * 50000)}`.trim() + let _cc3 = `${Math.floor(Math.random() * 350)}`.trim() + let _cp3 = `${Math.floor(Math.random() * 100)}`.trim() + let _ce3 = `${Math.floor(Math.random() * 80000)}`.trim() + let _cu3 = `${Math.floor(Math.random() * 200)}`.trim() + let cm3 = (_cm3 * 1) + let cc3 = (_cc3 * 1) + let cp3 = (_cp3 * 1) + let ce3 = (_ce3 * 1) + let cu3 = (_cu3 * 1) + let Hcom3 = ` +Anda telah membuka *๐Ÿ“ฆCommon crate* dan mendapatkan:${cm3 > 0 ? `\n๐Ÿ’ตmoney: ${cm3}` : ''}${ce3 > 0 ? `\nโšœ๏ธExp: ${ce3} *exp*` : ''}${cp3 > 0 ? `\n๐ŸฅคPotion: ${cp3} *potion*` : ''}${cc3 > 0 ? `\n๐Ÿ“ฆcommon crate: ${cc3} *crate*` : ''}${cu3 > 0 ? `\n๐Ÿ“ฆUncommon crate: ${cu3} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].common >= 1000) { + global.db.data.users[m.sender].common -= 1000 + global.db.data.users[m.sender].money += cm3 * 1 + global.db.data.users[m.sender].exp += ce3 * 1 + global.db.data.users[m.sender].potion += cp3 * 1 + global.db.data.users[m.sender].uncommon += cu3 * 1 + global.db.data.users[m.sender].common += cc3 * 1 + conn.reply(m.chat, Hcom3, m) + } else conn.reply(m.chat, '๐Ÿ“ฆCommon crate anda tidak cukup', m) + break + default: + return conn.reply(m.chat, Lmao, m) + } + break + case 'uncommon': + switch (jumlah) { + case '10': + case 'crate': + let _ud1 = `${Math.floor(Math.random() * 5)}`.trim() + let _ue1 = `${Math.floor(Math.random() * 750)}`.trim() + let _um1 = `${Math.floor(Math.random() * 400)}`.trim() + let _up1 = `${Math.floor(Math.random() * 7)}`.trim() + let _umc1 = `${Math.floor(Math.random() * 2)}`.trim() + let _uu1 = `${Math.floor(Math.random() * 4)}`.trim() + let _uc1 = `${Math.floor(Math.random() * 7)}`.trim() + let ud1 = (_ud1 * 1) + let ue1 = (_ue1 * 1) + let um1 = (_um1 * 1) + let up1 = (_up1 * 1) + let umc1 = (_umc1 * 1) + let uu1 = (_uu1 * 1) + let uc1 = (_uc1 * 1) + let Hun1 = ` +Anda telah membuka *๐Ÿ“ฆUncommon crate* dan mendapatkan:${um1 > 0 ? `\n๐Ÿ’ตmoney: ${um1}` : ''}${ue1 > 0 ? `\nโšœ๏ธExp: ${ue1} *exp*` : ''}${ud1 > 0 ? `\n๐Ÿ’ŽDiamond: ${ud1} *diamond*` : ''}${up1 > 0 ? `\n๐ŸฅคPotion: ${up1} *potion*` : ''}${uc1 > 0 ? `\n๐Ÿ“ฆCommon crate: ${uc1} *crate*` : ''}${uu1 > 0 ? `\n๐Ÿ“ฆUncommon crate: ${uu1} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].uncommon >= 10) { + global.db.data.users[m.sender].uncommon -= 10 + global.db.data.users[m.sender].money += um1 * 1 + global.db.data.users[m.sender].diamond += ud1 * 1 + global.db.data.users[m.sender].exp += ue1 * 1 + global.db.data.users[m.sender].potion += up1 * 1 + global.db.data.users[m.sender].common += uc1 * 1 + global.db.data.users[m.sender].uncommon += uu1 * 1 + conn.reply(m.chat, Hun1, m) + } else conn.reply(m.chat, '๐Ÿ“ฆUncommon crate anda tidak cukup', m) + break + case '100': + let _ud2 = `${Math.floor(Math.random() * 20)}`.trim() + let _ue2 = `${Math.floor(Math.random() * 8000)}`.trim() + let _um2 = `${Math.floor(Math.random() * 5000)}`.trim() + let _up2 = `${Math.floor(Math.random() * 20)}`.trim() + let _umc2 = `${Math.floor(Math.random() * 10)}`.trim() + let _uu2 = `${Math.floor(Math.random() * 25)}`.trim() + let _uc2 = `${Math.floor(Math.random() * 50)}`.trim() + let ud2 = (_ud2 * 1) + let ue2 = (_ue2 * 1) + let um2 = (_um2 * 1) + let up2 = (_up2 * 1) + let umc2 = (_umc2 * 1) + let uu2 = (_uu2 * 1) + let uc2 = (_uc2 * 1) + let Hun2 = ` +Anda telah membuka *๐Ÿ“ฆUncommon crate* dan mendapatkan:${um2 > 0 ? `\n๐Ÿ’ตmoney: ${um2}` : ''}${ue2 > 0 ? `\nโšœ๏ธExp: ${ue2} *exp*` : ''}${ud2 > 0 ? `\n๐Ÿ’ŽDiamond: ${ud2} *diamond*` : ''}${up2 > 0 ? `\n๐ŸฅคPotion: ${up2} *potion*` : ''}${uc2 > 0 ? `\n๐Ÿ“ฆCommon crate: ${uc2} *crate*` : ''}${uu2 > 0 ? `\n๐Ÿ“ฆUncommon crate: ${uu2} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].uncommon >= 100) { + global.db.data.users[m.sender].uncommon -= 100 + global.db.data.users[m.sender].money += um2 * 1 + global.db.data.users[m.sender].diamond += ud2 * 1 + global.db.data.users[m.sender].exp += ue2 * 1 + global.db.data.users[m.sender].potion += up2 * 1 + global.db.data.users[m.sender].common += uc2 * 1 + global.db.data.users[m.sender].uncommon += uu2 * 1 + conn.reply(m.chat, Hun2, m) + } else conn.reply(m.chat, '๐Ÿ“ฆUncommon crate anda tidak cukup', m) + break + case '1000': + let _ud3 = `${Math.floor(Math.random() * 50)}`.trim() + let _ue3 = `${Math.floor(Math.random() * 100000)}`.trim() + let _um3 = `${Math.floor(Math.random() * 50000)}`.trim() + let _up3 = `${Math.floor(Math.random() * 100)}`.trim() + let _umc3 = `${Math.floor(Math.random() * 100)}`.trim() + let _uu3 = `${Math.floor(Math.random() * 100)}`.trim() + let _uc3 = `${Math.floor(Math.random() * 200)}`.trim() + let ud3 = (_ud3 * 1) + let ue3 = (_ue3 * 1) + let um3 = (_um3 * 1) + let up3 = (_up3 * 1) + let umc3 = (_umc3 * 1) + let uu3 = (_uu3 * 1) + let uc3 = (_uc3 * 1) + let Hun3 = ` +Anda telah membuka *๐Ÿ“ฆUncommon crate* dan mendapatkan:${um3 > 0 ? `\n๐Ÿ’ตmoney: ${um3}` : ''}${ue3 > 0 ? `\nโšœ๏ธExp: ${ue3} *exp*` : ''}${ud3 > 0 ? `\n๐Ÿ’ŽDiamond: ${ud3} *diamond*` : ''}${up3 > 0 ? `\n๐ŸฅคPotion: ${up3} *potion*` : ''}${uc3 > 0 ? `\n๐Ÿ“ฆCommon crate: ${uc3} *crate*` : ''}${uu3 > 0 ? `\n๐Ÿ“ฆUncommon crate: ${uu3} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].uncommon >= 1000) { + global.db.data.users[m.sender].uncommon -= 1000 + global.db.data.users[m.sender].money += um3 * 1 + global.db.data.users[m.sender].diamond += ud3 * 1 + global.db.data.users[m.sender].exp += ue3 * 1 + global.db.data.users[m.sender].potion += up3 * 1 + global.db.data.users[m.sender].common += uc3 * 1 + global.db.data.users[m.sender].uncommon += uu3 * 1 + conn.reply(m.chat, Hun3, m) + } else conn.reply(m.chat, '๐Ÿ“ฆUncommon crate anda tidak cukup', m) + break + default: + return conn.reply(m.chat, Lmao ,m) + } + break + case 'mythic': + switch (jumlah) { + case '10': + case 'crate': + let _mm1 = `${Math.floor(Math.random() * 2000)}`.trim() + let _mmm1 = `${Math.floor(Math.random() * 4)}`.trim() + let _me1 = `${Math.floor(Math.random() * 3000)}`.trim() + let _mp1 = `${Math.floor(Math.random() * 6)}`.trim() + let _mu1 = `${Math.floor(Math.random() * 6)}`.trim() + let _mc1 = `${Math.floor(Math.random() * 11)}`.trim() + let _ml1 = `${Math.floor(Math.random() * 1)}`.trim() + let _md1 = `${Math.floor(Math.random() * 5)}`.trim() + let mm1 = (_mm1 * 1) + let mmm1 = (_mmm1 * 1) + let me1 = (_me1 * 1) + let mp1 = (_mp1 * 1) + let mu1 = (_mu1 * 1) + let mc1 = (_mc1 * 1) + let ml1 = (_ml1 * 1) + let md1 = (_md1 * 1) + let Mychat1 = ` +Anda telah membuka *Mythic crate* dan mendapatkan:${mm1 > 0 ? `\nmoney: ${mm1}` : ''}${me1 > 0 ? `\nExp: ${me1} *exp*` : ''}${md1 > 0 ? `\nDiamond: ${md1} *diamond*` : ''}${mp1 > 0 ? `\nPotion: ${mp1} *potion*` : ''}${mc1 > 0 ? `\nCommon crate: ${mc1} *crate*` : ''}${mu1 > 0 ? `\nUncommon crate: ${mu1} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].mythic >= 10) { + global.db.data.users[m.sender].mythic -= 10 + global.db.data.users[m.sender].money += mm1 * 1 + global.db.data.users[m.sender].diamond += md1 * 1 + global.db.data.users[m.sender].exp += me1 * 1 + global.db.data.users[m.sender].potion += mp1 * 1 + global.db.data.users[m.sender].common += mc1 * 1 + global.db.data.users[m.sender].uncommon += mu1 * 1 + conn.reply(m.chat, Mychat1, m) + } else conn.reply(m.chat, 'Mythic crate anda tidak cukup', m) + break + case '100': + let _mm2 = `${Math.floor(Math.random() * 25000)}`.trim() + let _mmm2 = `${Math.floor(Math.random() * 10)}`.trim() + let _me2 = `${Math.floor(Math.random() * 30000)}`.trim() + let _mp2 = `${Math.floor(Math.random() * 50)}`.trim() + let _mu2 = `${Math.floor(Math.random() * 80)}`.trim() + let _mc2 = `${Math.floor(Math.random() * 150)}`.trim() + let _ml2 = `${Math.floor(Math.random() * 6)}`.trim() + let _md2 = `${Math.floor(Math.random() * 20)}`.trim() + let mm2 = (_mm2 * 1) + let mmm2 = (_mmm2 * 1) + let me2 = (_me2 * 1) + let mp2 = (_mp2 * 1) + let mu2 = (_mu2 * 1) + let mc2 = (_mc2 * 1) + let ml2 = (_ml2 * 1) + let md2 = (_md2 * 1) + let Mychat2 = ` +Anda telah membuka *Mythic crate* dan mendapatkan:${mm2 > 0 ? `\nmoney: ${mm2}` : ''}${me2 > 0 ? `\nExp: ${me2} *exp*` : ''}${md2 > 0 ? `\nDiamond: ${md2} *diamond*` : ''}${mp2 > 0 ? `\nPotion: ${mp2} *potion*` : ''}${mc2 > 0 ? `\nCommon crate: ${mc2} *crate*` : ''}${mu2 > 0 ? `\nUncommon crate: ${mu2} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].mythic >= 100) { + global.db.data.users[m.sender].mythic -= 100 + global.db.data.users[m.sender].money += mm2 * 1 + global.db.data.users[m.sender].diamond += md2 * 1 + global.db.data.users[m.sender].exp += me2 * 1 + global.db.data.users[m.sender].potion += mp2 * 1 + global.db.data.users[m.sender].common += mc2 * 1 + global.db.data.users[m.sender].uncommon += mu2 * 1 + conn.reply(m.chat, Mychat2, m) + } else conn.reply(m.chat, 'Mythic crate anda tidak cukup', m) + break + case '1000': + let _mm3 = `${Math.floor(Math.random() * 500000)}`.trim() + let _mmm3 = `${Math.floor(Math.random() * 50)}`.trim() + let _me3 = `${Math.floor(Math.random() * 750000)}`.trim() + let _mp3 = `${Math.floor(Math.random() * 70)}`.trim() + let _mu3 = `${Math.floor(Math.random() * 250)}`.trim() + let _mc3 = `${Math.floor(Math.random() * 750)}`.trim() + let _ml3 = `${Math.floor(Math.random() * 10)}`.trim() + let _md3 = `${Math.floor(Math.random() * 50)}`.trim() + let mm3 = (_mm3 * 1) + let mmm3 = (_mmm3 * 1) + let me3 = (_me3 * 1) + let mp3 = (_mp3 * 1) + let mu3 = (_mu3 * 1) + let mc3 = (_mc3 * 1) + let ml3 = (_ml3 * 1) + let md3 = (_md3 * 1) + let Mychat3 = ` +Anda telah membuka *Mythic crate* dan mendapatkan:${mm3 > 0 ? `\nmoney: ${mm3}` : ''}${me3 > 0 ? `\nExp: ${me3} *exp*` : ''}${md3 > 0 ? `\nDiamond: ${md3} *diamond*` : ''}${mp3 > 0 ? `\nPotion: ${mp3} *potion*` : ''}${mc3 > 0 ? `\nCommon crate: ${mc3} *crate*` : ''}${mu3 > 0 ? `\nUncommon crate: ${mu3} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].mythic >= 1000) { + global.db.data.users[m.sender].mythic -= 1000 + global.db.data.users[m.sender].money += mm3 * 1 + global.db.data.users[m.sender].diamond += md3 * 1 + global.db.data.users[m.sender].exp += me3 * 1 + global.db.data.users[m.sender].potion += mp3 * 1 + global.db.data.users[m.sender].common += mc3 * 1 + global.db.data.users[m.sender].uncommon += mu3 * 1 + conn.reply(m.chat, Mychat3, m) + } else conn.reply(m.chat, 'Mythic crate anda tidak cukup', m) + break + default: + return conn.reply(m.chat, Lmao, m) + } + break + case 'legendary': + switch (jumlah) { + case '10': + case 'crate': + let _lm1 = `${Math.floor(Math.random() * 10000)}`.trim() + let _le1 = `${Math.floor(Math.random() * 15000)}`.trim() + let _lp1 = `${Math.floor(Math.random() * 30)}`.trim() + let _lu1 = `${Math.floor(Math.random() * 50)}`.trim() + let _lc1 = `${Math.floor(Math.random() * 75)}`.trim() + let _ll1 = `${Math.floor(Math.random() * 2)}`.trim() + let _lpp1 = `${Math.floor(Math.random() * 6)}`.trim() + let _ld1 = `${Math.floor(Math.random() * 16)}`.trim() + let _lmm1 = `${Math.floor(Math.random() * 4)}`.trim() + let lm1 = (_lm1 * 1) + let le1 = (_le1 * 1) + let lp1 = (_lp1 * 1) + let lu1 = (_lu1 * 1) + let lc1 = (_lc1 * 1) + let ll1 = (_ll1 * 1) + let lpp1 = (_lpp1 * 1) + let ld1 = (_ld1 * 1) + let lmm1 = (_lmm1 * 1) + let Lechat1 = ` +Anda telah membuka *Legendary crate* dan mendapatkan:${lm1 > 0 ? `\nmoney: ${lm1}` : ''}${le1 > 0 ? `\nExp: ${le1} *exp*` : ''}${ld1 > 0 ? `\nDiamond: ${ld1} *diamond*` : ''}${lp1 > 0 ? `\nPotion: ${lp1} *potion*` : ''}${lc1 > 0 ? `\nCommon crate: ${lc1} *crate*` : ''}${lu1 > 0 ? `\nUncommon crate: ${lu1} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].legendary >= 10) { + global.db.data.users[m.sender].legendary -= 10 + global.db.data.users[m.sender].money += lm1 * 1 + global.db.data.users[m.sender].diamond += ld1 * 1 + global.db.data.users[m.sender].exp += le1 * 1 + global.db.data.users[m.sender].potion += lp1 * 1 + global.db.data.users[m.sender].common += lc1 * 1 + global.db.data.users[m.sender].uncommon += lu1 * 1 + conn.reply(m.chat, Lechat1, m) + } else conn.reply(m.chat, 'Legendary crate anda tidak cukup', m) + break + case '100': + let _lm2 = `${Math.floor(Math.random() * 100000)}`.trim() + let _le2 = `${Math.floor(Math.random() * 200000)}`.trim() + let _lp2 = `${Math.floor(Math.random() * 100)}`.trim() + let _lu2 = `${Math.floor(Math.random() * 250)}`.trim() + let _lc2 = `${Math.floor(Math.random() * 750)}`.trim() + let _ll2 = `${Math.floor(Math.random() * 11)}`.trim() + let _lpp2 = `${Math.floor(Math.random() * 51)}`.trim() + let _ld2 = `${Math.floor(Math.random() * 50)}`.trim() + let _lmm2 = `${Math.floor(Math.random() * 11)}`.trim() + let lm2 = (_lm2 * 1) + let le2 = (_le2 * 1) + let lp2 = (_lp2 * 1) + let lu2 = (_lu2 * 1) + let lc2 = (_lc2 * 1) + let ll2 = (_ll2 * 1) + let lpp2 = (_lpp2 * 1) + let ld2 = (_ld2 * 1) + let lmm2 = (_lmm2 * 1) + let Lechat2 = ` +Anda telah membuka *Legendary crate* dan mendapatkan:${lm2 > 0 ? `\nmoney: ${lm2}` : ''}${le2 > 0 ? `\nExp: ${le2} *exp*` : ''}${ld2 > 0 ? `\nDiamond: ${ld2} *diamond*` : ''}${lp2 > 0 ? `\nPotion: ${lp2} *potion*` : ''}${lc2 > 0 ? `\nCommon crate: ${lc2} *crate*` : ''}${lu2 > 0 ? `\nUncommon crate: ${lu2} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].legendary >= 100) { + global.db.data.users[m.sender].legendary -= 100 + global.db.data.users[m.sender].money += lm2 * 1 + global.db.data.users[m.sender].diamond += ld2 * 1 + global.db.data.users[m.sender].exp += le2 * 1 + global.db.data.users[m.sender].potion += lp2 * 1 + global.db.data.users[m.sender].common += lc2 * 1 + global.db.data.users[m.sender].uncommon += lu2 * 1 + conn.reply(m.chat, Lechat2, m) + } else conn.reply(m.chat, 'Legendary crate anda tidak cukup', m) + break + case '1000': + let _lm3 = `${Math.floor(Math.random() * 2000000)}`.trim() + let _le3 = `${Math.floor(Math.random() * 5000000)}`.trim() + let _lp3 = `${Math.floor(Math.random() * 500)}`.trim() + let _lu3 = `${Math.floor(Math.random() * 1000)}`.trim() + let _lc3 = `${Math.floor(Math.random() * 2500)}`.trim() + let _ll3 = `${Math.floor(Math.random() * 51)}`.trim() + let _lpp3 = `${Math.floor(Math.random() * 222)}`.trim() + let _ld3 = `${Math.floor(Math.random() * 250)}`.trim() + let _lmm3 = `${Math.floor(Math.random() * 111)}`.trim() + let lm3 = (_lm3 * 1) + let le3 = (_le3 * 1) + let lp3 = (_lp3 * 1) + let lu3 = (_lu3 * 1) + let lc3 = (_lc3 * 1) + let ll3 = (_ll3 * 1) + let lpp3 = (_lpp3 * 1) + let ld3 = (_ld3 * 1) + let lmm3 = (_lmm3 * 1) + let Lechat3 = ` +Anda telah membuka *Legendary crate* dan mendapatkan:${lm3 > 0 ? `\nmoney: ${lm3}` : ''}${le3 > 0 ? `\nExp: ${le3} *exp*` : ''}${ld3 > 0 ? `\nDiamond: ${ld3} *diamond*` : ''}${lp3 > 0 ? `\nPotion: ${lp3} *potion*` : ''}${lc3 > 0 ? `\nCommon crate: ${lc3} *crate*` : ''}${lu3 > 0 ? `\nUncommon crate: ${lu3} *crate*` : ''} +`.trim() + if (global.db.data.users[m.sender].legendary >= 1000) { + global.db.data.users[m.sender].legendary -= 1000 + global.db.data.users[m.sender].money += lm3 * 1 + global.db.data.users[m.sender].diamond += ld3 * 1 + global.db.data.users[m.sender].exp += le3 * 1 + global.db.data.users[m.sender].potion += lp3 * 1 + global.db.data.users[m.sender].common += lc3 * 1 + global.db.data.users[m.sender].uncommon += lu3 * 1 + conn.reply(m.chat, Lechat3, m) + } else conn.reply(m.chat, 'Legendary crate anda tidak cukup', m) + break + default: + return conn.reply(m.chat, Lmao, m) + } + break + case 'pet': + let _mknp = pickRandom([1, 2, 1, 5, 3, 2, 1, 2, 4, 1, 3, 5, 2, 4, 3]) + let mknp = (_mknp * 1) + let kucing = global.db.data.users[m.sender].kucing + let rubah = global.db.data.users[m.sender].rubah + let kuda = global.db.data.users[m.sender].kuda + let anjing = global.db.data.users[m.sender].anjing + let _pet = `${pickRandom(['kucing', 'rubah', 'anjing', 'kuda'])}`.trim() + if (global.db.data.users[m.sender].pet > 0) { + global.db.data.users[m.sender].pet -= 1 + if (_pet == 'kucing' && kucing > 0) { + global.db.data.users[m.sender].potion += 2 + global.db.data.users[m.sender].makananpet += mknp * 1 + conn.reply(m.chat, `Anda sudah memiliki pet ${_pet}, Hadiahmu diganti dengan 2 potion${mknp > 0 ? ` Dan ${mknp} Makanan Pet` : ''}`, m) + } else if (_pet == 'kucing' && kucing == 0) { + global.db.data.users[m.sender].kucing += 1 + global.db.data.users[m.sender].makananpet += mknp * 1 + conn.reply(m.chat, `*Selamat Anda mendapatkan pet${_pet} ${mknp > 0 ? ` Dan ${mknp} Makanan Pet*` : '*'}`, m) + } else if (_pet == 'rubah' && rubah > 0) { + global.db.data.users[m.sender].potion += 2 + global.db.data.users[m.sender].makananpet += mknp * 1 + conn.reply(m.chat, `Anda sudah memiliki pet ${_pet}, Hadiahmu diganti dengan 2 potion ${mknp > 0 ? `Dan ${mknp} Makanan Pet` : ''}`, m) + } else if (_pet == 'rubah' && rubah == 0) { + global.db.data.users[m.sender].rubah += 1 + global.db.data.users[m.sender].makananpet += mknp * 1 + conn.reply(m.chat, `*Selamat Anda mendapatkan pet ${_pet}${mknp > 0 ? ` Dan ${mknp} Makanan Pet*` : '*'}`, m) + } else if (_pet == 'anjing' && anjing > 0) { + global.db.data.users[m.sender].potion += 2 + global.db.data.users[m.sender].makananpet += mknp * 1 + conn.reply(m.chat, `Anda sudah memiliki pet ${_pet}, Hadiahmu diganti dengan 2 potion ${mknp > 0 ? `Dan ${mknp} Makanan Pet` : ''}`, m) + } else if (_pet == 'anjing' && anjing == 0) { + global.db.data.users[m.sender].anjing += 1 + global.db.data.users[m.sender].makananpet += mknp * 1 + conn.reply(m.chat, `*Selamat Anda mendapatkan pet ${_pet}${mknp > 0 ? ` Dan ${mknp} Makanan Pet*` : '*'}`, m) + } else if (_pet == 'kuda' && kuda > 0) { + global.db.data.users[m.sender].potion += 2 + global.db.data.users[m.sender].makananpet += mknp * 1 + conn.reply(m.chat, `Anda sudah memiliki pet ${_pet}, Hadiahmu diganti dengan 2 potion${mknp > 0 ? ` Dan ${mknp} Makanan Pet` : ''}`, m) + } else if (_pet == 'kuda' && kuda == 0) { + global.db.data.users[m.sender].kuda += 1 + global.db.data.users[m.sender].makananpet += mknp * 1 + conn.reply(m.chat, `*Selamat Anda mendapatkan pet ${_pet}${mknp > 0 ? ` Dan ${mknp} Makanan Pet*` : '*'}`, m) + } else { + global.db.data.users[m.sender].makananpet += mknp * 1 + m.reply(pickRandom(['Anda kurang beruntung', 'Coba buka lagi lain kali, karena gk dapet pet', 'kasian gk dapet pet', 'Mungkin lagi gk hoki dan gk dapet pet', 'wkwkkwkwke']) + '. Anda hanya mendapatkan *' + mknp + '* makanan pet') + } + } else m.reply('Pet Crate kamu tidak cukup') + break + default: + return conn.reply(m.chat, bruh, m) + } + } catch (e) { + console.log(e) + conn.reply(m.chat, `${usedPrefix}open <crate name> < 10 | 100 | 1000 >\n\nContoh penggunaan: *${usedPrefix}open common 10*\n\nlist crate:\n*common*\n*uncommon*\n*mythic*\n*legendary*`, m) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.sendMessage(jid, 'Open.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*') + } + } + } +} +handler.help = ['open <crate>'] +handler.tags = ['rpg'] +handler.command = /^(open|buka)$/i +handler.register = true + +handler.fail = null + +module.exports = handler + +function pickRandom(list) { + return list[Math.floor(list.length * Math.random())] +} \ No newline at end of file diff --git a/plugins/rpg-paksa.js b/plugins/rpg-paksa.js new file mode 100644 index 0000000000000000000000000000000000000000..a87942bbf2ec5262c65020923cc26cc19f9ac64c --- /dev/null +++ b/plugins/rpg-paksa.js @@ -0,0 +1,103 @@ +let handler = async (m, { conn }) => { + let __timers = (new Date() - (global.db.data.users[m.sender].lastngewe || 0)) + let _timers = (7200000 - __timers) // 2 jam dalam milidetik + let timers = _timers >= 0 ? clockString(_timers) : "waktu sudah habis" + let name = conn.getName(m.sender) + let user = global.db.data.users[m.sender] + let id = m.sender + let kerja = 'ewe-paksa' + conn.misi = conn.misi ? conn.misi : {} + if (id in conn.misi) { + conn.reply(m.chat, `Selesaikan Misi ${conn.misi[id][0]} Terlebih Dahulu`, m) + throw false + } + if (new Date() - user.lastngewe > 7200000 || !user.lastngewe) { // Ubah kondisi cooldown + let randomaku1 = Math.floor(Math.random() * 1000000) + let randomaku2 = Math.floor(Math.random() * 10000) + + var dimas = ` +๐Ÿ‘™ kamu paksa + dia buka baju๐Ÿคญ +`.trim() + + var dimas2 = ` +๐Ÿฅต๐Ÿ’ฆ sszz Ahhhh..... +`.trim() + + var dimas3 = ` +๐ŸฅตAhhhh, Sakitttt!! >////< + ๐Ÿ’ฆCrotttt..... + ๐Ÿ’ฆCrottt lagi +`.trim() + + var dimas4 = ` +๐Ÿฅต๐Ÿ’ฆ๐Ÿ’ฆAhhhhhh๐Ÿ˜ซ +`.trim() + + var hsl = ` +*โ€”[ Hasil Ewe Paksa ${name} ]โ€”* +โžค ๐Ÿ’ฐ Uang = [ ${randomaku1} ] +โžค โœจ Exp = [ ${randomaku2} ] +โžค ๐Ÿ˜ Order Selesai = +1 +`.trim() + + user.money += randomaku1 + user.exp += randomaku2 + + conn.misi[id] = [ + kerja, + setTimeout(() => { + delete conn.misi[id] + }, 27000) + ] + + setTimeout(() => { + m.reply(hsl) + }, 27000) + + setTimeout(() => { + m.reply(dimas4) + }, 25000) + + setTimeout(() => { + m.reply(dimas3) + }, 20000) + + setTimeout(() => { + m.reply(dimas2) + }, 15000) + + setTimeout(() => { + m.reply(dimas) + }, 10000) + + setTimeout(() => { + m.reply('๐Ÿคญmulai ewe paksa..') + }, 0) + + setTimeout(() => { + m.reply(`โณ Waktu untuk *Ewe-paksa* selanjutnya sudah tiba! Gunakan *ewe-paksa* sekarang untuk mendapatkan lebih banyak hadiah!`) + }, _timers) + + user.lastngewe = new Date() * 1 + } else m.reply(`Silahkan Menunggu Selama ${timers} lagi untuk melakukan *Ewe-paksa* kembali`) +} + +handler.help = ['ewe-paksa @tag'] +handler.tags = ['rpg'] +handler.command = /^(ewe-paksa)$/i +handler.register = true +handler.group = true +module.exports = handler + +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + let result = [] + if (h > 0) result.push(`${h} jam`) + if (m > 0) result.push(`${m} menit`) + if (s > 0) result.push(`${s} detik`) + if (result.length === 0) result.push('kurang dari 1 detik') + return result.join(' ') +} \ No newline at end of file diff --git a/plugins/rpg-pasar.js b/plugins/rpg-pasar.js new file mode 100644 index 0000000000000000000000000000000000000000..b3b48b15c5e423e3a6f4dfe3849c668e25412957 --- /dev/null +++ b/plugins/rpg-pasar.js @@ -0,0 +1,577 @@ +let { MessageType } = require('@adiwajshing/baileys') +const Skepiting = 7000 +const Slobster = 7000 +const Sudang = 7000 +const Scumi = 7000 +const Sgurita = 7000 +const Sbuntal = 7000 +const Sdory = 7000 +const Sorca = 7000 +const Slumba = 7000 +const Spaus = 7000 +const Sikan = 7000 +const Shiu = 7000 +const Sbanteng = 9000 +const Sharimau = 9000 +const Sgajah = 9000 +const Skambing = 9000 +const Spanda = 9000 +const Sbuaya = 9000 +const Skerbau = 9000 +const Ssapi= 9000 +const Smonyet = 9000 +const Sbabihutan = 9000 +const Sbabi = 9000 +const Sayam = 9000 +let handler = async (m, { conn, command, args, usedPrefix, DevMode }) => { + const _armor = global.db.data.users[m.sender].armor + const armor = (_armor == 0 ? 20000 : '' || _armor == 1 ? 49999 : '' || _armor == 2 ? 99999 : '' || _armor == 3 ? 149999 : '' || _armor == 4 ? 299999 : '') + let type = (args[0] || '').toLowerCase() + let _type = (args[1] || '').toLowerCase() + let jualbeli = (args[0] || '').toLowerCase() + const Kchat = `โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” +*๐ŸŒฑ Hewan | ๐Ÿ’ฒ Harga Jual*\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n +๐Ÿฆ€ Kepiting: ${Skepiting} +๐Ÿฆž Lobster: ${Slobster} +๐Ÿฆ Udang: ${Sudang} +๐Ÿฆ‘ Cumi: ${Scumi} +๐Ÿ™ Gurita: ${Sgurita} +๐Ÿก Buntal: ${Sbuntal} +๐Ÿ  Dory: ${Sdory} +๐Ÿณ Orca: ${Sorca} +๐Ÿฌ Lumba: ${Slumba} +๐Ÿ‹ Paus: ${Spaus} +๐Ÿฆˆ Hiu: ${Shiu} +โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” +๐Ÿƒ Banteng: ${Sbanteng} +๐Ÿ… Harimau: ${Sharimau} +๐Ÿ˜ Gajah: ${Sgajah} +๐Ÿ Kambing: ${Skambing} +๐Ÿผ Panda: ${Spanda} +๐Ÿƒ Kerbau: ${Skerbau} +๐ŸŠ Buaya: ${Sbuaya} +๐Ÿ‚ Sapi: ${Ssapi} +๐Ÿ’ Monyet: ${Smonyet} +๐Ÿ— Babi Hutan: ${Sbabihutan} +๐Ÿ– Babi: ${Sbabi} +๐Ÿ” Ayam: ${Sayam}\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” +๐Ÿงช *Contoh penggunaan :* +#pasar jual ayam +`.trim() + try { + if (/pasar|toko/i.test(command)) { + const count = args[2] && args[2].length > 0 ? Math.min(99999999, Math.max(parseInt(args[2]), 1)) : !args[2] || args.length < 4 ? 1 :Math.min(1, count) + const sampah = global.db.data.users[m.sender].sampah + switch (jualbeli) { + /* case 'buy': + switch (_type) { + case 'potion': + if (global.db.data.users[m.sender].money >= potion * count) { + global.db.data.users[m.sender].money -= potion * count + global.db.data.users[m.sender].potion += count * 1 + conn.reply(m.chat, `Sukses Membeli ${count} Potion Dengan Harga ${potion * count} money\n\nGunakan Potion Dengan Ketik: *${usedPrefix}use potion <jumlah>*`, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Potion Dengan Harga ${potion * count} Money `,) + break + case 'diamond': + if (global.db.data.users[m.sender].money >= Bdiamond * count) { + global.db.data.users[m.sender].diamond += count * 1 + global.db.data.users[m.sender].money -= Bdiamond * count + conn.reply(m.chat, `Sukses Membeli ${count} Diamond Dengan Harga ${Bdiamond * count} Money`, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup`, m) + + break + case 'common': + if (global.db.data.users[m.sender].money >= Bcommon * count) { + global.db.data.users[m.sender].common += count * 1 + global.db.data.users[m.sender].money -= Bcommon * count + conn.reply(m.chat, `Sukses Membeli ${count} Common Crate Dengan Harga ${Bcommon * count} Money`, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Common Crate Dengan Harga ${Bcommon * count} Money \n\nBuka Crate Dengan Ketik: *${usedPrefix}open common*`, m) + + break + case 'uncommon': + if (global.db.data.users[m.sender].money >= Buncommon * count) { + global.db.data.users[m.sender].uncommon += count * 1 + global.db.data.users[m.sender].money -= Buncommon * count + conn.reply(m.chat, `Sukses Membeli ${count} Uncommon Crate Dengan Harga ${Buncommon * count} Money`, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Uncommon Crate Dengan Harga ${Buncommon * count} Money \n\nBuka Crate Dengan Ketik: *${usedPrefix}open uncommon*`, m) + + break + case 'mythic': + if (global.db.data.users[m.sender].money >= Bmythic * count) { + global.db.data.users[m.sender].mythic += count * 1 + global.db.data.users[m.sender].money -= Bmythic * count + conn.reply(m.chat, `Sukses Membeli ${count} Mythic Crate Dengan Harga ${Bmythic * count} Money`, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Mythic Crate Dengan Harga ${Bmythic* count} Money\n\nBuka Crate Dengan Ketik:*${usedPrefix}open mythic*`, m) + + break + case 'legendary': + if (global.db.data.users[m.sender].money >= Blegendary * count) { + global.db.data.users[m.sender].legendary += count * 1 + global.db.data.users[m.sender].money -= Blegendary * count + conn.reply(m.chat, `Sukses Membeli ${count} Legendary Crate Dengan Harga ${Blegendary * count} Money`, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Legendary Crate Dengan Harga ${Blegendary * count} Money \n\nBuka Crate Dengan Ketik: *${usedPrefix}open legendary*`, m) + + break + case 'sampah': + if (global.db.data.users[m.sender].money >= Bsampah * count) { + global.db.data.users[m.sender].sampah += count * 1 + global.db.data.users[m.sender].money -= Bsampah * count + conn.reply(m.chat, `Sukses Membeli ${count} Sampah Dengan Harga ${Bsampah * count} Money `, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Sampah Dengan Harga ${Bsampah * count} Money`.trim(), m) + + break + case 'armor': + if (global.db.data.users[m.sender].armor == 5) return conn.reply(m.chat, 'Armormu sudah *Level Max*', m) + if (global.db.data.users[m.sender].money > armor) { + global.db.data.users[m.sender].armor += 1 + global.db.data.users[m.sender].money -= armor * 1 + conn.reply(m.chat, `Sukses Membeli Armor Seharga ${armor} Money` ,m) + } else conn.reply(m.chat, `Uang Mu Tidak Cukup Untuk Membeli Armor Seharga ${armor} Money`, m) + + break + default: + return conn.reply(m.chat, Kchat, m) + } + break*/ + case 'jual': + switch (_type) { + case 'banteng': + if (global.db.data.users[m.sender].banteng >= count * 1) { + global.db.data.users[m.sender].money += Spaus * count + global.db.data.users[m.sender].banteng -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Banteng Dengan Harga ${Sbanteng * count} Money `.trim(), m) + } else conn.reply(m.chat, `Banteng Kamu Tidak Cukup`.trim(), m) + break + case 'harimau': + if (global.db.data.users[m.sender].harimau >= count * 1) { + global.db.data.users[m.sender].money += Sharimau * count + global.db.data.users[m.sender].harimau -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Harimau Dengan Harga ${Sharimau * count} Money `.trim(), m) + } else conn.reply(m.chat, `Harimau Kamu Tidak Cukup`.trim(), m) + break + case 'gajah': + if (global.db.data.users[m.sender].gajah >= count * 1) { + global.db.data.users[m.sender].money += Sgajah * count + global.db.data.users[m.sender].gajah -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Gajah Dengan Harga ${Sgajah * count} Money `.trim(), m) + } else conn.reply(m.chat, `Gajah Kamu Tidak Cukup`.trim(), m) + break + case 'kambing': + if (global.db.data.users[m.sender].kambing >= count * 1) { + global.db.data.users[m.sender].money += Skambing * count + global.db.data.users[m.sender].kambing -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kambing Dengan Harga ${Skambing * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kambing Kamu Tidak Cukup`.trim(), m) + break + case 'panda': + if (global.db.data.users[m.sender].panda >= count * 1) { + global.db.data.users[m.sender].money += Spanda * count + global.db.data.users[m.sender].panda -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Panda Dengan Harga ${Sbuaya * count} Money `.trim(), m) + } else conn.reply(m.chat, `Panda Kamu Tidak Cukup`.trim(), m) + break + case 'buaya': + if (global.db.data.users[m.sender].buaya >= count * 1) { + global.db.data.users[m.sender].money += Sbuaya * count + global.db.data.users[m.sender].buaya -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Buaya Dengan Harga ${Sbuaya * count} Money `.trim(), m) + } else conn.reply(m.chat, `Buaya Kamu Tidak Cukup`.trim(), m) + break + case 'kerbau': + if (global.db.data.users[m.sender].kerbau >= count * 1) { + global.db.data.users[m.sender].money += Skerbau * count + global.db.data.users[m.sender].kerbau -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kerbau Dengan Harga ${Skerbau * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kerbau Kamu Tidak Cukup`.trim(), m) + break + case 'sapi': + if (global.db.data.users[m.sender].sapi >= count * 1) { + global.db.data.users[m.sender].money += Ssapi * count + global.db.data.users[m.sender].sapi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Sapi Dengan Harga ${Ssapi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Sapi Kamu Tidak Cukup`.trim(), m) + break + case 'monyet': + if (global.db.data.users[m.sender].monyet >= count * 1) { + global.db.data.users[m.sender].money += Smonyet * count + global.db.data.users[m.sender].monyet -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Monyet Dengan Harga ${Smonyet * count} Money `.trim(), m) + } else conn.reply(m.chat, `Monyet Kamu Tidak Cukup`.trim(), m) + break + case 'babi': + if (global.db.data.users[m.sender].babi >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].babi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Babi Dengan Harga ${Sbabi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Babi Kamu Tidak Cukup`.trim(), m) + break + case 'babihutan': + if (global.db.data.users[m.sender].babihutan >= count * 1) { + global.db.data.users[m.sender].money += Sbabihutan * count + global.db.data.users[m.sender].babihutan -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Babi Hutan Dengan Harga ${Sbabihutan * count} Money `.trim(), m) + } else conn.reply(m.chat, `Babi Hutan Kamu Tidak Cukup`.trim(), m) + break + case 'ayam': + if (global.db.data.users[m.sender].ayam >= count * 1) { + global.db.data.users[m.sender].money += Sayam * count + global.db.data.users[m.sender].ayam -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ayam Dengan Harga ${Sayam * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ayam Kamu Tidak Cukup`.trim(), m) + break + //mancing + case 'kepiting': + if (global.db.data.users[m.sender].kepiting >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].kepiting -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kepiting Dengan Harga ${Skepiting * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kepiting Kamu Tidak Cukup`.trim(), m) + break + case 'ikan': + if (global.db.data.users[m.sender].ikan >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].ikan -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Dengan Harga ${Sikan * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Kamu Tidak Cukup`.trim(), m) + break + case 'dory': + if (global.db.data.users[m.sender].dory >= count * 1) { + global.db.data.users[m.sender].money += Sdory * count + global.db.data.users[m.sender].dory -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Dory Dengan Harga ${Sdory * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Dory Kamu Tidak Cukup`.trim(), m) + break + case 'gurita': + if (global.db.data.users[m.sender].gurita >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].gurita -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Gurita Dengan Harga ${Sgurita * count} Money `.trim(), m) + } else conn.reply(m.chat, `Gurita Kamu Tidak Cukup`.trim(), m) + break + case 'buntal': + if (global.db.data.users[m.sender].buntal >= count * 1) { + global.db.data.users[m.sender].money += Sbuntal * count + global.db.data.users[m.sender].buntal -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Buntal Dengan Harga ${Sbuntal * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Buntal Kamu Tidak Cukup`.trim(), m) + break + case 'hiu': + if (global.db.data.users[m.sender].hiu >= count * 1) { + global.db.data.users[m.sender].money += Shiu * count + global.db.data.users[m.sender].hiu -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Hiu Dengan Harga ${Shiu * count} Money `.trim(), m) + } else conn.reply(m.chat, `Hiu Kamu Tidak Cukup`.trim(), m) + break + case 'orca': + if (global.db.data.users[m.sender].orca >= count * 1) { + global.db.data.users[m.sender].money += Sorca * count + global.db.data.users[m.sender].orca -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Paus Orca Dengan Harga ${Sorca * count} Money `.trim(), m) + } else conn.reply(m.chat, `Paus Orca Kamu Tidak Cukup`.trim(), m) + break + case 'lumba': + if (global.db.data.users[m.sender].lumba >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].lumba -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Lumba Lumba Dengan Harga ${Slumba * count} Money `.trim(), m) + } else conn.reply(m.chat, `Lumba Lumba Kamu Tidak Cukup`.trim(), m) + break + case 'paus': + if (global.db.data.users[m.sender].paus >= count * 1) { + global.db.data.users[m.sender].money += Spaus * count + global.db.data.users[m.sender].paus -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Paus Dengan Harga ${Spaus * count} Money `.trim(), m) + } else conn.reply(m.chat, `Paus Kamu Tidak Cukup`.trim(), m) + break + case 'lobster': + if (global.db.data.users[m.sender].lobster >= count * 1) { + global.db.data.users[m.sender].money += Slobster * count + global.db.data.users[m.sender].lobster -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Lobster Dengan Harga ${Slobster * count} Money `.trim(), m) + } else conn.reply(m.chat, `Lobster Kamu Tidak Cukup`.trim(), m) + break + case 'udang': + if (global.db.data.users[m.sender].udang >= count * 1) { + global.db.data.users[m.sender].money += Sudang * count + global.db.data.users[m.sender].udang -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Udang Dengan Harga ${Sudang * count} Money `.trim(), m) + } else conn.reply(m.chat, `Udang Kamu Tidak Cukup`.trim(), m) + break + case 'cumi': + if (global.db.data.users[m.sender].cumi >= count * 1) { + global.db.data.users[m.sender].money += Scumi * count + global.db.data.users[m.sender].cumi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Cumi Dengan Harga ${Scumi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Cumi Kamu Tidak Cukup`.trim(), m) + break + default: + return conn.reply(m.chat, Kchat, m) + } + break + default: + return conn.sendFile(m.chat, thumb, 'pasar.jpg', `${Kchat}`, m) + } + /* } else if (/beli|buy/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(99999999, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count) + switch (type) { + case 'potion': + if (global.db.data.users[m.sender].money >= potion * count) { + global.db.data.users[m.sender].money -= potion * count + global.db.data.users[m.sender].potion += count * 1 + conn.reply(m.chat, `Sukses membeli ${count} Potion Dengan Harga ${potion * count} Money \n\nGunakan Potion Dengan Ketik: *${usedPrefix}use potion <jumlah>*`, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Potion Dengan Harga ${potion * count} Money`,m) + + break + case 'diamond': + if (global.db.data.users[m.sender].money >= Bdiamond * count) { + global.db.data.users[m.sender].diamond += count * 1 + global.db.data.users[m.sender].money -= Bdiamond * count + conn.reply(m.chat, `Sukses Membeli ${count} Diamond Dengan Harga ${Bdiamond * count} Money `, m) + } else conn.reply(m.chat, `Money Anda Tidak Cukup `, m) + + break + case 'common': + if (global.db.data.users[m.sender].money >= Bcommon * count) { + global.db.data.users[m.sender].common += count * 1 + global.db.data.users[m.sender].money -= Bcommon * count + conn.reply(m.chat, `Sukses Membeli ${count} Common Crate Dengan Harga ${Bcommon * count} Money `, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Common Crate Dengan Harga ${Bcommon * count} Money \n\nBuka Crate Dengan Ketik : *${usedPrefix}open common*`, m) + + break + case 'uncommon': + if (global.db.data.users[m.sender].money >= Buncommon * count) { + global.db.data.users[m.sender].uncommon += count * 1 + global.db.data.users[m.sender].money -= Buncommon * count + conn.reply(m.chat, `Sukses Membeli ${count} Uncommon Crate Dengan Harga ${Buncommon * count} Money `, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Uncommon Crate Dengan Harga ${Buncommon * count} Money \n\nBuka Crate Dengan Ketik: *${usedPrefix}open uncommon*`, m) + + break + case 'mythic': + if (global.db.data.users[m.sender].money >= Bmythic * count) { + global.db.data.users[m.sender].mythic += count * 1 + global.db.data.users[m.sender].money -= Bmythic * count + conn.reply(m.chat, `Sukses Membeli ${count} Mythic Crate Dengan Harga ${Bmythic * count} Money `, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Mythic Crate Dengan Harga ${Bmythic* count} money\n\nBuka Crate Dengan Ketik: *${usedPrefix}open mythic*`, m) + + break + case 'legendary': + if (global.db.data.users[m.sender].money >= Blegendary * count) { + global.db.data.users[m.sender].legendary += count * 1 + global.db.data.users[m.sender].money -= Blegendary * count + conn.reply(m.chat, `Sukses Membeli ${count} Legendary Crate Dengan Harga ${Blegendary * count} Money`, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Legendary Crate Dengan Harga ${Blegendary * count} Money \n\nBuka Crate Dengan Ketik: *${usedPrefix}open legendary*`, m) + + break + case 'sampah': + if (global.db.data.users[m.sender].money >= Bsampah * count) { + global.db.data.users[m.sender].sampah += count * 1 + global.db.data.users[m.sender].money -= Bsampah * count + conn.reply(m.chat, `Sukses Membeli ${count} Sampah Dengan Harga ${Bsampah * count} money`, m) + } else conn.reply(m.chat, `Uang Anda Tidak Cukup Untuk Membeli ${count} Sampah Dengan Harga ${Bsampah * count} Money `.trim(), m) + + break + case 'armor': + if (global.db.data.users[m.sender].armor == 5) return conn.reply(m.chat, 'Armormu Telah *Level Max*', m) + if (global.db.data.users[m.sender].money > armor * 1) { + global.db.data.users[m.sender].armor += 1 + global.db.data.users[m.sender].money -= armor * 1 + conn.reply(m.chat, `Sukses Membeli Armor Seharga ${armor} Money` ,m) + + } else conn.reply(m.chat, `Uang Mu Tidak Cukup Untuk Membeli Armor Seharga ${armor} Money`, m) + + break + default: + return conn.reply(m.chat, Kchat, m) + }*/ + } else if (/sell|jual|/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(99999999, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count) + switch (type) { + case 'banteng': + if (global.db.data.users[m.sender].banteng >= count * 1) { + global.db.data.users[m.sender].money += Spaus * count + global.db.data.users[m.sender].banteng -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Banteng Dengan Harga ${Sbanteng * count} Money `.trim(), m) + } else conn.reply(m.chat, `Banteng Kamu Tidak Cukup`.trim(), m) + break + case 'harimau': + if (global.db.data.users[m.sender].harimau >= count * 1) { + global.db.data.users[m.sender].money += Sharimau * count + global.db.data.users[m.sender].harimau -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Harimau Dengan Harga ${Sharimau * count} Money `.trim(), m) + } else conn.reply(m.chat, `Harimau Kamu Tidak Cukup`.trim(), m) + break + case 'gajah': + if (global.db.data.users[m.sender].gajah >= count * 1) { + global.db.data.users[m.sender].money += Sgajah * count + global.db.data.users[m.sender].gajah -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Gajah Dengan Harga ${Sgajah * count} Money `.trim(), m) + } else conn.reply(m.chat, `Gajah Kamu Tidak Cukup`.trim(), m) + break + case 'kambing': + if (global.db.data.users[m.sender].kambing >= count * 1) { + global.db.data.users[m.sender].money += Skambing * count + global.db.data.users[m.sender].kambing -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kambing Dengan Harga ${Skambing * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kambing Kamu Tidak Cukup`.trim(), m) + break + case 'panda': + if (global.db.data.users[m.sender].panda >= count * 1) { + global.db.data.users[m.sender].money += Spanda * count + global.db.data.users[m.sender].panda -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Panda Dengan Harga ${Sbuaya * count} Money `.trim(), m) + } else conn.reply(m.chat, `Panda Kamu Tidak Cukup`.trim(), m) + break + case 'buaya': + if (global.db.data.users[m.sender].buaya >= count * 1) { + global.db.data.users[m.sender].money += Sbuaya * count + global.db.data.users[m.sender].buaya -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Buaya Dengan Harga ${Sbuaya * count} Money `.trim(), m) + } else conn.reply(m.chat, `Buaya Kamu Tidak Cukup`.trim(), m) + break + case 'kerbau': + if (global.db.data.users[m.sender].kerbau >= count * 1) { + global.db.data.users[m.sender].money += Skerbau * count + global.db.data.users[m.sender].kerbau -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kerbau Dengan Harga ${Skerbau * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kerbau Kamu Tidak Cukup`.trim(), m) + break + case 'sapi': + if (global.db.data.users[m.sender].sapi >= count * 1) { + global.db.data.users[m.sender].money += Ssapi * count + global.db.data.users[m.sender].sapi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Sapi Dengan Harga ${Ssapi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Sapi Kamu Tidak Cukup`.trim(), m) + break + case 'monyet': + if (global.db.data.users[m.sender].monyet >= count * 1) { + global.db.data.users[m.sender].money += Smonyet * count + global.db.data.users[m.sender].monyet -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Monyet Dengan Harga ${Smonyet * count} Money `.trim(), m) + } else conn.reply(m.chat, `Monyet Kamu Tidak Cukup`.trim(), m) + break + case 'babi': + if (global.db.data.users[m.sender].babi >= count * 1) { + global.db.data.users[m.sender].money += Sbabi * count + global.db.data.users[m.sender].babi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Babi Dengan Harga ${Sbabi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Babi Kamu Tidak Cukup`.trim(), m) + break + case 'babihutan': + if (global.db.data.users[m.sender].babihutan >= count * 1) { + global.db.data.users[m.sender].money += Sbabihutan * count + global.db.data.users[m.sender].babihutan -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Babi Hutan Dengan Harga ${Sbabihutan * count} Money `.trim(), m) + } else conn.reply(m.chat, `Babi Hutan Kamu Tidak Cukup`.trim(), m) + break + case 'ayam': + if (global.db.data.users[m.sender].ayam >= count * 1) { + global.db.data.users[m.sender].money += Sayam * count + global.db.data.users[m.sender].ayam -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ayam Dengan Harga ${Sayam * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ayam Kamu Tidak Cukup`.trim(), m) + break + //mancing + case 'kepiting': + if (global.db.data.users[m.sender].kepiting >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].kepiting -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kepiting Dengan Harga ${Skepiting * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kepiting Kamu Tidak Cukup`.trim(), m) + break + case 'ikan': + if (global.db.data.users[m.sender].ikan >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].ikan -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Dengan Harga ${Sikan * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Kamu Tidak Cukup`.trim(), m) + break + case 'dory': + if (global.db.data.users[m.sender].dory >= count * 1) { + global.db.data.users[m.sender].money += Sdory * count + global.db.data.users[m.sender].dory -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Dory Dengan Harga ${Sdory * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Dory Kamu Tidak Cukup`.trim(), m) + break + case 'gurita': + if (global.db.data.users[m.sender].gurita >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].gurita -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Gurita Dengan Harga ${Sgurita * count} Money `.trim(), m) + } else conn.reply(m.chat, `Gurita Kamu Tidak Cukup`.trim(), m) + break + case 'buntal': + if (global.db.data.users[m.sender].buntal >= count * 1) { + global.db.data.users[m.sender].money += Sbuntal * count + global.db.data.users[m.sender].buntal -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Buntal Dengan Harga ${Sbuntal * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Buntal Kamu Tidak Cukup`.trim(), m) + break + case 'hiu': + if (global.db.data.users[m.sender].hiu >= count * 1) { + global.db.data.users[m.sender].money += Shiu * count + global.db.data.users[m.sender].hiu -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Hiu Dengan Harga ${Shiu * count} Money `.trim(), m) + } else conn.reply(m.chat, `Hiu Kamu Tidak Cukup`.trim(), m) + break + case 'orca': + if (global.db.data.users[m.sender].orca >= count * 1) { + global.db.data.users[m.sender].money += Sorca * count + global.db.data.users[m.sender].orca -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Paus Orca Dengan Harga ${Sorca * count} Money `.trim(), m) + } else conn.reply(m.chat, `Paus Orca Kamu Tidak Cukup`.trim(), m) + break + case 'lumba': + if (global.db.data.users[m.sender].lumba >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].lumba -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Lumba Lumba Dengan Harga ${Slumba * count} Money `.trim(), m) + } else conn.reply(m.chat, `Lumba Lumba Kamu Tidak Cukup`.trim(), m) + break + case 'paus': + if (global.db.data.users[m.sender].paus >= count * 1) { + global.db.data.users[m.sender].money += Spaus * count + global.db.data.users[m.sender].paus -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Paus Dengan Harga ${Spaus * count} Money `.trim(), m) + } else conn.reply(m.chat, `Paus Kamu Tidak Cukup`.trim(), m) + break + case 'lobster': + if (global.db.data.users[m.sender].lobster >= count * 1) { + global.db.data.users[m.sender].money += Slobster * count + global.db.data.users[m.sender].lobster -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Lobster Dengan Harga ${Slobster * count} Money `.trim(), m) + } else conn.reply(m.chat, `Lobster Kamu Tidak Cukup`.trim(), m) + break + case 'udang': + if (global.db.data.users[m.sender].udang >= count * 1) { + global.db.data.users[m.sender].money += Sudang * count + global.db.data.users[m.sender].udang -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Udang Dengan Harga ${Sudang * count} Money `.trim(), m) + } else conn.reply(m.chat, `Udang Kamu Tidak Cukup`.trim(), m) + break + case 'cumi': + if (global.db.data.users[m.sender].cumi >= count * 1) { + global.db.data.users[m.sender].money += Scumi * count + global.db.data.users[m.sender].cumi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Cumi Dengan Harga ${Scumi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Cumi Kamu Tidak Cukup`.trim(), m) + break + default: + return conn.reply(m.chat, Kchat, m) + } + } + } catch (e) { + conn.reply(m.chat, Kchat, m) + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.sendMessage(jid, 'shop.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', MessageType.text) + } + } + } +} + +handler.help = ['pasar *<sell>|<args>*'] +handler.tags = ['rpg'] + +handler.command = /^(pasar|jual)$/i +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-penjara.js b/plugins/rpg-penjara.js new file mode 100644 index 0000000000000000000000000000000000000000..1bb2612fe9fb5e19bbe6eea643b274e32bcb41e9 --- /dev/null +++ b/plugins/rpg-penjara.js @@ -0,0 +1,28 @@ +let handler = async (m, { conn, args, text, usedPrefix, command }) => { + const JAIL_TIME = 60 * 60 * 1000 + let who = (m.mentionedJid && m.mentionedJid[0]) ? m.mentionedJid[0] : args[0] ? ((args.join('').replace(/[@ .+-]/g, '')).replace(/^\+/, '').replace(/-/g, '') + '@s.whatsapp.net') : ''; + const user = global.db.data.users[who] + const usar = global.db.data.users[m.sender] + if (usar.job == 'polisi') { + if (!text) throw '*Siapa yang mau di penjara?*' + if (!who) return m.reply('*Tag target atau ketik nomornya*') + if (!user) return m.reply(`*Pengguna ${who} tidak ada dalam database*`) + + user.jail = true + user.perkerjaandua = Date.now() + JAIL_TIME + + setTimeout(() => { + conn.reply(who, `*Kamu telah di penjara oleh ${usar.name}*`, fverif) + }, 5000) + conn.reply(m.chat, `Berhasil penjara *@${(who || '').replace(/@s\.whatsapp\.net/g, '')}*\n๐Ÿงค +1 Tingkat Kerja Keras\n\n_Jika polisi diketahui memenjarai seseorang tanpa alasan tertentu, maka akan langsung diban oleh pihak atasan._`, m, { mentions: [who] }) + return + } + await conn.reply(m.chat, '*Fitur ini hanya dikhususkan untuk orang yang bekerja sebagai polisi*', m) +} + +handler.help = ['penjara'] +handler.tags = ['rpg'] +handler.command = /^penjara$/i +handler.register = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-petstore.js b/plugins/rpg-petstore.js new file mode 100644 index 0000000000000000000000000000000000000000..aec3ebe44841adf195b091c7a668a40fc391cf5d --- /dev/null +++ b/plugins/rpg-petstore.js @@ -0,0 +1,142 @@ + +let handler = async (m, { conn, command, args, usedPrefix, DevMode }) => { + let type = (args[0] || '').toLowerCase() + let _type = (args[0] || '').toLowerCase() + let user = global.db.data.users[m.sender] + global.db.data.users[m.sender].pickaxe = global.db.data.users[m.sender].pickaxe || 0 + global.db.data.users[m.sender].pedang = global.db.data.users[m.sender].pedang || 0 + global.db.data.users[m.sender].fishingrod = global.db.data.users[m.sender].fishingrod || 0 + + //----------HARGA + let hkucing = 10 + let hanjing = 10 + let hserigala = 25 + let hrubah = 50 + let hphonix = 150 + +let logo = `โ€” *P E T S T O R E* โ€” +โ–ฎโ–งโ–งโ–งโ–งโ–งโ–งโ–งโ–งโ–งโ–งโ–งโ–งโ–ฎ` +let caption = ` +๐Ÿˆ *kucing:* ${hkucing} pet +๐Ÿ• *anjing:* ${hanjing} pet +๐Ÿบ *serigala:* ${hserigala} pet +๐ŸฆŠ *rubah:* ${hrubah} pet +๐Ÿฆโ€๐Ÿ”ฅ *phonix:* ${hphonix} pet + +ใ€‰ *ABILITY* +Cooming soon.. + +ใ€‰ *Example* +${usedPrefix}adopt kucing`.trim() + + try { + if (/pet(store|shop)?|adopt/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(99999999, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count) + switch (type) { + case 'kucing': + if (user.kucing > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hkucing) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hkucing + global.db.data.users[m.sender].kucing += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'anjing': + if (user.anjing > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hanjing) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hanjing + global.db.data.users[m.sender].anjing += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'rubah': + if (user.rubah > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hrubah) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hrubah + global.db.data.users[m.sender].rubah += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'horse': + if (user.horse > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hhorse) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hhorse + global.db.data.users[m.sender].horse += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'robo': + if (user.robo > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hrobo) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hrobo + global.db.data.users[m.sender].robo += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'lion': + if (user.lion > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hlion) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hlion + global.db.data.users[m.sender].lion += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'rhinoceros': + if (user.rhinoceros > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hrhinoceros) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hrhinoceros + global.db.data.users[m.sender].rhinoceros += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'dragon': + if (user.dragon > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hdragon) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hdragon + global.db.data.users[m.sender].dragon += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'centaur': + if (user.centaur > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hcentaur) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hcentaur + global.db.data.users[m.sender].centaur += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'kyubi': + if (user.kyubi > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hkyubi) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hkyubi + global.db.data.users[m.sender].kyubi += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'griffin': + if (user.griffin > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hgriffin) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hgriffin + global.db.data.users[m.sender].griffin += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'phonix': + if (user.phonix > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hphonix) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hphonix + global.db.data.users[m.sender].phonix += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + case 'serigala': + if (user.serigala > 0) return m.reply('Kamu sudah memilik ini') + if(user.pet < hserigala) return m.reply(`Pet Token anda kurang`) + global.db.data.users[m.sender].pet -= hserigala + global.db.data.users[m.sender].serigala += 1 + m.reply("Selamat anda mempunyai pet Baru ! ๐ŸŽ‰") + break + + default: + return await m.reply(`${logo}\n${caption}`) + } + } + } catch (err) { + m.reply("Error\n\n\n" + err.stack) + } +} + +handler.help = ['petshop'] +handler.tags = ['rpg'] +handler.command = /^(pet(shop|store)?|adopt)/i +handler.register = true +handler.rpg = true +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-pointomoney.js b/plugins/rpg-pointomoney.js new file mode 100644 index 0000000000000000000000000000000000000000..47973a39aa42dfaeee157c4061a5148b8cf92dbb --- /dev/null +++ b/plugins/rpg-pointomoney.js @@ -0,0 +1,36 @@ +let handler = async (m, { args }) => { + if (args.length !== 1) { + return conn.reply(m.chat, 'โ€ข *Example :* .pointomoney 1000', m) + } + let poin = parseInt(args[0]) + if (isNaN(poin) || poin < 1) { + throw 'Jumlah poin yang ingin dikonversi harus lebih dari atau sama dengan 1!' + } + let user = global.db.data.users[m.sender] + if (poin > user.poin) { + throw 'Maaf, kamu tidak memiliki cukup poin untuk dikonversi.' + } + + let fee = Math.round(poin * 0.05) + let moneyp = poin - fee + + let message = `Berikut adalah detail konversi poin ke uang:\n\n` + message += `โ€ข Jumlah Poin: ${poin}\n` + message += `โ€ข Fee (5%): ${fee}\n` + message += `โ€ข Jumlah Uang: ${moneyp}` + + user.poin -= poin + user.money += moneyp + global.db.data.users[m.sender] = user + global.db.write() + + m.reply(message) +} + +handler.help = ['pointomoney'] +handler.tags = ['rpg'] +handler.command = /^pointomoney$/i +handler.register = true +handler.limit = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-polisi.js b/plugins/rpg-polisi.js new file mode 100644 index 0000000000000000000000000000000000000000..7a239d828cef904af224f6695bfc2dd55774c42e --- /dev/null +++ b/plugins/rpg-polisi.js @@ -0,0 +1,173 @@ +/** !! THIS CODE GENERATE BY RODOTZBOT !! **/ + +const STATES = { + IDLE: 0, + SEARCHING: 1, + FIGHTING: 2, +}; + +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +const handler = async (m, { conn, usedPrefix, command, args }) => { + const sender = m.sender; + const user = global.db.data.users[sender] + conn.players = conn.players || {}; + const player = conn.players[sender] || { Uang: 0, Pencuri_Tertangkap: 0, Waktu_Tertangkap: 0, Kaca_Pembesar: 0, Level: 1, State: STATES.IDLE }; + + if (command === "polisi") { + if (args.length === 0) { + conn.reply(m.chat, "*๐Ÿ‘ฎโ€โ™‚๏ธ Cara Bermain Game Polisi dan Pencuri ๐Ÿ‘ฎโ€โ™‚๏ธ*\n\n" + + "๐Ÿ” Gunakan perintah *.polisi cari* untuk mencari pencuri secara acak.\n" + + "๐Ÿš“ Anda akan menemukan jejak pencuri dan harus melakukan tindakan tertentu untuk menangkapnya.\n" + + "๐Ÿ’ฐ Anda akan mendapatkan imbalan jika berhasil menangkap pencuri.\n" + + "๐Ÿšจ Pilih tindakan dari: kejar, tembak, lempar, atau tangkap.\n" + + "๐Ÿ” Gunakan perintah *.polisi <tindakan>* untuk melawan dan menangkap pencuri.\n" + + "๐Ÿ”Ž Anda dapat membeli kaca pembesar *.polisi item kaca-pembesar* untuk meningkatkan peluang menangkap pencuri.\n" + + "๐Ÿ† Cek peringkat Anda dengan perintah *.polisi leaderboard*.\n" + + "โ„น๏ธ Gunakan perintah *.polisi status* untuk melihat status Anda saat ini.", m, { + contextInfo: { + externalAdReply: { + mediaType: 1, + title: wm, + thumbnailUrl: 'https://telegra.ph/file/505b8d95fd7ee7b9481e3.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + } + } + }); + return; + } + + const subCommand = args[0]; + if (subCommand === "cari") { + if (player.State !== STATES.IDLE) { + return conn.reply(m.chat, "*๐Ÿ” Sedang dalam pencarian...*", m); + } + + if (Date.now() - player.Waktu_Tertangkap < 30000) { + return conn.reply(m.chat, "*โฑ๏ธ Anda harus menunggu sebentar sebelum dapat mencari kembali.*", m); + } + + player.State = STATES.SEARCHING; + player.Waktu_Tertangkap = Date.now(); + + const level = player.Level; + const thiefActions = { + 1: ".polisi kejar", + 2: ".polisi tembak", + 3: ".polisi lempar", + 4: ".polisi tangkap", + }; + const thiefAction = thiefActions[level]; + + conn.reply(m.chat, `*๐Ÿ” Anda menemukan jejak pencuri level ${level}!* Untuk menangkap pencuri, lakukan tindakan: *${thiefAction.toUpperCase()}*.`, m); + + player.ThiefAction = thiefAction; + } else if (subCommand === "status") { + conn.reply(m.chat, `*๐Ÿ‘ฎโ€โ™‚๏ธ Status Polisi ๐Ÿ‘ฎโ€โ™‚๏ธ*\n\n๐Ÿ” Sedang Mencari Pencuri: ${player.State === STATES.SEARCHING ? "Ya" : "Tidak"}\n๐Ÿš“ Pencuri Tertangkap: ${player.Pencuri_Tertangkap}\n๐Ÿ’ฐ Uang: Rp${player.Uang.toLocaleString()}\n๐Ÿ† Level Pencuri: ${player.Level}`, m); + } else if (subCommand === "item") { + if (args.length === 1) { + conn.reply(m.chat, "*๐Ÿ›’ Item Shop ๐Ÿ›’*\n\nKaca Pembesar - 200 coins\n" + + `Gunakan *${usedPrefix}polisi item kaca-pembesar* untuk membeli kaca pembesar.`, m); + } else { + const item = args[1]?.toLowerCase(); + if (item === "kaca-pembesar") { + if (player.Kaca_Pembesar) { + return conn.reply(m.chat, "*๐Ÿ›’ Anda sudah memiliki kaca pembesar.*", m); + } + + if (player.Uang < 200) { + return conn.reply(m.chat, "*๐Ÿ›’ Uang Anda tidak cukup untuk membeli kaca pembesar.*", m); + } + + player.Kaca_Pembesar = 1; + player.Uang -= 200; + conn.reply(m.chat, "*๐Ÿ›’ Anda berhasil membeli kaca pembesar.* Gunakan 'polisi cari' untuk meningkatkan peluang menangkap pencuri.", m); + } else { + conn.reply(m.chat, "*๐Ÿ›’ Item yang dimaksud tidak ditemukan.*", m); + } + } + } else if (subCommand === "leaderboard") { + // Sort players based on the number of thieves caught (descending order) + const leaderboard = Object.entries(conn.players) + .map(([playerId, playerData]) => ({ id: playerId, Pencuri_Tertangkap: playerData.Pencuri_Tertangkap })) + .sort((a, b) => b.Pencuri_Tertangkap - a.Pencuri_Tertangkap) + .slice(0, 5); // Show top 5 players + + let leaderboardMsg = "*๐Ÿ† Leaderboard ๐Ÿ†*\n\n"; + for (let i = 0; i < leaderboard.length; i++) { + leaderboardMsg += `${i + 1}. @${leaderboard[i].id.split("@")[0]} - ${leaderboard[i].Pencuri_Tertangkap} Pencuri Tertangkap\n`; + } + + conn.reply(m.chat, leaderboardMsg, m); + } else if (subCommand === "stop") { + user.money += player.Uang * player.Pencuri_Tertangkap; + let skorMsg = `*๐Ÿ† Skor Akhir Anda ๐Ÿ†*\n\n๐Ÿš“ Pencuri Tertangkap: ${player.Pencuri_Tertangkap}\n๐Ÿ’ฐ Total Uang: Rp${player.Uang.toLocaleString()}\n๐Ÿ† Level Pencuri: ${player.Level}`; + + conn.reply(m.chat, `*๐Ÿ‘ฎโ€โ™‚๏ธ Sesi permainan Polisi dan Pencuri telah dihentikan.*\n\n${skorMsg}`, m); + player.State = STATES.IDLE; + player.ThiefAction = undefined; + } else { + if (player.State !== STATES.SEARCHING) { + return conn.reply(m.chat, "*๐Ÿ” Anda harus mencari pencuri terlebih dahulu dengan perintah 'polisi cari'.*", m); + } + + const polisiAction = subCommand.toLowerCase(); + const level = player.Level; + const thiefActions = { + 1: [".polisi kejar", ".polisi tembak", ".polisi lempar"], + 2: [".polisi tembak", ".polisi tangkap"], + 3: [".polisi tangkap"], + }; + + if (!thiefActions[level].includes(polisiAction)) { + return conn.reply(m.chat, `*๐Ÿš“ Pilihan tindakan Anda (${polisiAction.toUpperCase()}) tidak sesuai dengan hasil yang dicari.*`, m); + } + + if (thiefActions[level].includes(player.ThiefAction)) { + let reward = 0; + switch (polisiAction) { + case "kejar": + reward = 1000 * level; + break; + case "tembak": + reward = 2000 * level; + break; + case "lempar": + reward = 3000 * level; + break; + case "tangkap": + reward = 5000 * level; + break; + } + + player.Pencuri_Tertangkap++; + player.Uang += reward; + user.money += reward; + if (player.Uang < 5000) { + player.Uang = 5000; + } + + conn.reply(m.chat, `*๐Ÿš“ Anda berhasil melawan dan menangkap pencuri level ${level}!* Anda mendapatkan imbalan Rp${reward.toLocaleString()}. Total Uang Anda: Rp${player.Uang.toLocaleString()}.`, m); + } else { + conn.reply(m.chat, "*๐Ÿš“ Tindakan Anda tidak tepat dan pencuri berhasil lepas!*", m); + } + + player.State = STATES.IDLE; + player.ThiefAction = undefined; + } + + conn.players[sender] = player; + } else if (command === "info") { + conn.reply(m.chat, "*โ„น๏ธ Gunakan perintah 'polisi' untuk memulai game Polisi dan Pencuri.*", m); + } +}; + +handler.help = ["polisi", "polisi cari", "polisi status", "polisi item <item>", "polisi leaderboard", "polisi stop"]; +handler.tags = ["rpg"]; +handler.group = true; +handler.command = ["polisi"]; + +module.exports = handler; diff --git a/plugins/rpg-repair.js b/plugins/rpg-repair.js new file mode 100644 index 0000000000000000000000000000000000000000..20df0f574aa66131a868187ff5ad95f67c19802e --- /dev/null +++ b/plugins/rpg-repair.js @@ -0,0 +1,172 @@ +let handler = async (m, { conn, command, args, usedPrefix, DevMode }) => { + let type = (args[0] || '').toLowerCase() + let _type = (args[0] || '').toLowerCase() + let user = global.db.data.users[m.sender] + global.db.data.users[m.sender].pickaxe = global.db.data.users[m.sender].pickaxe || 0 + global.db.data.users[m.sender].pedang = global.db.data.users[m.sender].pedang || 0 + global.db.data.users[m.sender].fishingrod = global.db.data.users[m.sender].fishingrod || 0 + global.db.data.users[m.sender].bow = global.db.data.users[m.sender].bow || 0 + global.db.data.users[m.sender].katana = global.db.data.users[m.sender].katana || 0 + global.db.data.users[m.sender].axe = global.db.data.users[m.sender].axe || 0 + global.db.data.users[m.sender].armor = global.db.data.users[m.sender].armor || 0 + + let caption = ` +ไน‚ *R E P A I R* + +ไน‚ *L I S T - R E P A I R* +*[ โ›๏ธ ]* โ€ข Pickaxe +*[ โš”๏ธ ]* โ€ข Sword +*[ ๐ŸŽฃ ]* โ€ข Fishingrod +*[ ๐Ÿฅผ ]* โ€ข Armor +*[ ๐Ÿฆฏ ]* โ€ข Katana +*[ ๐Ÿช“ ]* โ€ข Axe +*[ ๐Ÿน ]* โ€ข Bow + +ไน‚ *M A T E R I A L* +*[ โ›๏ธ ]* โ€ข _Pickaxe_ + โ€ข _5_ || *Kayu* +โ€ข _3_ || *Batu* +โ€ข _3_ || *Iron* +โ€ข _1_ || *Diamond* + +*[ ๐Ÿฆฏ ]* โ€ข _Katana_ + โ€ข _5_ || *Kayu* +โ€ข _10_ || *Batu* +โ€ข _20_ || *Iron* +โ€ข _10_ || *Diamond* + +*[ โš”๏ธ ]* โ€ข _Sword_ +โ€ข _5_ || Kayu +โ€ข _9_ || Iron +โ€ข _1_ || Diamond + +*[ ๐Ÿฅผ ]* โ€ข _Armor_ +โ€ข _15_ || Iron +โ€ข _3_ || Diamond + +*[ ๐Ÿช“ ]* โ€ข _Axe_ +โ€ข _15_ || Iron +โ€ข _10_ || Kayu + +*[ ๐ŸŽฃ ]* โ€ข _FishingRod_ + โ€ข _10_ || *Kayu* +โ€ข _15_ || *Batu* +โ€ข _5_ || *Iron* + +*[ ๐Ÿน ]* โ€ข _Bow_ + โ€ข _15_ || *Kayu* +โ€ข _5_ || *Iron* +โ€ข _10_ || *String* + +_Example_ : +.perbaiki _bow_ +` + try { + if (/repair|perbaiki/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(99999999, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count) + switch (type) { + case 'pickaxe': + if (user.pickaxedurability > 99) return m.reply('Pickaxe Kamu Belum Memiliki Kerusakan') + if (user.pickaxe == 0) return m.reply('Kamu Belum Memilik Pickaxe') + if(user.diamond < 1 || user.batu < 3 || user.kayu < 5 || user.iron < 3 ) return m.reply(`Bahan Untuk Repair Tiidak Cukup!`) + user.batu -= 3 + user.kayu -= 5 + user.iron -= 3 + user.diamond -= 1 + user.pickaxedurability = 100 + m.reply("Sukses Memperbaiki Pickaxe") + break + case 'katana': + if (user.katanadurability > 99) return m.reply('Katana Kamu Belum Memiliki Kerusakan') + if (user.katana == 0) return m.reply('Kamu Belum Memilik Katana') + if(user.diamond < 10 || user.batu < 10 || user.kayu < 5 || user.iron < 20 ) return m.reply(`Bahan Untuk Repair Tiidak Cukup!`) + user.batu -= 10 + user.kayu -= 5 + user.iron -= 20 + user.diamond -= 10 + user.katanadurability = 100 + m.reply("Sukses Memperbaiki Katana") + break + case 'sword': + if (user.sworddurability > 99) return m.reply('Sword Kamu Belum Memiliki Kerusakan') + if (user.sword == 0) return m.reply('Kamu Belum Memilik Sword') + if(user.diamond < 1 || user.kayu < 5 || user.iron < 9 ) return m.reply(`Bahan Untuk Repair Tidak Cukup!`) + user.kayu -= 5 + user.iron -= 9 + user.diamond -= 1 + user.sworddurability = 100 + m.reply("Sukses Memperbaiki Sword") + break + case 'fishingrod': + if (user.fishingroddurability > 99) return m.reply('Fishingrod Kamu Belum Memiliki Kerusakan') + if (user.fishingrod == 0) return m.reply('Kamu Belum Memilik Fishingrod') + if(user.kayu < 10 || user.batu < 15 || user.iron < 5 ) return m.reply(`Bahan Untuk Repair Tidak Cukup!`) + user.kayu -= 10 + user.batu -= 15 + user.iron -= 5 + user.fishingroddurability = 100 + m.reply("Sukses Memperbaiki Fishingrod") + break + case 'bow': + if (user.bowdurability > 99) return m.reply('Bow Kamu Belum Memiliki Kerusakan') + if (user.bow == 0) return m.reply('Kamu Belum Memilik Bow') + if(user.kayu < 15 || user.iron < 5 || user.string < 10 ) return m.reply(`Bahan Untuk Repair Tidak Cukup!`) + user.kayu -= 10 + user.iron -= 5 + user.string -= 5 + user.bowdurability = 100 + m.reply("Sukses Memperbaiki Fishingrod") + break + case 'armor': + if (user.armordurability > 99) return m.reply('Armor Kamu Belum Memiliki Kerusakan') + if (user.armor == 0) return m.reply('Kamu Belum Memilik Armor') + if(user.diamond < 3 || user.iron < 15 ) return m.reply(`Bahan Tidak Cukup Untuk Memperbaiki Armor!`) + user.iron -= 15 + user.diamond -= 3 + user.armordurability = 100 + m.reply("Sukses Memperbaiki Armor") + break + case 'axe': + if (user.axedurability > 99) return m.reply('Axe Kamu Belum Memiliki Kerusakan') + if (user.axe == 0) return m.reply('Kamu Belum Memilik Axe') + if(user.kayu < 10 || user.iron < 15 ) return m.reply(`Bahan Tidak Cukup Untuk Memperbaiki Armor!`) + user.iron -= 15 + user.kayu -= 10 + user.axedurability = 100 + m.reply("Sukses Memperbaiki Axe") + break + default: + await conn.reply(m.chat, caption, m, { + contextInfo: { + externalAdReply: { + mediaType: 1, + title: wm, + thumbnailUrl: 'https://telegra.ph/file/f329ce46c24b0d7e0837e.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + } + } + }); + } + } else if (/enchant|enchan/i.test(command)) { + const count = args[2] && args[2].length > 0 ? Math.min(99999999, Math.max(parseInt(args[2]), 1)) : !args[2] || args.length < 4 ? 1 : Math.min(1, count); + switch (_type) { + case 't': + break; + case '': + break; + default: + m.reply(caption); + } + } + } catch (err) { + m.reply("Error\n\n\n" + err.stack); + } +}; + +handler.help = ['repair', 'perbaiki'] +handler.tags = ['rpg'] +handler.group = true +handler.command = /^(repair|perbaiki)/i + +module.exports = handler diff --git a/plugins/rpg-restauran.js b/plugins/rpg-restauran.js new file mode 100644 index 0000000000000000000000000000000000000000..851bd068c64fa75890fb91a22e0b5ed830fc0051 --- /dev/null +++ b/plugins/rpg-restauran.js @@ -0,0 +1,723 @@ +let { MessageType } = require('@adiwajshing/baileys') +const Hab = 20000 +const Hag = 15000 +const Hr = 15000 +const Hs = 20000 +const Hbp = 50000 +const Hga = 15000 +const Hoa = 15000 +const Hv = 50000 +const Hsu = 30000 +const Hb = 20000 +const Hg = 100000 +const Hso = 50000 +const Hro = 10000 +const Hib = 15000 +const Hlb = 15000 +const Hnb = 15000 +const Hbb = 15000 +const Hub = 15000 +const Hpb = 200000 +const Hkb = 20000 +let handler = async (m, { conn, command, args, usedPrefix, DevMode }) => { + const _armor = global.db.data.users[m.sender].armor + const armor = (_armor == 0 ? 20000 : '' || _armor == 1 ? 49999 : '' || _armor == 2 ? 99999 : '' || _armor == 3 ? 149999 : '' || _armor == 4 ? 299999 : '') + let type = (args[0] || '').toLowerCase() + let _type = (args[1] || '').toLowerCase() + let jualbeli = (args[0] || '').toLowerCase() + const Kchat = `โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n +โ•ญโ”€โ”€ใ€Ž า“แดแดแด… ใ€ +โ”‚โฌก *ayambakar* : ${Hab} +โ”‚โฌก *ayamgoreng* : ${Hag} +โ”‚โฌก *rendang* : ${Hr} +โ”‚โฌก *steak* : ${Hs} +โ”‚โฌก *babipanggang* : ${Hbp} +โ”‚โฌก *gulaiayam* : ${Hga} +โ”‚โฌก *oporayam* : ${Hoa} +โ”‚โฌก *vodka* : ${Hv} +โ”‚โฌก *sushi* : ${Hsu} +โ”‚โฌก *bandage* : ${Hb} +โ”‚โฌก *ganja* : ${Hg} +โ”‚โฌก *soda* : ${Hso} +โ”‚โฌก *roti* : ${Hro} +โ”‚โฌก *ikanbakar* : ${Hib} +โ”‚โฌก *lelebakar* : ${Hlb} +โ”‚โฌก *nilabakar* : ${Hnb} +โ”‚โฌก *bawalbakar* : ${Hbb} +โ”‚โฌก *udangbakar* : ${Hub} +โ”‚โฌก *pausbakar* : ${Hpb} +โ”‚โฌก *kepitingbakar* : ${Hkb} +โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” + +> *Contoh pembelian :* +#resto beli food jumlah +#resto beli ayambakar 2 +`.trim() + try { + if (/resto/i.test(command)) { + const count = args[2] && args[2].length > 0 ? Math.min(99999999, Math.max(parseInt(args[2]), 1)) : !args[2] || args.length < 4 ? 1 :Math.min(1, count) + const sampah = global.db.data.users[m.sender].sampah + switch (jualbeli) { + case 'beli': + switch (_type) { + case 'ayambakar': + if (global.db.data.users[m.sender].money >= Hab * count) { + global.db.data.users[m.sender].money -= Hab * count + global.db.data.users[m.sender].ayambakar += count * 1 + conn.reply(m.chat, `Succes membeli ${count} Ayam Bakar dengan harga ${Hab * count} money`, m) + } else conn.reply(m.chat, `Money Tidak Cukup`,) + break + case 'ayamgoreng': + if (global.db.data.users[m.sender].money >= Hag * count) { + global.db.data.users[m.sender].ayamgoreng += count * 1 + global.db.data.users[m.sender].money -= Hag * count + conn.reply(m.chat, `Succes membeli ${count} Ayam Goreng dengan harga ${Hag * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'rendang': + if (global.db.data.users[m.sender].money >= Hr * count) { + global.db.data.users[m.sender].rendang += count * 1 + global.db.data.users[m.sender].money -= Hr * count + conn.reply(m.chat, `Succes membeli ${count} Rendang dengan harga ${Hr * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'steak': + if (global.db.data.users[m.sender].money >= Hs * count) { + global.db.data.users[m.sender].steak += count * 1 + global.db.data.users[m.sender].money -= Hs * count + conn.reply(m.chat, `Succes membeli ${count} Steak dengan harga ${Hs * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'babipanggang': + if (global.db.data.users[m.sender].money >= Hbp * count) { + global.db.data.users[m.sender].babipanggang += count * 1 + global.db.data.users[m.sender].money -= Hbp * count + conn.reply(m.chat, `Succes membeli ${count} Babi Panggang dengan harga ${Hbp * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'gulaiayam': + if (global.db.data.users[m.sender].money >= Hga * count) { + global.db.data.users[m.sender].money -= Hga * count + global.db.data.users[m.sender].gulai += count * 1 + conn.reply(m.chat, `Succes membeli ${count} Gulai Ayam dengan harga ${Hga * count} money`, m) + } else conn.reply(m.chat, `Money Tidak Cukup`,) + break + case 'oporayam': + if (global.db.data.users[m.sender].money >= Hoa * count) { + global.db.data.users[m.sender].oporayam += count * 1 + global.db.data.users[m.sender].money -= Hoa * count + conn.reply(m.chat, `Succes membeli ${count} Opor Ayam dengan harga ${Hoa * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'vodka': + if (global.db.data.users[m.sender].money >= Hv * count) { + global.db.data.users[m.sender].vodka += count * 1 + global.db.data.users[m.sender].money -= Hv * count + conn.reply(m.chat, `Succes membeli ${count} Vodka dengan harga ${Hv * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'sushi': + if (global.db.data.users[m.sender].money >= Hsu * count) { + global.db.data.users[m.sender].sushi += count * 1 + global.db.data.users[m.sender].money -= Hsu * count + conn.reply(m.chat, `Succes membeli ${count} Sushi dengan harga ${Hsu * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'bandage': + if (global.db.data.users[m.sender].money >= Hb * count) { + global.db.data.users[m.sender].bandage += count * 1 + global.db.data.users[m.sender].money -= Hb * count + conn.reply(m.chat, `Succes membeli ${count} Bandage dengan harga ${Hb * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'ganja': + if (global.db.data.users[m.sender].money >= Hg * count) { + global.db.data.users[m.sender].money -= Hg * count + global.db.data.users[m.sender].ganja += count * 1 + conn.reply(m.chat, `Succes membeli ${count} Ganja dengan harga ${Hg * count} money`, m) + } else conn.reply(m.chat, `Money Tidak Cukup`,) + break + case 'soda': + if (global.db.data.users[m.sender].money >= Hso * count) { + global.db.data.users[m.sender].soda += count * 1 + global.db.data.users[m.sender].money -= Hso * count + conn.reply(m.chat, `Succes membeli ${count} Soda dengan harga ${Hso * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'roti': + if (global.db.data.users[m.sender].money >= Hro * count) { + global.db.data.users[m.sender].roti += count * 1 + global.db.data.users[m.sender].money -= Hro * count + conn.reply(m.chat, `Succes membeli ${count} Roti dengan harga ${Hro * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'ikanbakar': + if (global.db.data.users[m.sender].money >= Hib * count) { + global.db.data.users[m.sender].ikanbakar += count * 1 + global.db.data.users[m.sender].money -= Hib * count + conn.reply(m.chat, `Succes membeli ${count} Ikan Bakar dengan harga ${Hib * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'lelebakar': + if (global.db.data.users[m.sender].money >= Hlb * count) { + global.db.data.users[m.sender].lelebakar += count * 1 + global.db.data.users[m.sender].money -= Hlb * count + conn.reply(m.chat, `Succes membeli ${count} Lele Bakar dengan harga ${Hlb * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'nilabakar': + if (global.db.data.users[m.sender].money >= Hnb * count) { + global.db.data.users[m.sender].money -= Hnb * count + global.db.data.users[m.sender].nilabakar += count * 1 + conn.reply(m.chat, `Succes membeli ${count} Nila Bakar dengan harga ${Hnb * count} money`, m) + } else conn.reply(m.chat, `Money Tidak Cukup`,) + break + case 'bawalbakar': + if (global.db.data.users[m.sender].money >= Hbb * count) { + global.db.data.users[m.sender].bawalbakar += count * 1 + global.db.data.users[m.sender].money -= Hbb * count + conn.reply(m.chat, `Succes membeli ${count} Bawal Bakar dengan harga ${Hbb * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'udangbakar': + if (global.db.data.users[m.sender].money >= Hub * count) { + global.db.data.users[m.sender].udangbakar += count * 1 + global.db.data.users[m.sender].money -= Hub * count + conn.reply(m.chat, `Succes membeli ${count} Udang Bakar dengan harga ${Hub * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'pausbakar': + if (global.db.data.users[m.sender].money >= Hpb * count) { + global.db.data.users[m.sender].pausbakar += count * 1 + global.db.data.users[m.sender].money -= Hpb * count + conn.reply(m.chat, `Succes membeli ${count} Paus Bakar dengan harga ${Hpb * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'kepitingbakar': + if (global.db.data.users[m.sender].money >= Hkb * count) { + global.db.data.users[m.sender].kepitingbakar += count * 1 + global.db.data.users[m.sender].money -= Hkb * count + conn.reply(m.chat, `Succes membeli ${count} Kepiting Bakar dengan harga ${Hkb * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + default: + return conn.reply(m.chat, Kchat, m) + } + break + /*case 'jual': + switch (_type) { + case 'banteng': + if (global.db.data.users[m.sender].banteng >= count * 1) { + global.db.data.users[m.sender].money += Spaus * count + global.db.data.users[m.sender].banteng -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Banteng Dengan Harga ${Sbanteng * count} Money `.trim(), m) + } else conn.reply(m.chat, `Banteng Kamu Tidak Cukup`.trim(), m) + break + case 'harimau': + if (global.db.data.users[m.sender].harimau >= count * 1) { + global.db.data.users[m.sender].money += Sharimau * count + global.db.data.users[m.sender].harimau -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Harimau Dengan Harga ${Sharimau * count} Money `.trim(), m) + } else conn.reply(m.chat, `Harimau Kamu Tidak Cukup`.trim(), m) + break + case 'gajah': + if (global.db.data.users[m.sender].gajah >= count * 1) { + global.db.data.users[m.sender].money += Sgajah * count + global.db.data.users[m.sender].gajah -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Gajah Dengan Harga ${Sgajah * count} Money `.trim(), m) + } else conn.reply(m.chat, `Gajah Kamu Tidak Cukup`.trim(), m) + break + case 'kambing': + if (global.db.data.users[m.sender].kambing >= count * 1) { + global.db.data.users[m.sender].money += Skambing * count + global.db.data.users[m.sender].kambing -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kambing Dengan Harga ${Skambing * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kambing Kamu Tidak Cukup`.trim(), m) + break + case 'panda': + if (global.db.data.users[m.sender].panda >= count * 1) { + global.db.data.users[m.sender].money += Spanda * count + global.db.data.users[m.sender].panda -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Panda Dengan Harga ${Sbuaya * count} Money `.trim(), m) + } else conn.reply(m.chat, `Panda Kamu Tidak Cukup`.trim(), m) + break + case 'buaya': + if (global.db.data.users[m.sender].buaya >= count * 1) { + global.db.data.users[m.sender].money += Sbuaya * count + global.db.data.users[m.sender].buaya -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Buaya Dengan Harga ${Sbuaya * count} Money `.trim(), m) + } else conn.reply(m.chat, `Buaya Kamu Tidak Cukup`.trim(), m) + break + case 'kerbau': + if (global.db.data.users[m.sender].kerbau >= count * 1) { + global.db.data.users[m.sender].money += Skerbau * count + global.db.data.users[m.sender].kerbau -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kerbau Dengan Harga ${Skerbau * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kerbau Kamu Tidak Cukup`.trim(), m) + break + case 'sapi': + if (global.db.data.users[m.sender].sapi >= count * 1) { + global.db.data.users[m.sender].money += Ssapi * count + global.db.data.users[m.sender].sapi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Sapi Dengan Harga ${Ssapi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Sapi Kamu Tidak Cukup`.trim(), m) + break + case 'monyet': + if (global.db.data.users[m.sender].monyet >= count * 1) { + global.db.data.users[m.sender].money += Smonyet * count + global.db.data.users[m.sender].monyet -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Monyet Dengan Harga ${Smonyet * count} Money `.trim(), m) + } else conn.reply(m.chat, `Monyet Kamu Tidak Cukup`.trim(), m) + break + case 'babi': + if (global.db.data.users[m.sender].babi >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].babi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Babi Dengan Harga ${Sbabi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Babi Kamu Tidak Cukup`.trim(), m) + break + case 'babihutan': + if (global.db.data.users[m.sender].babihutan >= count * 1) { + global.db.data.users[m.sender].money += Sbabihutan * count + global.db.data.users[m.sender].babihutan -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Babi Hutan Dengan Harga ${Sbabihutan * count} Money `.trim(), m) + } else conn.reply(m.chat, `Babi Hutan Kamu Tidak Cukup`.trim(), m) + break + case 'ayam': + if (global.db.data.users[m.sender].ayam >= count * 1) { + global.db.data.users[m.sender].money += Sayam * count + global.db.data.users[m.sender].ayam -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ayam Dengan Harga ${Sayam * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ayam Kamu Tidak Cukup`.trim(), m) + break + //mancing + case 'kepiting': + if (global.db.data.users[m.sender].kepiting >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].kepiting -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kepiting Dengan Harga ${Skepiting * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kepiting Kamu Tidak Cukup`.trim(), m) + break + case 'ikan': + if (global.db.data.users[m.sender].ikan >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].ikan -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Dengan Harga ${Sikan * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Kamu Tidak Cukup`.trim(), m) + break + case 'dory': + if (global.db.data.users[m.sender].dory >= count * 1) { + global.db.data.users[m.sender].money += Sdory * count + global.db.data.users[m.sender].dory -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Dory Dengan Harga ${Sdory * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Dory Kamu Tidak Cukup`.trim(), m) + break + case 'gurita': + if (global.db.data.users[m.sender].gurita >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].gurita -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Gurita Dengan Harga ${Sgurita * count} Money `.trim(), m) + } else conn.reply(m.chat, `Gurita Kamu Tidak Cukup`.trim(), m) + break + case 'buntal': + if (global.db.data.users[m.sender].buntal >= count * 1) { + global.db.data.users[m.sender].money += Sbuntal * count + global.db.data.users[m.sender].buntal -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Buntal Dengan Harga ${Sbuntal * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Buntal Kamu Tidak Cukup`.trim(), m) + break + case 'hiu': + if (global.db.data.users[m.sender].hiu >= count * 1) { + global.db.data.users[m.sender].money += Shiu * count + global.db.data.users[m.sender].hiu -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Hiu Dengan Harga ${Shiu * count} Money `.trim(), m) + } else conn.reply(m.chat, `Hiu Kamu Tidak Cukup`.trim(), m) + break + case 'orca': + if (global.db.data.users[m.sender].orca >= count * 1) { + global.db.data.users[m.sender].money += Sorca * count + global.db.data.users[m.sender].orca -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Paus Orca Dengan Harga ${Sorca * count} Money `.trim(), m) + } else conn.reply(m.chat, `Paus Orca Kamu Tidak Cukup`.trim(), m) + break + case 'lumba': + if (global.db.data.users[m.sender].lumba >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].lumba -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Lumba Lumba Dengan Harga ${Slumba * count} Money `.trim(), m) + } else conn.reply(m.chat, `Lumba Lumba Kamu Tidak Cukup`.trim(), m) + break + case 'paus': + if (global.db.data.users[m.sender].paus >= count * 1) { + global.db.data.users[m.sender].money += Spaus * count + global.db.data.users[m.sender].paus -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Paus Dengan Harga ${Spaus * count} Money `.trim(), m) + } else conn.reply(m.chat, `Paus Kamu Tidak Cukup`.trim(), m) + break + case 'lobster': + if (global.db.data.users[m.sender].lobster >= count * 1) { + global.db.data.users[m.sender].money += Slobster * count + global.db.data.users[m.sender].lobster -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Lobster Dengan Harga ${Slobster * count} Money `.trim(), m) + } else conn.reply(m.chat, `Lobster Kamu Tidak Cukup`.trim(), m) + break + case 'udang': + if (global.db.data.users[m.sender].udang >= count * 1) { + global.db.data.users[m.sender].money += Sudang * count + global.db.data.users[m.sender].udang -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Udang Dengan Harga ${Sudang * count} Money `.trim(), m) + } else conn.reply(m.chat, `Udang Kamu Tidak Cukup`.trim(), m) + break + case 'cumi': + if (global.db.data.users[m.sender].cumi >= count * 1) { + global.db.data.users[m.sender].money += Scumi * count + global.db.data.users[m.sender].cumi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Cumi Dengan Harga ${Scumi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Cumi Kamu Tidak Cukup`.trim(), m) + break + default: + return conn.reply(m.chat, Kchat, m) + } + break*/ + default: + return conn.sendFile(m.chat, thumb, 'pasar.jpg', `${Kchat}`, m) + } + } else if (/beli/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(99999999, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count) + switch (type) { + case 'ayambakar': + if (global.db.data.users[m.sender].money >= Hab * count) { + global.db.data.users[m.sender].money -= Hab * count + global.db.data.users[m.sender].ayambakar += count * 1 + conn.reply(m.chat, `Succes membeli ${count} Ayam Bakar dengan harga ${Hab * count} money`, m) + } else conn.reply(m.chat, `Money Tidak Cukup`,) + break + case 'ayamgoreng': + if (global.db.data.users[m.sender].money >= Hag * count) { + global.db.data.users[m.sender].ayamgoreng += count * 1 + global.db.data.users[m.sender].money -= Hag * count + conn.reply(m.chat, `Succes membeli ${count} Ayam Goreng dengan harga ${Hag * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'rendang': + if (global.db.data.users[m.sender].money >= Hr * count) { + global.db.data.users[m.sender].rendang += count * 1 + global.db.data.users[m.sender].money -= Hr * count + conn.reply(m.chat, `Succes membeli ${count} Rendang dengan harga ${Hr * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'steak': + if (global.db.data.users[m.sender].money >= Hs * count) { + global.db.data.users[m.sender].steak += count * 1 + global.db.data.users[m.sender].money -= Hs * count + conn.reply(m.chat, `Succes membeli ${count} Steak dengan harga ${Hs * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'babipanggang': + if (global.db.data.users[m.sender].money >= Hbp * count) { + global.db.data.users[m.sender].babipanggang += count * 1 + global.db.data.users[m.sender].money -= Hbp * count + conn.reply(m.chat, `Succes membeli ${count} Babi Panggang dengan harga ${Hbp * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'gulaiayam': + if (global.db.data.users[m.sender].money >= Hga * count) { + global.db.data.users[m.sender].money -= Hga * count + global.db.data.users[m.sender].gulai += count * 1 + conn.reply(m.chat, `Succes membeli ${count} Gulai Ayam dengan harga ${Hga * count} money`, m) + } else conn.reply(m.chat, `Money Tidak Cukup`,) + break + case 'oporayam': + if (global.db.data.users[m.sender].money >= Hoa * count) { + global.db.data.users[m.sender].oporayam += count * 1 + global.db.data.users[m.sender].money -= Hoa * count + conn.reply(m.chat, `Succes membeli ${count} Opor Ayam dengan harga ${Hoa * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'vodka': + if (global.db.data.users[m.sender].money >= Hv * count) { + global.db.data.users[m.sender].vodka += count * 1 + global.db.data.users[m.sender].money -= Hv * count + conn.reply(m.chat, `Succes membeli ${count} Vodka dengan harga ${Hv * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'sushi': + if (global.db.data.users[m.sender].money >= Hsu * count) { + global.db.data.users[m.sender].sushi += count * 1 + global.db.data.users[m.sender].money -= Hsu * count + conn.reply(m.chat, `Succes membeli ${count} Sushi dengan harga ${Hsu * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'bandage': + if (global.db.data.users[m.sender].money >= Hb * count) { + global.db.data.users[m.sender].bandage += count * 1 + global.db.data.users[m.sender].money -= Hb * count + conn.reply(m.chat, `Succes membeli ${count} Bandage dengan harga ${Hb * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'ganja': + if (global.db.data.users[m.sender].money >= Hg * count) { + global.db.data.users[m.sender].money -= Hg * count + global.db.data.users[m.sender].ganja += count * 1 + conn.reply(m.chat, `Succes membeli ${count} Ganja dengan harga ${Hg * count} money`, m) + } else conn.reply(m.chat, `Money Tidak Cukup`,) + break + case 'soda': + if (global.db.data.users[m.sender].money >= Hso * count) { + global.db.data.users[m.sender].soda += count * 1 + global.db.data.users[m.sender].money -= Hso * count + conn.reply(m.chat, `Succes membeli ${count} Soda dengan harga ${Hso * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'roti': + if (global.db.data.users[m.sender].money >= Hro * count) { + global.db.data.users[m.sender].roti += count * 1 + global.db.data.users[m.sender].money -= Hro * count + conn.reply(m.chat, `Succes membeli ${count} Roti dengan harga ${Hro * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'ikanbakar': + if (global.db.data.users[m.sender].money >= Hib * count) { + global.db.data.users[m.sender].ikanbakar += count * 1 + global.db.data.users[m.sender].money -= Hib * count + conn.reply(m.chat, `Succes membeli ${count} Ikan Bakar dengan harga ${Hib * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'lelebakar': + if (global.db.data.users[m.sender].money >= Hlb * count) { + global.db.data.users[m.sender].lelebakar += count * 1 + global.db.data.users[m.sender].money -= Hlb * count + conn.reply(m.chat, `Succes membeli ${count} Lele Bakar dengan harga ${Hlb * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'nilabakar': + if (global.db.data.users[m.sender].money >= Hnb * count) { + global.db.data.users[m.sender].money -= Hnb * count + global.db.data.users[m.sender].nilabakar += count * 1 + conn.reply(m.chat, `Succes membeli ${count} Nila Bakar dengan harga ${Hnb * count} money`, m) + } else conn.reply(m.chat, `Money Tidak Cukup`,) + break + case 'bawalbakar': + if (global.db.data.users[m.sender].money >= Hbb * count) { + global.db.data.users[m.sender].bawalbakar += count * 1 + global.db.data.users[m.sender].money -= Hbb * count + conn.reply(m.chat, `Succes membeli ${count} Bawal Bakar dengan harga ${Hbb * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'udangbakar': + if (global.db.data.users[m.sender].money >= Hub * count) { + global.db.data.users[m.sender].udangbakar += count * 1 + global.db.data.users[m.sender].money -= Hub * count + conn.reply(m.chat, `Succes membeli ${count} Udang Bakar dengan harga ${Hub * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'pausbakar': + if (global.db.data.users[m.sender].money >= Hpb * count) { + global.db.data.users[m.sender].pausbakar += count * 1 + global.db.data.users[m.sender].money -= Hpb * count + conn.reply(m.chat, `Succes membeli ${count} Paus Bakar dengan harga ${Hpb * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + case 'kepitingbakar': + if (global.db.data.users[m.sender].money >= Hkb * count) { + global.db.data.users[m.sender].kepitingbakar += count * 1 + global.db.data.users[m.sender].money -= Hkb * count + conn.reply(m.chat, `Succes membeli ${count} Kepiting Bakar dengan harga ${Hkb * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + break + default: + return conn.reply(m.chat, Kchat, m) + } + /* } else if (/sell|jual|/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(99999999, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count) + switch (type) { + case 'banteng': + if (global.db.data.users[m.sender].banteng >= count * 1) { + global.db.data.users[m.sender].money += Spaus * count + global.db.data.users[m.sender].banteng -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Banteng Dengan Harga ${Sbanteng * count} Money `.trim(), m) + } else conn.reply(m.chat, `Banteng Kamu Tidak Cukup`.trim(), m) + break + case 'harimau': + if (global.db.data.users[m.sender].harimau >= count * 1) { + global.db.data.users[m.sender].money += Sharimau * count + global.db.data.users[m.sender].harimau -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Harimau Dengan Harga ${Sharimau * count} Money `.trim(), m) + } else conn.reply(m.chat, `Harimau Kamu Tidak Cukup`.trim(), m) + break + case 'gajah': + if (global.db.data.users[m.sender].gajah >= count * 1) { + global.db.data.users[m.sender].money += Sgajah * count + global.db.data.users[m.sender].gajah -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Gajah Dengan Harga ${Sgajah * count} Money `.trim(), m) + } else conn.reply(m.chat, `Gajah Kamu Tidak Cukup`.trim(), m) + break + case 'kambing': + if (global.db.data.users[m.sender].kambing >= count * 1) { + global.db.data.users[m.sender].money += Skambing * count + global.db.data.users[m.sender].kambing -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kambing Dengan Harga ${Skambing * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kambing Kamu Tidak Cukup`.trim(), m) + break + case 'panda': + if (global.db.data.users[m.sender].panda >= count * 1) { + global.db.data.users[m.sender].money += Spanda * count + global.db.data.users[m.sender].panda -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Panda Dengan Harga ${Sbuaya * count} Money `.trim(), m) + } else conn.reply(m.chat, `Panda Kamu Tidak Cukup`.trim(), m) + break + case 'buaya': + if (global.db.data.users[m.sender].buaya >= count * 1) { + global.db.data.users[m.sender].money += Sbuaya * count + global.db.data.users[m.sender].buaya -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Buaya Dengan Harga ${Sbuaya * count} Money `.trim(), m) + } else conn.reply(m.chat, `Buaya Kamu Tidak Cukup`.trim(), m) + break + case 'kerbau': + if (global.db.data.users[m.sender].kerbau >= count * 1) { + global.db.data.users[m.sender].money += Skerbau * count + global.db.data.users[m.sender].kerbau -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kerbau Dengan Harga ${Skerbau * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kerbau Kamu Tidak Cukup`.trim(), m) + break + case 'sapi': + if (global.db.data.users[m.sender].sapi >= count * 1) { + global.db.data.users[m.sender].money += Ssapi * count + global.db.data.users[m.sender].sapi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Sapi Dengan Harga ${Ssapi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Sapi Kamu Tidak Cukup`.trim(), m) + break + case 'monyet': + if (global.db.data.users[m.sender].monyet >= count * 1) { + global.db.data.users[m.sender].money += Smonyet * count + global.db.data.users[m.sender].monyet -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Monyet Dengan Harga ${Smonyet * count} Money `.trim(), m) + } else conn.reply(m.chat, `Monyet Kamu Tidak Cukup`.trim(), m) + break + case 'babi': + if (global.db.data.users[m.sender].babi >= count * 1) { + global.db.data.users[m.sender].money += Sbabi * count + global.db.data.users[m.sender].babi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Babi Dengan Harga ${Sbabi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Babi Kamu Tidak Cukup`.trim(), m) + break + case 'babihutan': + if (global.db.data.users[m.sender].babihutan >= count * 1) { + global.db.data.users[m.sender].money += Sbabihutan * count + global.db.data.users[m.sender].babihutan -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Babi Hutan Dengan Harga ${Sbabihutan * count} Money `.trim(), m) + } else conn.reply(m.chat, `Babi Hutan Kamu Tidak Cukup`.trim(), m) + break + case 'ayam': + if (global.db.data.users[m.sender].ayam >= count * 1) { + global.db.data.users[m.sender].money += Sayam * count + global.db.data.users[m.sender].ayam -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ayam Dengan Harga ${Sayam * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ayam Kamu Tidak Cukup`.trim(), m) + break + //mancing + case 'kepiting': + if (global.db.data.users[m.sender].kepiting >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].kepiting -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Kepiting Dengan Harga ${Skepiting * count} Money `.trim(), m) + } else conn.reply(m.chat, `Kepiting Kamu Tidak Cukup`.trim(), m) + break + case 'ikan': + if (global.db.data.users[m.sender].ikan >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].ikan -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Dengan Harga ${Sikan * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Kamu Tidak Cukup`.trim(), m) + break + case 'dory': + if (global.db.data.users[m.sender].dory >= count * 1) { + global.db.data.users[m.sender].money += Sdory * count + global.db.data.users[m.sender].dory -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Dory Dengan Harga ${Sdory * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Dory Kamu Tidak Cukup`.trim(), m) + break + case 'gurita': + if (global.db.data.users[m.sender].gurita >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].gurita -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Gurita Dengan Harga ${Sgurita * count} Money `.trim(), m) + } else conn.reply(m.chat, `Gurita Kamu Tidak Cukup`.trim(), m) + break + case 'buntal': + if (global.db.data.users[m.sender].buntal >= count * 1) { + global.db.data.users[m.sender].money += Sbuntal * count + global.db.data.users[m.sender].buntal -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Ikan Buntal Dengan Harga ${Sbuntal * count} Money `.trim(), m) + } else conn.reply(m.chat, `Ikan Buntal Kamu Tidak Cukup`.trim(), m) + break + case 'hiu': + if (global.db.data.users[m.sender].hiu >= count * 1) { + global.db.data.users[m.sender].money += Shiu * count + global.db.data.users[m.sender].hiu -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Hiu Dengan Harga ${Shiu * count} Money `.trim(), m) + } else conn.reply(m.chat, `Hiu Kamu Tidak Cukup`.trim(), m) + break + case 'orca': + if (global.db.data.users[m.sender].orca >= count * 1) { + global.db.data.users[m.sender].money += Sorca * count + global.db.data.users[m.sender].orca -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Paus Orca Dengan Harga ${Sorca * count} Money `.trim(), m) + } else conn.reply(m.chat, `Paus Orca Kamu Tidak Cukup`.trim(), m) + break + case 'lumba': + if (global.db.data.users[m.sender].lumba >= count * 1) { + global.db.data.users[m.sender].money += Skepiting * count + global.db.data.users[m.sender].lumba -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Lumba Lumba Dengan Harga ${Slumba * count} Money `.trim(), m) + } else conn.reply(m.chat, `Lumba Lumba Kamu Tidak Cukup`.trim(), m) + break + case 'paus': + if (global.db.data.users[m.sender].paus >= count * 1) { + global.db.data.users[m.sender].money += Spaus * count + global.db.data.users[m.sender].paus -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Paus Dengan Harga ${Spaus * count} Money `.trim(), m) + } else conn.reply(m.chat, `Paus Kamu Tidak Cukup`.trim(), m) + break + case 'lobster': + if (global.db.data.users[m.sender].lobster >= count * 1) { + global.db.data.users[m.sender].money += Slobster * count + global.db.data.users[m.sender].lobster -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Lobster Dengan Harga ${Slobster * count} Money `.trim(), m) + } else conn.reply(m.chat, `Lobster Kamu Tidak Cukup`.trim(), m) + break + case 'udang': + if (global.db.data.users[m.sender].udang >= count * 1) { + global.db.data.users[m.sender].money += Sudang * count + global.db.data.users[m.sender].udang -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Udang Dengan Harga ${Sudang * count} Money `.trim(), m) + } else conn.reply(m.chat, `Udang Kamu Tidak Cukup`.trim(), m) + break + case 'cumi': + if (global.db.data.users[m.sender].cumi >= count * 1) { + global.db.data.users[m.sender].money += Scumi * count + global.db.data.users[m.sender].cumi -= count * 1 + conn.reply(m.chat, `Sukses Menjual ${count} Cumi Dengan Harga ${Scumi * count} Money `.trim(), m) + } else conn.reply(m.chat, `Cumi Kamu Tidak Cukup`.trim(), m) + break + default: + return conn.reply(m.chat, Kchat, m) + }*/ + } + } catch (e) { + conn.reply(m.chat, Kchat, m) + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.sendMessage(jid, 'shop.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', MessageType.text) + } + } + } +} + +handler.help = ['resto *<beli> <args>*'] +handler.tags = ['rpg'] + +handler.command = /^(resto|beli)$/i +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-selectskill.js b/plugins/rpg-selectskill.js new file mode 100644 index 0000000000000000000000000000000000000000..9b03bfc07fd42a8a3bbf1d3c2b652955deaaa72f --- /dev/null +++ b/plugins/rpg-selectskill.js @@ -0,0 +1,73 @@ +let handler = async (m, { conn, usedPrefix, text, command }) => { + let user = global.db.data.users[m.sender] + let skill = { + "barbarian": { difficulty: "hard", stars: "โญโญโญโญ" }, + "bard": { difficulty: "medium", stars: "โญโญโญ" }, + "cleric": { difficulty: "medium", stars: "โญโญโญ" }, + "druid": { difficulty: "hard", stars: "โญโญโญโญ" }, + "fighter": { difficulty: "easy", stars: "โญโญ" }, + "monk": { difficulty: "expert", stars: "โญโญโญโญโญ" }, + "paladin": { difficulty: "hard", stars: "โญโญโญโญ" }, + "ranger": { difficulty: "medium", stars: "โญโญโญ" }, + "rogue": { difficulty: "medium", stars: "โญโญโญ" }, + "sorcerer": { difficulty: "expert", stars: "โญโญโญโญโญ" }, + "warlock": { difficulty: "hard", stars: "โญโญโญโญ" }, + "wizard": { difficulty: "expert", stars: "โญโญโญโญโญ" } + } + + let skil = text.trim().toLowerCase() // filter text + + if (!Object.keys(skill).includes(skil)) { + // Generate the list of skills with their difficulty and star rating + let skillList = Object.keys(skill).map(s => { + let { difficulty, stars } = skill[s] + return `- *${s}* *[ ${stars} ]*\n_Difficulty_ : ${difficulty}` + }).join('\n') + + // Context info for available skills with externalAdReply + const availableSkillsMessage = `ไน‚ *C L A S S*\n\nPilih *Class* yang anda sukai atau sesuai dengan skill atau talent mu :\n\n${skillList}\n\n_How To Use_ :\n${usedPrefix + command} *nameskill*\n\n_Example_ :\n${usedPrefix + command} *wizard*`.trim(); + await conn.reply(m.chat, availableSkillsMessage, m, { + contextInfo: { + externalAdReply: { + mediaType: 1, + title: 'AXELLDX', + thumbnailUrl: 'https://telegra.ph/file/a0e0fd6b16e109e36e455.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + } + } + }); + return; + } + + // Initialize user skills if not present + if (!user.skills) { + user.skills = [] + } + + let { difficulty, stars } = skill[skil] + + // Remove previous skill + if (user.skill) { + let index = user.skills.findIndex(s => s.name === user.skill) + user.skills.splice(index, 1) + } + + let newSkill = { + name: skil, + difficulty: difficulty, + stars: stars + } + + user.skills.push(newSkill) + user.skill = skil // Update current skill + m.reply(`Anda telah memilih skill ${skil} dengan tingkat kesulitan ${difficulty} dan bintang ${stars}.`) +} + +handler.help = ['selectskill <type>'] +handler.tags = ['rpg'] +handler.command = /^(selectskill)$/i +handler.register = true +handler.group = true + +module.exports = handler \ No newline at end of file diff --git a/plugins/rpg-shop.js b/plugins/rpg-shop.js new file mode 100644 index 0000000000000000000000000000000000000000..cbd16fcd493f453282c677a47d16e3d5b64121a2 --- /dev/null +++ b/plugins/rpg-shop.js @@ -0,0 +1,1505 @@ + +const Bcoal = 1500 +const Scoal = 1000 +const potion = 20000 +const Spotion = 100 +const Bdiamond = 100000 +const Sdiamond = 1000 +const Bemerald = 500000 +const Semerald = 50000 +const Bcommon = 100000 +const Scommon = 1000 +const Suncommon = 100 +const Buncommon = 100000 +const Bmythic = 100000 +const Smythic = 1000 +const Blegendary = 200000 +const Slegendary = 5000 +const Bsampah = 120 +const Ssampah = 5 +const Bkayu = 1000 +const Skayu = 400 +const Bbotol = 300 +const Sbotol = 50 +const Bkaleng = 400 +const Skaleng = 100 +const Bkardus = 400 +const Skardus = 50 +const Bpisang = 5500 +const Spisang = 100 +const Bmangga = 4600 +const Smangga = 150 +const Bjeruk = 6000 +const Sjeruk = 300 +const Banggur = 5500 +const Sanggur = 150 +const Bapel = 5500 +const Sapel = 400 +const Bbibitpisang = 550 +const Sbibitpisang = 50 +const Bbibitmangga = 550 +const Sbibitmangga = 50 +const Bbibitjeruk = 550 +const Sbibitjeruk = 50 +const Bbibitanggur = 550 +const Sbibitanggur = 50 +const Bbibitapel = 550 +const Sbibitapel = 50 +const Bberlian = 150000 +const Sberlian = 10000 +const Bemasbatang = 250000 +const Semasbatang = 10000 +const Bemasbiasa = 150000 +const Semasbiasa = 15000 +const Bphonix = 1000000000 +const Sphonix = 1000000 +const Bgriffin = 100000000 +const Sgriffin = 100000 +const Bkyubi = 100000000 +const Skyubi = 100000 +const Bnaga = 100000000 +const Snaga = 100000 +const Bcentaur = 100000000 +const Scentaur = 100000 +const Bkuda = 50000000 +const Skuda = 100000 +const Brubah = 100000000 +const Srubah = 100000 +const Bkucing = 5000000 +const Skucing = 50000 +const Bserigala = 50000000 +const Sserigala = 500000 +const Bmakananpet = 50000 +const Smakananpet = 500 +const Bmakananphonix = 80000 +const Smakananphonix = 5000 +const Bmakanangriffin = 80000 +const Smakanangriffin = 5000 +const Bmakanannaga = 150000 +const Smakanannaga = 10000 +const Bmakanankyubi = 150000 +const Smakanankyubi = 10000 +const Bmakanancentaur = 150000 +const Smakanancentaur = 10000 +const Bhealtmonster = 20000 +const Bpet = 150000 +const Spet = 1000 +const Blimit = 5 +const Slimit = 20000 +const Bexp = 550 +const Baqua = 5000 +const Saqua = 1000 +const Biron = 20000 +const Siron = 5000 +const Bstring = 50000 +const Sstring = 5000 +const Bsword = 150000 +const Ssword = 15000 +const Bumpan = 1500 +const Sumpan = 100 +const Bpancingan = 5000000 +const Spancingan = 500000 +const BBensin = 20000 +const BWeap = 150000 +const SWeap = 15000 +const SBensin = 10000 +const Bbatu = 500 +const Sbatu = 100 +const Bketake = 15 +const Btiketcoin = 500 +const Bkoinexpg = 500000 +const BObat = 15000 +const ObatStock = 500 +const Beleksirb = 500 +const BnStock = 9999 +const WeapStock = 50 +let handler = async (m, { conn, command, args, usedPrefix, owner }) => { + const _armor = global.db.data.users[m.sender].armor + const armor = (_armor == 0 ? 20000 : '' || _armor == 1 ? 49999 : '' || _armor == 2 ? 99999 : '' || _armor == 3 ? 149999 : '' || _armor == 4 ? 299999 : '') + let type = (args[0] || '').toLowerCase() + let _type = (args[1] || '').toLowerCase() + let jualbeli = (args[0] || '').toLowerCase() + let nomors = m.sender + const Kchat = ` +โ•ธโ•ธโ”โ”โ”ใ€Œ *Harga Beli* ใ€โ”โ”โ”โ•บโ•บ +> Kebutuhan +๐Ÿท๏ธLimit: ${Blimit} +๐Ÿ‰ Pet: ${Bpet} + +> Bibit Buah +๐ŸŒBibitPisang: ${Bbibitpisang} +๐Ÿ‡BibitAnggur: ${Bbibitanggur} +๐ŸฅญBibitMangga: ${Bbibitmangga} +๐ŸŠBibitJeruk: ${Bbibitjeruk} +๐ŸŽBibitApel: ${Bbibitapel} + +> Barang +๐ŸฅคPotion: ${potion} +๐Ÿ’ŽDiamond: ${Bdiamond} +โ‡๏ธEmerald: ${Bemerald} +โ›“๏ธIron: ${Biron} +๐Ÿ’ŽBerlian: ${Bberlian} +๐Ÿช™Emas: ${Bemasbiasa} +๐ŸชจCoal: ${Bcoal} +๐Ÿ“จCommon: ${Bcommon} +๐Ÿ“จUncommon: ${Buncommon} +๐ŸŽMythic: ${Bmythic} +๐Ÿ—ƒ๏ธLegendary: ${Blegendary} +๐Ÿ—‘๏ธSampah: ${Bsampah} +๐ŸงตString: ${Bstring} +๐ŸพBotol: ${Bbotol} +๐ŸฅซKaleng: ${Bkaleng} +๐Ÿ“ฆKardus: ${Bkardus} +๐ŸชตKayu: ${Bkayu} +๐ŸชจBatu: ${Bbatu} + +> Makanan +๐ŸŒPisang: ${Bpisang} +๐Ÿ‡Anggur: ${Banggur} +๐ŸฅญMangga: ${Bmangga} +๐ŸŠJeruk: ${Bjeruk} +๐ŸŽApel: ${Bapel} +๐Ÿซ”MakananPet: ${Bmakananpet} +๐ŸฅฉMakananNaga: ${Bmakanannaga} +๐ŸฅฉMakananKyubi: ${Bmakanankyubi} +๐ŸฅฉMakananGriffin:${Bmakanangriffin} +๐ŸฅฉMakananPhonix: ${Bmakananphonix} +๐ŸฅฉMakananCentaur:${Bmakanancentaur} + +> Minuman +๐Ÿซ—Aqua: ${Baqua} + +> Fishing +๐ŸชคUmpan: ${Bumpan} + +โ•ธโ•ธโ”โ”โ”ใ€Œ *Harga Jual* ใ€โ”โ”โ”โ•บโ•บ +> Kebutuhan +๐Ÿท๏ธLimit: ${Slimit} +๐ŸˆPet: ${Spet} + +> Barang +๐ŸฅคPotion: ${Spotion} +๐Ÿ’ŽDiamond: ${Sdiamond} +๐Ÿ“จCommon: ${Scommon} +๐ŸงฐUncommon: ${Suncommon} +๐ŸŽMythic: ${Smythic} +๐Ÿ—ƒ๏ธLegendary: ${Slegendary} +๐Ÿ—‘๏ธSampah: ${Ssampah} +๐Ÿ•ธ๏ธString: ${Sstring} +โ›“๏ธIron: ${Siron} +๐Ÿช™Emas: ${Bemasbiasa} +๐ŸชจCoal: ${Bcoal} +๐ŸชจBatu: ${Bbatu} +๐ŸพBotol: ${Bbotol} +๐ŸฅซKaleng: ${Bkaleng} +๐Ÿ“ฆKardus: ${Bkardus} +๐ŸชตKayu: ${Bkayu} +๐Ÿ’ŽBerlian: ${Sberlian} +๐Ÿ”ซWeapon: ${SWeap} + +> Makanan +๐ŸŒPisang: ${Bpisang} +๐Ÿ‡Anggur: ${Banggur} +๐ŸฅญMangga: ${Bmangga} +๐ŸŠJeruk: ${Bjeruk} +๐ŸŽApel: ${Bapel} +๐Ÿซ”MakananPet: ${Bmakananpet} +๐ŸฅฉMakananNaga: ${Bmakanannaga} +๐ŸฅฉMakananKyubi: ${Bmakanankyubi} +๐ŸฅฉMakananGriffin:${Bmakanangriffin} +๐ŸฅฉMakananPhonix: ${Bmakananphonix} +๐ŸฅฉMakananCentaur:${Bmakanancentaur} + +> Minuman +๐Ÿซ—Aqua: ${Saqua} +======================= +Penggunaan ${usedPrefix}shop <Buy|sell> <item> <jumlah> +Contoh penggunaan: *${usedPrefix}shop buy potion 1* +`.trim() + try { + if (/shop|toko/i.test(command)) { + const count = args[2] && args[2].length > 0 ? Math.min(999999999999999, Math.max(parseInt(args[2]), 1)) : !args[2] || args.length < 4 ? 1 :Math.min(1, count) + const sampah = global.db.data.users[m.sender].sampah + switch (jualbeli) { + case 'buy': + switch (_type) { + case 'potion': + if (global.db.data.users[m.sender].money >= potion * count) { + global.db.data.users[m.sender].money -= potion * count + global.db.data.users[m.sender].potion += count * 1 + conn.reply(m.chat, `Succes membeli ${count} Potion dengan harga ${potion * count} money\n\nGunakan potion dengan ketik: *${usedPrefix}use potion <jumlah>*`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Potion dengan harga ${potion * count} money`,) + break + case 'diamond': + if (global.db.data.users[m.sender].money >= Bdiamond * count) { + global.db.data.users[m.sender].diamond += count * 1 + global.db.data.users[m.sender].money -= Bdiamond * count + conn.reply(m.chat, `Succes membeli ${count} Diamond dengan harga ${Bdiamond * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + + break + case 'coal': + if (global.db.data.users[m.sender].money >= Bcoal * count) { + global.db.data.users[m.sender].coal += count * 1 + global.db.data.users[m.sender].money -= Bcoal * count + conn.reply(m.chat, `Succes membeli ${count} Coal dengan harga ${Bcoal * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + + break + case 'common': + if (global.db.data.users[m.sender].money >= Bcommon * count) { + global.db.data.users[m.sender].common += count * 1 + global.db.data.users[m.sender].money -= Bcommon * count + conn.reply(m.chat, `Succes membeli ${count} Common crate dengan harga ${Bcommon * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Common crate dengan harga ${Bcommon * count} money\n\nBuka crate dengan ketik: *${usedPrefix}open common*`, m) + + break + case 'uncommon': + if (global.db.data.users[m.sender].money >= Buncommon * count) { + global.db.data.users[m.sender].uncommon += count * 1 + global.db.data.users[m.sender].money -= Buncommon * count + conn.reply(m.chat, `Succes membeli ${count} Uncommon crate dengan harga ${Buncommon * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Uncommon crate dengan harga ${Buncommon * count} money\n\nBuka crate dengan ketik: *${usedPrefix}open uncommon*`, m) + + break + case 'mythic': + if (global.db.data.users[m.sender].money >= Bmythic * count) { + global.db.data.users[m.sender].mythic += count * 1 + global.db.data.users[m.sender].money -= Bmythic * count + conn.reply(m.chat, `Succes membeli ${count} Mythic crate dengan harga ${Bmythic * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Mythic crate dengan harga ${Bmythic* count} money\n\nBuka crate dengan ketik: *${usedPrefix}open mythic*`, m) + + break + case 'legendary': + if (global.db.data.users[m.sender].money >= Blegendary * count) { + global.db.data.users[m.sender].legendary += count * 1 + global.db.data.users[m.sender].money -= Blegendary * count + conn.reply(m.chat, `Succes membeli ${count} Legendary crate dengan harga ${Blegendary * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Legendary crate dengan harga ${Blegendary * count} money\n\nBuka crate dengan ketik: *${usedPrefix}open legendary*`, m) + + break + case 'sampah': + if (global.db.data.users[m.sender].money >= Bsampah * count) { + global.db.data.users[m.sender].sampah += count * 1 + global.db.data.users[m.sender].money -= Bsampah * count + conn.reply(m.chat, `Succes membeli ${count} Sampah dengan harga ${Bsampah * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Sampah dengan harga ${Bsampah * count} money`.trim(), m) + + break + case 'kaleng': + if (global.db.data.users[m.sender].money >= Bkaleng * count) { + global.db.data.users[m.sender].kaleng += count * 1 + global.db.data.users[m.sender].money -= Bkaleng * count + conn.reply(m.chat, `Succes membeli ${count} Kaleng dengan harga ${Bkaleng * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Kaleng dengan harga ${Bkaleng * count} money`.trim(), m) + + break + case 'kardus': + if (global.db.data.users[m.sender].money >= Bkardus * count) { + global.db.data.users[m.sender].kardus += count * 1 + global.db.data.users[m.sender].money -= Bkardus * count + conn.reply(m.chat, `Succes membeli ${count} Kardus dengan harga ${Bkardus * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Kardus dengan harga ${Bkardus * count} money`.trim(), m) + + break + case 'botol': + if (global.db.data.users[m.sender].money >= Bbotol * count) { + global.db.data.users[m.sender].botol += count * 1 + global.db.data.users[m.sender].money -= Bbotol * count + conn.reply(m.chat, `Succes membeli ${count} Botol dengan harga ${Bbotol * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} botol dengan harga ${Bbotol * count} money`.trim(), m) + + break + case 'kayu': + if (global.db.data.users[m.sender].money >= Bkayu * count) { + global.db.data.users[m.sender].kayu += count * 1 + global.db.data.users[m.sender].money -= Bkayu * count + conn.reply(m.chat, `Succes membeli ${count} Kayu dengan harga ${Bkayu * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} kayu dengan harga ${Bkayu * count} money`.trim(), m) + + break + case 'pisang': + if (global.db.data.users[m.sender].money >= Bpisang * count) { + global.db.data.users[m.sender].pisang += count * 1 + global.db.data.users[m.sender].money -= Bpisang * count + conn.reply(m.chat, `Succes membeli ${count} Pisang dengan harga ${Bpisang * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} pisang dengan harga ${Bpisang * count} money`.trim(), m) + + break + case 'anggur': + if (global.db.data.users[m.sender].money >= Banggur * count) { + global.db.data.users[m.sender].anggur += count * 1 + global.db.data.users[m.sender].money -= Banggur * count + conn.reply(m.chat, `Succes membeli ${count} Anggur dengan harga ${Banggur * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} anggur dengan harga ${Banggur * count} money`.trim(), m) + + break + case 'mangga': + if (global.db.data.users[m.sender].money >= Bmangga * count) { + global.db.data.users[m.sender].mangga += count * 1 + global.db.data.users[m.sender].money -= Bmangga * count + conn.reply(m.chat, `Succes membeli ${count} Mangga dengan harga ${Bmangga * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} mangga dengan harga ${Bmangga * count} money`.trim(), m) + + break + case 'jeruk': + if (global.db.data.users[m.sender].money >= Bjeruk * count) { + global.db.data.users[m.sender].jeruk += count * 1 + global.db.data.users[m.sender].money -= Bjeruk * count + conn.reply(m.chat, `Succes membeli ${count} Jeruk dengan harga ${Bjeruk * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} jeruk dengan harga ${Bjeruk * count} money`.trim(), m) + + break + case 'apel': + if (global.db.data.users[m.sender].money >= Bapel * count) { + global.db.data.users[m.sender].apel += count * 1 + global.db.data.users[m.sender].money -= Bapel * count + conn.reply(m.chat, `Succes membeli ${count} Apel dengan harga ${Bapel * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} apel dengan harga ${Bapel * count} money`.trim(), m) + + break + case 'bibitpisang': + if (global.db.data.users[m.sender].money >= Bbibitpisang * count) { + global.db.data.users[m.sender].bibitpisang += count * 1 + global.db.data.users[m.sender].money -= Bbibitpisang * count + conn.reply(m.chat, `Succes membeli ${count} Bibit Pisang dengan harga ${Bbibitpisang * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} bibit pisang dengan harga ${Bbibitpisang * count} money`.trim(), m) + + break + case 'bibitanggur': + if (global.db.data.users[m.sender].money >= Bbibitanggur * count) { + global.db.data.users[m.sender].bibitanggur += count * 1 + global.db.data.users[m.sender].money -= Bbibitanggur * count + conn.reply(m.chat, `Succes membeli ${count} Bibit Anggur dengan harga ${Bbibitanggur * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} bibit anggur dengan harga ${Bbibitanggur * count} money`.trim(), m) + + break + case 'bibitmangga': + if (global.db.data.users[m.sender].money >= Bbibitmangga * count) { + global.db.data.users[m.sender].bibitmangga += count * 1 + global.db.data.users[m.sender].money -= Bbibitmangga * count + conn.reply(m.chat, `Succes membeli ${count} Bibit Mangga dengan harga ${Bbibitmangga * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} bibit mangga dengan harga ${Bbibitmangga * count} money`.trim(), m) + + break + case 'bibitjeruk': + if (global.db.data.users[m.sender].money >= Bbibitjeruk * count) { + global.db.data.users[m.sender].bibitjeruk += count * 1 + global.db.data.users[m.sender].money -= Bbibitjeruk * count + conn.reply(m.chat, `Succes membeli ${count} Bibit Jeruk dengan harga ${Bbibitjeruk * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} bibit jeruk dengan harga ${Bbibitjeruk * count} money`.trim(), m) + + break + case 'bibitapel': + if (global.db.data.users[m.sender].money >= Bbibitapel * count) { + global.db.data.users[m.sender].bibitapel += count * 1 + global.db.data.users[m.sender].money -= Bbibitapel * count + conn.reply(m.chat, `Succes membeli ${count} Bibit Apel dengan harga ${Bbibitapel * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} bibit apel dengan harga ${Bbibitapel * count} money`.trim(), m) + + break + case 'gardenboxs': + if (global.db.data.users[m.sender].money >= Bgardenboxs * count) { + global.db.data.users[m.sender].gardenboxs += count * 1 + global.db.data.users[m.sender].money -= Bgardenboxs * count + conn.reply(m.chat, `Succes membeli ${count} Gardenboxs dengan harga ${Bgardenboxs * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} gardenboxs dengan harga ${Bgardenboxs * count} money`.trim(), m) + + break + case 'berlian': + if (global.db.data.users[m.sender].money >= Bberlian * count) { + global.db.data.users[m.sender].berlian += count * 1 + global.db.data.users[m.sender].money -= Bberlian * count + conn.reply(m.chat, `Succes membeli ${count} Berlian dengan harga ${Bberlian * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} berlian dengan harga ${Bberlian * count} money`.trim(), m) + + break + case 'bensin': + if (global.db.data.users[m.sender].money >= BBensin * count) { + global.db.data.users[m.sender].bensin += count * 1 + global.db.data.users[m.sender].money -= BBensin * count + conn.reply(m.chat, `Succes membeli ${count}L Bensin dengan harga ${BBensin * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Bensin dengan harga ${BBensin * count} money`.trim(), m) + + break + case 'weapon': + if (global.db.data.users[m.sender].money >= BWeap * count) { + global.db.data.users[m.sender].weapon += count * 1 + global.db.data.users[m.sender].money -= BWeap * count + conn.reply(m.chat, `Succes membeli ${count} Weapon dengan harga ${BWeap * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Weapon dengan harga ${BWeap * count} money`.trim(), m) + + break + case 'obat': + if (global.db.data.users[m.sender].money >= BObat * count) { + global.db.data.users[m.sender].obat += count * 1 + global.db.data.users[m.sender].money -= BObat * count + conn.reply(m.chat, `Succes membeli ${count} kapsul Obat dengan harga ${BObat * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} kapsul Obat dengan harga ${BObat * count} money`.trim(), m) + + break + + case 'emas': + if (global.db.data.users[m.sender].money >= Bemasbiasa * count) { + global.db.data.users[m.sender].emas += count * 1 + global.db.data.users[m.sender].money -= Bemasbiasa * count + conn.reply(m.chat, `Succes membeli ${count} Emas dengan harga ${Bemasbiasa * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} emas dengan harga ${Bemasbiasa * count} money`.trim(), m) + + break + case 'pet': + if (global.db.data.users[m.sender].money >= Bpet * count) { + global.db.data.users[m.sender].pet += count * 1 + global.db.data.users[m.sender].money -= Bpet * count + conn.reply(m.chat, `Succes membeli ${count} Pet Random dengan harga ${Bpet * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} pet random dengan harga ${Bpet * count} money`.trim(), m) + + break + case 'limit': + if (global.db.data.users[m.sender].diamond >= Blimit * count) { + global.db.data.users[m.sender].limit += count * 1 + global.db.data.users[m.sender].diamond -= Blimit * count + conn.reply(m.chat, `Succes membeli ${count} Limit dengan harga ${Blimit * count} money`, m) + } else conn.reply(m.chat, `diamond anda tidak cukup untuk membeli ${count} limit dengan harga ${Blimit * count} diamond`.trim(), m) + + break + /*case 'exp': + if (global.db.data.users[m.sender].money >= Bexp * count) { + global.db.data.users[m.sender].exp += count * 1 + global.db.data.users[m.sender].money -= Bexp * count + conn.reply(m.chat, `Succes membeli ${count} Exp dengan harga ${Bexp * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} exp dengan harga ${Bexp * count} money`.trim(), m) + + break + case 'eleksirb': + if (global.db.data.users[m.sender].money >= Beleksirb * count) { + global.db.data.users[m.sender].eleksirb += count * 1 + global.db.data.users[m.sender].money -= Beleksirb * count + conn.reply(m.chat, `Succes membeli ${count} Eleksir Biru dengan harga ${Beleksirb * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Eleksir Biru dengan harga ${Beleksirb * count} money`.trim(), m) + + break + case 'koinexpg': + if (global.db.data.users[m.sender].money >= Bkoinexpg * count) { + global.db.data.users[m.sender].koinexpg += count * 1 + global.db.data.users[m.sender].money -= Bkoinexpg * count + conn.reply(m.chat, `Succes membeli ${count} Koinexpg dengan harga ${Bkoinexpg * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} koinexpg dengan harga ${Bkoinexpg * count} money`.trim(), m) + + break*/ + case 'cupon': + if (global.db.data.users[m.sender].tiketcoin >= Btiketcoin * count) { + global.db.data.users[m.sender].cupon += count * 1 + global.db.data.users[m.sender].tiketcoin -= Btiketcoin * count + conn.reply(m.chat, `Succes membeli ${count} cupon dengan harga ${Btiketcoin * count} Tiketcoin`, m) + } else conn.reply(m.chat, `Tiketcoin anda tidak cukup untuk membeli ${count} cupon dengan harga ${Btiketcoin * count} Tiketcoin\n\nCara mendapatkan tiketcoin, anda harus memainkan semua fitur game..`.trim(), m) + + break + case 'makananpet': + if (global.db.data.users[m.sender].money >= Bmakananpet * count) { + global.db.data.users[m.sender].makananpet += count * 1 + global.db.data.users[m.sender].money -= Bmakananpet * count + conn.reply(m.chat, `Succes membeli ${count} Makanan Pet dengan harga ${Bmakananpet * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan pet dengan harga ${Bmakananpet * count} money`.trim(), m) + + break + case 'makanannaga': + if (global.db.data.users[m.sender].money >= Bmakanannaga * count) { + global.db.data.users[m.sender].makanannaga += count * 1 + global.db.data.users[m.sender].money -= Bmakanannaga * count + conn.reply(m.chat, `Succes membeli ${count} Makanan Naga dengan harga ${Bmakanannaga * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan naga dengan harga ${Bmakanannaga * count} money`.trim(), m) + + break + case 'makananphonix': + if (global.db.data.users[m.sender].money >= Bmakananphonix * count) { + global.db.data.users[m.sender].makananphonix += count * 1 + global.db.data.users[m.sender].money -= Bmakananphonix * count + conn.reply(m.chat, `Succes membeli ${count} Makanan Phonix dengan harga ${Bmakananphonix * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan phonix dengan harga ${Bmakananphonix * count} money`.trim(), m) + + break + case 'makanankyubi': + if (global.db.data.users[m.sender].money >= Bmakanankyubi * count) { + global.db.data.users[m.sender].makanankyubi += count * 1 + global.db.data.users[m.sender].money -= Bmakanankyubi* count + conn.reply(m.chat, `Succes membeli ${count} Makanan Kyubi dengan harga ${Bmakanankyubi * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan kyubi dengan harga ${Bmakanankyubi * count} money`.trim(), m) + + break + case 'makanangriffin': + if (global.db.data.users[m.sender].money >= Bmakanangriffin * count) { + global.db.data.users[m.sender].makanangriffin += count * 1 + global.db.data.users[m.sender].money -= Bmakanangriffin * count + conn.reply(m.chat, `Succes membeli ${count} Makanan Griffin dengan harga ${Bmakanangriffin * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan griffin dengan harga ${Bmakanangriffin * count} money`.trim(), m) + + break + case 'makanancentaur': + if (global.db.data.users[m.sender].money >= Bmakanancentaur * count) { + global.db.data.users[m.sender].makanancentaur += count * 1 + global.db.data.users[m.sender].money -= Bmakanancentaur * count + conn.reply(m.chat, `Succes membeli ${count} Makanan Centaur dengan harga ${Bmakanancentaur * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan centaur dengan harga ${Bmakanancentaur * count} money`.trim(), m) + + break + case 'tiketm': + if (global.db.data.users[m.sender].money >= Bhealtmonster * count) { + global.db.data.users[m.sender].healtmonster += count * 1 + global.db.data.users[m.sender].money -= Bhealtmonster * count + conn.reply(m.chat, `Succes membeli ${count} TiketM dengan harga ${Bhealtmonster * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} tiketm dengan harga ${Bhealtmonster * count} money`.trim(), m) + + break + case 'aqua': + if (global.db.data.users[m.sender].money >= Baqua * count) { + global.db.data.users[m.sender].aqua += count * 1 + global.db.data.users[m.sender].money -= Baqua * count + conn.reply(m.chat, `Succes membeli ${count} Aqua dengan harga ${Baqua * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} aqua dengan harga ${Baqua * count} money`.trim(), m) + + break + case 'iron': + if (global.db.data.users[m.sender].money >= Biron * count) { + global.db.data.users[m.sender].iron += count * 1 + global.db.data.users[m.sender].money -= Biron * count + conn.reply(m.chat, `Succes membeli ${count} Iron dengan harga ${Biron * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} iron dengan harga ${Biron * count} money`.trim(), m) + + break + case 'string': + if (global.db.data.users[m.sender].money >= Bstring * count) { + global.db.data.users[m.sender].string += count * 1 + global.db.data.users[m.sender].money -= Bstring * count + conn.reply(m.chat, `Succes membeli ${count} String dengan harga ${Bstring * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} string dengan harga ${Bstring * count} money`.trim(), m) + + break + case 'emerald': + if (global.db.data.users[m.sender].money >= Bemerald * count) { + global.db.data.users[m.sender].emerald += count * 1 + global.db.data.users[m.sender].money -= Bemerald * count + conn.reply(m.chat, `Succes membeli ${count} emerald dengan harga ${Bemerald * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} emerald dengan harga ${Bemerald * count} money`.trim(), m) + + break + case 'batu': + if (global.db.data.users[m.sender].money >= Bbatu * count) { + global.db.data.users[m.sender].batu += count * 1 + global.db.data.users[m.sender].money -= Bbatu * count + conn.reply(m.chat, `Succes membeli ${count} Batu dengan harga ${Bbatu * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} batu dengan harga ${Bbatu * count} money`.trim(), m) + + break + case 'umpan': + if (global.db.data.users[m.sender].money >= Bumpan * count) { + global.db.data.users[m.sender].umpan += count * 1 + global.db.data.users[m.sender].money -= Bumpan * count + conn.reply(m.chat, `Succes membeli ${count} Umpan dengan harga ${Bumpan * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} umpan dengan harga ${Bumpan * count} money`.trim(), m) + + break + case 'pancingan': + if (global.db.data.users[m.sender].money >= Bpancingan * count) { + global.db.data.users[m.sender].pancingan += count * 1 + global.db.data.users[m.sender].money -= Bpancingan * count + conn.reply(m.chat, `Succes membeli ${count} Pancingan dengan harga ${Bpancingan * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} pancingan dengan harga ${Bpancingan * count} money`.trim(), m) + + break + case 'armor': + if (global.db.data.users[m.sender].armor == 5) return conn.reply(m.chat, 'Armormu sudah *Level Max*', m) + if (global.db.data.users[m.sender].money > armor) { + global.db.data.users[m.sender].armor += 1 + global.db.data.users[m.sender].money -= armor * 1 + conn.reply(m.chat, `Succes membeli armor seharga ${armor} money` ,m) + } else conn.reply(m.chat, `uang mu tidak cukup untuk membeli armor seharga ${armor} money`, m) + + break + default: + return conn.reply(m.chat, Kchat, m) + } + break + case 'sell': + switch (_type) { + case 'potion': + if (global.db.data.users[m.sender].potion >= count * 1) { + global.db.data.users[m.sender].money += Spotion * count + global.db.data.users[m.sender].potion -= count * 1 + conn.reply(m.chat, `Succes menjual ${count} Potion dengan harga ${Spotion * count} money`.trim(), m) + } else conn.reply(m.chat, `Potion kamu tidak cukup`.trim(), m) + break + case 'common': + if (global.db.data.users[m.sender].common >= count * 1) { + global.db.data.users[m.sender].money += Scommon * count + global.db.data.users[m.sender].common -= count * 1 + conn.reply(m.chat, `Succes menjual ${count} Common Crate dengan harga ${Scommon * count} money`.trim(), m) + } else conn.reply(m.chat, `Common Crate kamu tidak cukup`.trim(), m) + break + case 'uncommon': + if (global.db.data.users[m.sender].uncommon >= count * 1) { + global.db.data.users[m.sender].money += Suncommon * count + global.db.data.users[m.sender].uncommon -= count * 1 + conn.reply(m.chat, `Succes menjual ${count} Uncommon Crate dengan harga ${Suncommon * count} money`.trim(), m) + } else conn.reply(m.chat, `Uncommon Crate kamu tidak cukup`.trim(), m) + break + case 'mythic': + if (global.db.data.users[m.sender].mythic >= count * 1) { + global.db.data.users[m.sender].money += Smythic * count + global.db.data.users[m.sender].mythic -= count * 1 + conn.reply(m.chat, `Succes menjual ${count} Mythic Crate dengan harga ${Smythic * count} money`.trim(), m) + } else conn.reply(m.chat, `Mythic Crate kamu tidak cukup`.trim(), m) + break + case 'legendary': + if (global.db.data.users[m.sender].legendary >= count * 1) { + global.db.data.users[m.sender].money += Slegendary * count + global.db.data.users[m.sender].legendary -= count * 1 + conn.reply(m.chat, `Succes menjual ${count} Legendary Crate dengan harga ${Slegendary * count} money`.trim(), m) + } else conn.reply(m.chat, `Legendary Crate kamu tidak cukup`.trim(), m) + break + case 'sampah': + if (global.db.data.users[m.sender].sampah >= count * 1) { + global.db.data.users[m.sender].sampah -= count * 1 + global.db.data.users[m.sender].money += Ssampah * count + conn.reply(m.chat, `Succes menjual ${count} sampah, dan anda mendapatkan ${Ssampah * count} money`, m) + } else conn.reply(m.chat, `Sampah anda tidak cukup`, m) + break + case 'kaleng': + if (global.db.data.users[m.sender].kaleng >= count * 1) { + global.db.data.users[m.sender].kaleng -= count * 1 + global.db.data.users[m.sender].money += Skaleng * count + conn.reply(m.chat, `Succes menjual ${count} kaleng, dan anda mendapatkan ${Skaleng * count} money`, m) + } else conn.reply(m.chat, `Kaleng anda tidak cukup`, m) + break + case 'kardus': + if (global.db.data.users[m.sender].kardus >= count * 1) { + global.db.data.users[m.sender].kardus -= count * 1 + global.db.data.users[m.sender].money += Skardus * count + conn.reply(m.chat, `Succes menjual ${count} kardus, dan anda mendapatkan ${Skardus * count} money`, m) + } else conn.reply(m.chat, `Kardus anda tidak cukup`, m) + break + case 'botol': + if (global.db.data.users[m.sender].botol >= count * 1) { + global.db.data.users[m.sender].botol -= count * 1 + global.db.data.users[m.sender].money += Sbotol * count + conn.reply(m.chat, `Succes menjual ${count} botol, dan anda mendapatkan ${Sbotol * count} money`, m) + } else conn.reply(m.chat, `Botol anda tidak cukup`, m) + break + case 'kayu': + if (global.db.data.users[m.sender].kayu >= count * 1) { + global.db.data.users[m.sender].kayu -= count * 1 + global.db.data.users[m.sender].money += Skayu * count + conn.reply(m.chat, `Succes menjual ${count} kayu, dan anda mendapatkan ${Skayu * count} money`, m) + } else conn.reply(m.chat, `Kayu anda tidak cukup`, m) + break + case 'pisang': + if (global.db.data.users[m.sender].pisang >= count * 1) { + global.db.data.users[m.sender].pisang -= count * 1 + global.db.data.users[m.sender].money += Spisang * count + conn.reply(m.chat, `Succes menjual ${count} pisang, dan anda mendapatkan ${Spisang * count} money`, m) + } else conn.reply(m.chat, `Pisang anda tidak cukup`, m) + break + case 'anggur': + if (global.db.data.users[m.sender].anggur >= count * 1) { + global.db.data.users[m.sender].anggur -= count * 1 + global.db.data.users[m.sender].money += Sanggur * count + conn.reply(m.chat, `Succes menjual ${count} anggur, dan anda mendapatkan ${Sanggur * count} money`, m) + } else conn.reply(m.chat, `Anggur anda tidak cukup`, m) + break + case 'mangga': + if (global.db.data.users[m.sender].mangga >= count * 1) { + global.db.data.users[m.sender].mangga -= count * 1 + global.db.data.users[m.sender].money += Smangga * count + conn.reply(m.chat, `Succes menjual ${count} mangga, dan anda mendapatkan ${Smangga * count} money`, m) + } else conn.reply(m.chat, `Mangga anda tidak cukup`, m) + break + case 'jeruk': + if (global.db.data.users[m.sender].jeruk >= count * 1) { + global.db.data.users[m.sender].jeruk -= count * 1 + global.db.data.users[m.sender].money += Sjeruk * count + conn.reply(m.chat, `Succes menjual ${count} jeruk, dan anda mendapatkan ${Sjeruk * count} money`, m) + } else conn.reply(m.chat, `Jeruk anda tidak cukup`, m) + break + case 'apel': + if (global.db.data.users[m.sender].apel >= count * 1) { + global.db.data.users[m.sender].apel -= count * 1 + global.db.data.users[m.sender].money += Sapel * count + conn.reply(m.chat, `Succes menjual ${count} apel, dan anda mendapatkan ${Sapel * count} money`, m) + } else conn.reply(m.chat, `Apel anda tidak cukup`, m) + break + case 'berlian': + if (global.db.data.users[m.sender].berlian >= count * 1) { + global.db.data.users[m.sender].berlian -= count * 1 + global.db.data.users[m.sender].money += Sberlian * count + conn.reply(m.chat, `Succes menjual ${count} berlian, dan anda mendapatkan ${Sberlian * count} money`, m) + } else conn.reply(m.chat, `Berlian anda tidak cukup`, m) + break + case 'emas': + if (global.db.data.users[m.sender].emas >= count * 1) { + global.db.data.users[m.sender].emas -= count * 1 + global.db.data.users[m.sender].money += Semasbiasa * count + conn.reply(m.chat, `Succes menjual ${count} emas , dan anda mendapatkan ${Semasbiasa * count} money`, m) + } else conn.reply(m.chat, `Emas anda tidak cukup`, m) + break + case 'bensin': + if (global.db.data.users[m.sender].bensin >= count * 1) { + global.db.data.users[m.sender].bensin -= count * 1 + global.db.data.users[m.sender].money += SBensin * count + conn.reply(m.chat, `Succes menjual ${count} bensin , dan anda mendapatkan ${SBensin * count} money`, m) + } else conn.reply(m.chat, `Bensin anda tidak cukup`, m) + break + case 'weapon': + if (global.db.data.users[m.sender].weapon >= count * 1) { + global.db.data.users[m.sender].weapon -= count * 1 + global.db.data.users[m.sender].money += SWeap * count + conn.reply(m.chat, `Succes menjual ${count} Weapon , dan anda mendapatkan ${SWeap * count} money`, m) + } else conn.reply(m.chat, `Weapon anda tidak cukup`, m) + break + case 'pet': + if (global.db.data.users[m.sender].pet >= count * 1) { + global.db.data.users[m.sender].pet -= count * 1 + global.db.data.users[m.sender].money += Spet * count + conn.reply(m.chat, `Succes menjual ${count} pet random, dan anda mendapatkan ${Spet * count} money`, m) + } else conn.reply(m.chat, `Pet Random anda tidak cukup`, m) + break + case 'makananpet': + if (global.db.data.users[m.sender].makananpet >= count * 1) { + global.db.data.users[m.sender].makananpet -= count * 1 + global.db.data.users[m.sender].money += Smakananpet * count + conn.reply(m.chat, `Succes menjual ${count} makanan pet, dan anda mendapatkan ${Smakananpet * count} money`, m) + } else conn.reply(m.chat, `Makanan pet anda tidak cukup`, m) + break + case 'makananphonix': + if (global.db.data.users[m.sender].makananphonix >= count * 1) { + global.db.data.users[m.sender].makananphonix -= count * 1 + global.db.data.users[m.sender].money += Smakananphonix * count + conn.reply(m.chat, `Succes menjual ${count} makanan phonix, dan anda mendapatkan ${Smakananphonix * count} money`, m) + } else conn.reply(m.chat, `Makanan phonix anda tidak cukup`, m) + break + case 'makanannaga': + if (global.db.data.users[m.sender].makanannaga >= count * 1) { + global.db.data.users[m.sender].makanannaga -= count * 1 + global.db.data.users[m.sender].money += Smakanannaga * count + conn.reply(m.chat, `Succes menjual ${count} makanan naga, dan anda mendapatkan ${Smakanannaga * count} money`, m) + } else conn.reply(m.chat, `Makanan naga anda tidak cukup`, m) + break + case 'makanankyubi': + if (global.db.data.users[m.sender].makanankyuni >= count * 1) { + global.db.data.users[m.sender].makanankyubi -= count * 1 + global.db.data.users[m.sender].money += Smakanankyubi * count + conn.reply(m.chat, `Succes menjual ${count} makanan kyubi, dan anda mendapatkan ${Smakanankyubi* count} money`, m) + } else conn.reply(m.chat, `Makanan kyubi anda tidak cukup`, m) + break + case 'makanangriffin': + if (global.db.data.users[m.sender].makanangriffin >= count * 1) { + global.db.data.users[m.sender].makanangriffin -= count * 1 + global.db.data.users[m.sender].money += Smakanangriffin * count + conn.reply(m.chat, `Succes menjual ${count} makanan griffin, dan anda mendapatkan ${Smakanangriffin * count} money`, m) + } else conn.reply(m.chat, `Makanan griffin anda tidak cukup`, m) + break + case 'makanancentaur': + if (global.db.data.users[m.sender].makanancentaur >= count * 1) { + global.db.data.users[m.sender].makanancentaur -= count * 1 + global.db.data.users[m.sender].money += Smakanancentaur * count + conn.reply(m.chat, `Succes menjual ${count} makanan centaur, dan anda mendapatkan ${Smakanancentaur * count} money`, m) + } else conn.reply(m.chat, `Makanan centaur anda tidak cukup`, m) + break + case 'aqua': + if (global.db.data.users[m.sender].aqua >= count * 1) { + global.db.data.users[m.sender].aqua -= count * 1 + global.db.data.users[m.sender].money += Saqua * count + conn.reply(m.chat, `Succes menjual ${count} aqua, dan anda mendapatkan ${Saqua * count} money`, m) + } else conn.reply(m.chat, `Aqua anda tidak cukup`, m) + break + case 'pancingan': + if (global.db.data.users[m.sender].pancingan >= count * 1) { + global.db.data.users[m.sender].pancingan -= count * 1 + global.db.data.users[m.sender].money += Spancingan * count + conn.reply(m.chat, `Succes menjual ${count} pancingan, dan anda mendapatkan ${Spancingan * count} money`, m) + } else conn.reply(m.chat, `Pancingan anda tidak cukup`, m) + break + case 'iron': + if (global.db.data.users[m.sender].iron >= count * 1) { + global.db.data.users[m.sender].iron -= count * 1 + global.db.data.users[m.sender].money += Siron * count + conn.reply(m.chat, `Succes menjual ${count} pancingan, dan anda mendapatkan ${Siron * count} money`, m) + } else conn.reply(m.chat, `Iron anda tidak cukup`, m) + break + case 'string': + if (global.db.data.users[m.sender].string >= count * 1) { + global.db.data.users[m.sender].string -= count * 1 + global.db.data.users[m.sender].money += Sstring * count + conn.reply(m.chat, `Succes menjual ${count} string, dan anda mendapatkan ${Sstring * count} money`, m) + } else conn.reply(m.chat, `String anda tidak cukup`, m) + break + case 'sword': + if (global.db.data.users[m.sender].sword >= count * 1) { + global.db.data.users[m.sender].sword -= count * 1 + global.db.data.users[m.sender].money += Ssword * count + conn.reply(m.chat, `Succes menjual ${count} sword, dan anda mendapatkan ${Ssword * count} money`, m) + } else conn.reply(m.chat, `Sword anda tidak cukup`, m) + break + case 'batu': + if (global.db.data.users[m.sender].batu >= count * 1) { + global.db.data.users[m.sender].batu -= count * 1 + global.db.data.users[m.sender].money += Sbatu * count + conn.reply(m.chat, `Succes menjual ${count} batu, dan anda mendapatkan ${Sbatu * count} money`, m) + } else conn.reply(m.chat, `Batu anda tidak cukup`, m) + break + case 'limit': + if (global.db.data.users[m.sender].limit >= count * 1) { + global.db.data.users[m.sender].limit -= count * 1 + global.db.data.users[m.sender].money += Slimit * count + conn.reply(m.chat, `Succes menjual ${count} limit, dan anda mendapatkan ${Slimit * count} money`, m) + } else conn.reply(m.chat, `Limit anda tidak cukup`, m) + break + case 'diamond': + if (global.db.data.users[m.sender].diamond >= count * 1) { + global.db.data.users[m.sender].diamond -= count * 1 + global.db.data.users[m.sender].money += Sdiamond * count + conn.reply(m.chat, `Succes menjual ${count} Diamond, dan anda mendapatkan ${Sdiamond * count} money`, m) + } else conn.reply(m.chat, `Diamond anda tidak cukup`, m) + break + case 'coal': + if (global.db.data.users[m.sender].coal >= count * 1) { + global.db.data.users[m.sender].coal -= count * 1 + global.db.data.users[m.sender].money += Scoal * count + conn.reply(m.chat, `Succes menjual ${count} Coal, dan anda mendapatkan ${Scoal * count} money`, m) + } else conn.reply(m.chat, `Coal anda tidak cukup`, m) + + break + default: + return conn.reply(m.chat, Kchat, m) + } + break + default: + return conn.reply(m.chat, Kchat, m) + } + } else if (/beli|buy/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(999999999999999, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count) + switch (type) { + case 'potion': + if (global.db.data.users[m.sender].money >= potion * count) { + global.db.data.users[m.sender].money -= potion * count + global.db.data.users[m.sender].potion += count * 1 + conn.reply(m.chat, `Succes membeli ${count} Potion dengan harga ${potion * count} money\n\nGunakan potion dengan ketik: *${usedPrefix}use potion <jumlah>*`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Potion dengan harga ${potion * count} money`,m) + + break + case 'diamond': + if (global.db.data.users[m.sender].money >= Bdiamond * count) { + global.db.data.users[m.sender].diamond += count * 1 + global.db.data.users[m.sender].money -= Bdiamond * count + conn.reply(m.chat, `Succes membeli ${count} Diamond dengan harga ${Bdiamond * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + + break + case 'coal': + if (global.db.data.users[m.sender].money >= Bcoal * count) { + global.db.data.users[m.sender].coal += count * 1 + global.db.data.users[m.sender].money -= Bcoal * count + conn.reply(m.chat, `Succes membeli ${count} Coal dengan harga ${Bcoal * count} money`, m) + } else conn.reply(m.chat, `Money anda tidak cukup`, m) + + break + case 'common': + if (global.db.data.users[m.sender].money >= Bcommon * count) { + global.db.data.users[m.sender].common += count * 1 + global.db.data.users[m.sender].money -= Bcommon * count + conn.reply(m.chat, `Succes membeli ${count} Common crate dengan harga ${Bcommon * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Common crate dengan harga ${Bcommon * count} money\n\nBuka crate dengan ketik: *${usedPrefix}open common*`, m) + + break + case 'uncommon': + if (global.db.data.users[m.sender].money >= Buncommon * count) { + global.db.data.users[m.sender].uncommon += count * 1 + global.db.data.users[m.sender].money -= Buncommon * count + conn.reply(m.chat, `Succes membeli ${count} Uncommon crate dengan harga ${Buncommon * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Uncommon crate dengan harga ${Buncommon * count} money\n\nBuka crate dengan ketik: *${usedPrefix}open uncommon*`, m) + + break + case 'mythic': + if (global.db.data.users[m.sender].money >= Bmythic * count) { + global.db.data.users[m.sender].mythic += count * 1 + global.db.data.users[m.sender].money -= Bmythic * count + conn.reply(m.chat, `Succes membeli ${count} Mythic crate dengan harga ${Bmythic * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Mythic crate dengan harga ${Bmythic* count} money\n\nBuka crate dengan ketik: *${usedPrefix}open mythic*`, m) + + break + case 'legendary': + if (global.db.data.users[m.sender].money >= Blegendary * count) { + global.db.data.users[m.sender].legendary += count * 1 + global.db.data.users[m.sender].money -= Blegendary * count + conn.reply(m.chat, `Succes membeli ${count} Legendary crate dengan harga ${Blegendary * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Legendary crate dengan harga ${Blegendary * count} money\n\nBuka crate dengan ketik: *${usedPrefix}open legendary*`, m) + + break + case 'sampah': + if (global.db.data.users[m.sender].money >= Bsampah * count) { + global.db.data.users[m.sender].sampah += count * 1 + global.db.data.users[m.sender].money -= Bsampah * count + conn.reply(m.chat, `Succes membeli ${count} Sampah dengan harga ${Bsampah * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Sampah dengan harga ${Bsampah * count} money`.trim(), m) + + break + case 'kaleng': + if (global.db.data.users[m.sender].money >= Bkaleng * count) { + global.db.data.users[m.sender].kaleng += count * 1 + global.db.data.users[m.sender].money -= Bkaleng * count + conn.reply(m.chat, `Succes membeli ${count} Kaleng dengan harga ${Bkaleng * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Kaleng dengan harga ${Bkaleng * count} money`.trim(), m) + + break + case 'kardus': + if (global.db.data.users[m.sender].money >= Bkardus * count) { + global.db.data.users[m.sender].kardus += count * 1 + global.db.data.users[m.sender].money -= Bkardus * count + conn.reply(m.chat, `Succes membeli ${count} Kardus dengan harga ${Bkardus * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Kardus dengan harga ${Bkardus * count} money`.trim(), m) + + break + case 'botol': + if (global.db.data.users[m.sender].money >= Bbotol * count) { + global.db.data.users[m.sender].botol += count * 1 + global.db.data.users[m.sender].money -= Bbotol * count + conn.reply(m.chat, `Succes membeli ${count} Botol dengan harga ${Bbotol * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} botol dengan harga ${Bbotol * count} money`.trim(), m) + + break + case 'kayu': + if (global.db.data.users[m.sender].money >= Bkayu * count) { + global.db.data.users[m.sender].kayu += count * 1 + global.db.data.users[m.sender].money -= Bkayu * count + conn.reply(m.chat, `Succes membeli ${count} Kayu dengan harga ${Bkayu * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} kayu dengan harga ${Bkayu * count} money`.trim(), m) + + break + case 'pisang': + if (global.db.data.users[m.sender].money >= Bpisang * count) { + global.db.data.users[m.sender].pisang += count * 1 + global.db.data.users[m.sender].money -= Bpisang * count + conn.reply(m.chat, `Succes membeli ${count} Pisang dengan harga ${Bpisang * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} pisang dengan harga ${Bpisang * count} money`.trim(), m) + + break + case 'anggur': + if (global.db.data.users[m.sender].money >= Banggur * count) { + global.db.data.users[m.sender].anggur += count * 1 + global.db.data.users[m.sender].money -= Banggur * count + conn.reply(m.chat, `Succes membeli ${count} Anggur dengan harga ${Banggur * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} anggur dengan harga ${Banggur * count} money`.trim(), m) + + break + case 'mangga': + if (global.db.data.users[m.sender].money >= Bmangga * count) { + global.db.data.users[m.sender].mangga += count * 1 + global.db.data.users[m.sender].money -= Bmangga * count + conn.reply(m.chat, `Succes membeli ${count} Mangga dengan harga ${Bmangga * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} mangga dengan harga ${Bmangga * count} money`.trim(), m) + + break + case 'jeruk': + if (global.db.data.users[m.sender].money >= Bjeruk * count) { + global.db.data.users[m.sender].jeruk += count * 1 + global.db.data.users[m.sender].money -= Bjeruk * count + conn.reply(m.chat, `Succes membeli ${count} Jeruk dengan harga ${Bjeruk * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} jeruk dengan harga ${Bjeruk * count} money`.trim(), m) + + break + case 'apel': + if (global.db.data.users[m.sender].money >= Bapel * count) { + global.db.data.users[m.sender].apel += count * 1 + global.db.data.users[m.sender].money -= Bapel * count + conn.reply(m.chat, `Succes membeli ${count} Apel dengan harga ${Bapel * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} apel dengan harga ${Bapel * count} money`.trim(), m) + + break + case 'bibitpisang': + if (global.db.data.users[m.sender].money >= Bbibitpisang * count) { + global.db.data.users[m.sender].bibitpisang += count * 1 + global.db.data.users[m.sender].money -= Bbibitpisang * count + conn.reply(m.chat, `Succes membeli ${count} Bibit Pisang dengan harga ${Bbibitpisang * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} bibit pisang dengan harga ${Bbibitpisang * count} money`.trim(), m) + + break + case 'bibitanggur': + if (global.db.data.users[m.sender].money >= Bbibitanggur * count) { + global.db.data.users[m.sender].bibitanggur += count * 1 + global.db.data.users[m.sender].money -= Bbibitanggur * count + conn.reply(m.chat, `Succes membeli ${count} Bibit Anggur dengan harga ${Bbibitanggur * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} bibit anggur dengan harga ${Bbibitanggur * count} money`.trim(), m) + + break + case 'bibitmangga': + if (global.db.data.users[m.sender].money >= Bbibitmangga * count) { + global.db.data.users[m.sender].bibitmangga += count * 1 + global.db.data.users[m.sender].money -= Bbibitmangga * count + conn.reply(m.chat, `Succes membeli ${count} Bibit Mangga dengan harga ${Bbibitmangga * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} bibit mangga dengan harga ${Bbibitmangga * count} money`.trim(), m) + + break + case 'bibitjeruk': + if (global.db.data.users[m.sender].money >= Bbibitjeruk * count) { + global.db.data.users[m.sender].bibitjeruk += count * 1 + global.db.data.users[m.sender].money -= Bbibitjeruk * count + conn.reply(m.chat, `Succes membeli ${count} Bibit Jeruk dengan harga ${Bbibitjeruk * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} bibit jeruk dengan harga ${Bbibitjeruk * count} money`.trim(), m) + + break + case 'bibitapel': + if (global.db.data.users[m.sender].money >= Bbibitapel * count) { + global.db.data.users[m.sender].bibitapel += count * 1 + global.db.data.users[m.sender].money -= Bbibitapel * count + conn.reply(m.chat, `Succes membeli ${count} Bibit Apel dengan harga ${Bbibitapel * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} bibit apel dengan harga ${Bbibitapel * count} money`.trim(), m) + + break + case 'gardenboxs': + if (global.db.data.users[m.sender].money >= Bgardenboxs * count) { + global.db.data.users[m.sender].gardenboxs += count * 1 + global.db.data.users[m.sender].money -= Bgardenboxs * count + conn.reply(m.chat, `Succes membeli ${count} Gardenboxs dengan harga ${Bgardenboxs * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} gardenboxs dengan harga ${Bgardenboxs * count} money`.trim(), m) + + break + case 'berlian': + if (global.db.data.users[m.sender].money >= Bberlian * count) { + global.db.data.users[m.sender].berlian += count * 1 + global.db.data.users[m.sender].money -= Bberlian * count + conn.reply(m.chat, `Succes membeli ${count} Apel dengan harga ${Bberlian * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} berlian dengan harga ${Bberlian * count} money`.trim(), m) + + break + case 'emas': + if (global.db.data.users[m.sender].money >= Bemasbiasa * count) { + global.db.data.users[m.sender].emas += count * 1 + global.db.data.users[m.sender].money -= Bemasbiasa * count + conn.reply(m.chat, `Succes membeli ${count} Emas dengan harga ${Bemasbiasa * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} emas dengan harga ${Bemasbiasa * count} money`.trim(), m) + + break + case 'pet': + if (global.db.data.users[m.sender].money >= Bpet * count) { + global.db.data.users[m.sender].pet += count * 1 + global.db.data.users[m.sender].money -= Bpet * count + conn.reply(m.chat, `Succes membeli ${count} Pet Random dengan harga ${Bpet * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} pet random dengan harga ${Bpet * count} money`.trim(), m) + + break + case 'limit': + if (global.db.data.users[m.sender].diamond >= Blimit * count) { + global.db.data.users[m.sender].limit += count * 1 + global.db.data.users[m.sender].diamond -= Blimit * count + conn.reply(m.chat, `Succes membeli ${count} Limit dengan harga ${Blimit * count} money`, m) + } else conn.reply(m.chat, `diamond anda tidak cukup untuk membeli ${count} limit dengan harga ${Blimit * count} diamond`.trim(), m) + + break + /*case 'exp': + if (global.db.data.users[m.sender].money >= Bexp * count) { + global.db.data.users[m.sender].exp += count * 1 + global.db.data.users[m.sender].money -= Bexp * count + conn.reply(m.chat, `Succes membeli ${count} Exp dengan harga ${Bexp * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} exp dengan harga ${Bexp * count} money`.trim(), m) + + break + case 'eleksirb': + if (global.db.data.users[m.sender].money >= Beleksirb * count) { + global.db.data.users[m.sender].eleksirb += count * 1 + global.db.data.users[m.sender].money -= Beleksirb * count + conn.reply(m.chat, `Succes membeli ${count} Eleksir Biru dengan harga ${Beleksirb * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} Eleksir Biru dengan harga ${Beleksirb * count} money`.trim(), m) + + break + case 'koinexpg': + if (global.db.data.users[m.sender].money >= Bkoinexpg * count) { + global.db.data.users[m.sender].koinexpg += count * 1 + global.db.data.users[m.sender].money -= Bkoinexpg * count + conn.reply(m.chat, `Succes membeli ${count} Koinexpg dengan harga ${Bkoinexpg * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} koinexpg dengan harga ${Bkoinexpg * count} money`.trim(), m) + + break*/ + case 'cupon': + if (global.db.data.users[m.sender].tiketcoin >= Btiketcoin * count) { + global.db.data.users[m.sender].cupon += count * 1 + global.db.data.users[m.sender].tiketcoin -= Btiketcoin * count + conn.reply(m.chat, `Succes membeli ${count} cupon dengan harga ${Btiketcoin * count} Tiketcoin`, m) + } else conn.reply(m.chat, `Tiketcoin anda tidak cukup untuk membeli ${count} cupon dengan harga ${Btiketcoin * count} Tiketcoin\n\nCara mendapatkan tiketcoin, anda harus memainkan semua fitur game..`.trim(), m) + + break + case 'makananpet': + if (global.db.data.users[m.sender].money >= Bmakananpet * count) { + global.db.data.users[m.sender].makananpet += count * 1 + global.db.data.users[m.sender].money -= Bmakananpet * count + conn.reply(m.chat, `Succes membeli ${count} Makanan Pet dengan harga ${Bmakananpet * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan pet dengan harga ${Bmakananpet * count} money`.trim(), m) + + break + case 'makanannaga': + if (global.db.data.users[m.sender].money >= Bmakanannaga * count) { + global.db.data.users[m.sender].makanannaga += count * 1 + global.db.data.users[m.sender].money -= Bmakanannaga * count + conn.reply(m.chat, `Succes membeli ${count} Makanan Naga dengan harga ${Bmakanannaga * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan pet dengan harga ${Bmakanannaga * count} money`.trim(), m) + + break + case 'makananphonix': + if (global.db.data.users[m.sender].money >= Bmakananphonix * count) { + global.db.data.users[m.sender].makananphonix += count * 1 + global.db.data.users[m.sender].money -= Bmakananphonix * count + conn.reply(m.chat, `Succes membeli ${count} Makanan Phonix dengan harga ${Bmakananphonix * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan pet dengan harga ${Bmakananphonix * count} money`.trim(), m) + + break + case 'makanankyubi': + if (global.db.data.users[m.sender].money >= Bmakanankyubi * count) { + global.db.data.users[m.sender].makanankyubi += count * 1 + global.db.data.users[m.sender].money -= Bmakanankyubi* count + conn.reply(m.chat, `Succes membeli ${count} Makanan Kyubi dengan harga ${Bmakanankyubi * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan kyubi dengan harga ${Bmakanankyubi * count} money`.trim(), m) + + break + case 'makanangriffin': + if (global.db.data.users[m.sender].money >= Bmakanangriffin * count) { + global.db.data.users[m.sender].makanangriffin += count * 1 + global.db.data.users[m.sender].money -= Bmakanangriffin * count + conn.reply(m.chat, `Succes membeli ${count} Makanan Griffin dengan harga ${Bmakanangriffin * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan griffin dengan harga ${Bmakanangriffin * count} money`.trim(), m) + + break + case 'makanancentaur': + if (global.db.data.users[m.sender].money >= Bmakanancentaur * count) { + global.db.data.users[m.sender].makanancentaur += count * 1 + global.db.data.users[m.sender].money -= Bmakanancentaur * count + conn.reply(m.chat, `Succes membeli ${count} Makanan Centaur dengan harga ${Bmakanancentaur * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} makanan centaur dengan harga ${Bmakanancentaur * count} money`.trim(), m) + + break + case 'tiketm': + if (global.db.data.users[m.sender].money >= Bhealtmonster * count) { + global.db.data.users[m.sender].healtmonster += count * 1 + global.db.data.users[m.sender].money -= Bhealtmonster * count + conn.reply(m.chat, `Succes membeli ${count} TiketM dengan harga ${Bhealtmonster * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} tiketm dengan harga ${Bhealtmonster * count} money`.trim(), m) + + break + case 'aqua': + if (global.db.data.users[m.sender].money >= Baqua * count) { + global.db.data.users[m.sender].aqua += count * 1 + global.db.data.users[m.sender].money -= Baqua * count + conn.reply(m.chat, `Succes membeli ${count} Aqua dengan harga ${Baqua * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} aqua dengan harga ${Baqua * count} money`.trim(), m) + + break + case 'iron': + if (global.db.data.users[m.sender].money >= Biron * count) { + global.db.data.users[m.sender].iron += count * 1 + global.db.data.users[m.sender].money -= Biron * count + conn.reply(m.chat, `Succes membeli ${count} Iron dengan harga ${Biron * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} iron dengan harga ${Biron * count} money`.trim(), m) + + break + case 'string': + if (global.db.data.users[m.sender].money >= Bstring * count) { + global.db.data.users[m.sender].string += count * 1 + global.db.data.users[m.sender].money -= Bstring * count + conn.reply(m.chat, `Succes membeli ${count} String dengan harga ${Bstring * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} string dengan harga ${Bstring * count} money`.trim(), m) + + break + case 'emerald': + if (global.db.data.users[m.sender].money >= Bemerald * count) { + global.db.data.users[m.sender].emerald += count * 1 + global.db.data.users[m.sender].money -= Bemerald * count + conn.reply(m.chat, `Succes membeli ${count} emerald dengan harga ${Bemerald * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} emerald dengan harga ${Bemerald * count} money`.trim(), m) + + break + case 'batu': + if (global.db.data.users[m.sender].money >= Bbatu * count) { + global.db.data.users[m.sender].batu += count * 1 + global.db.data.users[m.sender].money -= Bbatu * count + conn.reply(m.chat, `Succes membeli ${count} Batu dengan harga ${Bbatu * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} batu dengan harga ${Bbatu * count} money`.trim(), m) + + break + case 'umpan': + if (global.db.data.users[m.sender].money >= Bumpan * count) { + global.db.data.users[m.sender].umpan += count * 1 + global.db.data.users[m.sender].money -= Bumpan * count + conn.reply(m.chat, `Succes membeli ${count} Umpan dengan harga ${Bumpan * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} umpan dengan harga ${Bumpan * count} money`.trim(), m) + + break + case 'pancingan': + if (global.db.data.users[m.sender].money >= Bpancingan * count) { + global.db.data.users[m.sender].pancingan += count * 1 + global.db.data.users[m.sender].money -= Bpancingan * count + conn.reply(m.chat, `Succes membeli ${count} Pancingan dengan harga ${Bpancingan * count} money`, m) + } else conn.reply(m.chat, `Uang anda tidak cukup untuk membeli ${count} pancingan dengan harga ${Bpancingan * count} money`.trim(), m) + + break + case 'armor': + if (global.db.data.users[m.sender].armor == 5) return conn.reply(m.chat, 'Armormu sudah *Level Max*', m) + if (global.db.data.users[m.sender].money > armor * 1) { + global.db.data.users[m.sender].armor += 1 + global.db.data.users[m.sender].money -= armor * 1 + conn.reply(m.chat, `Succes membeli armor seharga ${armor} money` ,m) + + } else conn.reply(m.chat, `uang mu tidak cukup untuk membeli armor seharga ${armor} money`, m) + + break + default: + return conn.reply(m.chat, Kchat, m) + } + } else if (/sell|jual|/i.test(command)) { + const count = args[1] && args[1].length > 0 ? Math.min(999999999999999, Math.max(parseInt(args[1]), 1)) : !args[1] || args.length < 3 ? 1 : Math.min(1, count) + switch (type) { + case 'potion': + if (global.db.data.users[m.sender].potion >= count * 1) { + global.db.data.users[m.sender].money += Spotion * count + global.db.data.users[m.sender].potion -= count * 1 + conn.reply(m.chat, `Succes menjual ${count} Potion dengan harga ${Spotion * count} money`.trim(), m) + } else conn.reply(m.chat, `Potion kamu tidak cukup`.trim(), m) + break + case 'common': + if (global.db.data.users[m.sender].common >= count * 1) { + global.db.data.users[m.sender].money += Scommon * count + global.db.data.users[m.sender].common -= count * 1 + conn.reply(m.chat, `Succes menjual ${count} Common Crate dengan harga ${Scommon * count} money`.trim(), m) + } else conn.reply(m.chat, `Common Crate kamu tidak cukup`.trim(), m) + break + case 'uncommon': + if (global.db.data.users[m.sender].uncommon >= count * 1) { + global.db.data.users[m.sender].money += Suncommon * count + global.db.data.users[m.sender].uncommon -= count * 1 + conn.reply(m.chat, `Succes menjual ${count} Uncommon Crate dengan harga ${Suncommon * count} money`.trim(), m) + } else conn.reply(m.chat, `Uncommon Crate kamu tidak cukup`.trim(), m) + break + case 'mythic': + if (global.db.data.users[m.sender].mythic >= count * 1) { + global.db.data.users[m.sender].money += Smythic * count + global.db.data.users[m.sender].mythic -= count * 1 + conn.reply(m.chat, `Succes menjual ${count} Mythic Crate dengan harga ${Smythic * count} money`.trim(), m) + } else conn.reply(m.chat, `Mythic Crate kamu tidak cukup`.trim(), m) + break + case 'legendary': + if (global.db.data.users[m.sender].legendary >= count * 1) { + global.db.data.users[m.sender].money += Slegendary * count + global.db.data.users[m.sender].legendary -= count * 1 + conn.reply(m.chat, `Succes menjual ${count} Legendary Crate dengan harga ${Slegendary * count} money`.trim(), m) + } else conn.reply(m.chat, `Legendary Crate kamu tidak cukup`.trim(), m) + break + case 'sampah': + if (global.db.data.users[m.sender].sampah >= count * 1) { + global.db.data.users[m.sender].sampah -= count * 1 + global.db.data.users[m.sender].money += Ssampah * count + conn.reply(m.chat, `Succes menjual ${count} sampah, dan anda mendapatkan ${Ssampah * count} money`.trim(), m) + } else conn.reply(m.chat, `Sampah anda tidak cukup`.trim(), m) + break + case 'kaleng': + if (global.db.data.users[m.sender].kaleng >= count * 1) { + global.db.data.users[m.sender].kaleng -= count * 1 + global.db.data.users[m.sender].money += Skaleng * count + conn.reply(m.chat, `Succes menjual ${count} kaleng, dan anda mendapatkan ${Skaleng * count} money`, m) + } else conn.reply(m.chat, `Kaleng anda tidak cukup`, m) + break + case 'kardus': + if (global.db.data.users[m.sender].kardus >= count * 1) { + global.db.data.users[m.sender].kardus -= count * 1 + global.db.data.users[m.sender].money += Skardus * count + conn.reply(m.chat, `Succes menjual ${count} kardus, dan anda mendapatkan ${Skardus * count} money`, m) + } else conn.reply(m.chat, `Kardus anda tidak cukup`, m) + break + case 'botol': + if (global.db.data.users[m.sender].botol >= count * 1) { + global.db.data.users[m.sender].botol -= count * 1 + global.db.data.users[m.sender].money += Sbotol * count + conn.reply(m.chat, `Succes menjual ${count} botol, dan anda mendapatkan ${Sbotol * count} money`, m) + } else conn.reply(m.chat, `Botol anda tidak cukup`, m) + break + case 'kayu': + if (global.db.data.users[m.sender].kayu >= count * 1) { + global.db.data.users[m.sender].kayu -= count * 1 + global.db.data.users[m.sender].money += Skayu * count + conn.reply(m.chat, `Succes menjual ${count} kayu, dan anda mendapatkan ${Skayu * count} money`, m) + } else conn.reply(m.chat, `Kayu anda tidak cukup`, m) + break + case 'pisang': + if (global.db.data.users[m.sender].pisang >= count * 1) { + global.db.data.users[m.sender].pisang -= count * 1 + global.db.data.users[m.sender].money += Spisang * count + conn.reply(m.chat, `Succes menjual ${count} pisang, dan anda mendapatkan ${Spisang * count} money`, m) + } else conn.reply(m.chat, `Pisang anda tidak cukup`, m) + break + case 'anggur': + if (global.db.data.users[m.sender].anggur >= count * 1) { + global.db.data.users[m.sender].anggur -= count * 1 + global.db.data.users[m.sender].money += Sanggur * count + conn.reply(m.chat, `Succes menjual ${count} anggur, dan anda mendapatkan ${Sanggur * count} money`, m) + } else conn.reply(m.chat, `Anggur anda tidak cukup`, m) + break + case 'mangga': + if (global.db.data.users[m.sender].mangga >= count * 1) { + global.db.data.users[m.sender].mangga -= count * 1 + global.db.data.users[m.sender].money += Smangga * count + conn.reply(m.chat, `Succes menjual ${count} mangga, dan anda mendapatkan ${Smangga * count} money`, m) + } else conn.reply(m.chat, `Mangga anda tidak cukup`, m) + break + case 'jeruk': + if (global.db.data.users[m.sender].jeruk >= count * 1) { + global.db.data.users[m.sender].jeruk -= count * 1 + global.db.data.users[m.sender].money += Sjeruk * count + conn.reply(m.chat, `Succes menjual ${count} jeruk, dan anda mendapatkan ${Sjeruk * count} money`, m) + } else conn.reply(m.chat, `Jeruk anda tidak cukup`, m) + break + case 'apel': + if (global.db.data.users[m.sender].apel >= count * 1) { + global.db.data.users[m.sender].apel -= count * 1 + global.db.data.users[m.sender].money += Sapel * count + conn.reply(m.chat, `Succes menjual ${count} apel, dan anda mendapatkan ${Sapel * count} money`, m) + } else conn.reply(m.chat, `Apel anda tidak cukup`, m) + break + case 'berlian': + if (global.db.data.users[m.sender].berlian >= count * 1) { + global.db.data.users[m.sender].berlian -= count * 1 + global.db.data.users[m.sender].money += Sberlian * count + conn.reply(m.chat, `Succes menjual ${count} berlian, dan anda mendapatkan ${Sberlian * count} money`, m) + } else conn.reply(m.chat, `Berlian anda tidak cukup`, m) + break + case 'emas': + if (global.db.data.users[m.sender].emas >= count * 1) { + global.db.data.users[m.sender].emas -= count * 1 + global.db.data.users[m.sender].money += Semasbiasa * count + conn.reply(m.chat, `Succes menjual ${count} emas, dan anda mendapatkan ${Semasbiasa * count} money`, m) + } else conn.reply(m.chat, `Emas anda tidak cukup`, m) + break + case 'pet': + if (global.db.data.users[m.sender].pet >= count * 1) { + global.db.data.users[m.sender].pet -= count * 1 + global.db.data.users[m.sender].money += Spet * count + conn.reply(m.chat, `Succes menjual ${count} pet random, dan anda mendapatkan ${Spet * count} money`, m) + } else conn.reply(m.chat, `Pet Random anda tidak cukup`, m) + break + case 'makananpet': + if (global.db.data.users[m.sender].makananpet >= count * 1) { + global.db.data.users[m.sender].makananpet -= count * 1 + global.db.data.users[m.sender].money += Smakananpet * count + conn.reply(m.chat, `Succes menjual ${count} makanan pet, dan anda mendapatkan ${Smakananpet * count} money`, m) + } else conn.reply(m.chat, `Makanan pet anda tidak cukup`, m) + break + case 'makanannaga': + if (global.db.data.users[m.sender].makanannaga >= count * 1) { + global.db.data.users[m.sender].makanannaga -= count * 1 + global.db.data.users[m.sender].money += Smakanannaga * count + conn.reply(m.chat, `Succes menjual ${count} makanan naga, dan anda mendapatkan ${Smakanannaga * count} money`, m) + } else conn.reply(m.chat, `Makanan naga anda tidak cukup`, m) + break + case 'makananphonix': + if (global.db.data.users[m.sender].makananphonix >= count * 1) { + global.db.data.users[m.sender].makananphonix -= count * 1 + global.db.data.users[m.sender].money += Smakananphonix * count + conn.reply(m.chat, `Succes menjual ${count} makanan phonix, dan anda mendapatkan ${Smakananphonix * count} money`, m) + } else conn.reply(m.chat, `Makanan phonix anda tidak cukup`, m) + break + case 'makanankyubi': + if (global.db.data.users[m.sender].makanankyuni >= count * 1) { + global.db.data.users[m.sender].makanankyubi -= count * 1 + global.db.data.users[m.sender].money += Smakanankyubi * count + conn.reply(m.chat, `Succes menjual ${count} makanan kyubi, dan anda mendapatkan ${Smakanankyubi* count} money`, m) + } else conn.reply(m.chat, `Makanan kyubi anda tidak cukup`, m) + break + case 'makanangriffin': + if (global.db.data.users[m.sender].makanangriffin >= count * 1) { + global.db.data.users[m.sender].makanangriffin -= count * 1 + global.db.data.users[m.sender].money += Smakanangriffin * count + conn.reply(m.chat, `Succes menjual ${count} makanan griffin, dan anda mendapatkan ${Smakanangriffin * count} money`, m) + } else conn.reply(m.chat, `Makanan griffin anda tidak cukup`, m) + break + case 'makanancentaur': + if (global.db.data.users[m.sender].makanancentaur >= count * 1) { + global.db.data.users[m.sender].makanancentaur -= count * 1 + global.db.data.users[m.sender].money += Smakanancentaur * count + conn.reply(m.chat, `Succes menjual ${count} makanan centaur, dan anda mendapatkan ${Smakanancentaur * count} money`, m) + } else conn.reply(m.chat, `Makanan centaur anda tidak cukup`, m) + break + case 'aqua': + if (global.db.data.users[m.sender].aqua >= count * 1) { + global.db.data.users[m.sender].aqua -= count * 1 + global.db.data.users[m.sender].money += Saqua * count + conn.reply(m.chat, `Succes menjual ${count} aqua, dan anda mendapatkan ${Saqua * count} money`, m) + } else conn.reply(m.chat, `Aqua anda tidak cukup`, m) + break + case 'pancingan': + if (global.db.data.users[m.sender].pancingan >= count * 1) { + global.db.data.users[m.sender].pancingan -= count * 1 + global.db.data.users[m.sender].money += Spancingan * count + conn.reply(m.chat, `Succes menjual ${count} pancingan, dan anda mendapatkan ${Spancingan * count} money`, m) + } else conn.reply(m.chat, `Pancingan anda tidak cukup`, m) + break + case 'iron': + if (global.db.data.users[m.sender].iron >= count * 1) { + global.db.data.users[m.sender].iron -= count * 1 + global.db.data.users[m.sender].money += Siron * count + conn.reply(m.chat, `Succes menjual ${count} pancingan, dan anda mendapatkan ${Siron * count} money`, m) + } else conn.reply(m.chat, `Iron anda tidak cukup`, m) + break + case 'string': + if (global.db.data.users[m.sender].string >= count * 1) { + global.db.data.users[m.sender].string -= count * 1 + global.db.data.users[m.sender].money += Sstring * count + conn.reply(m.chat, `Succes menjual ${count} string, dan anda mendapatkan ${Sstring * count} money`, m) + } else conn.reply(m.chat, `String anda tidak cukup`, m) + break + case 'sword': + if (global.db.data.users[m.sender].sword >= count * 1) { + global.db.data.users[m.sender].sword -= count * 1 + global.db.data.users[m.sender].money += Ssword * count + conn.reply(m.chat, `Succes menjual ${count} sword, dan anda mendapatkan ${Ssword * count} money`, m) + } else conn.reply(m.chat, `Sword anda tidak cukup`, m) + break + case 'batu': + if (global.db.data.users[m.sender].batu >= count * 1) { + global.db.data.users[m.sender].batu -= count * 1 + global.db.data.users[m.sender].money += Sbatu * count + conn.reply(m.chat, `Succes menjual ${count} batu, dan anda mendapatkan ${Sbatu * count} money`, m) + } else conn.reply(m.chat, `Batu anda tidak cukup`, m) + break + case 'limit': + if (global.db.data.users[m.sender].limit >= count * 1) { + global.db.data.users[m.sender].limit -= count * 1 + global.db.data.users[m.sender].money += Slimit * count + conn.reply(m.chat, `Succes menjual ${count} limit, dan anda mendapatkan ${Slimit * count} money`, m) + } else conn.reply(m.chat, `Limit anda tidak cukup`, m) + break + case 'diamond': + if (global.db.data.users[m.sender].diamond >= count * 1) { + global.db.data.users[m.sender].diamond -= count * 1 + global.db.data.users[m.sender].money += Sdiamond * count + conn.reply(m.chat, `Succes menjual ${count} Diamond, dan anda mendapatkan ${Sdiamond * count} money`, m) + } else conn.reply(m.chat, `Diamond anda tidak cukup`, m) + break + case 'coal': + if (global.db.data.users[m.sender].coal >= count * 1) { + global.db.data.users[m.sender].coal -= count * 1 + global.db.data.users[m.sender].money += Scoal * count + conn.reply(m.chat, `Succes menjual ${count} Coal, dan anda mendapatkan ${Scoal * count} money`, m) + } else conn.reply(m.chat, `Coal anda tidak cukup`, m) + + break + default: + return conn.reply(m.chat, Kchat, m) + } + } + } catch (e) { + conn.reply(m.chat, Kchat, m) + console.log(e) + } +} + +handler.help = ['shop <sell|buy> <args>'] +handler.tags = ['rpg'] + +handler.command = /^(shop|toko|buy|beli|sell|jual)$/i +handler.limit = true +handler.group = true +module.exports = handler diff --git a/plugins/rpg-tambang.js b/plugins/rpg-tambang.js new file mode 100644 index 0000000000000000000000000000000000000000..247809c77e2a1155f2d138a1c0ff38ad367d677b --- /dev/null +++ b/plugins/rpg-tambang.js @@ -0,0 +1,140 @@ +const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); + +function createTambangs() { + const areaNames = [ + "Emas", "Perak", "Berlian", "Batu Permata", "Uranium", "Emas Hitam", + "Kristal", "Rubi", "Safir", "Topaz", "Ametis", "Zamrud", "Opal", "Kuarsa", + "Safir Merah", "Topaz Biru", "Ametis Ungu", "Rubi Merah", "Emas Putih", + "Berlian Biru", "Batu Permata Hitam", "Uranium Radioaktif", "Kristal Langka", + "Diam", "Pirus", "Garnet", "Kalimaya", "Kuarsit", "Lapis Lazuli", "Rodokrosit", + "Yaspis", "Malakit", "Hessonit", "Peridot", "Amber", "Kornerupin", + "Morganit", "Labradorit", "Akuamarin", "Tanzanite", "Batu Delima", "Akuamarin", + "Kunzit", "Maw-sit-sit", "Sphene", "Kyanite", "Alexandrite", "Variscite", + "Tambang Baru 1", "Tambang Baru 2", "Tambang Baru 3" + ]; + + let tambangs = areaNames.map((areaName, i) => ({ + area: `Tambang ${areaName}`, + txt: areaName.toLowerCase().replace(/ /g, "_"), + reward: { + exp: 50 + (i * 50), + resources: { + diamond: Math.random() > 0.5 ? Math.floor(Math.random() * 6) : 0, + gold: Math.random() > 0.5 ? Math.floor(Math.random() * 6) : 0, + stone: Math.random() > 0.5 ? Math.floor(Math.random() * 6) : 0, + emerald: Math.random() > 0.5 ? Math.floor(Math.random() * 6) : 0, + coal: Math.random() > 0.5 ? Math.floor(Math.random() * 6) : 0, + iron: Math.random() > 0.5 ? Math.floor(Math.random() * 6) : 0 + } + } + })); + return tambangs; +} + +function formatTime(ms) { + let d = isNaN(ms) ? '--' : Math.floor(ms / 86400000); + let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) % 24; + let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60; + let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60; + return ['\n' + d, ' *Hari โ˜€๏ธ*\n', h, ' *Jam ๐Ÿ•*\n', m, ' *Menit โฐ*\n', s, ' *Detik โฑ๏ธ*'].map(v => v.toString().padStart(2, 0)).join(''); +} + +async function handler(m, { conn, text }) { + conn.tambang = conn.tambang || {}; + let user = global.db.data.users[m.sender]; + + if (m.sender in conn.tambang) { + if (conn.tambang[m.sender].currentArea >= conn.tambang[m.sender].areas.length) { + return m.reply("๐Ÿ† Anda telah menyelesaikan semua area pertambangan."); + } + return m.reply("โณ Anda masih memiliki area pertambangan yang belum selesai. Silakan selesaikan terlebih dahulu."); + } else { + if (text === 'start') { + let tambangs = createTambangs(); + + if (!user) return m.reply("๐Ÿ“ Silakan daftar untuk bermain game."); + if (user.healt === 0 || user.stamina === 0) return m.reply("โ— Stamina/healt Anda kurang dari 100."); + if (typeof user.exp !== "number") global.db.data.users[m.sender].exp = 0; + if (typeof user.resources !== "object") global.db.data.users[m.sender].resources = { diamond: 0, emerald: 0, coal: 0, iron: 0 }; + if (typeof user.kerjasatu !== "number") global.db.data.users[m.sender].kerjasatu = 0; + + const cooldown = 5 * 60 * 1000; // 5 menit cooldown + let timers = cooldown - (Date.now() - (user.kerjasatu || 0)); + if (timers > 0) return m.reply(`Silakan tunggu ${formatTime(timers)} lagi sebelum memulai pertambangan baru.`); + + let { area, txt, reward } = tambangs[0]; // Start with the first area + let currentArea = 0; + let hasilTambang = 0; + let totalReward = { diamond: 0, emerald: 0, coal: 0, iron: 0 }; + + conn.tambang[m.sender] = { + areas: tambangs, + currentArea, + hasilTambang, + lastTambangTime: Date.now(), + totalReward, + }; + + let caption = `๐Ÿž๏ธ *AREA PERTAMBANGAN:* ${area}\n\n๐Ÿชจ Ketik *'${txt}'* untuk memulai pertambangan di area ini.\n๐Ÿ” Jumlah hasil tambang yang didapatkan: ${hasilTambang}\n๐Ÿ’ฐ Exp yang didapatkan: ${reward.exp}\n๐Ÿ’Ž Resources yang didapatkan: Diamond: ${reward.resources.diamond}, Emerald: ${reward.resources.emerald}, Coal: ${reward.resources.coal}, Iron: ${reward.resources.iron}`; + + return m.reply(caption); + } else { + let instructions = "๐Ÿ… Selamat datang di game pertambangan!\n"; + instructions += "Ketik *'tambang start'* untuk memulai pertambangan.\n"; + instructions += "Ketik *'stop'* untuk menghentikan pertambangan saat sedang bermain."; + + return m.reply(instructions); + } + } +} + +handler.before = async m => { + conn.tambang = conn.tambang || {}; + if (!(m.sender in conn.tambang)) return; + if (m.isBaileys) return; + + let { areas, currentArea, hasilTambang, lastTambangTime, totalReward } = conn.tambang[m.sender]; + const cooldown = 5 * 60 * 1000; // 5 menit cooldown + let user = global.db.data.users[m.sender]; + + let msg = m.text.toLowerCase(); + if (msg === 'stop') { + m.reply("โŒ Pertambangan telah dihentikan. Ketik *'tambang start'* untuk memulai pertambangan kembali."); + delete conn.tambang[m.sender]; + return false; + } else if (currentArea < areas.length) { + if (areas[currentArea].txt === msg) { + let { area, reward } = areas[currentArea]; + user.exp += reward.exp; + for (let resource in reward.resources) { + user.resources[resource] += reward.resources[resource]; + totalReward[resource] += reward.resources[resource]; + } + hasilTambang++; + currentArea++; + conn.tambang[m.sender].currentArea = currentArea; + conn.tambang[m.sender].hasilTambang = hasilTambang; + conn.tambang[m.sender].totalReward = totalReward; + conn.tambang[m.sender].lastTambangTime = Date.now(); + + if (currentArea >= areas.length) { + m.reply(`๐ŸŽ‰ Selamat! Anda telah menyelesaikan semua area pertambangan.\nTotal hasil tambang: ${hasilTambang}\nExp yang didapatkan: ${reward.exp}\nTotal resources yang didapatkan: Diamond: ${totalReward.diamond}, Emerald: ${totalReward.emerald}, Coal: ${totalReward.coal}, Iron: ${totalReward.iron}`); + delete conn.tambang[m.sender]; + return false; + } else { + let nextArea = areas[currentArea].area; + let caption = `๐Ÿž๏ธ *AREA PERTAMBANGAN:* ${nextArea}\n\n๐Ÿชจ Ketik *'${areas[currentArea].txt}'* untuk memulai pertambangan di area ini.\n๐Ÿ” Jumlah hasil tambang yang didapatkan: ${hasilTambang}\n๐Ÿ’ฐ Exp yang didapatkan: ${reward.exp}\n๐Ÿ’Ž Resources yang didapatkan: Diamond: ${reward.resources.diamond}, Emerald: ${reward.resources.emerald}, Coal: ${reward.resources.coal}, Iron: ${reward.resources.iron}\n\n> ketik *stop* untuk berhenti`; + m.reply(caption); + return false; + } + } + } +}; + +handler.help = ['tambang']; +handler.tags = ['rpg']; +handler.command = /^(tambang)$/i; +handler.group = true; +handler.register = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-taxi.js b/plugins/rpg-taxi.js new file mode 100644 index 0000000000000000000000000000000000000000..3ba4589b26755297515907a984ae4ab1f20dc943 --- /dev/null +++ b/plugins/rpg-taxi.js @@ -0,0 +1,112 @@ +let handler = async (m, { conn }) => { + let __timers = (new Date - global.db.data.users[m.sender].lasttaxi) + let _timers = (3600000 - __timers) + let order = global.db.data.users[m.sender].taxi + let timers = clockString(_timers) + let name = conn.getName(m.sender) + let user = global.db.data.users[m.sender] + let id = m.sender + let kerja = 'taxi' + conn.misi = conn.misi ? conn.misi : {} + if (id in conn.misi) { + conn.reply(m.chat, `Selesaikan orderan taxi kamu ${conn.misi[id][0]} Terlebih Dahulu`, m) + throw false + } + if (new Date - user.lasttaxi > 3600000) { + let randomaku1 = Math.floor(Math.random() * 1000000) + let randomaku2 = Math.floor(Math.random() * 10000) + + var njir = ` +๐Ÿšถโฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ› +โฌ›โฌœโฌœโฌœโฌ›โฌœโฌœโฌœโฌ›โฌ› +โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ› +๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐ŸŒณ ๐ŸŒณ ๐Ÿ˜๏ธ ๐Ÿš• + + +โœ”๏ธ Mendapatkan orderan.... +`.trim() + + var njirr = ` +๐Ÿšถโฌ›โฌ›โฌ›โฌ›โฌ›๐Ÿšโฌ›โฌ›โฌ›๐Ÿš“๐Ÿšš +๐Ÿš–โฌœโฌœโฌœโฌ›โฌœโฌœโฌœ๐Ÿš“โฌ›๐Ÿš‘ +โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›๐Ÿš™ +๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐Ÿข๏ธ๐ŸŒณ ๐ŸŒณ ๐Ÿ˜๏ธ ๐Ÿ˜๏ธ๐Ÿก + + +๐Ÿš– Mengantar Ke tujuan..... +`.trim() + + var njirrr = ` +โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›๐Ÿš“ +โฌ›โฌœ๐Ÿš—โฌœโฌœโฌ›โฌœ๐Ÿšโฌœโฌœโฌ›๐Ÿš™๐Ÿšš๐Ÿš‘ +โฌ›โฌ›โฌ›โฌ›๐Ÿš’โฌ›โฌ›โฌ›โฌ›โฌ›โฌ›๐Ÿšš +๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐Ÿ˜๏ธ๐ŸŒณ ๐ŸŒณ ๐Ÿ˜๏ธ + + +๐Ÿš– Selesai Mengantar Pelanggan.... +`.trim() + + var njirrrr = ` +โž• ๐Ÿ’นMenerima gaji.... +`.trim() + + var hasil = ` +*โ€”[ Hasil taxi ${name} ]โ€”* +โž• ๐Ÿ’น Uang = [ ${randomaku1} ] +โž• โœจ Exp = [ ${randomaku2} ] +โž• ๐Ÿ˜ Order Selesai = +1 +โž• ๐Ÿ“ฅTotal Order Sebelumnya : ${order} +`.trim() + + user.money += randomaku1 + user.exp += randomaku2 + user.taxi += 1 + + conn.misi[id] = [ + kerja, + setTimeout(() => { + delete conn.misi[id] + }, 27000) + ] + + setTimeout(() => { + m.reply(hasil) + }, 27000) + + setTimeout(() => { + m.reply(njirrrr) + }, 25000) + + setTimeout(() => { + m.reply(njirrr) + }, 20000) + + setTimeout(() => { + m.reply(njirr) + }, 15000) + + setTimeout(() => { + m.reply(njir) + }, 10000) + + setTimeout(() => { + m.reply('๐Ÿ”Mencari orderan buat kamu.....') + }, 0) + user.lasttaxi = new Date * 1 + } else m.reply(`kamu kecapean, istirahat dulu selama ${timers}, baru gas ngorder lagi`) +} +handler.help = ['taxi'] +handler.tags = ['rpg'] +handler.command = /^(taxi)$/i +handler.register = true +handler.group = true +handler.rpg = true +module.exports = handler; + + +function clockString(ms) { + let h = Math.floor(ms / 3600000) + let m = Math.floor(ms / 60000) % 60 + let s = Math.floor(ms / 1000) % 60 + return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':') +} \ No newline at end of file diff --git a/plugins/rpg-tf.js b/plugins/rpg-tf.js new file mode 100644 index 0000000000000000000000000000000000000000..770c9c0d2cadbbe835f146b803acc16f9bf85df6 --- /dev/null +++ b/plugins/rpg-tf.js @@ -0,0 +1,313 @@ +//tq: hafizdexe + +let handler = async (m, { conn, args, usedPrefix, DevMode }) => { + if (args.length < 3) { + return conn.reply(m.chat, `Gunakan format .tf <type> <jumlah> <@tag>\n๐Ÿ“contoh penggunaan: *.tf money 100 @tag*\n\n*List yang bisa di transfer :*\n๐Ÿ’นMoney\n๐Ÿท Limit\n๐Ÿ’ณ Tabungan\n๐ŸฅคPotion\n๐Ÿ—‘๏ธSampah\n๐Ÿ’ŽDiamond\n๐Ÿ“ฆCommon\n๐Ÿ›๏ธUncommon\n๐ŸŽMythic\n๐ŸงฐLegendary\n๐Ÿ•ธ๏ธstring\n๐Ÿชตkayu\n๐Ÿชจbatu\nโ›“iron`.trim(), m) + } else try { + let type = (args[0] || '').toLowerCase() + let count = args[1] && args[1].length > 0 ? Math.min(9999999, Math.max(parseInt(args[1]), 1)) : Math.min(1) + let who = m.mentionedJid ? m.mentionedJid[0] : (args[2].replace(/[@ .+-]/g, '').replace(' ', '') + '@s.whatsapp.net') + if(!m.mentionedJid || !args[2]) throw 'Tag salah satu, atau ketik Nomernya!!' + let users = global.db.data.users + switch (type) { + case 'limit': + if (global.db.data.users[m.sender].limit >= count * 1) { + try { + global.db.data.users[m.sender].limit -= count * 1 + global.db.data.users[who].limit += count * 1 + conn.reply(m.chat, `Berhasil mentransfer limit sebesar ${count}`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].money += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Limit kamu tidak mencukupi untuk mentransfer Limit sebesar ${count}`.trim(), m) + break + case 'money': + if (global.db.data.users[m.sender].money >= count * 1) { + try { + global.db.data.users[m.sender].money -= count * 1 + global.db.data.users[who].money += count * 1 + conn.reply(m.chat, `Berhasil mentransfer money sebesar ${count}`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].money += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Uang kamu tidak mencukupi untuk mentransfer Money sebesar ${count}`.trim(), m) + break + case 'tabungan': + if (global.db.data.users[m.sender].atm >= count * 1) { + try { + global.db.data.users[m.sender].atm -= count * 1 + global.db.data.users[who].atm += count * 1 + conn.reply(m.chat, `Berhasil mentransfer Uang dari bank sebesar ${count}`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].atm += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Limit kamu tidak mencukupi untuk mentransfer Uang dari Bank sebesar ${count}`.trim(), m) + break + case 'limit': + if (global.db.data.users[m.sender].limit >= count * 1) { + try { + global.db.data.users[m.sender].limit -= count * 1 + global.db.data.users[who].limit += count * 1 + conn.reply(m.chat, `Berhasil mentransfer limit sebesar ${count}`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].limit += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Limit kamu tidak mencukupi untuk mentransfer Limit sebesar ${count}`.trim(), m) + break + case 'potion': + if (global.db.data.users[m.sender].potion >= count * 1) { + try { + global.db.data.users[m.sender].potion -= count * 1 + global.db.data.users[who].potion += count * 1 + conn.reply(m.chat, `Berhasil mentransfer ${count} Potion`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].potion += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Potion kamu tidak cukup`.trim(), m) + break + case 'sampah': + if (global.db.data.users[m.sender].sampah >= count * 1) { + try { + global.db.data.users[m.sender].sampah -= count * 1 + global.db.data.users[who].sampah += count * 1 + conn.reply(m.chat, `Berhasil mentransfer ${count} Sampah`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].sampah += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Sampah kamu tidak cukup`.trim(), m) + break + case 'diamond': + if (global.db.data.users[m.sender].diamond >= count * 1) { + try { + global.db.data.users[m.sender].diamond -= count * 1 + global.db.data.users[who].diamond += count * 1 + conn.reply(m.chat, `Berhasil mentransfer ${count} Diamond`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].diamond += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Diamond kamu kamu tidak cukup`.trim(), m) + break + case 'common': + if (global.db.data.users[m.sender].common >= count * 1) { + try { + global.db.data.users[m.sender].common -= count * 1 + global.db.data.users[who].common += count * 1 + conn.reply(m.chat, `Berhasil mentransfer ${count} Common Crate`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].common += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Common crate kamu kamu tidak cukup`.trim(), m) + break + case 'uncommon': + if (global.db.data.users[m.sender].uncommon >= count * 1) { + try { + global.db.data.users[m.sender].uncommon -= count * 1 + global.db.data.users[who].uncommon += count * 1 + conn.reply(m.chat, `Berhasil mentransfer ${count} Uncommon Crate`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].uncommon += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Uncommon crate kamu kamu tidak cukup`.trim(), m) + break + case 'mythic': + if (global.db.data.users[m.sender].mythic >= count * 1) { + try { + global.db.data.users[m.sender].mythic -= count * 1 + global.db.data.users[who].mythic += count * 1 + conn.reply(m.chat, `Berhasil mentransfer ${count} Mythic crate`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].mythic += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Mythic crate kamu kamu tidak cukup`.trim(), m) + break + case 'legendary': + if (global.db.data.users[m.sender].legendary >= count * 1) { + try { + global.db.data.users[m.sender].legendary -= count * 1 + global.db.data.users[who].legendary += count * 1 + conn.reply(m.chat, `Berhasil mentransfer ${count} Legendary crate`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].legendary += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Legendary crate kamu kamu tidak cukup`.trim(), m) + break + case 'string': + if (global.db.data.users[m.sender].string >= count * 1) { + try { + global.db.data.users[m.sender].string -= count * 1 + global.db.data.users[who].string += count * 1 + conn.reply(m.chat, `Berhasil mentransfer string sebesar ${count}`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].string += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Uang kamu tidak mencukupi untuk mentransfer String sebesar ${count}`.trim(), m) + break + case 'batu': + if (global.db.data.users[m.sender].batu >= count * 1) { + try { + global.db.data.users[m.sender].batu -= count * 1 + global.db.data.users[who].batu += count * 1 + conn.reply(m.chat, `Berhasil mentransfer Batu sebesar ${count}`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].batu += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Uang kamu tidak mencukupi untuk mentransfer Batu sebesar ${count}`.trim(), m) + break + case 'kayu': + if (global.db.data.users[m.sender].kayu >= count * 1) { + try { + global.db.data.users[m.sender].kayu -= count * 1 + global.db.data.users[who].kayu += count * 1 + conn.reply(m.chat, `Berhasil mentransfer kayu sebesar ${count}`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].kayu += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Uang kamu tidak mencukupi untuk mentransfer Kayu sebesar ${count}`.trim(), m) + break + case 'iron': + if (global.db.data.users[m.sender].iron >= count * 1) { + try { + global.db.data.users[m.sender].iron -= count * 1 + global.db.data.users[who].iron += count * 1 + conn.reply(m.chat, `Berhasil mentransfer iron sebesar ${count}`.trim(), m) + } catch (e) { + global.db.data.users[m.sender].iron += count * 1 + m.reply('Gagal Menstransfer') + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } + } else conn.reply(m.chat, `Uang kamu tidak mencukupi untuk mentransfer Iron sebesar ${count}`.trim(), m) + break + default: + return conn.reply(m.chat, `Gunakan format ${usedPrefix}transfer <type> <jumlah> <@tag>\n๐Ÿ“ Contoh penggunaan: *${usedPrefix}transfer money 100 @tag*\n\n*List yang bisa di transfer*\n๐Ÿ’น Money\n๐Ÿท Limit\n๐Ÿ’ณ Tabungan\n๐Ÿฅค Potion\n๐Ÿ—‘๏ธ Sampah\n๐Ÿ’Ž Diamond\n๐Ÿ“ฆ Common\n๐Ÿ›๏ธ Uncommon\n๐ŸŽ Mythic\n๐Ÿงฐ Legendary\n๐Ÿ•ธ๏ธ String\n๐Ÿชต Kayu\n๐Ÿชจ Batu\nโ›“๏ธ Iron`.trim(), m) + } + } catch (e) { + conn.reply(m.chat, `Gunakan format ${usedPrefix}tf <type> <jumlah> <@tag>\๐Ÿ“ Contoh penggunaan: *${usedPrefix}tf money 100 @tag*\n\n*List yang bisa di transfer :*\n๐Ÿ’น Money\n๐Ÿท Limit\n๐Ÿ’ณ Tabungan\n๐Ÿฅค Potion\n๐Ÿ—‘๏ธ Sampah\n๐Ÿ’Ž Diamond\n๐Ÿ“ฆ Common\n๐Ÿ›๏ธ Uncommon\n๐ŸŽ Mythic\n๐Ÿงฐ Legendary\n๐Ÿ•ธ๏ธ String\n๐Ÿชต Kayu\n๐Ÿชจ Batu\nโ›“ iron`.trim(), m) + console.log(e) + if (DevMode) { + for (let jid of global.owner.map(v => v.replace(/[^0-9]/g, '') + '@s.whatsapp.net').filter(v => v != conn.user.jid)) { + conn.reply(jid, 'Transfer.js error\nNo: *' + m.sender.split`@`[0] + '*\nCommand: *' + m.text + '*\n\n*' + e + '*', m) + } + } + } +} + +handler.help = ['transfer <Args>'] +handler.tags = ['rpg'] +handler.command = /^(transfer|tf)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = true +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.money = 0 + +module.exports = handler + diff --git a/plugins/rpg-upgrade.js b/plugins/rpg-upgrade.js new file mode 100644 index 0000000000000000000000000000000000000000..0a8488b8d27a013b708e31be5a4dce6bc94bb85e --- /dev/null +++ b/plugins/rpg-upgrade.js @@ -0,0 +1,244 @@ +const handler = async (m, { + conn, + command, + args, + usedPrefix +}) => { + try { + let user = global.db.data.users[m.sender]; + let fishingrod = user.fishingrod * 1; + let pickaxe = user.pickaxe * 1; + let sword = user.sword * 1; + let armor = user.armor * 1; + let katana = user.katana * 1; + let axe = user.axe * 1; + let bow = user.bow * 1; + let pisau = user.pisau * 1; + + let type = (args[0] || '').toLowerCase(); + let prefix = usedPrefix; + + let lmao1 = `ไน‚ *U P G R A D E* + +ไน‚ *L I S T - U P G R A D E* +*[ ๐ŸŽฃ ]* โ€ข FishingRod +*[ โ›๏ธ ]* โ€ข Pickaxe +*[ ๐Ÿ—ก ]* โ€ข Sword +*[ ๐Ÿ›ก ]* โ€ข Armor +*[ ๐Ÿฆฏ ]* โ€ข Katana +*[ ๐Ÿน ]* โ€ข Bow +*[ ๐Ÿช“ ]* โ€ข Axe +*[ ๐Ÿ”ช ]* โ€ข Pisau + +ไน‚ *H O W - U P G R A D E* +โ€ข _Example_ : +.uptool _sword_ +`.trim(); + + switch (type) { + case 'fishingrod': + if (fishingrod == 0) { + m.reply(`anda belum memiliki *๐ŸŽฃFishingRod*\nuntuk mendapatkannya ketik *${usedPrefix}craft fishingrod*`); + } else if (fishingrod > 9) { + m.reply(`*๐ŸŽฃFishingRod* kamu sudah level max`); + } else { + let _kayu = fishingrod * 25; + let _string = fishingrod * 15; + let _money = fishingrod * 10000; + if (user.kayu < _kayu || user.string < _string || user.money < _money) { + m.reply(`Material kamu kurang!!${user.kayu < _kayu ? `\n๐ŸชตKayu Kamu Kurang *${_kayu - user.kayu}*` : ''}${user.string < _string ? `\n๐ŸงถString Kamu Kurang *${_string - user.string}*` : ''}${user.money < _money ? `\n๐Ÿ’ฐUang Kamu Kurang *${_money - user.money}*` : ''}`); + } else { + user.fishingrod += 1; + user.kayu -= _kayu; + user.string -= _string; + user.money -= _money; + user.fishingroddurability = 0; + user.fishingroddurability += fishingrod * 50; + m.reply(`Succes mengupgrade *๐ŸŽฃFishingRod*`); + } + } + break; + case 'pickaxe': + if (pickaxe == 0) { + m.reply(`anda belum memiliki *โ›Pickaxe*\nuntuk memilikinya ketik *${usedPrefix}craft pickaxe*`); + } else if (pickaxe > 9) { + m.reply(`*โ›Pickaxe* kamu sudah level max`); + } else { + let __batu = pickaxe * 25; + let __kayu = pickaxe * 15; + let __money = pickaxe * 15000; + if (user.batu < __batu || user.kayu < __kayu || user.money < __money) { + m.reply(`Material Anda Kurang!!${user.batu < __batu ? `\n๐ŸชจBatu kamu kurang *${__batu - user.batu}*` : ''}${user.kayu < __kayu ? `\n๐ŸชตKayu kamu kurang *${__kayu - user.kayu}*` : ''}${user.money < __money ? `\n๐Ÿ’ฐUang kamu kurang *${__money - user.money}*` : ''}`); + } else { + user.pickaxe += 1; + user.kayu -= __kayu; + user.batu -= __batu; + user.money -= __money; + user.pickaxedurability = 0; + user.pickaxedurability += pickaxe * 50; + m.reply(`Succes mengupgrade *โ›Pickaxe*`); + } + } + break; + case 'axe': + if (axe == 0) { + m.reply(`anda belum memiliki *๐Ÿช“ Axe*\nuntuk memilikinya ketik *${usedPrefix}craft axe*`); + } else if (axe > 9) { + m.reply(`*๐Ÿช“ axe* kamu sudah level max`); + } else { + let __batu = axe * 25; + let __kayu = axe * 15; + let __money = axe * 15000; + if (user.batu < __batu || user.kayu < __kayu || user.money < __money) { + m.reply(`Material Anda Kurang!!${user.batu < __batu ? `\n๐ŸชจBatu kamu kurang *${__batu - user.batu}*` : ''}${user.kayu < __kayu ? `\n๐ŸชตKayu kamu kurang *${__kayu - user.kayu}*` : ''}${user.money < __money ? `\n๐Ÿ’ฐUang kamu kurang *${__money - user.money}*` : ''}`); + } else { + user.axe += 1; + user.kayu -= __kayu; + user.batu -= __batu; + user.money -= __money; + user.axedurability = 0; + user.axedurability += axe * 50; + m.reply(`Succes mengupgrade *๐Ÿช“ Axe*`); + } + } + break; + case 'bow': + if (bow == 0) { + m.reply(`anda belum memiliki *๐Ÿน Bow*\nuntuk memilikinya ketik *${usedPrefix}craft bow*`); + } else if (bow > 9) { + m.reply(`*๐Ÿน bow* kamu sudah level max`); + } else { + let __batu = bow * 25; + let __kayu = bow * 15; + let __money = bow * 15000; + if (user.batu < __batu || user.kayu < __kayu || user.money < __money) { + m.reply(`Material Anda Kurang!!${user.batu < __batu ? `\n๐ŸชจBatu kamu kurang *${__batu - user.batu}*` : ''}${user.kayu < __kayu ? `\n๐ŸชตKayu kamu kurang *${__kayu - user.kayu}*` : ''}${user.money < __money ? `\n๐Ÿ’ฐUang kamu kurang *${__money - user.money}*` : ''}`); + } else { + user.bow += 1; + user.kayu -= __kayu; + user.batu -= __batu; + user.money -= __money; + user.bowdurability = 0; + user.bowdurability += axe * 50; + m.reply(`Succes mengupgrade *๐Ÿน Bow*`); + } + } + break; + case 'sword': + if (sword == 0) { + m.reply(`anda belum memiliki *๐Ÿ—กSword*\nuntuk memilikinya ketik *${usedPrefix}craft sword*`); + } else if (sword > 9) { + m.reply(`*๐Ÿ—กSword* kamu sudah level max`); + } else { + let _iron = sword * 25; + let ___kayu = sword * 15; + let ___money = sword * 10000; + if (user.iron < _iron || user.kayu < ___kayu || user.money < ___money) { + m.reply(`Material Anda Kurang!!${user.iron < _iron ? `\n๐Ÿ”ฉIron kamu kurang *${_iron - user.iron}*` : ''}${user.kayu < ___kayu ? `\n๐ŸชตKayu kamu kurang *${___kayu - user.kayu}*` : ''}${user.money < ___money ? `\n๐Ÿ’ฐUang kamu kurang *${___money - user.money}*` : ''}`); + } else { + user.sword += 1; + user.iron -= _iron; + user.kayu -= ___kayu; + user.money -= ___money; + user.sworddurability = 0; + user.sworddurability += sword * 50; + m.reply(`Succes mengupgrade *๐Ÿ—กSword*`); + } + } + break; + case 'pisau': + if (pisau == 0) { + m.reply(`anda belum memiliki *๐Ÿ”ชPisau*\nuntuk memilikinya ketik *${usedPrefix}craft pisau*`); + } else if (pisau > 9) { + m.reply(`*๐Ÿ”ชPisau* kamu sudah level max`); + } else { + let _iron = pisau * 25; + let ___kayu = pisau * 15; + let ___money = pisau * 10000; + if (user.iron < _iron || user.kayu < ___kayu || user.money < ___money) { + m.reply(`Material Anda Kurang!!${user.iron < _iron ? `\n๐Ÿ”ฉIron kamu kurang *${_iron - user.iron}*` : ''}${user.kayu < ___kayu ? `\n๐ŸชตKayu kamu kurang *${___kayu - user.kayu}*` : ''}${user.money < ___money ? `\n๐Ÿ’ฐUang kamu kurang *${___money - user.money}*` : ''}`); + } else { + user.pisau += 1; + user.iron -= _iron; + user.kayu -= ___kayu; + user.money -= ___money; + user.pisaudurability = 0; + user.pisaudurability += pisau * 50; + m.reply(`Succes mengupgrade *๐Ÿ”ชPisau*`); + } + } + break; + case 'katana': + if (katana == 0) { + m.reply(`anda belum memiliki *๐ŸฆฏKatana*\nuntuk memilikinya ketik *${usedPrefix}craft katana`); + } else if (katana > 9) { + m.reply(`*๐ŸฆฏKatana* kamu sudah level max`); + } else { + let _iron = katana * 30; + let ___kayu = katana * 15; + let ___diamond = katana * 10; + let ___emerald = katana * 5; + let ___money = katana * 50000; + if (user.iron < _iron || user.kayu < ___kayu || user.diamond < ___diamond || user.emerald < ___emerald || user.money < ___money) { + m.reply(`Material Anda Kurang!!${user.iron < _iron ? `\n๐Ÿ”ฉIron kamu kurang *${_iron - user.iron}*` : ''}${user.kayu < ___kayu ? `\n๐ŸชตKayu kamu kurang *${___kayu - user.kayu}*` : ''}${user.diamond < ___diamond ? `\n๐Ÿ’ŽDiamond kamu kurang *${___diamond - user.diamond}*` : ''}${user.emerald < ___emerald ? `\n๐ŸŸฉEmerald kamu kurang *${___emerald - user.emerald}*` : ''}${user.money < ___money ? `\n๐Ÿ’ฐUang kamu kurang *${___money - user.money}*` : ''}`); + } else { + user.katana += 1; + user.iron -= _iron; + user.kayu -= ___kayu; + user.diamond -= ___diamond; + user.emerald -= ___emerald; + user.money -= ___money; + user.katanadurability = 0; + user.katanadurability += katana * 50; + m.reply(`Succes mengupgrade *๐ŸฆฏKatana*`); + } + } + break; + case 'armor': + if (armor == 0) { + m.reply(`anda belum memiliki *๐Ÿ›กarmor*\nuntuk memilikinya ketik *${usedPrefix}craft armor*`); + } else if (armor > 9) { + m.reply(`*๐Ÿ›ก Armor* kamu sudah level max`); + } else { + let __iron = armor * 10; + let ___diamond = armor * 5; + let ___money = armor * 30000; + if (user.iron < __iron || user.diamond < ___diamond || user.money < ___money) { + m.reply(`Material Anda Kurang!!${user.iron < __iron ? `\n๐Ÿ”ฉ iron kamu kurang *${__iron - user.iron}*` : ''}${user.diamond < ___diamond ? `\n๐Ÿ’Ž Diamond kamu kurang *${___diamond - user.diamond}*` : ''}${user.money < ___money ? `\n๐Ÿ’ฐUang kamu kurang *${___money - user.money}*` : ''}`); + } else { + user.armor += 1; + user.iron -= __iron; + user.diamond -= ___diamond; + user.money -= ___money; + user.armordurability = 0; + user.armordurability += armor * 50; + m.reply(`Succes mengupgrade *๐Ÿ›กArmor*`); + } + } + break; + default: + await conn.reply(m.chat, lmao1, m, { + contextInfo: { + externalAdReply: { + mediaType: 1, + title: wm, + thumbnailUrl: 'https://telegra.ph/file/97dba25a7bd8084913166.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + } + } + }); + } + } catch (e) { + console.log(e); + throw e; + } +}; + +handler.help = ['uptool']; +handler.tags = ['rpg']; +handler.command = /^(up(tool)?)$/i; +handler.fail = null; +handler.group = true; + +module.exports = handler; diff --git a/plugins/rpg-yt_akun.js b/plugins/rpg-yt_akun.js new file mode 100644 index 0000000000000000000000000000000000000000..f3d2e87df9a04e457051f172206c3c93f0bfa965 --- /dev/null +++ b/plugins/rpg-yt_akun.js @@ -0,0 +1,57 @@ +let handler = async (m, { conn, command, args, usedPrefix }) => { + try { + const user = global.db.data.users[m.sender]; + const tag = '@' + m.sender.split('@')[0]; + let playButton = user.playButton || 0; + function formatNumber(number) { + if (number >= 1000000) { + return (number / 1000000).toFixed(1) + 'Jt'; + } else if (number >= 1000) { + return (number / 1000).toFixed(1) + 'K'; + } else { + return number; + } + } + if (command === 'akunyt') { + let targetNumber = m.sender; + let targetTag = tag; + if (args.length > 0) { + targetNumber = formatNumber(args[0]); + targetTag = '@' + args[0].split('@')[0]; + } + if (!global.db.data.users[targetNumber]?.youtube_account) { + return conn.sendMessage(m.chat, { text: `Hey ${targetTag}, buat akun terlebih dahulu\nKetik: ${usedPrefix}createakunyt`, contextInfo: { mentionedJid: [m.sender] }}, { quoted: m }); + } + const targetUser = global.db.data.users[targetNumber]; + const formattedSubscribers = formatNumber(targetUser.subscribers || 0); + const formattedViewers = formatNumber(targetUser.viewers || 0); + const formattedLike = formatNumber(targetUser.like || 0); + const silverButton = targetUser.playButton >= 1 ? 'โœ…' : 'โŽ'; + const goldButton = targetUser.playButton >= 2 ? 'โœ…' : 'โŽ'; + const diamondButton = targetUser.playButton >= 3 ? 'โœ…' : 'โŽ'; + return conn.sendMessage(m.chat, { text: `๐Ÿ“ˆ Akun YouTube ${targetTag} ๐Ÿ“‰\n +๐Ÿง‘๐Ÿปโ€๐Ÿ’ป *Streamer:* ${targetUser.registered ? targetTag : conn.getName(targetNumber)} +๐ŸŒ *Channel:* ${targetUser.youtube_account} +๐Ÿ‘ฅ *Subscribers:* ${formattedSubscribers} +๐Ÿชฌ *Viewers:* ${formattedViewers} +๐Ÿ‘๐Ÿป *Like:* ${formattedLike} + +โฌœ *Silver PlayButton:* ${silverButton} +๐ŸŸง *Gold PlayButton:* ${goldButton} +๐Ÿ’Ž *Diamond PlayButton:* ${diamondButton}`, contextInfo: { mentionedJid: [m.sender] }}, { quoted: m }); + } else if (/^live youtuber/i.test(command)) { + } else { + return await conn.reply("Perintah tidak dikenali.\n*.akunyt*\n> Untuk mengecek akun YouTube Anda\n*.live youtuber [judul live]*\n> Untuk memulai aktivitas live streaming."); + } + } catch (err) { + console.error(err); + return m.reply("Terjadi kesalahan dalam memproses perintah."); + } +}; +handler.help = ['akunyt [nomor]']; +handler.tags = ['rpg']; +handler.command = /^(akunyt)$/i; +handler.register = true; +handler.group = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-yt_buatakun.js b/plugins/rpg-yt_buatakun.js new file mode 100644 index 0000000000000000000000000000000000000000..10e3e26664c9eb1bdc3e8349b8dab7d8d931138a --- /dev/null +++ b/plugins/rpg-yt_buatakun.js @@ -0,0 +1,49 @@ +// Handler function +let handler = async (m, { conn, command, args, usedPrefix }) => { + let user = global.db.data.users[m.sender]; + + try { + if (command === 'createakunyt') { + if (args.length === 0) { + return m.reply("Silakan masukkan nama akun YouTube Anda.\nContoh: .createakunyt Mahiru"); + } + + // Menggabungkan semua argumen menjadi satu string (nama akun YouTube) + let youtubeAccountName = args.join(' '); + + // Set nama akun YouTube untuk pengguna + user.youtube_account = youtubeAccountName; + m.reply(`Akun YouTube Anda telah berhasil dibuat/diedit\nchannel: ${youtubeAccountName}`); + } else if (command === 'deleteakun') { + // Check if user has a YouTube account + if (!user.youtube_account) { + return m.reply("Anda belum memiliki akun YouTube."); + } + + // Delete user's YouTube account + delete user.youtube_account; + m.reply("Akun YouTube Anda telah dihapus dari sistem kami."); + } else if (/live/i.test(command) && args[0] === 'youtuber') { + // Periksa apakah pengguna memiliki akun YouTube + if (!user.youtube_account) { + return m.reply("Buat akun terlebih dahulu\nKetik: .createakunyt"); + } + + // Kode eksisting untuk perintah 'live youtuber' + // ... + } else { + return await m.reply("Perintah tidak dikenali.\n*.akunyt*\n> แดœษดแด›แดœแด‹ แดแด‡ษดษขแด‡แด„แด‡แด‹ แด€แด‹แดœษด สแดแดœแด›แดœส™แด‡ แด€ษดแด…แด€\n*.live [judul live]*\n> แดœษดแด›แดœแด‹ แดแด‡แดแดœสŸแด€ษช แด€แด‹แด›ษชแด ษชแด›แด€s สŸษชแด แด‡ sแด›ส€แด‡แด€แดษชษดษข."); + } + } catch (err) { + m.reply("Error\n\n\n" + err.stack); + } +}; + +// Metadata +handler.help = ['createakunyt', 'deleteakun']; // Add 'deleteakun' to help commands +handler.tags = ['rpg']; +handler.command = /^(createakunyt|deleteakun)$/i; // Modify to include deleteakun command +handler.register = true; +handler.group = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg-yt_streaming.js b/plugins/rpg-yt_streaming.js new file mode 100644 index 0000000000000000000000000000000000000000..a55a4f6efe37996f5e4f7a4af65c517bc4808e06 --- /dev/null +++ b/plugins/rpg-yt_streaming.js @@ -0,0 +1,119 @@ +let handler = async (m, { conn, command, args }) => { + let user = global.db.data.users[m.sender]; + const tag = `@${m.sender.replace(/@.+/, '')}`; + try { + if (command === 'ytlive') { + if (!user.youtube_account) { + return conn.reply(m.chat, `Hey Kamu Iya Kamu ${tag}\nBuat akun terlebih dahulu\nKetik: .createakunyt`, m); + } + let title = args.join(' '); + if (!title || title.length > 50) { + return conn.reply(m.chat, `${tag} Silakan berikan judul untuk live Anda (maksimal 50 karakter).`, m); + } + const cooldownTime = 600000; // 10 menit dalam milidetik (10 * 60 * 1000) + const lastLiveTime = user.lastLiveTime || 0; + const timeSinceLastLive = new Date() - lastLiveTime; + if (timeSinceLastLive < cooldownTime) { + const remainingCooldown = cooldownTime - timeSinceLastLive; + const formattedCooldown = msToTime(remainingCooldown); + throw `Kamu sudah lelah. Tunggu selama\n${formattedCooldown}`; + } + setTimeout(() => { + conn.reply(m.chat, `๐Ÿ‘‹ Hai Kak ${tag}, Subscribermu sudah menunggu,\nwaktunya untuk live streaming kembali!`, m); + }, cooldownTime); + const randomSubscribers = Math.floor(Math.random() * (3000 - 10 + 1)) + 1; + const randomLike = Math.floor(Math.random() * (1000 - 20 + 1)) + 10; + const randomViewers = Math.floor(Math.random() * (1000000 - 100 + 1)) + 1; + const randomDonation = Math.floor(Math.random() * (200000 - 10000 + 1)) + 10000; + user.subscribers += randomSubscribers; + user.like += randomLike; + user.viewers += randomViewers; + user.money += randomDonation; + user.lastLiveTime = new Date(); + if (user.subscribers >= 1000000 && user.playButton < 3) { + user.playButton += 1; + user.eris += Math.floor(Math.random() * (1000000 - 500000 + 1)) + 500000; // Hadiah Eris + user.exp += 5000; // Hadiah EXP + conn.reply(m.chat, `๐Ÿ“ข Congratulation! Anda telah mencapai milestone subscribers dan mendapatkan *๐Ÿฅ‡ Diamond PlayButton* serta hadiah Money dan exp! ๐ŸŽ‰\n\n๐Ÿ“ข Cek Progresmu Dengan cara *.akunyt*`, m); + } else if (user.subscribers >= 100000 && user.playButton < 2) { + user.playButton += 1; + user.eris += Math.floor(Math.random() * (500000 - 300000 + 1)) + 300000; // Hadiah Eris + user.exp += 2500; // Hadiah EXP + conn.reply(m.chat, `๐Ÿ“ข Congratulation! Anda telah mencapai milestone subscribers dan mendapatkan *๐Ÿฅˆ Gold PlayButton* serta hadiah Money dan exp! ๐ŸŽ‰\n\n๐Ÿ“ข Cek Progresmu Dengan cara *.akunyt*`, m); + } else if (user.subscribers >= 10000 && user.playButton < 1) { + user.playButton += 1; + user.money += Math.floor(Math.random() * (250000 - 10000 + 1)) + 10000; // Hadiah Eris + user.exp += 500; // Hadiah EXP + conn.reply(m.chat, `๐Ÿ“ข Congratulation! ${tag}, telah mencapai milestone subscribers dan mendapatkan *๐Ÿฅ‰ Silver PlayButton* serta hadiah Money dan exp! ๐ŸŽ‰\n\n๐Ÿ“ข Cek Progresmu Dengan cara *.akunyt*`, m); + }; + const formattedSubscribers = formatNumber(user.subscribers); + const formattedLike = formatNumber(user.like); + const formattedViewers = formatNumber(user.viewers); + const formattedDonation = formatCurrency(randomDonation); + + conn.reply(m.chat, ` +[ ๐ŸŽฆ ] Hasil Live Streaming + +๐Ÿง‘๐Ÿปโ€๐Ÿ’ป *Streamer:* ${tag} +๐Ÿ“น *Judul Live:* ${title} +๐Ÿ“ˆ *New Subscribers:* +${formatNumber(randomSubscribers)} +๐Ÿ‘๐Ÿป *New Like:* +${formatNumber(randomLike)} +๐Ÿชฌ *New Viewers:* +${formatNumber(randomViewers)} +๐Ÿ’ต *Donasi:* ${formattedDonation} + +๐Ÿ“Š *Total Like:* ${formattedLike} +๐Ÿ“Š *Total Viewers:* ${formattedViewers} +๐Ÿ“Š *Total Subscribers:* ${formattedSubscribers} + +> Cek akun YouTube Anda +> Ketik: .akunyt`, m); + } + } catch (err) { + m.reply("๐Ÿ“ข: " + err); + } +}; + +// Fungsi untuk mengonversi angka besar menjadi format K, Jt, M, T +function formatNumber(num) { + if (num >= 1e12) return (num / 1e12).toFixed(1) + 'T'; + if (num >= 1e9) return (num / 1e9).toFixed(1) + 'M'; + if (num >= 1e6) return (num / 1e6).toFixed(1) + 'Jt'; + if (num >= 1e3) return (num / 1e3).toFixed(1) + 'K'; + return num.toString(); +} + +// Fungsi untuk mengonversi angka ke format mata uang Indonesia (IDR) +function formatCurrency(num) { + return 'Rp' + new Intl.NumberFormat('id-ID').format(num); +} + +// Fungsi untuk mengonversi milidetik menjadi format waktu yang mudah dibaca +function msToTime(duration) { + const seconds = Math.floor((duration / 1000) % 60); + const minutes = Math.floor((duration / (1000 * 60)) % 60); + const hours = Math.floor((duration / (1000 * 60 * 60)) % 24); + + const formattedTime = []; + if (hours > 0) { + formattedTime.push(`${hours} jam`); + } + if (minutes > 0) { + formattedTime.push(`${minutes} menit`); + } + if (seconds > 0 || (hours === 0 && minutes === 0)) { + formattedTime.push(`${seconds} detik`); + } + + return formattedTime.join(' '); +} + +// Definisikan bantuan, tag, perintah, dan pendaftaran untuk handler perintah RPG +handler.help = ['ytlive']; +handler.tags = ['rpg']; +handler.command = /^(ytlive|ytstreaming)/i; +handler.register = true; +handler.rpg = true; +handler.group = true; + +// Ekspor handler perintah RPG +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg.balance.js b/plugins/rpg.balance.js new file mode 100644 index 0000000000000000000000000000000000000000..06ebdc41da7c24f8b0c767fcbdc901b73401f5a4 --- /dev/null +++ b/plugins/rpg.balance.js @@ -0,0 +1,24 @@ + +let handler = async (m, {conn, usedPrefix}) => { + + let who = m.quoted ? m.quoted.sender : m.mentionedJid && m.mentionedJid[0] ? m.mentionedJid[0] : m.fromMe ? conn.user.jid : m.sender + let user = global.db.data.users[who] + if (!(who in global.db.data.users)) throw `โœณ๏ธ Pengguna hilang dari database saya` + conn.reply(m.chat, ` +โ”Œโ”€โ”€โ”€โŠท *BALANCE* โŠถ +โ–ข *๐Ÿ“ŒNama* : _@${who.split('@')[0]}_ +โ–ข *๐Ÿ’ŽDiamonds* : _${user.diamond}_ +โ–ข *โฌ†๏ธXP* : _Total ${user.exp}_ +โ–ข *MONEY* : _Total ${user.money}_ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +*NOTA :* +Anda dapat membeli ๐Ÿ’Ž berlian menggunakan perintah +โ *${usedPrefix}buydm <jumlah dm>* +โ *${usedPrefix}buyalldm*`, m, { mentions: [who] }) +} +handler.help = ['balance'] +handler.tags = ['rpg'] +handler.command = ['bal', 'balance'] + +module.exports = handler; diff --git a/plugins/rpgAbsen-hourly.js b/plugins/rpgAbsen-hourly.js new file mode 100644 index 0000000000000000000000000000000000000000..c950f94dc93cb5287b8334c90642414a7075cc07 --- /dev/null +++ b/plugins/rpgAbsen-hourly.js @@ -0,0 +1,48 @@ +const free = 5000 +const prem = 10000 +const moneyfree = 5000 +const moneyprem = 10000 +const timeout = 3600000 + +let handler = async (m, { conn, isPrems }) => { + let time = global.db.data.users[m.sender].lasthourly + 3600000 + if (new Date - global.db.data.users[m.sender].lasthourly < 3600000) return conn.reply(m.chat, `Anda sudah mengklaim, klaim harian hari ini\ntunggu selama ${msToTime(time - new Date())} lagi`, m) + // conn.reply(m.chat, `Anda sudah mengklaim dan mendapatkan :`, m) + global.db.data.users[m.sender].exp += isPrems ? prem : free + global.db.data.users[m.sender].money += isPrems ? moneyprem : moneyfree + // global.db.data.users[m.sender].potion += 5 + conn.reply(m.chat, `Selamat kamu mendapatkan:\n\n+${isPrems ? prem : free} Exp\n+${isPrems ? moneyprem : moneyfree} Money`, m) + global.db.data.users[m.sender].lasthourly = new Date * 1 + } +handler.help = ['hourly'] +handler.tags = ['rpg'] +handler.command = /^(hourly)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.money = 0 +handler.exp = 0 +handler.limit = true + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return hours + " jam " + minutes + " menit " + seconds + " detik" +} diff --git a/plugins/rpgAbsen-monthly.js b/plugins/rpgAbsen-monthly.js new file mode 100644 index 0000000000000000000000000000000000000000..10fb6f8b80c8baf604af174b2d03ab8fc6b9b528 --- /dev/null +++ b/plugins/rpgAbsen-monthly.js @@ -0,0 +1,41 @@ +const free = 20000 +const prem = 40000 +const limitfree = 20 +const limitprem = 40 +const moneyfree = 20000 +const moneyprem = 40000 + +let handler = async (m, { isPrems }) => { + let time = global.db.data.users[m.sender].lastmonthly + 2592000000 + if (new Date - global.db.data.users[m.sender].lastmonthly < 2592000000) throw `Anda sudah mengklaim, klaim bulanan ini\ntunggu selama ${msToTime(time - new Date())} lagi` + // conn.reply(m.chat, `Anda sudah mengklaim dan mendapatkan :`, m) + global.db.data.users[m.sender].exp += isPrems ? prem : free + global.db.data.users[m.sender].money += isPrems ? moneyprem : moneyfree + global.db.data.users[m.sender].limit += isPrems ? limitprem : limitfree + // global.db.data.users[m.sender].pet += 3 + conn.reply(m.chat, `Selamat kamu mendapatkan:\n\n+${isPrems ? prem : free} Exp\n+${isPrems ? moneyprem : moneyfree} Money\n+${isPrems ? limitprem : limitfree} Limit`, m) + global.db.data.users[m.sender].lastmonthly = new Date * 1 + } +handler.help = ['monthly'] +handler.tags = ['rpg'] +handler.command = /^(monthly)$/i +handler.limit = true + +handler.fail = null + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24), + monthly = Math.floor((duration / (1000 * 60 * 60 * 24)) % 720) + + monthly = (monthly < 10) ? "0" + monthly : monthly + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return monthly + " hari " + hours + " jam " + minutes + " menit" +} diff --git a/plugins/rpgAbsen-weekly.js b/plugins/rpgAbsen-weekly.js new file mode 100644 index 0000000000000000000000000000000000000000..d0cf99b9385372be1841ec19df91f01b74cc4efe --- /dev/null +++ b/plugins/rpgAbsen-weekly.js @@ -0,0 +1,41 @@ +const free = 10000 +const prem = 20000 +const limitfree = 10 +const limitprem = 20 +const moneyfree = 10000 +const moneyprem = 20000 + +let handler = async (m, { isPrems }) => { + let time = global.db.data.users[m.sender].lastweekly + 604800000 + if (new Date - global.db.data.users[m.sender].lastweekly < 604800000) throw `Anda sudah mengklaim, klaim mingguan ini\ntunggu selama ${msToTime(time - new Date())} lagi` + // conn.reply(m.chat, `Anda sudah mengklaim dan mendapatkan :`, m) + global.db.data.users[m.sender].exp += isPrems ? prem : free + global.db.data.users[m.sender].money += isPrems ? moneyprem : moneyfree + global.db.data.users[m.sender].limit += isPrems ? limitprem : limitfree + // global.db.data.users[m.sender].legendary += 3 + conn.reply(m.chat, `Selamat kamu mendapatkan:\n\n+${isPrems ? prem : free} Exp\n+${isPrems ? moneyprem : moneyfree} Money\n+${isPrems ? limitprem : limitfree} Limit`, m) + global.db.data.users[m.sender].lastweekly= new Date * 1 + } + +handler.help = ['weekly'] +handler.tags = ['rpg'] +handler.command = /^(weekly)$/i +handler.limit = true +handler.fail = null + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24), + weeks = Math.floor((duration / (1000 * 60 * 60 * 24)) % 168) + + weeks = (weeks < 10) ? "0" + weeks : weeks + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return weeks + " hari " + hours + " jam " + minutes + " menit" +} diff --git a/plugins/rpgAbsen-yearly.js b/plugins/rpgAbsen-yearly.js new file mode 100644 index 0000000000000000000000000000000000000000..0ca814d06e1214b8ba9eccef95eb826c4efec7b8 --- /dev/null +++ b/plugins/rpgAbsen-yearly.js @@ -0,0 +1,41 @@ +const free = 200000 +const prem = 400000 +const limitfree = 200 +const limitprem = 400 +const moneyfree = 200000 +const moneyprem = 400000 + +let handler = async (m, { isPrems }) => { + let time = global.db.data.users[m.sender].lastyearly + 31536000000 + if (new Date - global.db.data.users[m.sender].lastyearly < 31536000000) throw `Anda sudah mengklaim, klaim tahunan ini\ntunggu selama ${msToTime(time - new Date())} lagi` + // conn.reply(m.chat, `Anda sudah mengklaim dan mendapatkan :`, m) + global.db.data.users[m.sender].exp += isPrems ? prem : free + global.db.data.users[m.sender].money += isPrems ? moneyprem : moneyfree + global.db.data.users[m.sender].limit += isPrems ? limitprem : limitfree + // global.db.data.users[m.sender].pet += 3 + conn.reply(m.chat, `Selamat kamu mendapatkan:\n\n+${isPrems ? prem : free} Exp\n+${isPrems ? moneyprem : moneyfree} Money\n+${isPrems ? limitprem : limitfree} Limit`, m) + global.db.data.users[m.sender].lastyearly = new Date * 1 + } +handler.help = ['yearly'] +handler.tags = ['rpg'] +handler.command = /^(yearly)$/i +handler.limit = true + +handler.fail = null + +module.exports = handler + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24), + monthly = Math.floor((duration / (1000 * 60 * 60 * 24)) % 720) + + monthly = (monthly < 10) ? "0" + monthly : monthly + hours = (hours < 10) ? "0" + hours : hours + minutes = (minutes < 10) ? "0" + minutes : minutes + seconds = (seconds < 10) ? "0" + seconds : seconds + + return monthly + " hari " + hours + " jam " + minutes + " menit" +} diff --git a/plugins/rpgG-guild.js b/plugins/rpgG-guild.js new file mode 100644 index 0000000000000000000000000000000000000000..47417d34d24f613a115598b4c87e47f90fdac995 --- /dev/null +++ b/plugins/rpgG-guild.js @@ -0,0 +1,33 @@ +let handler = async (m) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild. Gunakan .joinguild <nama_guild> untuk bergabung ke guild atau buat guild baru dengan .createguild <nama_guild>.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + let membersList = guild.members.map((member, idx) => `โ€ข ${idx + 1}. @${member.split('@')[0]}`).join('\n'); + let guildInfo = ` +ไบ— Nama Guild: ${guild.name} +ไบ— Level: ${guild.level} +ไบ— Pemilik: @${guild.owner.split('@')[0]} +ไบ— Anggota: + - ${membersList} +ไบ— Eksperience Guild: ${guild.exp} / 1000 +ไบ— Eliksir: ${guild.eliksir} +ไบ— Harta: ${guild.harta} +ไบ— Guardian: ${guild.guardian || '-'} +ไบ— Attack: ${guild.attack} +ไบ— Staff: ${guild.staff.length > 0 ? guild.staff.map(staff => `โ€ข @${staff.split('@')[0]}`).join('\n') : '-'} +ไบ— Waiting Room: ${guild.waitingRoom.length > 0 ? guild.waitingRoom.map(room => `โ€ข @${room.split('@')[0]}`).join('\n') : '-' } +ไบ— Building Made: ${guild.createdAt}`; + + conn.reply(m.chat, guildInfo, m, { mentions: [guild.owner, ...guild.members] }); +}; + +handler.help = ['guild']; +handler.tags = ['rpgG']; +handler.command = /^(guild)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG-staff.js b/plugins/rpgG-staff.js new file mode 100644 index 0000000000000000000000000000000000000000..9bb6f00766fe05e11695f7db24c60237cd094e4b --- /dev/null +++ b/plugins/rpgG-staff.js @@ -0,0 +1,42 @@ +const fs = require('fs'); +const path = require('path'); +let handler = async (m, { conn, args }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (guild.owner !== userId) return conn.reply(m.chat, 'Hanya pemilik guild yang bisa mengatur staff.', m); + + if (!args[0]) return conn.reply(m.chat, 'Format yang kamu masukkan salah. Contoh penggunaan: .guildstaff tambah/hapus @user', m); + + let action = args[0].toLowerCase(); + let target = m.mentionedJid[0] || args[1]; + + if (!target) return conn.reply(m.chat, 'Tag user yang ingin ditambahkan atau dihapus dari staff.', m); + + if (action === 'tambah') { + if (guild.staff.includes(target)) return conn.reply(m.chat, 'User sudah menjadi staff.', m); + + guild.staff.push(target); + conn.reply(m.chat, `@${target.split('@')[0]} telah ditambahkan sebagai staff di guild ${guild.name}.`, m, { mentions: [target] }); + } else if (action === 'hapus') { + if (!guild.staff.includes(target)) return conn.reply(m.chat, 'User tidak ada di dalam staff.', m); + + guild.staff = guild.staff.filter(staff => staff !== target); + conn.reply(m.chat, `@${target.split('@')[0]} telah dihapus dari staff di guild ${guild.name}.`, m, { mentions: [target] }); + } else { + conn.reply(m.chat, 'Format yang kamu masukkan salah. Contoh penggunaan: .guildstaff tambah/hapus @user', m); + } + + fs.writeFileSync(dbPath, JSON.stringify(global.db.data, null, 2)); +}; + +handler.help = ['guildstaff <tambah/hapus> <@user>']; +handler.tags = ['rpgG']; +handler.command = /^(guildstaff)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_accept.js b/plugins/rpgG_accept.js new file mode 100644 index 0000000000000000000000000000000000000000..3a9079c6f3aa950e350b850ebad484f4f8ba107d --- /dev/null +++ b/plugins/rpgG_accept.js @@ -0,0 +1,40 @@ +let handler = async (m, { conn }) => { + let user = global.db.data.users[m.sender]; + + // Cek apakah pengguna adalah pemilik guild atau memiliki peran staff + if (!isGuildOwner(user) && !isGuildStaff(user)) { + return conn.reply(m.chat, 'Anda tidak memiliki izin untuk melakukan ini.', m); + } + + let target = m.mentionedJid[0]; + if (!target) return conn.reply(m.chat, 'Tag user yang ingin Anda terima di guild.', m); + + let targetUser = global.db.data.users[target]; + if (!targetUser.guildRequest) return conn.reply(m.chat, 'Tidak ada permintaan bergabung yang tertunda dari pengguna ini.', m); + + let guildName = targetUser.guildRequest; + let guild = global.db.data.guilds[guildName]; + + guild.members.push(target); + targetUser.guild = guildName; + delete targetUser.guildRequest; + + conn.reply(m.chat, `Permintaan bergabung dari @${target.split('@')[0]} telah diterima.`, m); +}; + +handler.help = ['guildaccept @user']; +handler.tags = ['rpgG']; +handler.command = /^(guildaccept)$/i; +module.exports = handler; + +// Fungsi untuk mengecek apakah pengguna adalah pemilik guild +function isGuildOwner(user) { + // Implementasi logika untuk mengecek apakah user adalah pemilik guild + return user.role === 'owner'; // Misalnya, jika role 'owner' menunjukkan pemilik guild +} + +// Fungsi untuk mengecek apakah pengguna memiliki peran staff di guild +function isGuildStaff(user) { + // Implementasi logika untuk mengecek apakah user memiliki peran staff di guild + return user.role === 'staff'; // Misalnya, jika role 'staff' menunjukkan staff guild +} \ No newline at end of file diff --git a/plugins/rpgG_acceptinvite.js b/plugins/rpgG_acceptinvite.js new file mode 100644 index 0000000000000000000000000000000000000000..23ea919c9f922932374aec4f637de1d1f41b30f2 --- /dev/null +++ b/plugins/rpgG_acceptinvite.js @@ -0,0 +1,27 @@ +let handler = async (m, { conn, args }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + let target = m.mentionedJid[0] || args[0]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (!args[0]) return conn.reply(m.chat, 'Tag user yang ingin kamu terima undangannya ke guild.', m); + + if (guild.owner !== userId) return conn.reply(m.chat, 'Hanya pemilik guild yang bisa menerima undangan.', m); + + if (!guild.waitingRoom.includes(target)) return conn.reply(m.chat, 'User tidak ada di dalam daftar undangan.', m); + + guild.members.push(target); + guild.waitingRoom = guild.waitingRoom.filter(room => room !== target); + + conn.reply(m.chat, `@${target.split('@')[0]} telah resmi bergabung dengan guild ${guild.name}.`, m, { mentions: [target] }); +}; + +handler.help = ['guildinviteacc <@user>']; +handler.tags = ['rpgG']; +handler.command = /^(guildinviteacc)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_attactrandom.js b/plugins/rpgG_attactrandom.js new file mode 100644 index 0000000000000000000000000000000000000000..f93cef6248e60b269ad48eac402bd80ad1fd61f8 --- /dev/null +++ b/plugins/rpgG_attactrandom.js @@ -0,0 +1,92 @@ +const fs = require('fs'); +const dbPath = './database.json'; + +let handler = async (m, { conn }) => { + let user = global.db.data.users[m.sender]; + let guildId = user.guild; + + if (!guildId) { + return conn.reply(m.chat, 'Anda harus bergabung dengan sebuah guild untuk menggunakan perintah ini.', m); + } + + let guild = global.db.data.guilds[guildId]; + if (!guild) { + return conn.reply(m.chat, 'Guild Anda tidak ditemukan di basis data.', m); + } + + if (guild.owner !== m.sender && !guild.staff.includes(m.sender)) { + return conn.reply(m.chat, 'Anda tidak memiliki izin untuk menyerang guild lawan.', m); + } + + conn.reply(m.chat, 'Mencari Guild Aktif ๐Ÿ”Ž', m); + + setTimeout(async () => { + let attackedGuildId = getRandomGuildId(guildId); // Fungsi untuk mendapatkan ID guild lawan secara acak (tidak termasuk guild sendiri) + let attackedGuild = global.db.data.guilds[attackedGuildId]; + + if (!attackedGuild) { + return conn.reply(m.chat, 'Tidak ada guild lawan yang dapat diserang saat ini.', m); + } + + conn.reply(m.chat, `Menemukan Guild Aktif ${attackedGuild.name}`, m); + + await sleep(getRandomInt(1000, 3000)); // Jeda 1-3 detik + + let itemName = getRandomItemName(); // Fungsi untuk mendapatkan nama item secara acak + + conn.reply(m.chat, `Memulai Penyerangan Menggunakan ${itemName}`, m); + + await sleep(getRandomInt(1000, 5000)); // Jeda 1-5 detik + + conn.reply(m.chat, `${guild.name} VS ${attackedGuild.name}`, m); + + await sleep(getRandomInt(60000, 300000)); // Jeda 1-5 menit + + // Simulasi kerusakan dan pencurian + let elixirStolen = Math.floor(attackedGuild.elixir / 2); // Mengambil setengah dari eliksir lawan + let treasureStolen = Math.floor(attackedGuild.treasure / 2); // Mengambil setengah dari harta lawan + + attackedGuild.elixir -= elixirStolen; + attackedGuild.treasure -= treasureStolen; + + // Update basis data + fs.writeFileSync(dbPath, JSON.stringify(global.db.data, null, 2)); + + let result = guild.name === attackedGuild.name ? 'Draw' : (guild.elixir > attackedGuild.elixir ? `${guild.name} Win` : `${guild.name} Lose`); + + conn.reply(m.chat, `${result}: + +Mengambil ${elixirStolen} Eliksir - ${treasureStolen} Harta dari ${attackedGuild.name}`, m); + }, 3000); // Jeda 3 detik sebelum mencari guild lawan +}; + +// Fungsi untuk mendapatkan ID guild lawan secara acak (kecuali guild sendiri) +function getRandomGuildId(currentGuildId) { + let guildIds = Object.keys(global.db.data.guilds); + let filteredGuildIds = guildIds.filter(id => id !== currentGuildId); // Filter agar tidak termasuk guild sendiri + let randomIndex = getRandomInt(0, filteredGuildIds.length - 1); + return filteredGuildIds[randomIndex]; +} + +// Fungsi untuk mendapatkan nama item secara acak +function getRandomItemName() { + let items = ['namaitem1', 'namaitem2', 'namaitem3']; // Ganti dengan nama-nama item yang sesuai + let randomIndex = getRandomInt(0, items.length - 1); + return items[randomIndex]; +} + +// Fungsi untuk menghasilkan angka acak dalam rentang tertentu +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +// Fungsi untuk membuat jeda dalam waktu tertentu +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +handler.help = ['attackguild']; +handler.tags = ['rpgG']; +handler.command = /^attackguild$/i; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_create.js b/plugins/rpgG_create.js new file mode 100644 index 0000000000000000000000000000000000000000..5347c86d9429ff5fe7f9472068dbe11c7ebe646e --- /dev/null +++ b/plugins/rpgG_create.js @@ -0,0 +1,64 @@ +const fs = require('fs'); +const dbPath = './database.json'; // Path ke database file + +let handler = async (m, { conn, args }) => { + if (args.length < 1) return conn.reply(m.chat, 'Contoh penggunaan: .createguild <nama_guild>', m); + + let userId = m.sender; + let guildName = args.join(' '); + + // Memeriksa apakah user memiliki cukup money untuk membuat guild + let user = global.db.data.users[userId]; + if (!user) return conn.reply(m.chat, 'Kamu belum terdaftar di dalam database.', m); + + if (user.money < 20000000000) { + return conn.reply(m.chat, 'Kamu tidak memiliki cukup money untuk membuat guild. Butuh 20.000.000.000 money.', m); + } + + // Inisialisasi basis data pengguna jika belum ada + if (!global.db.data.users) global.db.data.users = {}; + if (!global.db.data.users[userId]) { + global.db.data.users[userId] = { + guild: null, + money: 0, + exp: 0, + // Menambahkan field untuk exp guild + guild_exp: 0, + // Inisialisasi data pengguna lainnya jika diperlukan + }; + } + + if (user.guild) return conn.reply(m.chat, 'Kamu sudah tergabung dalam guild.', m); + + let guildId = 'guild_' + new Date().getTime(); // Membuat ID guild unik + if (!global.db.data.guilds) global.db.data.guilds = {}; + if (!global.db.data.guilds[guildId]) { + global.db.data.guilds[guildId] = { + name: guildName, + owner: userId, + members: [userId], + createdAt: new Date().toISOString(), + level: 1, // Menambahkan level guild + exp: 0, // Menambahkan exp guild + eliksir: 0, // Menambahkan eliksir guild + harta: 0, // Menambahkan harta guild + guardian: null, // Menambahkan guardian guild + attack: 0, // Menambahkan attack guild + staff: [], // Menambahkan staff guild + waitingRoom: [], // Menambahkan waiting room guild + }; + user.guild = guildId; + user.money -= 20000000000; // Mengurangi money user setelah membuat guild + fs.writeFileSync(dbPath, JSON.stringify(global.db.data, null, 2)); + conn.reply(m.chat, `Guild ${guildName} berhasil dibuat.`, m); + } else { + conn.reply(m.chat, 'Terjadi kesalahan saat membuat guild. Coba lagi.', m); + } +}; + +handler.help = ['createguild <nama_guild>']; +handler.tags = ['rpgG']; +handler.command = /^(createguild)$/i; +handler.owner = false; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_decline.js b/plugins/rpgG_decline.js new file mode 100644 index 0000000000000000000000000000000000000000..976631a4422d8f67f3ab6cb265f1c490c9fd2ab9 --- /dev/null +++ b/plugins/rpgG_decline.js @@ -0,0 +1,21 @@ +let handler = async (m, { conn }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (guild.owner === userId) return conn.reply(m.chat, 'Pemilik guild tidak bisa menolak permintaan.', m); + + guild.waitingRoom = guild.waitingRoom.filter(room => room !== userId); + + conn.reply(m.chat, 'Permintaan kamu untuk bergabung dengan guild telah ditolak.', m); +}; + +handler.help = ['guilddecline']; +handler.tags = ['rpgG']; +handler.command = /^(guilddecline)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_delguild.js b/plugins/rpgG_delguild.js new file mode 100644 index 0000000000000000000000000000000000000000..bc866e6e6be084c1bf05141115425e9bd39a0bb6 --- /dev/null +++ b/plugins/rpgG_delguild.js @@ -0,0 +1,49 @@ +const fs = require('fs'); +const dbPath = './database.json'; // Path ke database file + +let handler = async (m, { conn, args }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild mana pun.', m); + + let guilds = Object.values(global.db.data.guilds); + + if (guilds.length === 0) return conn.reply(m.chat, 'Tidak ada guild yang tersedia untuk dihapus.', m); + + let guildList = guilds.map((guild, index) => `${index + 1}. ${guild.name}`).join('\n'); + let responseText = `Pilih guild yang ingin dihapus dengan mengetik nomor guild:\n\n${guildList}`; + + if (args.length < 1) return conn.reply(m.chat, responseText, m); + + let guildIndex = parseInt(args[0]) - 1; + + if (isNaN(guildIndex) || guildIndex < 0 || guildIndex >= guilds.length) { + return conn.reply(m.chat, 'Nomor guild tidak valid.', m); + } + + let selectedGuild = guilds[guildIndex]; + + if (selectedGuild.owner !== userId) return conn.reply(m.chat, 'Hanya owner guild yang bisa menghapus guild.', m); + + // Hapus guild dari database + delete global.db.data.guilds[selectedGuild.name]; + + // Hapus referensi guild dari setiap anggota + selectedGuild.members.forEach(memberId => { + if (global.db.data.users[memberId]) { + global.db.data.users[memberId].guild = null; + } + }); + + fs.writeFileSync(dbPath, JSON.stringify(global.db.data, null, 2)); + + conn.reply(m.chat, `Guild ${selectedGuild.name} berhasil dihapus.`, m); +}; + +handler.help = ['delguild <nomor_guild>']; +handler.tags = ['rpgG']; +handler.command = /^(delguild)$/i; +handler.owner = false; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_demote.js b/plugins/rpgG_demote.js new file mode 100644 index 0000000000000000000000000000000000000000..5e1a971943d6d535487fad5026778d44a9b895cc --- /dev/null +++ b/plugins/rpgG_demote.js @@ -0,0 +1,27 @@ +let handler = async (m, { conn, args }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (guild.owner !== userId) return conn.reply(m.chat, 'Hanya pemilik guild yang bisa menurunkan pangkat anggota.', m); + + let target = m.mentionedJid[0] || args[0]; + + if (!target) return conn.reply(m.chat, 'Tag user yang ingin kamu turunkan pangkatnya.', m); + + if (!guild.staff.includes(target)) return conn.reply(m.chat, 'User tidak ada di dalam staff.', m); + + guild.staff = guild.staff.filter(staff => staff !== target); + + conn.reply(m.chat, `@${target.split('@')[0]} telah diturunkan pangkatnya di guild ${guild.name}.`, m, { mentions: [target] }); +}; + +handler.help = ['guilddemote <@user>']; +handler.tags = ['rpgG']; +handler.command = /^(guilddemote)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_info.js b/plugins/rpgG_info.js new file mode 100644 index 0000000000000000000000000000000000000000..4eaf4d895a6f5eb216117c358c063aefdf8606cb --- /dev/null +++ b/plugins/rpgG_info.js @@ -0,0 +1,33 @@ +let handler = async (m, { conn, args }) => { + let target = m.mentionedJid[0] || m.sender; + + let user = global.db.data.users[target]; + if (!user || !user.guild) return conn.reply(m.chat, 'Pengguna ini tidak tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + let membersList = guild.members.map((member, idx) => `โ€ข ${idx + 1}. @${member.split('@')[0]}`).join('\n'); + let guildInfo = ` +ไบ— Nama Guild: ${guild.name} +ไบ— Level: ${guild.level} +ไบ— Pemilik: @${guild.owner.split('@')[0]} +ไบ— Anggota: + - ${membersList} +ไบ— Eksperience Guild: ${guild.exp} / 1000 +ไบ— Eliksir: ${guild.eliksir} +ไบ— Harta: ${guild.harta} +ไบ— Guardian: ${guild.guardian || '-'} +ไบ— Attack: ${guild.attack} +ไบ— Staff: ${guild.staff.length > 0 ? guild.staff.map(staff => `โ€ข @${staff.split('@')[0]}`).join('\n') : '-'} +ไบ— Waiting Room: ${guild.waitingRoom.length > 0 ? guild.waitingRoom.map(room => `โ€ข @${room.split('@')[0]}`).join('\n') : '-' } +ไบ— Building Made: ${guild.createdAt}`; + + conn.reply(m.chat, guildInfo, m, { mentions: [guild.owner, ...guild.members] }); +}; + +handler.help = ['guildinfo [@user]']; +handler.tags = ['rpgG']; +handler.command = /^(guildinfo)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_infoacc.js b/plugins/rpgG_infoacc.js new file mode 100644 index 0000000000000000000000000000000000000000..81c1172f40cdaf1266f51f5e982517dbd4642f08 --- /dev/null +++ b/plugins/rpgG_infoacc.js @@ -0,0 +1,39 @@ +let handler = async (m, { conn, args }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + let target = m.mentionedJid[0] || args[0]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (guild.owner !== userId) return conn.reply(m.chat, 'Hanya pemilik guild yang bisa melihat informasi guild lain.', m); + + let targetUser = global.db.data.users[target]; + if (!targetUser || !targetUser.guild || targetUser.guild !== guildId) return conn.reply(m.chat, 'User tidak tergabung dalam guild kamu.', m); + + let membersList = guild.members.map((member, idx) => `โ€ข ${idx + 1}. @${member.split('@')[0]}`).join('\n'); + let guildInfo = ` +Nama Guild: ${guild.name} +Level: ${guild.level} +Pemilik: @${guild.owner.split('@')[0]} +Anggota: +${membersList} +Eksperience Guild: ${guild.exp} / 1000 +Eliksir: ${guild.eliksir} +Harta: ${guild.harta} +Guardian: ${guild.guardian || '-'} +Attack: ${guild.attack} +Staff: ${guild.staff.length > 0 ? guild.staff.map(staff => `โ€ข @${staff.split('@')[0]}`).join('\n') : '-'} +Waiting Room: ${guild.waitingRoom.length > 0 ? guild.waitingRoom.map(room => `โ€ข @${room.split('@')[0]}`).join('\n') : '-' } +Dibuat Pada: ${guild.createdAt}`; + + conn.reply(m.chat, guildInfo, m, { mentions: [guild.owner, ...guild.members] }); +}; + +handler.help = ['guildinfoacc <@user>']; +handler.tags = ['rpgG']; +handler.command = /^(guildinfoacc)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_invite.js b/plugins/rpgG_invite.js new file mode 100644 index 0000000000000000000000000000000000000000..4a5489a4d0ee69db88e3e6b63bee0d0afee540d8 --- /dev/null +++ b/plugins/rpgG_invite.js @@ -0,0 +1,26 @@ +let handler = async (m, { conn, args }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + let target = m.mentionedJid[0] || args[0]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (!args[0]) return conn.reply(m.chat, `Tag user yang ingin kamu undang ke guild ${guild.name}.`, m); + + if (guild.owner !== userId) return conn.reply(m.chat, 'Hanya pemilik guild yang bisa mengundang.', m); + + if (global.db.data.users[target].guild === guildId) return conn.reply(m.chat, 'User sudah tergabung dalam guild.', m); + + guild.waitingRoom.push(target); + + conn.reply(m.chat, `@${target.split('@')[0]} kamu telah diundang ke guild ${guild.name}. Silakan tunggu konfirmasi dari pemilik guild.`, m, { mentions: [target] }); +}; + +handler.help = ['guildinvite <@user>']; +handler.tags = ['rpgG']; +handler.command = /^(guildinvite)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_join.js b/plugins/rpgG_join.js new file mode 100644 index 0000000000000000000000000000000000000000..fe41d1198b1efdbc491f0edd94c1cccc167af966 --- /dev/null +++ b/plugins/rpgG_join.js @@ -0,0 +1,23 @@ +let handler = async (m, { conn, args }) => { + let user = global.db.data.users[m.sender]; + let guildIndex = parseInt(args[0]) - 1; // Ambil nomor guild dari argumen + + if (!args[0] || isNaN(guildIndex)) return conn.reply(m.chat, 'Masukkan nomor guild yang valid.', m); + if (user.guild) return conn.reply(m.chat, 'Anda sudah bergabung dalam guild.', m); + + let guildKeys = Object.keys(global.db.data.guilds); + if (guildIndex < 0 || guildIndex >= guildKeys.length) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + let guildName = guildKeys[guildIndex]; + let guild = global.db.data.guilds[guildName]; + + guild.members.push(m.sender); + user.guild = guildName; + + conn.reply(m.chat, `Anda berhasil bergabung dengan guild ${guild.name}.`, m); +}; + +handler.help = ['joinguild <nomor_guild>']; +handler.tags = ['rpgG']; +handler.command = /^(joinguild)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_left.js b/plugins/rpgG_left.js new file mode 100644 index 0000000000000000000000000000000000000000..60f673ade97fd3f882e35d89651998bc719383ed --- /dev/null +++ b/plugins/rpgG_left.js @@ -0,0 +1,20 @@ +let handler = async (m, { conn }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + guild.members = guild.members.filter(member => member !== userId); + user.guild = null; + + conn.reply(m.chat, 'Kamu telah keluar dari guild.', m); +}; + +handler.help = ['guildleave']; +handler.tags = ['rpgG']; +handler.command = /^(guildleave)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_list.js b/plugins/rpgG_list.js new file mode 100644 index 0000000000000000000000000000000000000000..eea76d04fd97e1cc567974f5147bc8cdde922551 --- /dev/null +++ b/plugins/rpgG_list.js @@ -0,0 +1,16 @@ +let handler = async (m, { conn }) => { + let guilds = Object.values(global.db.data.guilds); + + if (guilds.length === 0) { + return conn.reply(m.chat, 'Belum ada guild yang terdaftar.', m); + } + + let guildList = guilds.map((guild, idx) => `${idx + 1}. ${guild.name} ${guild.members.length} Member`).join('\n'); + + conn.reply(m.chat, `ไบ— PUBLIC GUILD ไบ—\n${guildList}`, m); +}; + +handler.help = ['guildlist']; +handler.tags = ['rpgG']; +handler.command = /^(guildlist)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_listacc.js b/plugins/rpgG_listacc.js new file mode 100644 index 0000000000000000000000000000000000000000..8ff5802641d5de57a2c3cbf248bc30940c71c0b5 --- /dev/null +++ b/plugins/rpgG_listacc.js @@ -0,0 +1,21 @@ +let handler = async (m, { conn }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guilds = Object.values(global.db.data.guilds); + + if (guilds.length === 0) { + return conn.reply(m.chat, 'Belum ada guild yang terdaftar.', m); + } + + let guildList = guilds.map((guild, idx) => `${idx + 1}. ${guild.name} (${guild.members.length} anggota)`).join('\n'); + + conn.reply(m.chat, `Daftar Guild:\n${guildList}`, m); +}; + +handler.help = ['guildlistacc']; +handler.tags = ['rpgG']; +handler.command = /^(guildlistacc)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_my.js b/plugins/rpgG_my.js new file mode 100644 index 0000000000000000000000000000000000000000..a27fd613c10d216fd1491c65d7d9110c2ce4802d --- /dev/null +++ b/plugins/rpgG_my.js @@ -0,0 +1,33 @@ +let handler = async (m, { conn }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + let membersList = guild.members.map((member, idx) => `โ€ข ${idx + 1}. @${member.split('@')[0]}`).join('\n'); + let guildInfo = ` +Nama Guild: ${guild.name} +Level: ${guild.level} +Pemilik: @${guild.owner.split('@')[0]} +Anggota: +${membersList} +Eksperience Guild: ${guild.exp} / 1000 +Eliksir: ${guild.eliksir} +Harta: ${guild.harta} +Guardian: ${guild.guardian || '-'} +Attack: ${guild.attack} +Staff: ${guild.staff.length > 0 ? guild.staff.map(staff => `โ€ข @${staff.split('@')[0]}`).join('\n') : '-'} +Waiting Room: ${guild.waitingRoom.length > 0 ? guild.waitingRoom.map(room => `โ€ข @${room.split('@')[0]}`).join('\n') : '-' } +Dibuat Pada: ${guild.createdAt}`; + + conn.reply(m.chat, guildInfo, m, { mentions: [guild.owner, ...guild.members] }); +}; + +handler.help = ['myguild']; +handler.tags = ['rpgG']; +handler.command = /^(myguild)$/i; +module.exports = handler; diff --git a/plugins/rpgG_promote.js b/plugins/rpgG_promote.js new file mode 100644 index 0000000000000000000000000000000000000000..b9a973fca914c82e6913ceabe3b05dcbdb1ac1ab --- /dev/null +++ b/plugins/rpgG_promote.js @@ -0,0 +1,27 @@ +let handler = async (m, { conn, args }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (guild.owner !== userId) return conn.reply(m.chat, 'Hanya pemilik guild yang bisa mempromosikan anggota.', m); + + let target = m.mentionedJid[0] || args[0]; + + if (!target) return conn.reply(m.chat, 'Tag user yang ingin kamu promosikan.', m); + + if (guild.staff.includes(target)) return conn.reply(m.chat, 'User sudah menjadi staff.', m); + + guild.staff.push(target); + + conn.reply(m.chat, `@${target.split('@')[0]} telah dipromosikan menjadi staff di guild ${guild.name}.`, m, { mentions: [target] }); +}; + +handler.help = ['guildpromote <@user>']; +handler.tags = ['rpgG']; +handler.command = /^(guildpromote)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_tutotial.js b/plugins/rpgG_tutotial.js new file mode 100644 index 0000000000000000000000000000000000000000..5abd610b36be5faecc80a107fa8f3b4d54e251d0 --- /dev/null +++ b/plugins/rpgG_tutotial.js @@ -0,0 +1,65 @@ +let handler = async (m, { conn, usedPrefix }) => { + let tutorial = ` +๐Ÿฐ *Tutorial Guild* + +1. *Membuat Guild* + ${usedPrefix}createguild <nama_guild> + Contoh: ${usedPrefix}createguild TheDark + +2. *Melihat Info Guild* + ${usedPrefix}guildinfo [@user] + Contoh: ${usedPrefix}guildinfo @user + +3. *Bergabung dengan Guild* + ${usedPrefix}joinguild <nama_guild> + Contoh: ${usedPrefix}joinguild TheDark + +4. *Mengundang Anggota ke Guild* + ${usedPrefix}guildinvite @user + Contoh: ${usedPrefix}guildinvite @user + +5. *Menerima Anggota ke Guild (Hanya Owner atau Staff)* + ${usedPrefix}guildaccept @user + Contoh: ${usedPrefix}guildaccept @user + +6. *Meninggalkan Guild* + ${usedPrefix}guildleave + Contoh: ${usedPrefix}guildleave + +7. *Melihat Guild Sendiri* + ${usedPrefix}myguild + Contoh: ${usedPrefix}myguild + +8. *Upgrade Guild* + ${usedPrefix}guildupgrade + Contoh: ${usedPrefix}guildupgrade + +9. *Menghapus Guild (Hanya Owner)* + ${usedPrefix}delguild <nomor_guild> + Contoh: ${usedPrefix}delguild 2 + +10. *Misi Harian untuk Mendapatkan Eksir dan Harta* + ${usedPrefix}dailyg + Contoh: ${usedPrefix}dailyg + +11. *Menjalankan WarGuild* + ${usedPrefix}warguild + Contoh: ${usedPrefix}warguild + +12. *Menjalankan DeffGuild* + ${usedPrefix}deffguild + Contoh: ${usedPrefix}deffguild + +โ„น๏ธ Untuk informasi lebih lanjut tentang setiap perintah, gunakan ${usedPrefix}help [command]. + +๐Ÿ”— Selamat menjelajahi fitur guild! + `; + + conn.reply(m.chat, tutorial, m); +}; + +handler.help = ['tutorguild']; +handler.tags = ['rpgG']; +handler.command = /^tutorguild$/i; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_upgrade.js b/plugins/rpgG_upgrade.js new file mode 100644 index 0000000000000000000000000000000000000000..1dba3cdc1a66d7271b22154ca72e6a3839a2d9ed --- /dev/null +++ b/plugins/rpgG_upgrade.js @@ -0,0 +1,61 @@ +let handler = async (m, { conn, args }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + let upgradeType = args[0]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (!upgradeType) return conn.reply(m.chat, 'Pilih jenis upgrade yang ingin kamu lakukan (level, eliksir, harta, guardian, attack).', m); + + switch (upgradeType.toLowerCase()) { + case 'level': + if (user.money < 5000000000) return conn.reply(m.chat, 'Kamu tidak memiliki cukup money untuk upgrade level guild. Butuh 5.000.000.000 money.', m); + + guild.level++; + user.money -= 5000000000; + conn.reply(m.chat, `Level guild ${guild.name} telah ditingkatkan menjadi ${guild.level}.`, m); + break; + case 'eliksir': + if (user.money < 1000000000) return conn.reply(m.chat, 'Kamu tidak memiliki cukup money untuk upgrade eliksir guild. Butuh 1.000.000.000 money.', m); + + guild.eliksir++; + user.money -= 1000000000; + conn.reply(m.chat, `Eliksir guild ${guild.name} telah ditingkatkan menjadi ${guild.eliksir}.`, m); + break; + case 'harta': + if (user.money < 2000000000) return conn.reply(m.chat, 'Kamu tidak memiliki cukup money untuk upgrade harta guild. Butuh 2.000.000.000 money.', m); + + guild.harta++; + user.money -= 2000000000; + conn.reply(m.chat, `Harta guild ${guild.name} telah ditingkatkan menjadi ${guild.harta}.`, m); + break; + case 'guardian': + if (user.money < 3000000000) return conn.reply(m.chat, 'Kamu tidak memiliki cukup money untuk upgrade guardian guild. Butuh 3.000.000.000 money.', m); + + guild.guardian++; + user.money -= 3000000000; + conn.reply(m.chat, `Guardian guild ${guild.name} telah ditingkatkan menjadi ${guild.guardian}.`, m); + break; + case 'attack': + if (user.money < 4000000000) return conn.reply(m.chat, 'Kamu tidak memiliki cukup money untuk upgrade attack guild. Butuh 4.000.000.000 money.', m); + + guild.attack++; + user.money -= 4000000000; + conn.reply(m.chat, `Attack guild ${guild.name} telah ditingkatkan menjadi ${guild.attack}.`, m); + break; + default: + conn.reply(m.chat, 'Pilih jenis upgrade yang valid: level, eliksir, harta, guardian, attack.', m); + break; + } + + fs.writeFileSync(dbPath, JSON.stringify(global.db.data, null, 2)); +}; + +handler.help = ['guildupgrade <level/eliksir/harta/guardian/attack>']; +handler.tags = ['rpgG']; +handler.command = /^(guildupgrade)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_war.js b/plugins/rpgG_war.js new file mode 100644 index 0000000000000000000000000000000000000000..407eb8bbd8d3751a6814c5baed33e2ef6a649091 --- /dev/null +++ b/plugins/rpgG_war.js @@ -0,0 +1,25 @@ +let handler = async (m, { conn, args }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (!args[0]) return conn.reply(m.chat, 'Masukkan guild lawan yang ingin diwar.', m); + + let enemyGuildName = args.join(' '); + let enemyGuild = Object.values(global.db.data.guilds).find(guild => guild.name === enemyGuildName); + if (!enemyGuild) return conn.reply(m.chat, 'Guild lawan tidak ditemukan.', m); + + // Logika pertempuran dapat ditambahkan di sini + + conn.reply(m.chat, `Pertempuran dengan guild ${enemyGuild.name} sedang dalam pengembangan.`, m); +}; + +handler.help = ['guildwar <nama_guild>']; +handler.tags = ['rpgG']; +handler.command = /^(guildwar)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_waracc.js b/plugins/rpgG_waracc.js new file mode 100644 index 0000000000000000000000000000000000000000..c750251ddc7f10fffbcbef3b270a6082ca8c7038 --- /dev/null +++ b/plugins/rpgG_waracc.js @@ -0,0 +1,27 @@ +let handler = async (m, { conn, args }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (!args[0]) return conn.reply(m.chat, 'Masukkan guild lawan yang ingin diwar.', m); + + let enemyGuildName = args.join(' '); + let enemyGuild = Object.values(global.db.data.guilds).find(guild => guild.name === enemyGuildName); + if (!enemyGuild) return conn.reply(m.chat, 'Guild lawan tidak ditemukan.', m); + + if (guild.owner !== userId) return conn.reply(m.chat, 'Hanya pemilik guild yang bisa memulai perang.', m); + + // Logika perang dapat ditambahkan di sini + + conn.reply(m.chat, `Pertempuran dengan guild ${enemyGuild.name} dalam pengembangan.`, m); +}; + +handler.help = ['guildwaracc <nama_guild>']; +handler.tags = ['rpgG']; +handler.command = /^(guildwaracc)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpgG_warpause.js b/plugins/rpgG_warpause.js new file mode 100644 index 0000000000000000000000000000000000000000..925644ff772e470033a9b47e293fb8d8236aff4f --- /dev/null +++ b/plugins/rpgG_warpause.js @@ -0,0 +1,21 @@ +let handler = async (m, { conn }) => { + let userId = m.sender; + let user = global.db.data.users[userId]; + + if (!user.guild) return conn.reply(m.chat, 'Kamu belum tergabung dalam guild.', m); + + let guildId = user.guild; + let guild = global.db.data.guilds[guildId]; + if (!guild) return conn.reply(m.chat, 'Guild tidak ditemukan.', m); + + if (guild.owner !== userId) return conn.reply(m.chat, 'Hanya pemilik guild yang bisa menghentikan perang.', m); + + // Logika untuk menghentikan perang dapat ditambahkan di sini + + conn.reply(m.chat, 'Pertempuran dengan guild lawan sedang dihentikan.', m); +}; + +handler.help = ['guildwarpause']; +handler.tags = ['rpgG']; +handler.command = /^(guildwarpause)$/i; +module.exports = handler; \ No newline at end of file diff --git a/plugins/rpg_buydm.js b/plugins/rpg_buydm.js new file mode 100644 index 0000000000000000000000000000000000000000..7853fb22f5cf6116ab4a14346b4e29eb302cf212 --- /dev/null +++ b/plugins/rpg_buydm.js @@ -0,0 +1,21 @@ +const xpperdiamond = 1000000 +let handler = async (m, { conn, command, args }) => { + let count = command.replace(/^buydm/i, '') + count = count ? /all/i.test(count) ? Math.floor(global.db.data.users[m.sender].exp / xpperdiamond) : parseInt(count) : args[0] ? parseInt(args[0]) : 1 + count = Math.max(1, count) + if (global.db.data.users[m.sender].exp >= xpperdiamond * count) { + global.db.data.users[m.sender].exp -= xpperdiamond * count + global.db.data.users[m.sender].diamond += count + conn.reply(m.chat, ` +โ”Œโ”€ใ€Œ *NOTA PEMBAYARAN* ใ€ +โ€ฃ *Nominal pembelian* : + ${count}๐Ÿ’Ž +โ€ฃ *Usang* : -${xpperdiamond * count} XP +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€`, m) + } else conn.reply(m.chat, `โŽ Maaf, Anda tidak memiliki cukup *XP* untuk membeli *${count}* Berlian 1.000.000 xp\n\nAnda bisa mendapatkan *XP* dengan .daily bermain game atau cek di *.balance* \n\nAtau anda bisa top up ke *.DONATE* dan mengirimkan bukti ke *.OWNER*`, m) +} +handler.help = ['buydm', 'buyalldm'] +handler.tags = ['rpg'] +handler.command = ['buydm', 'buyalldm'] +handler.group = true + +module.exports = handler; diff --git a/plugins/rpg_daily.js b/plugins/rpg_daily.js new file mode 100644 index 0000000000000000000000000000000000000000..a5df8107d89b7004a5e93e4f90d4bd2958ec8ef7 --- /dev/null +++ b/plugins/rpg_daily.js @@ -0,0 +1,41 @@ +const fs = require('fs'); + +const prem = 1000; // xp yang didapat untuk user prem +const free = 100; // xp yang didapat untuk user free + +let handler = async (m, {conn, text, isPrems}) => { + let lastClaimTime = global.db.data.users[m.sender].lastclaim || 0; + let currentTime = new Date().getTime(); + + // Cek apakah sudah 24 jam (86400000 ms) sejak klaim terakhir + if (currentTime - lastClaimTime < 86400000) throw `๐ŸŽ *Anda telah mengumpulkan hadiah harian Anda*\n\n๐Ÿ•š Masuk kembali *${msToTime(86400000 - (currentTime - lastClaimTime))}*`; + + // Tambahkan XP sesuai jenis user + global.db.data.users[m.sender].exp += isPrems ? prem : free; + m.reply(` +๐ŸŽ *HADIAH XP* +*Spam terus untuk mendapatkan xp* +cek .balance jumlah xp mu! +๐Ÿ†™ *XP* : +${isPrems ? prem : free}`); + + // Update waktu klaim terakhir + global.db.data.users[m.sender].lastclaim = currentTime; +} + +handler.help = handler.command = ['daily']; +handler.tags = ['rpg']; + +module.exports = handler; + +function msToTime(duration) { + var milliseconds = parseInt((duration % 1000) / 100), + seconds = Math.floor((duration / 1000) % 60), + minutes = Math.floor((duration / (1000 * 60)) % 60), + hours = Math.floor((duration / (1000 * 60 * 60)) % 24); + + hours = (hours < 10) ? "0" + hours : hours; + minutes = (minutes < 10) ? "0" + minutes : minutes; + seconds = (seconds < 10) ? "0" + seconds : seconds; + + return hours + " Jam " + minutes + " Menit"; +} diff --git a/plugins/rpg_leaderboard.js b/plugins/rpg_leaderboard.js new file mode 100644 index 0000000000000000000000000000000000000000..d14d336a39d37f595c0c9144a63f76ca3d7d96fe --- /dev/null +++ b/plugins/rpg_leaderboard.js @@ -0,0 +1,82 @@ +let handler = async (m, { conn, args, participants }) => { + let users = Object.entries(global.db.data.users).map(([key, value]) => { + return {...value, jid: key} + }) + let sortedExp = users.map(toNumber('exp')).sort(sort('exp')) + let sortedLim = users.map(toNumber('limit')).sort(sort('limit')) + let sortedLevel = users.map(toNumber('level')).sort(sort('level')) + let sortedMoney = users.map(toNumber('money')).sort(sort('money')) + let sortedDiamond = users.map(toNumber('diamond')).sort(sort('diamond')) + let sortedBank = users.map(toNumber('bank')).sort(sort('bank')) + let usersExp = sortedExp.map(enumGetKey) + let usersLim = sortedLim.map(enumGetKey) + let usersLevel = sortedLevel.map(enumGetKey) + let usersMoney = sortedMoney.map(enumGetKey) + let usersDiamond = sortedDiamond.map(enumGetKey) + let usersBank = sortedBank.map(enumGetKey) + console.log(participants) + let len = args[0] && args[0].length > 0 ? Math.min(10, Math.max(parseInt(args[0]), 10)) : Math.min(10, sortedExp.length) + let text = ` + โ€ข *XP Leaderboard Top ${len}* โ€ข + Kamu: *${usersExp.indexOf(m.name) + 1}* dari *${usersExp.length}* + + ${sortedExp.slice(0, len).map(({ jid, exp }, i) => `${i + 1}. ${participants.some(p => jid === p.jid) ? `(${conn.getName(jid)}) wa.me/` : '@'}${jid.split`@`[0]} *${exp} Exp*`).join`\n`} + + โ€ข *Limit Leaderboard Top ${len}* โ€ข + Kamu: *${usersLim.indexOf(m.name) + 1}* dari *${usersLim.length}* + + ${sortedLim.slice(0, len).map(({ jid, limit }, i) => `${i + 1}. ${participants.some(p => jid === p.jid) ? `(${conn.getName(jid)}) wa.me/` : '@'}${jid.split`@`[0]} *${limit} Limit*`).join`\n`} + + โ€ข *Level Leaderboard Top ${len}* โ€ข + Kamu: *${usersLevel.indexOf(m.name) + 1}* dari *${usersLevel.length}* + + ${sortedLevel.slice(0, len).map(({ jid, level }, i) => `${i + 1}. ${participants.some(p => jid === p.jid) ? `(${conn.getName(jid)}) wa.me/` : '@'}${jid.split`@`[0]} *Level ${level}*`).join`\n`} + + โ€ข *Money Leaderboard Top ${len}* โ€ข + Kamu: *${usersMoney.indexOf(m.name) + 1}* dari *${usersMoney.length}* + + ${sortedMoney.slice(0, len).map(({ jid, money }, i) => `${i + 1}. ${participants.some(p => jid === p.jid) ? `(${conn.getName(jid)}) wa.me/` : '@'}${jid.split`@`[0]} *Money ${money}*`).join`\n`} + + โ€ข *Bank Leaderboard Top ${len}* โ€ข + Kamu: *${usersBank.indexOf(m.name) + 1}* dari *${usersBank.length}* + + ${sortedBank.slice(0, len).map(({ jid, bank }, i) => `${i + 1}. ${participants.some(p => jid === p.jid) ? `(${conn.getName(jid)}) wa.me/` : '@'}${jid.split`@`[0]} *Bank ${bank}*`).join`\n`} + `.trim() + conn.reply(m.chat, text, m, { + contextInfo: { + mentionedJid: [...usersExp.slice(0, len), ...usersLim.slice(0, len), ...usersLevel.slice(0, len), ...usersMoney.slice(0, len), ...usersBank.slice(0, len)].filter(v => !participants.some(p => v === p.jid)) + } + }) + } + handler.help = ['leaderboard <jumlah user>'] + handler.tags = ['info'] + handler.command = /^(leaderboard|lb)$/i + handler.owner = false + handler.mods = false + handler.premium = false + handler.group = true + handler.private = false + + handler.admin = false + handler.botAdmin = false + + handler.fail = null + handler.exp = 0 + + module.exports = handler + + function sort(property, ascending = true) { + if (property) return (...args) => args[ascending & 1][property] - args[!ascending & 1][property] + else return (...args) => args[ascending & 1] - args[!ascending & 1] + } + + function toNumber(property, _default = 0) { + if (property) return (a, i, b) => { + return {...b[i], [property]: a[property] === undefined ? _default : a[property]} + } + else return a => a === undefined ? _default : a + } + + function enumGetKey(a) { + return a.jid + } \ No newline at end of file diff --git a/plugins/rpg_nomorseriser.js b/plugins/rpg_nomorseriser.js new file mode 100644 index 0000000000000000000000000000000000000000..a0001f1b385fdc21c96866aa2b120c237ccb3f07 --- /dev/null +++ b/plugins/rpg_nomorseriser.js @@ -0,0 +1,18 @@ +const { createHash } = require('crypto') + + +let handler = async function (m, { text, usedPrefix }) { + + let sn = createHash('md5').update(m.sender).digest('hex') + m.reply(` +Serial Number kamu: +${sn}`.trim()) +} + +handler.help = ['nomorseri'] +handler.tags = ['xp', 'rpg'] +handler.command = ['nomorseri'] +handler.group = true + + +module.exports = handler \ No newline at end of file diff --git a/plugins/samehadaku.js b/plugins/samehadaku.js new file mode 100644 index 0000000000000000000000000000000000000000..8cca93087237c7b8b6d47c263b179857446aa2af --- /dev/null +++ b/plugins/samehadaku.js @@ -0,0 +1,250 @@ +//ยฉ AkiraaBot 2023-2024 +// โ€ข Credits : wa.me/6287869975929 [ Bang syaii ] +// โ€ข Owner: 6287869975929,6283831945469 + +/* +โ€ข untuk siapa pun yang ketahuan menjual script ini tanpa sepengetahuan developer mohon untuk dilaporkan ! +*/ + +const axios = require("axios"); +const cheerio = require("cheerio"); + +class Samehada { + latest = async () => { + try { + let { data } = await axios.get("https://samehadaku.email/anime-terbaru/"); + let $ = cheerio.load(data); + const posts = []; + $(".post-show li").each((index, element) => { + const title = $(element).find(".entry-title a").attr("title"); + const link = $(element).find(".entry-title a").attr("href"); + const author = $(element).find('[itemprop="author"] author').text(); + const date = $(element) + .find(".dashicons-calendar") + .parent() + .text() + .replace("Released on:", "") + .trim(); + posts.push({ + title, + author, + date, + link, + }); + }); + return posts; + } catch (error) { + console.error(error); + return []; + } + }; + search = async (text) => { + const { data } = await axios.get("https://samehadaku.email"); + const $ = cheerio.load(data); + const scriptContent = $("#live_search-js-extra").html(); + const nonceMatch = scriptContent.match(/"nonce":"([^"]+)"/); + const nonce = nonceMatch ? nonceMatch[1] : null; + + try { + let { data: result } = await axios.get( + `https://samehadaku.email/wp-json/eastheme/search/?keyword=${text}&nonce=${nonce}`, + ); + let objek = Object.values(result).map((v) => v); + return objek; + } catch (e) { + return { + msg: e, + }; + } + }; + detail = async (url) => { + try { + const response = await axios.get(url); + const $ = cheerio.load(response.data); + + const title = $("h1.entry-title").text().trim(); + const author = "shannz"; + const image = $(".thumb img").attr("src"); + const rating = $('.rtg span[itemprop="ratingValue"]').text().trim(); + const description = $(".entry-content-single").text().trim(); + + const genres = []; + $(".genre-info a").each((i, el) => { + genres.push($(el).text().trim()); + }); + + const episodes = []; + $(".lstepsiode.listeps li").each((i, el) => { + const episodeNumber = $(el).find(".epsright .eps a").text().trim(); + const episodeTitle = $(el).find(".epsleft .lchx a").text().trim(); + const episodeUrl = $(el).find(".epsleft .lchx a").attr("href"); + const episodeDate = $(el).find(".epsleft .date").text().trim(); + + episodes.push({ + number: episodeNumber, + title: episodeTitle, + url: episodeUrl, + date: episodeDate, + }); + }); + + return { + author, + title, + image, + rating, + description, + genres, + episodes, + }; + } catch (error) { + console.error("Error scraping anime:", error); + return null; + } + }; + download = async (url) => { + if (!url.includes("samehadaku.email")) { + throw new Error("URL tidak valid"); + } + + try { + const response = await axios.get(url); + const $ = cheerio.load(response.data); + const result = { + judul: $("h1.entry-title").text().trim(), + url: url, + unduhan: [], + }; + + const serverList = $("div#server > ul > li"); + + for (let i = 0; i < serverList.length; i++) { + const server = $(serverList[i]); + const serverInfo = { + nama: server.find("span").text().trim(), + tipeServer: server.find("div").attr("data-type"), + nomorServer: server.find("div").attr("data-nume"), + postId: server.find("div").attr("data-post"), + }; + + const formData = new URLSearchParams(); + formData.append("action", "player_ajax"); + formData.append("post", serverInfo.postId); + formData.append("nume", serverInfo.nomorServer); + formData.append("type", serverInfo.tipeServer); + + const linkResponse = await axios.post( + "https://samehadaku.email/wp-admin/admin-ajax.php", + formData, + { + headers: { + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + Origin: "https://samehadaku.email", + "Content-Type": "application/x-www-form-urlencoded", + }, + }, + ); + + const $link = cheerio.load(linkResponse.data); + serverInfo.tautan = $link("iframe").attr("src"); + + result.unduhan.push(serverInfo); + } + + return result; + } catch (error) { + console.error("Terjadi kesalahan:", error.message); + throw error; + } + }; +} + +const handler = async (m, { conn, args, usedPrefix, text, command }) => { + let lister = ["search", "detail", "pdf"]; + if (!text) + throw `*[ SHINIGAMI EXAMPLE ]* +> *โ€ข Example :* ${usedPrefix + command} search *[query]* +> *โ€ข Example :* ${usedPrefix + command} detail *[url]* +> *โ€ข Example :* ${usedPrefix + command} episode *[url]*`; + let feature = text.split(" ")[0]; + let inputs = text.slice(feature.length + 1); + let same = new Samehada(); + if ("search" === feature) { + if (!inputs) throw `*โ€ข Example :* ${usedPrefix + command} search *[query]*`; + m.reply(wait); + try { + let res = await same.search(inputs); + let cap = + `Type a command +${usedPrefix + command} detail *[url]* for Get detail!\n\n` + + res + .map( + (a, i) => `*${i + 1}.* ${a.title} +*โ€ข Type :* ${a.data.type} +*โ€ข Score :* ${a.data.score} +*โ€ข Genre :* ${a.data.genre} +*โ€ข Url :* ${a.url}`, + ) + .join("\n\n"); + m.reply(cap, res[0].img); + } catch (e) { + throw e; + } + } + if ("detail" === feature) { + if (!inputs) throw `*โ€ข Example :* ${usedPrefix + command} detail *[url]*`; + try { + let resl = await same.detail(inputs); + let cap = `*${resl.title}* +*โ€ข Score :* ${resl.rating} +*โ€ข Genre :* ${resl.genres.join(", ")} +${resl.description || ""} + +Type a command +${usedPrefix + command} episode *[url]* for Get video! + +${resl.episodes + .map( + (a) => `*โ€ข Title :* ${a.title} +*โ€ข Date :* ${a.date} +*โ€ข Url :* ${a.url}`, + ) + .join("\n\n")}`; + await conn.sendFile(m.chat, resl.image, "", cap, m); + } catch (e) { + throw e; + } + } + if ("episode" === feature) { + if (!inputs) throw `*โ€ข Example :* ${usedPrefix + command} episode *[url]*`; + try { + let buff = await same.download(inputs); + let hasil = buff.unduhan.find((a) => a.tautan.endsWith(".mp4")); + let q = await conn.sendMessage(m.chat, { + text: `*โ€ข Title :* ${buff.judul}\n*โ€ข Url :* ${buff.url}\n*โ€ข Resolution :* ${hasil.nama}\n*โ€ข Download :* ${hasil.tautan}`, + }); + await conn.sendMessage( + m.chat, + { + document: { + url: hasil.tautan, + }, + caption: buff.utl, + fileName: buff.judul + ".mp4", + mimetype: "video/mp4", + }, + { + quoted: q, + }, + ); + } catch (e) { + throw e; + } + } +}; +handler.help = ["samehadaku", "samehada"].map((a) => a + " *[options]*"); +handler.tags = ["anime"]; +handler.command = ["samehadaku", "samehada"]; + +module.exports = handler; diff --git a/plugins/server.js b/plugins/server.js new file mode 100644 index 0000000000000000000000000000000000000000..895f7e64880ad2a95539372c78abde9664dba754 --- /dev/null +++ b/plugins/server.js @@ -0,0 +1,104 @@ +const axios = require('axios'); +const os = require('os'); + +let handler = async (m, { conn }) => { + try { + const response = await axios.get('http://ip-api.com/json/'); + const serverInfo = response.data; + + conn.chatRead(m.chat); + conn.sendMessage(m.chat, { + react: { + text: 'โณ', + key: m.key, + } + }); + + let serverMessage = `โ€ข *S E R V E R*\n\n`; + const osInfo = os.platform(); + const totalRAM = Math.floor(os.totalmem() / (1024 * 1024)); + const freeRAM = Math.floor(os.freemem() / (1024 * 1024)); + const uptime = os.uptime(); + const uptimeFormatted = formatUptime(uptime); + const processor = os.cpus()[0].model; + + serverMessage += `โ”Œ โ—ฆ OS : ${osInfo}\n`; + serverMessage += `โ”‚ โ—ฆ RAM : ${freeRAM} MB / ${totalRAM} MB\n`; + serverMessage += `โ”‚ โ—ฆ Country : ${serverInfo.country}\n`; + serverMessage += `โ”‚ โ—ฆ CountryCode : ${serverInfo.countryCode}\n`; + serverMessage += `โ”‚ โ—ฆ Region : ${serverInfo.region}\n`; + serverMessage += `โ”‚ โ—ฆ RegionName : ${serverInfo.regionName}\n`; + serverMessage += `โ”‚ โ—ฆ City : ${serverInfo.city}\n`; + serverMessage += `โ”‚ โ—ฆ Zip : ${serverInfo.zip}\n`; + serverMessage += `โ”‚ โ—ฆ Lat : ${serverInfo.lat}\n`; + serverMessage += `โ”‚ โ—ฆ Lon : ${serverInfo.lon}\n`; + serverMessage += `โ”‚ โ—ฆ Timezone : ${serverInfo.timezone}\n`; + serverMessage += `โ”‚ โ—ฆ ISP : ${serverInfo.isp}\n`; + serverMessage += `โ”‚ โ—ฆ Org : ${serverInfo.org}\n`; + serverMessage += `โ”‚ โ—ฆ AS : ${serverInfo.as}\n`; + serverMessage += `โ”‚ โ—ฆ Query : HIDDEN\n`; + serverMessage += `โ”‚ โ—ฆ Uptime : ${uptimeFormatted}\n`; + serverMessage += `โ”” โ—ฆ Processor : ${processor}`; + + // Create the fake reply with contextInfo + await conn.sendMessage(m.chat, { + text: serverMessage, + contextInfo: { + externalAdReply: { + mediaType: 1, + title: 'IKYBOT OFFICIAL', + thumbnailUrl: 'https://telegra.ph/file/e64a2612fe7dda57be962.jpg', + renderLargerThumbnail: true, + sourceUrl: '' + }, + forwardedNewsletterMessageInfo: { + newsletterJid: '120363185802524978@newsletter', + newsletterName: 'Powered By RIZKI IRFAN' + } + } + }, { quoted: { + key: { fromMe: false, participant: '0@s.whatsapp.net', remoteJid: 'status@broadcast' }, + message: { + conversation: getWIBTime() + } + }}); + } catch (e) { + console.log(e); + } +}; + +function formatUptime(uptime) { + let seconds = Math.floor(uptime % 60); + let minutes = Math.floor((uptime / 60) % 60); + let hours = Math.floor((uptime / (60 * 60)) % 24); + let days = Math.floor(uptime / (60 * 60 * 24)); + + let formattedUptime = ''; + if (days > 0) formattedUptime += `${days} days `; + if (hours > 0) formattedUptime += `${hours} hours `; + if (minutes > 0) formattedUptime += `${minutes} minutes `; + if (seconds > 0) formattedUptime += `${seconds} seconds`; + + return formattedUptime.trim(); +} + +function getWIBTime() { + const offset = 7; // WIB is UTC+7 + let date = new Date(); + let utc = date.getTime() + (date.getTimezoneOffset() * 60000); + let wibDate = new Date(utc + (3600000 * offset)); + let hours = wibDate.getHours(); + let minutes = wibDate.getMinutes(); + let seconds = wibDate.getSeconds(); + let ampm = hours >= 12 ? 'PM' : 'AM'; + hours = hours % 12; + hours = hours ? hours : 12; // the hour '0' should be '12' + let strTime = hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0') + ':' + seconds.toString().padStart(2, '0') + ampm; + return strTime; +} + +handler.command = ['server']; +handler.tags = ['info']; +handler.help = ['server']; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/ssweb.js b/plugins/ssweb.js new file mode 100644 index 0000000000000000000000000000000000000000..25f72ded3b4ec29add5c4ef57ca64617e2d95129 --- /dev/null +++ b/plugins/ssweb.js @@ -0,0 +1,40 @@ +var fs = require('fs'); +var path = require('path'); +var fetch = require('node-fetch'); +var handler = async (m, { conn, command, args }) => { + if (!args[0]) return conn.reply(m.chat, 'Input URL!', m); + if (args[0].match(/aduh\.com|hore\.com|poi\.care/i)) { + return conn.reply(m.chat, 'Link tersebut dilarang!', m); + } + await m.reply('_๏ผฌ๏ฝ๏ฝ๏ฝ„๏ฝ‰๏ฝŽ๏ฝ‡๏ผŽ๏ผŽ._'); + var url = args[0].startsWith('http') ? args[0] : 'https://' + args[0] + try { + var img = await fetch(`https://skizoasia.xyz/api/ssweb?apikey=Ikyskizo&url=${url}`); + if (!img) { + await m.reply('Gagal saat percobaan pertama. Memulai percobaan kedua...'); + img = await fetch(`https://skizoasia.xyz/api/ssweb?type=desktop&url=${url}&apikey=Ikyskizo`); + if (!img) return conn.reply(m.chat, 'Gambar tidak tersedia', m); + } + var filepath = path.join(__dirname, '../tmp/') + (+new Date) + '.jpeg'; // Ubah ke tmp folder + if (!fs.existsSync(path.join(__dirname, '../tmp/'))) fs.mkdirSync(path.join(__dirname, '../tmp/')); + const dest = fs.createWriteStream(filepath); + dest.on('finish', () => { + conn.sendFile(m.chat, filepath, 'screenshot.jpeg', 'Nih gambarnya.', m) + .then(() => { + }) + .catch(() => { }); + }); + img.body.pipe(dest); img.body.pipe(fs.createWriteStream(filepath)); + } catch (e) { + console.log(e); + conn.reply(m.chat, `Terjadi error!`, m); + } +} +handler.help = ['ssweb']; +handler.tags = ['tools']; +handler.command = ['ssweb',] + +handler.limit = true; +handler.fail = null; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/stalker-ghstalk.js b/plugins/stalker-ghstalk.js new file mode 100644 index 0000000000000000000000000000000000000000..a32cbe1d2785c3ef43a18893ccf3fcc191fd2333 --- /dev/null +++ b/plugins/stalker-ghstalk.js @@ -0,0 +1,45 @@ +let fetch = require('node-fetch') + +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `*Example:* ${usedPrefix + command} botcahx` + try { + let json = await fetch(`https://api.botcahx.eu.org/api/stalk/github?username=${text}&apikey=${btc}`).then(res => res.json()); + let caption = `โฆฟ *G H - S T A L K*\n\n` + caption += ` โ—ฆ *Name* : ${json.result.user.username}\n` + caption += ` โ—ฆ *ID* : ${json.result.user.idUser}\n` + caption += ` โ—ฆ *NodeId* : ${json.result.user.nodeId}\n` + caption += ` โ—ฆ *Name* : ${json.result.user.username}\n` + caption += ` โ—ฆ *Followers* : ${json.result.user.followers}\n` + caption += ` โ—ฆ *Following* : ${json.result.user.following}\n` + caption += ` โ—ฆ *Bio* : ${json.result.user.bio}\n` + caption += ` โ—ฆ *Type* : ${json.result.user.type}\n` + caption += ` โ—ฆ *Company* : ${json.result.user.company}\n` + caption += ` โ—ฆ *Repo* : ${json.result.user.publicRepos}\n` + caption += ` โ—ฆ *Create At* : ${json.result.user.createdAt}\n` + caption += ` โ—ฆ *Update At* : ${json.result.user.updatedAt}\n` + caption += ` โ—ฆ *Url* : ${json.result.user.githubUrl}\n` + conn.relayMessage(m.chat, { + extendedTextMessage: { + text: caption, + contextInfo: { + externalAdReply: { + title: wm, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: json.result.user.avatarUrl, + sourceUrl: '' + } + }, mentions: [m.sender] + } + }, {}) + } catch (e) { + throw `Error: ${eror}` + } +} +handler.help = ['ghstalk <username>'] +handler.tags = ['stalk'] +handler.command = /^(ghstalk|githubstalk)$/i +handler.limit = true + +module.exports = handler diff --git a/plugins/stalker-igstalk.js b/plugins/stalker-igstalk.js new file mode 100644 index 0000000000000000000000000000000000000000..2f9466c374c2c48de0e95c8938617650711492a9 --- /dev/null +++ b/plugins/stalker-igstalk.js @@ -0,0 +1,32 @@ +let fetch = require('node-fetch') +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `contoh:\n${usedPrefix + command} prm2.0` + try { + let api = await fetch(`https://api.botcahx.eu.org/api/stalk/ig?username=${text}&apikey=${btc}`) + let response = await api.json() + if (response.status) { + let { photoUrl, postsCount, followers, following, bio, fullName, username } = response.result; + let capt; + capt = `ไน‚ *I G S T A L K E R*\n\n`; + capt += `โ—ฆ *Username* : ${username}\n`; + capt += `โ—ฆ *Full Name* : ${fullName}\n`; + capt += `โ—ฆ *Bio* : ${bio}\n`; + capt += `โ—ฆ *Followers* : ${followers}\n`; + capt += `โ—ฆ *Following* : ${following}\n`; + capt += `โ—ฆ *Total Post* : ${postsCount}\n`; + capt += `\n`; + return conn.sendFile(m.chat, photoUrl, 'pp.png', capt, m) + } else { + throw 'Sistem Sedang Bermasalah!' + } + } catch (e) { + m.reply('Sistem Sedang Bermasalah!') + } +} + +handler.help = ['igstalk <username>'] +handler.tags = ['stalk'] +handler.command = /^(igstalk)$/i +handler.limit = true + +module.exports = handler diff --git a/plugins/stalker-tools.js b/plugins/stalker-tools.js new file mode 100644 index 0000000000000000000000000000000000000000..47a12045d5fd717591ce0eb6c4bc35237f381de1 --- /dev/null +++ b/plugins/stalker-tools.js @@ -0,0 +1,128 @@ +const fetch = require('node-fetch'); + +let handler = async (m, { + conn, + args, + text, + usedPrefix, + command +}) => { + if (command == 'ffstalk') { + if (!text) throw `Example : ${usedPrefix + command} 919044185`; + try { + let ff = await fetch(`https://api.botcahx.eu.org/api/stalk/ff?id=${text}&apikey=${btc}`).then(res => res.json()); + await conn.reply(m.chat, ff.result.userNameGame, m); + } catch (e) { + console.log(e); + throw eror + } + } + if (command == 'mlstalk') { + if (text.length < 2) throw `Contoh: ${usedPrefix + command} 2480197|2001`; + let [id, server] = text.split('|'); + try { + let ml = await fetch(`https://api.botcahx.eu.org/api/stalk/ml?id=${id}&server=${server}&apikey=${btc}`).then(res => res.json()); + await conn.reply(m.chat, ml.result.userName, m); + } catch (e) { + console.log(e); + throw eror + } + } + if (command == 'supersusstalk') { + if (!text) throw `Example : ${usedPrefix + command} 20431364`; + try { + let sus = await fetch(`https://api.botcahx.eu.org/api/stalk/supersus?id=${text}&apikey=${btc}`).then(res => res.json()); + let results = sus.result; + let caption = `*S U P E R S U S*\n\n`; + caption += `*ID:* ${results.id}\n`; + caption += `*Name:* ${results.name}\n`; + caption += `*Account:* ${results.account}\n`; + caption += `*User ID:* ${results.userId}\n`; + caption += `*Space ID:* ${results.spaceId}\n`; + caption += `*Sex:* ${results.sex}\n`; + caption += `*Cup Number:* ${results.cupNum}\n`; + caption += `*Bind Type:* ${results.bindType}\n`; + caption += `*Head ID:* ${results.headId}\n`; + caption += `*Head URL:* ${results.headUrl}\n`; + caption += `*Device:* ${results.device}\n`; + await conn.reply(m.chat, caption, m); + } catch (e) { + console.log(e); + throw eror + } + } + if (command == 'npmstalk') { + if (!text) throw `Example : ${usedPrefix + command} tiktokdl`; + try { + let npm = await fetch(`https://api.botcahx.eu.org/api/stalk/npm?name=${text}&apikey=${btc}`).then(res => res.json()); + let caption = `*N P M S T A L K*\n\n` + caption += `*ID:* ${npm.result._id}\n` + caption += `*Name:* ${npm.result.name}\n` + caption += `*Description:* ${npm.result.description}\n` + caption += `*Main:* ${npm.result.main}\n` + caption += `*License:* ${npm.result.license}\n` + caption += `*Homepage:* ${npm.result.homepage}\n` + caption += `*Keywords:* ${npm.result.keywords}\n` + caption += `*Repository:* ${npm.result.repository.url}\n` + caption += `*Bugs:* ${npm.result.bugs.url}\n` + let versions = npm.result.versions; + for (let version in versions) { + let v = versions[version]; + caption += `\n*Version: ${v.version}*\n` + caption += `*Description:* ${v.description}\n` + caption += `*Main:* ${v.main}\n` + caption += `*License:* ${v.license}\n` + caption += `*Homepage:* ${v.homepage}\n` + caption += `*Keywords:* ${v.keywords}\n` + caption += `*Repository:* ${v.repository.url}\n` + caption += `*Bugs:* ${v.bugs.url}\n` + } + await conn.reply(m.chat, caption, m); + } catch (e) { + throw eror + } + } + if (command == 'repostalk') { + if (!text) throw `Example : ${usedPrefix + command} RTXZY-MD`; + try { + let repo = await fetch(`https://api.botcahx.eu.org/api/stalk/repo?repo=${text}&apikey=${btc}`).then(res => res.json()); + let caption = `*R E P O S T A L K*\n\n`; + caption += `*ID:* ${repo.result.items[0].id}\n`; + caption += `*Node ID:* ${repo.result.items[0].nodeId}\n`; + caption += `*Nama Repo:* ${repo.result.items[0].nameRepo}\n`; + caption += `*Nama Lengkap Repo:* ${repo.result.items[0].fullNameRepo}\n`; + caption += `*URL Repo:* ${repo.result.items[0].url_repo}\n`; + caption += `*Deskripsi:* ${repo.result.items[0].description}\n`; + caption += `*URL Git:* ${repo.result.items[0].git_url}\n`; + caption += `*URL SSH:* ${repo.result.items[0].ssh_url}\n`; + caption += `*URL Clone:* ${repo.result.items[0].clone_url}\n`; + caption += `*URL SVN:* ${repo.result.items[0].svn_url}\n`; + caption += `*Homepage:* ${repo.result.items[0].homepage}\n`; + caption += `*Stargazers:* ${repo.result.items[0].stargazers}\n`; + caption += `*Watchers:* ${repo.result.items[0].watchers}\n`; + caption += `*Forks:* ${repo.result.items[0].forks}\n`; + caption += `*Default Branch:* ${repo.result.items[0].defaultBranch}\n`; + caption += `*Bahasa:* ${repo.result.items[0].language}\n`; + caption += `*Private:* ${repo.result.items[0].isPrivate}\n`; + caption += `*Fork:* ${repo.result.items[0].isFork}\n`; + caption += `*Created At:* ${repo.result.items[0].createdAt}\n`; + caption += `*Updated At:* ${repo.result.items[0].updatedAt}\n`; + caption += `*Pushed At:* ${repo.result.items[0].pushedAt}\n`; + caption += `*Author Username:* ${repo.result.items[0].author.username}\n`; + caption += `*Author ID:* ${repo.result.items[0].author.id_user}\n`; + caption += `*Author Avatar URL:* ${repo.result.items[0].author.avatar_url}\n`; + caption += `*Author GitHub URL:* ${repo.result.items[0].author.user_github_url}\n`; + caption += `*Author Type:* ${repo.result.items[0].author.type}\n`; + caption += `*Is Site Admin:* ${repo.result.items[0].author.isSiteAdmin}\n`; + await conn.reply(m.chat, caption, m); + } catch (error) { + throw eror + } + } +} + +handler.command = handler.help = ['ffstalk', 'mlstalk','supersusstalk','npmstalk','repostalk'] +handler.tags = ['stalk'] +handler.limit = true + +module.exports = handler diff --git a/plugins/stalker-ttstalk.js b/plugins/stalker-ttstalk.js new file mode 100644 index 0000000000000000000000000000000000000000..057d92e2edc8531318da2f27f25dfd1407df54bc --- /dev/null +++ b/plugins/stalker-ttstalk.js @@ -0,0 +1,38 @@ +let fetch = require('node-fetch') + +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `*Example:* ${usedPrefix + command} chenggu_4` + try { + let json = await fetch(`https://api.botcahx.eu.org/api/stalk/tt?username=${text}&apikey=${btc}`).then(res => res.json()); + let caption = `โฆฟ *T I K T O K - S T A L K*\n\n` + caption += ` โ—ฆ *Username* : ${json.result.username}\n` + caption += ` โ—ฆ *Description* : ${json.result.description}\n` + caption += ` โ—ฆ *Likes* : ${json.result.likes}\n` + caption += ` โ—ฆ *Followers* : ${json.result.followers}\n` + caption += ` โ—ฆ *Following* : ${json.result.following}\n` + caption += ` โ—ฆ *Totalposts* : ${json.result.totalPosts}\n\n` + conn.relayMessage(m.chat, { + extendedTextMessage: { + text: caption, + contextInfo: { + externalAdReply: { + title: wm, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: json.result.profile, + sourceUrl: '' + } + }, mentions: [m.sender] + } + }, {}) + } catch (e) { + throw `Error: ${eror}` + } +} +handler.help = ['ttstalk <username>'] +handler.tags = ['stalk'] +handler.command = /^(ttstalk|tiktokstalk)$/i +handler.limit = true + +module.exports = handler diff --git a/plugins/stalker-twitterstalk.js b/plugins/stalker-twitterstalk.js new file mode 100644 index 0000000000000000000000000000000000000000..dccd15756729ffe85bcd0166f58b3bd701e74a8e --- /dev/null +++ b/plugins/stalker-twitterstalk.js @@ -0,0 +1,35 @@ +let fetch = require('node-fetch') +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `contoh:\n${usedPrefix + command} erlanrahmat_14` + try { + let api = await fetch(`https://api.botcahx.eu.org/api/stalk/twitter?username=${text}&apikey=${btc}`) + let response = await api.json() + if (response.status) { + let { profileImage, bio, id, username, fullName, follower, following, totalPosts, favoritCount, createdAt, location } = response.result; + let capt; + capt = `ไน‚ *T W S T A L K E R*\n\n`; + capt += `โ—ฆ *ID* : ${id}\n`; + capt += `โ—ฆ *Username* : ${username}\n`; + capt += `โ—ฆ *Full Name* : ${fullName}\n`; + capt += `โ—ฆ *Bio* : ${bio}\n`; + capt += `โ—ฆ *Followers* : ${follower}\n`; + capt += `โ—ฆ *Following* : ${following}\n`; + capt += `โ—ฆ *Total Post* : ${totalPosts}\n`; + capt += `โ—ฆ *Total Favorit* : ${favoritCount}\n`; + capt += `โ—ฆ *Created* : ${location}/${createdAt}\n`; + capt += `\n`; + return conn.sendFile(m.chat, profileImage, 'pp.png', capt, m) + } else { + throw 'Sistem Sedang Bermasalah!' + } + } catch (e) { + m.reply('Sistem Sedang Bermasalah!') + } +} + +handler.help = ['twitterstalk <username>'] +handler.tags = ['stalk'] +handler.command = /^(twstalk|twitterstalk)$/i +handler.limit = true + +module.exports = handler diff --git a/plugins/stalker-ytstalk.js b/plugins/stalker-ytstalk.js new file mode 100644 index 0000000000000000000000000000000000000000..8d56b40216ed7ee75db80946ae49c30f95226e34 --- /dev/null +++ b/plugins/stalker-ytstalk.js @@ -0,0 +1,47 @@ +let fetch = require('node-fetch') +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `Contoh:\n${usedPrefix + command} deaafrizal` + try { + let res = await (await fetch(`https://api.botcahx.eu.org/api/stalk/yt?username=${text}&apikey=${btc}`)).json() + + if (res.status && res.result && res.result.data && res.result.data.length > 0) { + let data = res.result.data[0]; + let { channelId, url, channelName, avatar, isVerified, subscriberH, subscriber, description } = data; + + let capt; + capt = `ไน‚ *Y O U T U B E S T A L K*\n\n`; + capt += `โ—ฆ *ID* : ${channelId}\n`; + capt += `โ—ฆ *Name* : ${channelName}\n`; + capt += `โ—ฆ *Subscriber* : ${subscriberH}\n`; + capt += `โ—ฆ *Verified* : ${isVerified}\n`; + capt += `โ—ฆ *URL* : ${url}\n`; + if (description) capt += `โ—ฆ *Description* : ${description}\n`; + + return conn.relayMessage(m.chat, { +extendedTextMessage:{ + text: capt, + contextInfo: { + externalAdReply: { + title: ('Channel ' + text).toUpperCase(), + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: avatar, + sourceUrl: url + } + }, mentions: [m.sender] +}}, {}) + } else { + throw 'Channel tidak ditemukan!' + } + } catch (e) { + m.reply('Sistem Sedang Bermasalah!') + } +} + +handler.help = ['ytstalk'] +handler.tags = ['stalk'] +handler.command = /^(youtubestalk|ytstalk)$/i +handler.limit = true + +module.exports = handler diff --git a/plugins/sticker-attp.js b/plugins/sticker-attp.js new file mode 100644 index 0000000000000000000000000000000000000000..0ae44dfa29d1bdee031b5540aa38e6b3201793d6 --- /dev/null +++ b/plugins/sticker-attp.js @@ -0,0 +1,31 @@ +let { +sticker5 +} = require('../lib/sticker') +let fs = require('fs') +let handler = async (m, { + conn, + args, + text, + usedPrefix, + command + }) => { + text = text ? text : m.quoted && m.quoted.text ? m.quoted.text : m.quoted && m.quoted.caption ? m.quoted.caption : m.quoted && m.quoted.description ? m.quoted.description : '' + if (!text) throw `Example : ${usedPrefix + command} Lagi Ruwet` + const res = `https://api.botcahx.eu.org/api/maker/attp?text=${encodeURIComponent(text.substring(0, 151))}&apikey=${btc}` + var error = fs.readFileSync(`./media/sticker/emror.webp`) + try { + if (command == 'attp' || command == 'attp') { + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + } catch (e) { + console.log(e) + await conn.sendFile(m.chat, error, 'error.webp', '', m) + } +} + +handler.command = handler.help = ['attp'] +handler.tags = ['sticker'] +handler.limit = true + +module.exports = handler diff --git a/plugins/sticker-brat.js b/plugins/sticker-brat.js new file mode 100644 index 0000000000000000000000000000000000000000..cd4183abe5c0e86873060821fab438a0b103ee29 --- /dev/null +++ b/plugins/sticker-brat.js @@ -0,0 +1,30 @@ +var { +sticker5 +} = require('../lib/sticker') +var fs = require('fs') +var handler = async (m, { + conn, + args, + text, + usedPrefix, + command + }) => { + text = text ? text : m.quoted && m.quoted.text ? m.quoted.text : m.quoted && m.quoted.caption ? m.quoted.caption : m.quoted && m.quoted.description ? m.quoted.description : '' + if (!text) throw `Example : ${usedPrefix + command} Lagi Ruwet` + const res = `https://api.botcahx.eu.org/api/maker/brat?text=${encodeURIComponent(text.substring(0, 151))}&apikey=${btc}` + var error = fs.readFileSync(`./media/sticker/emror.webp`) + try { + if (command == 'brat') { + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + } catch (e) { + console.log(e) + await conn.sendFile(m.chat, error, 'error.webp', '', m) + } +} + +handler.command = handler.help = ['brat'] +handler.tags = ['sticker'] +handler.limit = true +module.exports = handler diff --git a/plugins/sticker-emoji.js b/plugins/sticker-emoji.js new file mode 100644 index 0000000000000000000000000000000000000000..6fedab4bc537f4cbd7f6e8a57979efa5299987dd --- /dev/null +++ b/plugins/sticker-emoji.js @@ -0,0 +1,107 @@ +var { +sticker5 +} = require('../lib/sticker') +let handler = async (m, { conn, command, text, usedPrefix }) => { + if (!text) throw `๐Ÿšฉ *Contoh:* ${usedPrefix + command} ๐Ÿ—ฟ` + await conn.reply(m.chat, wait, m) + try { + if (command == 'stikapple') { + const res = `https://api.botcahx.eu.org/api/emoji/apple?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikgoogle') { + const res = `https://api.botcahx.eu.org/api/emoji/google?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stiksamsung') { + const res = `https://api.botcahx.eu.org/api/emoji/samsung?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikmicrosoft') { + const res = `https://api.botcahx.eu.org/api/emoji/microsoft?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikwhatsapp') { + const res = `https://api.botcahx.eu.org/api/emoji/whatsapp?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stiktwitter') { + const res = `https://api.botcahx.eu.org/api/emoji/twitter?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikfacebook') { + const res = `https://api.botcahx.eu.org/api/emoji/facebook?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikskype') { + const res = `https://api.botcahx.eu.org/api/emoji/skype?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikjoypixels') { + const res = `https://api.botcahx.eu.org/api/emoji/joypixels?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikopenmoji') { + const res = `https://api.botcahx.eu.org/api/emoji/openmoji?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikemojipedia') { + const res = `https://api.botcahx.eu.org/api/emoji/emojipedia?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stiklg') { + const res = `https://api.botcahx.eu.org/api/emoji/lg?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikjoypixels') { + const res = `https://api.botcahx.eu.org/api/emoji/joypixels?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikhtc') { + const res = `https://api.botcahx.eu.org/api/emoji/htc?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikmozilla') { + const res = `https://api.botcahx.eu.org/api/emoji/mozilla?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stiksoftbank') { + const res = `https://api.botcahx.eu.org/api/emoji/softbank?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikdocomo') { + const res = `https://api.botcahx.eu.org/api/emoji/docomo?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'stikkddi') { + const res = `https://api.botcahx.eu.org/api/emoji/kddi?emoji=${encodeURIComponent(text)}&apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + } catch (e) { + console.log(e) + throw '*๐Ÿšฉ Stiker tidak di temukan!*' + } +} + +handler.command = handler.help = ['stikapple', 'stikkddi', 'stikgoogle', 'stikdocomo', 'stiksoftbank', 'stikhtc', 'stikmozilla', 'stiklg', 'stikopenmoji', 'stikemojipedia', 'stikjoypixels', 'stikopenmoji', 'stikfacebook', 'stikskype', 'stikwhatsapp', 'stiktwitter', 'stiksamsung', 'stikmicrosoft'] +handler.tags = ['sticker'] +handler.limit = true +module.exports = handler diff --git a/plugins/sticker-emojimix.js b/plugins/sticker-emojimix.js new file mode 100644 index 0000000000000000000000000000000000000000..d2eb544dd69e58621fb91393c95a80a0234cb08c --- /dev/null +++ b/plugins/sticker-emojimix.js @@ -0,0 +1,23 @@ +const fetch = require('node-fetch') +let fs = require("fs") +const { MessageType } = require('@adiwajshing/baileys') +const { sticker5 } = require('../lib/sticker') + +let handler = async (m, { conn, text, args }) => { + if (!args[0]) throw 'Contoh penggunaan:\n\n*.emojimix ๐Ÿคจ+๐Ÿ˜ฃ*' + try { + let [emoji1, emoji2] = text.split`+` + let anu = await fetch(`https://api.botcahx.eu.org/api/emoji/emojimix?emoji1=${emoji1}&emoji2=${emoji2}&apikey=${btc}`) + let res = await anu.json() + let stiker = await sticker5(res.result.results[0].media_formats.png_transparent.url, false, packname, author) + await conn.sendFile(m.chat, stiker, 'sticker.webp', '', m) + } catch (e) { + m.reply('*๐Ÿšฉ Emoji tidak support!*'); + } +} + +handler.help = ['emojimix'] +handler.tags = ['sticker'] +handler.command = /^(emojimix)$/i +handler.limit = true +module.exports = handler diff --git a/plugins/sticker-exif.js b/plugins/sticker-exif.js new file mode 100644 index 0000000000000000000000000000000000000000..b638620d31d06905e735fc34908d70b7bb75dc4d --- /dev/null +++ b/plugins/sticker-exif.js @@ -0,0 +1,18 @@ +var { + format +} = require("util"); +var { + Image +} = require("node-webpmux"); + +var handler = async (m) => { + if (!m.quoted) return m.reply('Tag stiker nya!') + if (/sticker/.test(m.quoted.mtype)) { + var gambar = new Image() + await gambar.load(await m.quoted.download()) + m.reply(format(JSON.parse(gambar.exif.slice(22).toString()))) + } +}; +handler.command = handler.help = ['getexif']; +handler.tags = ['sticker']; +module.exports = handler; diff --git a/plugins/sticker-gif-toimg.js b/plugins/sticker-gif-toimg.js new file mode 100644 index 0000000000000000000000000000000000000000..f64b2c83b0a1feeb2211d7cd8b458c3d3d1f9cd6 --- /dev/null +++ b/plugins/sticker-gif-toimg.js @@ -0,0 +1,36 @@ +let fetch = require('node-fetch'); +let uploader = require('../lib/uploadFile'); + +let handler = async (m, { conn, usedPrefix, command }) => { + let q = m.quoted ? m.quoted : m; + let mime = (q.msg || q).mimetype || q.mediaType || ''; + if (/webp/.test(mime)) { + let buffer = await q.download(); + await m.reply(wait); + try { + let media = await uploader(buffer); + let json; + if (command === 'togif') { + json = await (await fetch(`https://api.botcahx.eu.org/api/tools/webp2mp4?url=${media}&apikey=${btc}`)).json(); + } else if (command === 'toimg') { + json = await (await fetch(`https://api.botcahx.eu.org/api/tools/webp2png?url=${media}&apikey=${btc}`)).json(); + } + if (json && json.result) { + await conn.sendFile(m.chat, json.result, null, "*DONE*", m); + } else { + await m.reply('Error: Failed to convert file. Please try again.'); + } + } catch (err) { + await m.reply('An error occurred while processing your request.'); + } + } else { + await m.reply(`Reply sticker with command ${usedPrefix + command}`); + } +} + +handler.help = ['toimg', 'togif']; +handler.tags = ['tools']; +handler.command = /^(toimg|togif)$/i; +handler.limit = true; + +module.exports = handler; diff --git a/plugins/sticker-random.js b/plugins/sticker-random.js new file mode 100644 index 0000000000000000000000000000000000000000..9ed11f59275935d11269f647c1211983a6542cd5 --- /dev/null +++ b/plugins/sticker-random.js @@ -0,0 +1,44 @@ +var { +sticker5 +} = require('../lib/sticker') +var handler = async (m, { + conn, + command + }) => { + var error = (`https://telegra.ph/file/12141dd462ecabeed1347.png`) + try { + if (command == 'dinokuning' || command == 'sdino') { + const res = `https://api.botcahx.eu.org/api/sticker/dinokuning?apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'patrick' || command == 'spatrick') { + const res = `https://api.botcahx.eu.org/api/sticker/patrick?apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'spongebob' || command == 'sspongebob') { + const res = `https://api.botcahx.eu.org/api/sticker/spongebob?apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'doge' || command == 'sdoge') { + const res = `https://api.botcahx.eu.org/api/sticker/doge?apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + else if (command == 'manusialidi' || command == 'smanusialidi') { + const res = `https://api.botcahx.eu.org/api/sticker/manusialidi?apikey=${btc}` + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + } catch (e) { + console.log(e) + await conn.sendFile(m.chat, error, 'error.webp', '', m) + } +} + +handler.command = handler.help = ['dinokuning', 'patrick', 'spongebob', 'doge', 'manusialidi', 'sdino', 'spatrick', 'sspongebob', 'sdoge', 'smanusialidi'] +handler.tags = ['sticker'] +handler.limit = true +module.exports = handler diff --git a/plugins/sticker-smeme.js b/plugins/sticker-smeme.js new file mode 100644 index 0000000000000000000000000000000000000000..1f336b5af702755b6e194575af1e458a77dc853a --- /dev/null +++ b/plugins/sticker-smeme.js @@ -0,0 +1,21 @@ +const uploadImage = require('../lib/uploadImage') +let handler = async (m, { conn, text, usedPrefix, command }) => { + + let [atas, bawah] = text.split`|` + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || '' + if (!mime) throw `balas gambar dengan perintah\n\n${usedPrefix + command} <${atas ? atas : 'teks atas'}>|<${bawah ? bawah : 'teks bawah'}>` + if (!/image\/(jpe?g|png)/.test(mime)) throw `_*Mime ${mime} tidak didukung!*_` + let img = await q.download() + let url = await uploadImage(img) + let meme = `https://api.memegen.link/images/custom/${encodeURIComponent(atas ? atas : '')}/${encodeURIComponent(bawah ? bawah : '')}.png?background=${url}` + conn.sendImageAsSticker(m.chat, meme, m, { packname: packname, author: author }) + +} +handler.help = ['stickermeme <teks>|<teks>'] +handler.tags = ['sticker'] +handler.command = /^(s(tic?ker)?me(me)?)$/i + +handler.limit = false + +module.exports = handler diff --git a/plugins/sticker-smim.js b/plugins/sticker-smim.js new file mode 100644 index 0000000000000000000000000000000000000000..f5b912cf722805025d12500a1c5d8b063c76d3f0 --- /dev/null +++ b/plugins/sticker-smim.js @@ -0,0 +1,30 @@ +const uploadImage = require('../lib/uploadImage') +const { MessageType } = require('@adiwajshing/baileys') +const { sticker } = require('../lib/sticker') +let handler = async (m, { conn, text, usedPrefix, command }) => { + + let [atas, bawah] = text.split`|` + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || '' + if (!mime) throw `balas gambar dengan perintah\n\n${usedPrefix + command} <${atas ? atas : 'teks atas'}>|<${bawah ? bawah : 'teks bawah'}>` + if (!/image\/(jpe?g|png)/.test(mime)) throw `_*Mime ${mime} tidak didukung!*_` + let img = await q.download() + let url = await uploadImage(img) + meme = `https://api.memegen.link/images/custom/${encodeURIComponent(atas ? atas : '')}/${encodeURIComponent(bawah ? bawah : '')}.png?background=${url}` +try { + let stiker = await sticker(null, meme, global.packname, global.author) + await conn.sendFile(m.chat, stiker, { + quoted: m + }) + } catch (e) { + m.reply('gagal membuat stiker, Mencoba Mengirim gambar') + await conn.sendFile(m.chat, meme, 'image.png', 'JADIKAN STIKER SECARA MANUAL DENGAN MENGETIK .S', m) + } +} +handler.help = ['smim <teks atas>|<teks bawah>'] +handler.tags = ['sticker'] +handler.command = /^(smim)$/i + +handler.limit = false + +module.exports = handler diff --git a/plugins/sticker-sticker.js b/plugins/sticker-sticker.js new file mode 100644 index 0000000000000000000000000000000000000000..7412d39061fe422484906f4f27ec3ff6e76a302b --- /dev/null +++ b/plugins/sticker-sticker.js @@ -0,0 +1,29 @@ +const fs = require('fs') + +let handler = async (m, { conn, command, usedPrefix }) => { +let q = m.quoted ? m.quoted : m +let mime = (q.msg || q).mimetype || '' +if (/image/.test(mime)) { + let media = await q.download() + m.reply(stiker_wait) + let encmedia = await conn.sendImageAsSticker(m.chat, media, m, { packname: global.packname, author: global.author }) + await fs.unlinkSync(encmedia) + } else if (/video/.test(mime)) { + if ((q.msg || q).seconds > 7) return m.reply('maksimal 6 detik!') + let media = await q.download() + m.reply(stiker_wait) + let encmedia = await conn.sendVideoAsSticker(m.chat, media, m, { packname: global.packname, author: global.author }) + await fs.unlinkSync(encmedia) + } else { + throw `Kirim Gambar/Video Dengan Caption ${usedPrefix + command}\nDurasi Video 1-6 Detik` + } + } +handler.help = ['sticker'] +handler.tags = ['sticker'] +handler.command = /^(stiker|s|sticker)$/i +handler.limit = true +module.exports = handler + +const isUrl = (text) => { + return text.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)(jpe?g|gif|png|mp4)/, 'gi')) +} diff --git a/plugins/sticker-stickerai.js b/plugins/sticker-stickerai.js new file mode 100644 index 0000000000000000000000000000000000000000..d830754e8655242a6b7f0dd1e307151176d8efb9 --- /dev/null +++ b/plugins/sticker-stickerai.js @@ -0,0 +1,30 @@ +const fs = require('fs'); +const fetch = require('node-fetch'); + +let handler = async (m, { conn, command, usedPrefix, text }) => { + if (!text) throw `Kirim prompt dengan cara ${usedPrefix + command} <prompt>`; + + let apiUrl = `https://api.botcahx.eu.org/api/search/openai-image?text=${text}&apikey=${btc}`; + let res = await fetch(apiUrl); + if (!res.ok) throw 'Gagal mengambil gambar dari API'; + let buffer = await res.buffer(); + + let filePath = './tmp/tmp-sticker.png'; + fs.writeFileSync(filePath, buffer); + + m.reply(stiker_wait); + let encmedia = await conn.sendImageAsSticker(m.chat, buffer, m, { packname: global.packname, author: global.author }); + + await fs.unlinkSync(encmedia); + await fs.unlinkSync(filePath); +} + +handler.help = ['aistiker <prompt>']; +handler.tags = ['sticker']; +handler.command = /^(aistiker|ai?s|aisticker|stickerai)$/i; +handler.limit = true; +module.exports = handler; + +const isUrl = (text) => { + return text.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)(jpe?g|gif|png|mp4)/, 'gi')); +} diff --git a/plugins/sticker-ttp.js b/plugins/sticker-ttp.js new file mode 100644 index 0000000000000000000000000000000000000000..60b65fa4a9e6f3c1278ac421504587a69ace255a --- /dev/null +++ b/plugins/sticker-ttp.js @@ -0,0 +1,30 @@ +var { +sticker5 +} = require('../lib/sticker') +var fs = require('fs') +var handler = async (m, { + conn, + args, + text, + usedPrefix, + command + }) => { + text = text ? text : m.quoted && m.quoted.text ? m.quoted.text : m.quoted && m.quoted.caption ? m.quoted.caption : m.quoted && m.quoted.description ? m.quoted.description : '' + if (!text) throw `Example : ${usedPrefix + command} Lagi Ruwet` + const res = `https://api.botcahx.eu.org/api/maker/ttp?text=${encodeURIComponent(text.substring(0, 151))}&apikey=${btc}` + var error = fs.readFileSync(`./media/sticker/emror.webp`) + try { + if (command == 'ttp' || command == 'ttp') { + var stiker = await sticker5(res, { packname }) + await conn.sendFile(m.chat, stiker, 'emror.webp', '', m) + } + } catch (e) { + console.log(e) + await conn.sendFile(m.chat, error, 'error.webp', '', m) + } +} + +handler.command = handler.help = ['ttp'] +handler.tags = ['sticker'] +handler.limit = true +module.exports = handler diff --git a/plugins/sticker-tts.js b/plugins/sticker-tts.js new file mode 100644 index 0000000000000000000000000000000000000000..3a8f52fb07fb129e6d1495a3a17ab80e8b70d959 --- /dev/null +++ b/plugins/sticker-tts.js @@ -0,0 +1,48 @@ +let gtts = require('node-gtts'); +let fs = require('fs'); +let path = require('path'); +let { spawn } = require('child_process'); + +const defaultLang = 'id'; +let handler = async (m, { conn, args }) => { + try { + let lang = args[0]; + let text = args.slice(1).join(' '); + if ((args[0] || '').length !== 2) { + lang = defaultLang; + text = args.join(' '); + } + if (!text && m.quoted && m.quoted.text) text = m.quoted.text; + + let res = await tts(text, lang); + conn.sendFile(m.chat, res, 'tts.opus', null, m, true); + } catch (e) { + m.reply('*Contoh:* .tts hello world'); + } +}; +handler.help = ['tts <teks>']; +handler.tags = ['tools']; +handler.command = /^tts$/i; +module.exports = handler; + +function tts(text, lang = 'id') { + console.log(lang, text); + return new Promise((resolve, reject) => { + let tts = gtts(lang); + let filePath = path.join(__dirname, '../tmp', (1 * new Date) + '.wav'); + tts.save(filePath, text, (err, result) => { + if (err) reject(err); + else { + fs.readFile(filePath, (err, data) => { + if (err) reject(err); + else { + fs.unlink(filePath, err => { + if (err) console.log(err); + }); + resolve(data); + } + }); + } + }); + }); +} diff --git a/plugins/sticker-wm.js b/plugins/sticker-wm.js new file mode 100644 index 0000000000000000000000000000000000000000..d7c679eda0417c2392ebd9968c2b6924e19d41e4 --- /dev/null +++ b/plugins/sticker-wm.js @@ -0,0 +1,25 @@ +const { sticker } = require('../lib/sticker') +const uploadFile = require('../lib/uploadFile') +const uploadImage = require('../lib/uploadImage') +let { webp2png } = require('../lib/webp2mp4') +let fetch = require("node-fetch") +let handler = async (m, { conn, text, usedPrefix, command }) => { + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || '' +if (/video/g.test(mime)) if ((q.msg || q).seconds > 11) return m.reply('Maksimal 10 detik!') +try { + let img = await q.download() + +if(!img) throw `balas gambar/video/stiker dengan perintah .stiker` +conn.sendImageAsSticker(m.chat , img, m, {packname: text, author: ''}) + } catch { throw 'Gagal!, Balas Gambar/video dengan caption *.stiker*'} +} +handler.help = ['wm', 'watermark'] +handler.tags = ['sticker'] +handler.command = /^wm|watermark?$/i + +module.exports = handler + +const isUrl = (text) => { + return text.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)(jpe?g|gif|png)/, 'gi')) +} diff --git a/plugins/tool-audiochanges.js b/plugins/tool-audiochanges.js new file mode 100644 index 0000000000000000000000000000000000000000..517b3a4f58c79d942724f10c4ec9922e1c6e9fef --- /dev/null +++ b/plugins/tool-audiochanges.js @@ -0,0 +1,45 @@ +const fs = require('fs') +const path = require('path') +const { exec } = require('child_process') + +let handler = async (m, { conn, args, usedPrefix, command }) => { + try { + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || '' + if (!/audio/.test(mime)) throw `Balas vn/audio yang ingin diubah dengan caption *${usedPrefix + command}*` + let audio = await q.download() + if (!audio) throw 'Can\'t download audio!' + let set + if (/bass/.test(command)) set = '-af equalizer=f=94:width_type=o:width=2:g=30' + if (/blown/.test(command)) set = '-af acrusher=.1:1:64:0:log' + if (/deep/.test(command)) set = '-af atempo=4/4,asetrate=44500*2/3' + if (/earrape/.test(command)) set = '-af volume=12' + if (/fast/.test(command)) set = '-filter:a "atempo=1.63,asetrate=44100"' + if (/fat/.test(command)) set = '-filter:a "atempo=1.6,asetrate=22100"' + if (/nightcore/.test(command)) set = '-filter:a atempo=1.06,asetrate=44100*1.25' + if (/reverse/.test(command)) set = '-filter_complex "areverse"' + if (/robot/.test(command)) set = '-filter_complex "afftfilt=real=\'hypot(re,im)*sin(0)\':imag=\'hypot(re,im)*cos(0)\':win_size=512:overlap=0.75"' + if (/slow/.test(command)) set = '-filter:a "atempo=0.7,asetrate=44100"' + if (/smooth/.test(command)) set = '-filter:v "minterpolate=\'mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120\'"' + if (/tupai|squirrel|chipmunk/.test(command)) set = '-filter:a "atempo=0.5,asetrate=65100"' + if (/vibra/.test(command)) set = '-filter_complex "vibrato=f=15"' + let ran = (new Date * 1) + '.mp3' + let media = path.join(__dirname, '../tmp/' + ran) + let filename = media + '.mp3' + await fs.promises.writeFile(media, audio) + exec(`ffmpeg -i ${media} ${set} ${filename}`, async (err) => { + await fs.promises.unlink(media) + if (err) return Promise.reject( `_*Error!*_`) + let buff = await fs.promises.readFile(filename) + conn.sendFile(m.chat, buff, ran, null, m, /vn/.test(args[0]), { quoted: m, mimetype: 'audio/mp4' }) + await fs.promises.unlink(filename) + }) + } catch (e) { + throw e + } +} +handler.help = ['bass', 'blown', 'deep', 'earrape', 'fast', 'fat', 'nightcore', 'reverse', 'robot', 'slow', 'smooth', 'tupai', 'vibra'].map(v => v + ' [vn]') +handler.tags = ['voice'] +handler.command = /^(bass|blown|deep|earrape|fas?t|nightcore|reverse|robot|slow|smooth|tupai|squirrel|chipmunk|vibra)$/i + +module.exports = handler diff --git a/plugins/tools-audio2video.js b/plugins/tools-audio2video.js new file mode 100644 index 0000000000000000000000000000000000000000..052f48d27386136fd97c59c527f1add98db91939 --- /dev/null +++ b/plugins/tools-audio2video.js @@ -0,0 +1,24 @@ +const fetch = require('node-fetch'); +const uploader = require('../lib/uploadFile'); + +let handler = async (m, { conn, usedPrefix, command }) => { + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || q.mediaType || '' + if (/audio/.test(mime)) { + let buffer = await q.download() + await m.reply(wait) + try { + let media = await uploader(buffer) + let json = await (await fetch(`https://api.botcahx.eu.org/api/tools/audio2video?url=${media}&apikey=${btc}`)).json() + await conn.sendFile(m.chat, json.result, "video.mp4", "*DONE*", m) + } catch (err) { + throw eror + } + } else throw `Reply audio with command ${usedPrefix + command}` +} +handler.help = ['audio2video'] +handler.tags = ['tools'] +handler.command = /^(audio2video)$/i +handler.limit = true; + +module.exports = handler diff --git a/plugins/tools-base64.js b/plugins/tools-base64.js new file mode 100644 index 0000000000000000000000000000000000000000..80f4e62c731359c70c429a0ed3617e10589ac969 --- /dev/null +++ b/plugins/tools-base64.js @@ -0,0 +1,14 @@ +let handler = async (m, { command, text }) => { + let txt = m.quoted ? m.quoted.text ? m.quoted.text : text ? text : m.text : m.text + if (/^encrypt$/i.test(command)) { + m.reply(Buffer.from(txt, 'utf-8').toString('base64')) + } + if (/^decrypt$/i.test(command)) { + m.reply(Buffer.from(txt, 'base64').toString('utf-8')) +} +} +handler.help = ['encrypt', 'decrypt'] +handler.tags = ['tools'] +handler.command = /^(encrypt|decrypt)$/i + +module.exports = handler diff --git a/plugins/tools-binary.js b/plugins/tools-binary.js new file mode 100644 index 0000000000000000000000000000000000000000..2dbc2b75c2957a3422214b54b171723fd32b8b29 --- /dev/null +++ b/plugins/tools-binary.js @@ -0,0 +1,29 @@ +let axios = require("axios"); + +let handler = async(m, { conn, text }) => { + + if (!text) return conn.reply(m.chat, 'Masukan Teksnya', m) + + axios.get(`https://some-random-api.ml/binary?text=${text}`).then ((res) => { + let hasil = `Teks : ${text}\nBinary : ${res.data.binary}` + + conn.reply(m.chat, hasil, m) + }) +} +handler.help = ['binary'].map(v => v + ' <teks>') +handler.tags = ['tools'] +handler.command = /^(binary)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.exp = 0 +handler.limit = false + +module.exports = handler diff --git a/plugins/tools-bitly.js b/plugins/tools-bitly.js new file mode 100644 index 0000000000000000000000000000000000000000..13bfed084e773a9ab30ecd81d62d996360795736 --- /dev/null +++ b/plugins/tools-bitly.js @@ -0,0 +1,13 @@ +let fetch = require('node-fetch') +let handler = async (m, { text }) => { + if (!text) throw 'Masukan url/link nya mana?\n> .bitly https://google.com' + let res = await fetch(`https://api.botcahx.eu.org/api/linkshort/bitly?link=${text}&apikey=${btc}`) + let json = await res.json() + if (json.status) m.reply(json.result) + else throw 'Link Invalid!\nPeriksa url anda' +} +handler.help = ['bitly'].map(v => v + ' <link>') +handler.tags = ['shortlink'] +handler.command = /^bitly$/i + +module.exports = handler diff --git a/plugins/tools-cekresolusi.js b/plugins/tools-cekresolusi.js new file mode 100644 index 0000000000000000000000000000000000000000..21f8b782f9bd8bf0e0302665a0324b952b56d6bf --- /dev/null +++ b/plugins/tools-cekresolusi.js @@ -0,0 +1,30 @@ +const jimp = require("jimp") +const uploadImage = require("../lib/uploadImage.js") +const uploadFile = require("../lib/uploadFile.js") + +let handler = async (m, { conn, usedPrefix }) => { + +let q = m.quoted ? m.quoted : m +let mime = (q.msg || q).mimetype || '' +if (!mime) throw "where the media?" + +let media = await q.download() +let isMedia = /image\/(png|jpe?g|gif)|video\/mp4/.test(mime) +let link = await (isMedia ? uploadImage : uploadImage)(media) + +let source = await jimp.read(await link) +let height = await source.getHeight() +let width = await source.getWidth() + +m.reply(`*_RESOLUSI:_* ${width} x ${height} + +*> Lebar :* ${width} +*> Tinggi :* ${height} + +*> Link :* ${link}`) +} +handler.help = ['cekresolution *<foto>*', 'cekreso *<foto>*'] +handler.tags = ['tools'] +handler.command = /^(cekreso(lution)?)$/i + +module.exports = handler \ No newline at end of file diff --git a/plugins/tools-cuttly.js b/plugins/tools-cuttly.js new file mode 100644 index 0000000000000000000000000000000000000000..04a4f1759d2bd4ce86fe9f5488685ac94880cdea --- /dev/null +++ b/plugins/tools-cuttly.js @@ -0,0 +1,13 @@ +let fetch = require('node-fetch') +let handler = async (m, { text }) => { + if (!text) throw 'Masukan url/link nya mana?\n> .cuttly https://googe.com' + let res = await fetch(`https://api.botcahx.eu.org/api/linkshort/cuttly?link=${text}&apikey=${btc}`) + let json = await res.json() + if (json.status) m.reply(json.result) + else throw 'Link Invalid!\nPeriksa url anda' +} +handler.help = ['cuttly'].map(v => v + ' <link>') +handler.tags = ['shortlink'] +handler.command = /^cuttly2$/i + +module.exports = handler diff --git a/plugins/tools-delete.js b/plugins/tools-delete.js new file mode 100644 index 0000000000000000000000000000000000000000..a31f3ffa0e662bab203cef6308fbb7d4dc756151 --- /dev/null +++ b/plugins/tools-delete.js @@ -0,0 +1,22 @@ +let handler = async (m, { conn, command }) => { + if (!m.quoted) throw 'Reply pesan yang ingin dihapus'; + try { + let res = m.message.extendedTextMessage.contextInfo; + let deleteMsg = { delete: { remoteJid: m.chat, fromMe: false } }; + if (res.participant) { + deleteMsg.delete.id = res.stanzaId; + deleteMsg.delete.participant = res.participant; + } else { + deleteMsg.delete.id = res.stanzaId; + } + return conn.sendMessage(m.chat, deleteMsg); + } catch { + return conn.sendMessage(m.chat, { delete: m.quoted.vM.key }); + } +}; +handler.help = ['del', 'delete']; +handler.tags = ['tools']; +handler.botaadmin = true; +handler.command = ['del', 'delete', 'unsend']; + +module.exports = handler; diff --git a/plugins/tools-device.js b/plugins/tools-device.js new file mode 100644 index 0000000000000000000000000000000000000000..c43ba5b02238695938034607fe0362f7bd625231 --- /dev/null +++ b/plugins/tools-device.js @@ -0,0 +1,11 @@ +const { getDevice } = require('@adiwajshing/baileys') + +let handler = async (m) => { + m.reply(await getDevice(m.quoted ? m.quoted.id : m.key.id)) +} + +handler.help = ['device'] +handler.tags = ['tools'] +handler.command = /^(device)$/i + +module.exports = handler diff --git a/plugins/tools-editmsg.js b/plugins/tools-editmsg.js new file mode 100644 index 0000000000000000000000000000000000000000..8bb46475804ea3dc6fcef78694ee7902764b0201 --- /dev/null +++ b/plugins/tools-editmsg.js @@ -0,0 +1,12 @@ +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) `masukkan teks` + let q = m.quoted ? m.quoted : m + if (!q.fromMe) throw `itu bukan pesan dari bot` + await conn.sendMessage(m.chat, { text: text, edit: q }) +} + +handler.help = ['edit'] +handler.tags = ['tools'] +handler.command = /^(edit)$/i + +module.exports = handler diff --git a/plugins/tools-enc.js b/plugins/tools-enc.js new file mode 100644 index 0000000000000000000000000000000000000000..b8f5c682604ffa0d423bf24e74b893c5cc96ad69 --- /dev/null +++ b/plugins/tools-enc.js @@ -0,0 +1,12 @@ +const JavaScriptObfuscator = require('javascript-obfuscator') + +let handler = async (m, { conn, text }) => { +if (!text) throw `[!] Masukan textnya` +let res = JavaScriptObfuscator.obfuscate(text) +conn.reply(m.chat, res.getObfuscatedCode(), m) +} +handler.help = ['enc'] +handler.tags = ['tools'] +handler.command = /^enc$/i + +module.exports = handler diff --git a/plugins/tools-fakeReply.js b/plugins/tools-fakeReply.js new file mode 100644 index 0000000000000000000000000000000000000000..32742fc7d6bea690516dd25d0afa61f87129e343 --- /dev/null +++ b/plugins/tools-fakeReply.js @@ -0,0 +1,27 @@ +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) return m.reply(`Menggunakan perintah\n\n*${usedPrefix + command}* Halo apa? @${m.sender.split`@`[0]} tidak ada dan Anda`, null, { mentions: [m.sender] }) + let cm = copy(m) + let who + if (text.includes('@0')) who = '0@s.whatsapp.net' + else if (m.isGroup) who = cm.participant = m.mentionedJid[0] + else who = m.chat + if (!who) return m.reply(`Menggunakan perintah\n\n*${usedPrefix + command}* Halo apa? @${m.sender.split`@`[0]} tidak ada dan Anda`, null, { mentions: [m.sender] }) + cm.key.fromMe = false + cm.message[m.mtype] = copy(m.msg) + let sp = '@' + who.split`@`[0] + let [fake, ...real] = text.split(sp) + conn.fakeReply(m.chat, real.join(sp).trimStart(), who, fake.trimEnd(), m.isGroup ? m.chat : false, { + contextInfo: { + mentionedJid: conn.parseMention(real.join(sp).trim()) + } + }) +} +handler.help = ['fake <text> @user <text2>'] +handler.tags = ['tools'] +handler.command = /^(fitnah|fakereply|fake)$/ + +module.exports = handler + +function copy(obj) { + return JSON.parse(JSON.stringify(obj)) +} \ No newline at end of file diff --git a/plugins/tools-fakesecond.js b/plugins/tools-fakesecond.js new file mode 100644 index 0000000000000000000000000000000000000000..b0aabbffcece283cf39e8e16e0e74bf0fb902e3b --- /dev/null +++ b/plugins/tools-fakesecond.js @@ -0,0 +1,36 @@ +const fetch = require('node-fetch'); +const uploadImage = require('../lib/uploadImage.js'); + +async function handler(m, { conn, usedPrefix, command, args, text }) { + if (!text) return m.reply('kirim video/audio dengan caption .fakesecond <angka>'); + const angka = args.join` ` + const q = m.quoted ? m.quoted : m; + const mime = (q.msg || q).mimetype || q.mediaType || ''; + if (!mime) throw 'Reply video/audio' + const img = await q.download(); + const out = await uploadImage(img); + let fileSizeLimit = 15 * 1024 * 1024 // 15MB รฐลธโ€”ยฟ + if (img.length > fileSizeLimit) { + throw 'Ukuran media tidak boleh melebihi 15MB' + } + if (/^video/.test(mime)) { + conn.sendMessage(m.chat, { + video: img, + gifPlayback: false, + seconds: angka}) + } else if (/^audio/.test(mime)) { + conn.sendMessage(m.chat, { + audio: img, + seconds: angka}) + } else { + m.reply(`Kirim audio/video dengan caption *${usedPrefix + command}* <angka> atau tag audio/video yang sudah dikirim.`); + } +} + +handler.help = ['fakesecond <angka>']; +handler.tags = ['tools']; +handler.command = ['fakesecond']; +handler.premium = false; +handler.limit = false; + +module.exports = handler; diff --git a/plugins/tools-fakesize.js b/plugins/tools-fakesize.js new file mode 100644 index 0000000000000000000000000000000000000000..17e5e0baab2ef4e64a90e1131fbac541b720bcc7 --- /dev/null +++ b/plugins/tools-fakesize.js @@ -0,0 +1,41 @@ +const fetch = require('node-fetch'); +const uploadImage = require('../lib/uploadImage.js'); + +async function handler(m, { conn, usedPrefix, command, args, text }) { + if (!text) return m.reply('kirim video/gambar/audio dengan caption .fakesize <angka>'); + const angka = args.join` ` + const q = m.quoted ? m.quoted : m; + const mime = (q.msg || q).mimetype || q.mediaType || ''; + if (!mime) throw 'Reply video/image/audio' + const img = await q.download(); + const out = await uploadImage(img); + let fileSizeLimit = 15 * 1024 * 1024 // 15MB รฐลธโ€”ยฟ + if (img.length > fileSizeLimit) { + throw 'Ukuran media tidak boleh melebihi 15MB' + } + if (/^audio/.test(mime)) { + conn.sendMessage(m.chat, { + audio: img, + mimetype: 'audio/mpeg', + fileLength: angka}) + } else if (/^video/.test(mime)) { + conn.sendMessage(m.chat, { + video: img, + gifPlayback: false, + fileLength: angka}) + } else if (/^image/.test(mime)) { + conn.sendMessage(m.chat, { + image: img, + fileLength: angka}) + } else { + m.reply(`Kirim gambar/video/audio dengan caption *${usedPrefix + command}* <angka> atau tag gambar/video/audio yang sudah dikirim.`); + } +} + +handler.help = ['fakesize <angka>']; +handler.tags = ['tools']; +handler.command = ['fakesize']; +handler.premium = false; +handler.limit = false; + +module.exports = handler; diff --git a/plugins/tools-font.js b/plugins/tools-font.js new file mode 100644 index 0000000000000000000000000000000000000000..631d9dfb989fc2c7a9e7e8a8e16d39003cb906c2 --- /dev/null +++ b/plugins/tools-font.js @@ -0,0 +1,35 @@ +let fetch = require('node-fetch') +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `contoh:\n${usedPrefix + command} botcahx` + + try { + let json = await fetch(`https://api.botcahx.eu.org/api/tools/styletext?text=${text}&apikey=${btc}`) + let data = await json.json() + let caption = "" + for (let x of data.result) { + caption += ` +${x.result}\n` + } + return m.reply(caption) + } catch (e) { + console.log(e) + throw `${eror}` + } +} + +handler.help = ['font','styletext'].map(v => v + ' <text>') +handler.tags = ['tools'] +handler.command = /^(font|styletext)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.limit = true + +module.exports = handler diff --git a/plugins/tools-hdr.js b/plugins/tools-hdr.js new file mode 100644 index 0000000000000000000000000000000000000000..4e3ce8b9ef08c804f55fbe4c400ea1602baede30 --- /dev/null +++ b/plugins/tools-hdr.js @@ -0,0 +1,136 @@ + +const axios = require("axios"); +const FormData = require("form-data"); +const jimp = require("jimp"); + + + +let handler = async (m, { + conn, + usedPrefix, + command, + args +}) => { + const defaultScale = 2; + const defaultEnhance = false; + + const validScales = [2, 4, 6, 8, 16]; + const scale = args[0] ? parseInt(args[0]) : defaultScale; + if (!validScales.includes(scale)) { + return m.reply( + `Nilai untuk upscale harus salah satu dari: ${validScales.join(", ")}.`, + ); + } + + const enhance = args[1] ? args[1] === "true" : defaultEnhance; + if (args[1] && args[1] !== "true" && args[1] !== "false") { + return m.reply( + `Apakah foto kartun atau real? jika kartun true, jika real false.`, + ); + } + + let q = m.quoted ? m.quoted : m; + let mime = (q.msg || q).mimetype || q.mediaType || ""; + + if (!mime) { + return m.reply( + `Opsi Penggunaan\n\n1. Fotonya mana? Kirim foto dengan caption ${usedPrefix + command}.\n2. Nilai untuk upscale harus salah satu dari: ${validScales.join(", ")}. (${usedPrefix + command} < nomor >)\n3. Apakah foto kartun atau real? jika kartun true, jika real false. (${usedPrefix + command} < nomor > < true/false>)`, + ); + } + + if (!/image\/(jpe?g|png)/.test(mime)) { + return m.reply(`Tipe ${mime} tidak didukung!`); + } + + await m.reply("Mohon tunggu beberapa menit..."); + + let img; + try { + img = await q.download(); + } catch (error) { + return m.reply(`Gagal mendownload gambar: ${error.message}`); + } + + if (!img) { + return m.reply("Gagal mendownload gambar."); + } + + let response; + try { + response = await upscale(img, scale, enhance); + } catch (error) { + return m.reply(`Gagal melakukan upscale: ${error.message}`); + } + + if (!response || !response.status) { + return m.reply("Gagal melakukan upscale."); + } + + conn.sendFile(m.chat, response.image, "upscaled.jpg", 'Ini dia, Kak!', m); +}; + +handler.help = ["hd"]; +handler.tags = ["ai"]; +handler.command = /^(hd)$/i; +handler.limit = true; + +module.exports = handler; + +async function upscale(buffer, size = 2, anime = false) { + try { + return await new Promise((resolve, reject) => { + if (!buffer) return reject("Buffer input is undefined!"); + if (!Buffer.isBuffer(buffer)) return reject("Invalid buffer input"); + if (!/(2|4|6|8|16)/.test(size.toString())) + return reject("Invalid upscale size!"); + + jimp + .read(buffer) + .then((image) => { + const { + width, + height + } = image.bitmap; + let newWidth = width * size; + let newHeight = height * size; + + const form = new FormData(); + form.append("name", "upscale-" + Date.now()); + form.append("imageName", "upscale-" + Date.now()); + form.append("desiredHeight", newHeight.toString()); + form.append("desiredWidth", newWidth.toString()); + form.append("outputFormat", "png"); + form.append("compressionLevel", "none"); + form.append("anime", anime.toString()); + form.append("image_file", buffer, { + filename: "upscale-" + Date.now() + ".png", + contentType: "image/png", + }); + + axios + .post("https://api.upscalepics.com/upscale-to-size", form, { + headers: { + ...form.getHeaders(), + origin: "https://upscalepics.com", + referer: "https://upscalepics.com", + }, + }) + .then((res) => { + const data = res.data; + if (data.error) return reject("Error from upscaler API."); + resolve({ + status: true, + image: data.bgRemoved, + }); + }) + .catch(reject); + }) + .catch(reject); + }); + } catch (e) { + return { + status: false, + message: e.message + }; + } +} \ No newline at end of file diff --git a/plugins/tools-hlh.js b/plugins/tools-hlh.js new file mode 100644 index 0000000000000000000000000000000000000000..d20a644fab6d8b558fd1d4012ca52c6213ff3067 --- /dev/null +++ b/plugins/tools-hlh.js @@ -0,0 +1,12 @@ +let handler = async (m, { command, text, usedPrefix }) => { + if (!text) throw `*Example:* ${usedPrefix + command} halo`; + let ter = command[1].toLowerCase(); + let txt = text; + let transformedText = txt.replace(/[aiueo]/g, ter).replace(/[AIUEO]/g, ter.toUpperCase()); + await m.reply(transformedText); +} +handler.help = [...'aiueo'].map(v => `h${v}l${v}h <teks>`); +handler.tags = ['tools']; +handler.command = /^h([aiueo])l\1h/i; + +module.exports = handler; diff --git a/plugins/tools-img2prompt.js b/plugins/tools-img2prompt.js new file mode 100644 index 0000000000000000000000000000000000000000..708445abfae30a75362ab0da235286edbf6313b0 --- /dev/null +++ b/plugins/tools-img2prompt.js @@ -0,0 +1,30 @@ +const uploadImage = require('../lib/uploadImage'); +const fetch = require("node-fetch"); +let handler = async (m, { +conn, +usedPrefix, +command + }) => { + var q = m.quoted ? m.quoted : m + var mime = (q.msg || q).mimetype || q.mediaType || '' + if (/image/g.test(mime) && !/webp/g.test(mime)) { + await conn.reply(m.chat, wait, m) + try { + const img = await q.download?.() + let out = await uploadImage(img) + let data = await (await fetch(`https://api.botcahx.eu.org/api/tools/img2prompt?url=${out}&apikey=${btc}`)).json() + await m.reply(data.result) + } catch (e) { + console.log(e) + m.reply(`[ ! ] Identifikasi Gagal.`) + } + } else { + m.reply(`Kirim gambar dengan caption *${usedPrefix + command}* atau tag gambar yang sudah dikirim`) + } +}; +handler.help = ['img2prompt']; +handler.command = ['img2prompt']; +handler.tags = ['tools']; +handler.premium = false; +handler.limit = true; +module.exports = handler; diff --git a/plugins/tools-ipwho.js b/plugins/tools-ipwho.js new file mode 100644 index 0000000000000000000000000000000000000000..e70071476dcbefe1797ed29f2f31288a2cfdc411 --- /dev/null +++ b/plugins/tools-ipwho.js @@ -0,0 +1,21 @@ +let fetch = require('node-fetch'); +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `*Example:* ${usedPrefix + command} 112.90.150.204`; + try { + await m.reply(wait); + let res = await fetch(`https://ipwho.is/${text}`).then(result => result.json()); + await conn.sendMessage(m.chat, { location: { degreesLatitude: res.latitude, degreesLongitude: res.longitude }},{ ephemeralExpiration: 604800 }); + await delay(2000); + conn.reply(m.chat, JSON.stringify(res, null, 2), m); + } catch (e) { + throw { error: `IP ${text} not found!` }; + } +} +handler.command = handler.help = ['ip','ipwho']; +handler.tags = ['tools']; +handler.premium = false; +module.exports = handler; + +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/plugins/tools-join.js b/plugins/tools-join.js new file mode 100644 index 0000000000000000000000000000000000000000..8ec42a2af8a2570291a8801091baa1a1f72cf2fb --- /dev/null +++ b/plugins/tools-join.js @@ -0,0 +1,16 @@ +let linkRegex = /chat.whatsapp.com\/([0-9A-Za-z]{20,24})/i + +let handler = async (m, { conn, text }) => { + let [_, code] = text.match(linkRegex) || [] + if (!code) throw 'Link invalid' + let res = await conn.groupAcceptInvite(code) + m.reply(`Berhasil join grup ${res.gid}`) +} +handler.help = ['join <chat.whatsapp.com>'] +handler.tags = ['tools'] + +handler.command = /^join$/i + +handler.owner = true + +module.exports = handler diff --git a/plugins/tools-join.js.bak b/plugins/tools-join.js.bak new file mode 100644 index 0000000000000000000000000000000000000000..ef299984263000e3b6e574788eea860bb0f4f7f8 --- /dev/null +++ b/plugins/tools-join.js.bak @@ -0,0 +1,16 @@ +let linkRegex = /chat.whatsapp.com\/([0-9A-Za-z]{20,24})/i + +let handler = async (m, { conn, text }) => { + let [_, code] = text.match(linkRegex) || [] + if (!code) throw 'Link invalid' + let res = await conn.groupAcceptInvite(code) + m.reply(`Berhasil join grup ${res.gid}`) +} +handler.help = ['join <chat.whatsapp.com>'] +handler.tags = ['tools'] + +handler.command = /^join$/i + +handler.premium = true + +module.exports = handler diff --git a/plugins/tools-kalkulator.js b/plugins/tools-kalkulator.js new file mode 100644 index 0000000000000000000000000000000000000000..446578e7fb8cdae4b86a9698da132c2a3e904f94 --- /dev/null +++ b/plugins/tools-kalkulator.js @@ -0,0 +1,38 @@ +let handler = async (m, { conn, text }) => { + let id = m.chat + conn.math = conn.math ? conn.math : {} + if (id in conn.math) { + clearTimeout(conn.math[id][3]) + delete conn.math[id] + m.reply('Hmmm...ngecheat?') + } + let val = text + .replace(/[^0-9\-\/+*ร—รทฯ€Ee()piPI/]/g, '') + .replace(/ร—/g, '*') + .replace(/รท/g, '/') + .replace(/ฯ€|pi/gi, 'Math.PI') + .replace(/e/gi, 'Math.E') + .replace(/\/+/g, '/') + .replace(/\++/g, '+') + .replace(/-+/g, '-') + let format = val + .replace(/Math\.PI/g, 'ฯ€') + .replace(/Math\.E/g, 'e') + .replace(/\//g, 'รท') + .replace(/\*ร—/g, 'ร—') + try { + console.log(val) + let result = (new Function('return ' + val))() + if (!result) throw result + m.reply(`*${format}* = _${result}_`) + } catch (e) { + if (e == undefined) throw 'Isinya?' + throw 'Format salah, hanya 0-9 dan Simbol -, +, *, /, ร—, รท, ฯ€, e, (, ) yang disupport' + } +} +handler.help = ['kalkulator <soal>'] +handler.tags = ['tools'] +handler.command = /^(calc(ulat(e|or))?|kalk(ulator)?)$/i +handler.exp = 5 +handler.register = false +module.exports = handler diff --git a/plugins/tools-libur.js b/plugins/tools-libur.js new file mode 100644 index 0000000000000000000000000000000000000000..4b8cf9cdc46b31736ed9f4401c533ddb6ecf3029 --- /dev/null +++ b/plugins/tools-libur.js @@ -0,0 +1,36 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { command }) => { + const now = new Date(); + const month = now.getMonth() + 1; + const year = now.getFullYear(); + m.reply(wait); + try { + let res = await (await fetch(`https://widipe.com/kalender?bulan=${month}&tahun=${year}`)).json(); + let content = `*L I B U R N A S I O N A L*\n\n`; + + if (res.status) { + if (res.result && res.result.length > 0) { + const holiday = res.result[0]; + content += ` โ—ฆ *Tanggal:* ${holiday.holiday_date}\n`; + content += ` โ—ฆ *Nama Libur:* ${holiday.holiday_name}\n`; + content += ` โ—ฆ *Hari Nasional:* ${holiday.is_national_holiday ? 'Ya' : 'Tidak'}\n`; + } else { + content += 'Data libur tidak ditemukan.'; + } + } else { + content += 'Gagal mengambil data.'; + } + + await m.reply(content); + + } catch (error) { + throw eror; + } +}; + +handler.command = handler.help = ['libur', 'liburnasional'] +handler.tags = ['tools']; +handler.limit = true; + +module.exports = handler; diff --git a/plugins/tools-lookup.js b/plugins/tools-lookup.js new file mode 100644 index 0000000000000000000000000000000000000000..a4c873276bede714603d81806236d86983942fa0 --- /dev/null +++ b/plugins/tools-lookup.js @@ -0,0 +1,42 @@ +const fetch = require('node-fetch'); +const handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `Masukkan Domain/Sub Domain!\n\n*Contoh:* botcahx.eu.org`; + + if (text.includes('https://') || text.includes('http://')) throw `Tolong masukkan domain/sub domain secara lengkap. Contoh: botcahx.eu.org`; + + try { + // fetch pertama + const api_key = 'E4/gdcfciJHSQdy4+9+Ryw==JHciNFemGqOVIbyv'; + const res1 = await fetch(`https://api.api-ninjas.com/v1/dnslookup?domain=${text}`, { + headers: { 'X-Api-Key': api_key }, + contentType: 'application/json' + }) + .then(response => response.text()) + .catch(error => { + console.log(error); + return fetch(`https://api.hackertarget.com/dnslookup/?q=${text}`) + .then(response => response.text()) + .then(data => { + m.reply(`*Ini Adalah Hasil Dns Lookup Untuk ${text}:*\n${data}`); + console.log(data); + }) + .catch(error => { + console.error(error); + m.reply('*Tidak dapat memproses permintaan DNS Lookup*'); + }); + }); + m.reply(`*Ini Adalah Hasil Dns Lookup Untuk ${text}:*\n${res1}`); + console.log(res1); + + } catch (error) { + console.log(error); + m.reply('*Invalid data!*'); + } +}; + +handler.command = ['dnslookup', 'hackertarget', 'lookup','dns']; +handler.help = ['dnslookup', 'hackertarget', 'lookup','dns']; +handler.tags = ['tools']; +handler.premium = false; + +module.exports = handler; diff --git a/plugins/tools-npm.js b/plugins/tools-npm.js new file mode 100644 index 0000000000000000000000000000000000000000..52e4eff01f3c0fde2eaa78f7efc677c9463a2d05 --- /dev/null +++ b/plugins/tools-npm.js @@ -0,0 +1,17 @@ +let fetch = require('node-fetch') + +let handler = async (m, { text }) => { + if (!text) throw 'Input Query' + let res = await fetch(`http://registry.npmjs.com/-/v1/search?text=${text}`) + let { objects } = await res.json() + if (!objects.length) throw `Query "${text}" not found :/` + let txt = objects.map(({ package: pkg }) => { + return `*${pkg.name}* (v${pkg.version})\n_${pkg.links.npm}_\n_${pkg.description}_` + }).join`\n\n` + m.reply(txt) +} +handler.help = ['npmsearch'] +handler.tags = ['tools'] +handler.command = /^npm(js|search)?$/i +//maapin hyzer +module.exports = handler diff --git a/plugins/tools-nsfwdetector.js b/plugins/tools-nsfwdetector.js new file mode 100644 index 0000000000000000000000000000000000000000..fedfbafd12b4ce854b02a1ca72ba99ebb849a4cb --- /dev/null +++ b/plugins/tools-nsfwdetector.js @@ -0,0 +1,37 @@ +let fetch = require('node-fetch'); +let uploader = require('../lib/uploadImage'); + +let handler = async (m, { conn, command, usedPrefix }) => { + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || q.mediaType || '' + if (/image/g.test(mime) && !/webp/g.test(mime)) { + let buffer = await q.download() + await m.reply(wait) + try { + let media = await uploader(buffer) + let res = await (await fetch(`https://api.botcahx.eu.org/api/tools/nsfw-detect?url=${media}&apikey=${btc}`)).json() + if (res.status) { + let { labelName, labelId, confidence } = res.result; + let capt; + capt = `ไน‚ *N S F W D E T E C T O R*\n\n`; + capt += `โ—ฆ *Label Name* : ${labelName}\n`; + capt += `โ—ฆ *Label Id* : ${labelId}\n`; + capt += `โ—ฆ *Confidence* : ${confidence}\n`; + m.reply(capt); + } + + } catch (err) { + throw eror + } + } else { + throw `Reply image with command ${usedPrefix + command}` + } +} + +handler.help = ['nsfwdetector','nsfwdetect'] +handler.tags = ['tools'] +handler.command = /^(nsfwdetector|nsfwdetect)$/i +handler.limit = true; +handler.group = true; + +module.exports = handler diff --git a/plugins/tools-nulis.js b/plugins/tools-nulis.js new file mode 100644 index 0000000000000000000000000000000000000000..2e4c79875695bc88fca2d2964807ae3e0eee165d --- /dev/null +++ b/plugins/tools-nulis.js @@ -0,0 +1,71 @@ + const { format } = require('util') +// let path = require('path') +const { spawn } = require('child_process') + +// Font By MFarelS:V +let fontPath = 'src/font/Zahraaa.ttf' +let handler = async (m, { conn, args }) => { + if (!global.support.convert && + !global.support.magick && + !global.support.gm) return handler.disabled = true // Disable if doesnt support + let inputPath = 'src/kertas/magernulis1.jpg' + let d = new Date() + let tgl = d.toLocaleDateString('id-Id') + let hari = d.toLocaleDateString('id-Id', { weekday: 'long' }) + let teks = args.join` ` + // conn.reply(m.chat, util.format({fontPath, inputPath, outputPath, tgl, hari, teks}), m) + let bufs = [] + const [_spawnprocess, ..._spawnargs] = [...(global.support.gm ? ['gm'] : global.support.magick ? ['magick'] : []), + 'convert', + inputPath, + '-font', + fontPath, + '-size', + '1024x784', + '-pointsize', + '20', + '-interline-spacing', + '1', + '-annotate', + '+806+78', + hari, + '-font', + fontPath, + '-size', + '1024x784', + '-pointsize', + '18', + '-interline-spacing', + '1', + '-annotate', + '+806+102', + tgl, + '-font', + fontPath, + '-size', + '1024x784', + '-pointsize', + '20', + '-interline-spacing', + '-7.5', + '-annotate', + '+344+142', + teks, + 'jpg:-' + ] + spawn(_spawnprocess, _spawnargs) + .on('error', e => m.reply(format(e))) + .on('close', () => { + conn.sendFile(m.chat, Buffer.concat(bufs), 'nulis.jpg', 'Hatiยฒ ketahuan:v', m) + }) + .stdout.on('data', chunk => bufs.push(chunk)) +} +handler.help = ['n'].map(v => v + 'ulis <teks>') +handler.tags = ['tools'] +handler.command = /^nulis$/i + + +module.exports = handler + +// BY MFARELS NJEENK +// https://GitHub.com/MFarelS/ diff --git a/plugins/tools-ocr.js b/plugins/tools-ocr.js new file mode 100644 index 0000000000000000000000000000000000000000..e891f6c8ec3040035ccbc5ca4c2f15345e6f6c70 --- /dev/null +++ b/plugins/tools-ocr.js @@ -0,0 +1,36 @@ +let fetch = require('node-fetch'); +let FormData = require('form-data'); +let { fromBuffer } = require('file-type'); +let ocrapi = require("ocr-space-api-wrapper") + +let handler = async (m, { conn, text }) => { + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || '' + if (!mime) throw `balas gambar dengan perintah .ocr` + if (!/image\/(jpe?g|png)/.test(mime)) throw `_*jenis ${mime} tidak didukung!*_` + let img = await q.download() + let url = await uploader(img) + let hasil = await ocrapi.ocrSpace(url) + await m.reply(hasil.ParsedResults[0].ParsedText) +} + +handler.help = ['ocr', 'totext'] +handler.tags = ['tools'] +handler.command = /^(ocr|totext)$/i +handler.limit = true + +module.exports = handler + +async function uploader(buffer) { + let { ext } = await fromBuffer(buffer); + bodyForm = new FormData(); + bodyForm.append("file", buffer, "file." + ext); + + let res = await fetch("https://file.btch.rf.gd/api/upload.php", { + method: "post", + body: bodyForm, + }); + + let data = await res.json() + return data.result.url || 'null' +} diff --git a/plugins/tools-ogg.js b/plugins/tools-ogg.js new file mode 100644 index 0000000000000000000000000000000000000000..25a5e5b9accf2812ec9431f5466ab1cb493d9cd3 --- /dev/null +++ b/plugins/tools-ogg.js @@ -0,0 +1,27 @@ +const { toAudio, toPTT } = require('../lib/converter') + +let handler = async (m, { conn, usedPrefix, command }) => { + let q = m.quoted ? m.quoted : m + let mime = (m.quoted ? m.quoted : m.msg).mimetype || '' + if (/mp3|a(udio)?$/i.test(command)) { + if (!/video|audio/.test(mime)) throw `Balas video/audio dengan perintah *${usedPrefix + command}*` + let media = await q.download() + if (!media) throw 'Media tidak dapat diunduh' + let audio = await toAudio(media, 'mp4') + if (!audio.data) throw 'Gagal melakukan konversi.' + conn.sendMessage(m.chat, {document: audio.data, mimetype: 'audio/mpeg', fileName: `audio.mp3`}, { quoted : m }) + } + if (/vn|ptt$/i.test(command)) { + if (!/video|audio/.test(mime)) throw `Balas video/audio dengan perintah *${usedPrefix + command}*` + let media = await q.download() + if (!media) throw 'Media tidak dapat diunduh' + let audio = await toPTT(media, 'mp4') + if (!audio.data) throw 'Gagal melakukan konversi.' + await conn.sendFile(m.chat, audio.data, 'file.mp4', '', m, 1, { mimetype: 'audio/mp4' }) + } +} +handler.help = ['tomp3', 'tovn'] +handler.tags = ['voice'] +handler.command = /^to(mp3|vn|ptt)$/i + +module.exports = handler diff --git a/plugins/tools-pesan.js b/plugins/tools-pesan.js new file mode 100644 index 0000000000000000000000000000000000000000..7eca64739b6bfad1bbaca535e974978d1fd4da90 --- /dev/null +++ b/plugins/tools-pesan.js @@ -0,0 +1,32 @@ +let handler = async(m, { conn, text, usedPrefix }) => { +let [number, pesan] = text.split `|` + + if (!number) return conn.reply(m.chat, 'Silahkan masukan nomor yang akan dikirim\n_Contoh : .pesan 6281395861695|Halo Bang_', m) + if (!pesan) return conn.reply(m.chat, 'Silahkan masukan pesannya\n_Contoh : .pesan 6281395861695|Halo Bang_', m) + if (text > 500) return conn.reply(m.chat, 'Teks Kepanjangan!', m) + + let user = global.db.data.users[m.sender] + + let korban = `${number}` + var nomor = m.sender + let spam1 = `*ใ€Œ PENITIPAN PESAN ใ€*\n\nUntuk : wa.me/${korban}\nPesan : ${pesan}\n\n*${global.wm}*` + + conn.reply(korban + '@s.whatsapp.net', spam1, m) + + let logs = `[ โœ”๏ธ ] Berhasil mengirim pesan wa ke nomor wa.me/${korban}` + conn.reply(m.chat, logs, m) +} +handler.command = /^(pesan|chat)$/i +handler.rowner = false +handler.limit = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.limit = false + +module.exports = handler \ No newline at end of file diff --git a/plugins/tools-ping.js b/plugins/tools-ping.js new file mode 100644 index 0000000000000000000000000000000000000000..7dad40e8bc87b51ad24f988f1f48c539d36904ad --- /dev/null +++ b/plugins/tools-ping.js @@ -0,0 +1,179 @@ +var { totalmem, +freemem + } = require('os') +var os = require("os"); +var util = require("util"); +var osu = require("node-os-utils"); +var { performance } = require("perf_hooks"); +var { sizeFormatter } = require("human-readable"); +var format = sizeFormatter({ + std: "JEDEC", // 'SI' (default) | 'IEC' | 'JEDEC' + decimalPlaces: 2, + keepTrailingZeroes: false, + render: (literal, symbol) => `${literal} ${symbol}B`, +}) +var handler = async (m, { +conn +}) => { + const chats = Object.entries(conn.chats).filter(([id, data]) => id && data.isChats) + const groupsIn = chats.filter(([id]) => id.endsWith('@g.us')) //groups.filter(v => !v.read_only) + const used = process.memoryUsage() + const cpus = os.cpus().map(cpu => { + cpu.total = Object.keys(cpu.times).reduce((last, type) => last + cpu.times[type], 0) + return cpu + }) + const cpu = cpus.reduce( + (last, cpu, _, { length }) => { + last.total += cpu.total; + last.speed += cpu.speed / length; + last.times.user += cpu.times.user; + last.times.nice += cpu.times.nice; + last.times.sys += cpu.times.sys; + last.times.idle += cpu.times.idle; + last.times.irq += cpu.times.irq; + return last; + }, + { + speed: 0, + total: 0, + times: { + user: 0, + nice: 0, + sys: 0, + idle: 0, + irq: 0, + }, + } + ); + var _muptime + if (process.send) { + process.send('uptime') + _muptime = await new Promise(resolve => { + process.once('message', resolve) + setTimeout(resolve, 1000) + }) * 1000 + } + var muptime = clockString(_muptime) + var old = performance.now(); + var neww = performance.now(); + var speed = neww - old; + var cpux = osu.cpu + var cpuCore = cpux.count() + var drive = osu.drive + var mem = osu.mem + var netstat = osu.netstat + var HostN = osu.os.hostname() + var OS = osu.os.platform() + var cpuModel = cpux.model() + + var d = new Date(new Date + 3600000) + var locale = 'id' + var weeks = d.toLocaleDateString(locale, { weekday: 'long' }) + var dates = d.toLocaleDateString(locale, { + day: 'numeric', + month: 'long', + year: 'numeric' + }) + var times = d.toLocaleTimeString(locale, { + hour: 'numeric', + minute: 'numeric', + second: 'numeric' + }) +await m.reply('_Testing speed..._') + var txt = `*แด˜ ษช ษด ษข* +${Math.round(neww - old)} ms +${speed} ms + +*ส€ แดœ ษด แด› ษช แด แด‡* +${muptime} + +*แด„ สœ แด€ แด› s* +โ€ข *${groupsIn.length}* Group Chats +โ€ข *${groupsIn.length}* Groups Joined +โ€ข *${groupsIn.length - groupsIn.length}* Groups Left +โ€ข *${chats.length - groupsIn.length}* Personal Chats +โ€ข *${chats.length}* Total Chats + +*s แด‡ ส€ แด  แด‡ ส€* +*๐Ÿ›‘ ส€แด€แด:* ${format(totalmem() - freemem())} / ${format(totalmem())} +*๐Ÿ”ต า“ส€แด‡แด‡RAM:* ${format(freemem())} +*๐Ÿ”ด แด„แด˜แดœ แด›สแด˜แด‡:* ${require('os').cpus()[0].model} +*๐Ÿ”ญ แด˜สŸแด€แด›า“แดส€แด:* ${os.platform()} +*๐Ÿงฟ sแด‡ส€แด แด‡ส€:* ${os.hostname()} +*๐Ÿ’ป แดs:* ${OS} +*โฐ แด›ษชแดแด‡ sแด‡ส€แด แด‡ส€:* ${times} + +_NodeJS Memory Usage_ +${ + "```" + + Object.keys(used) + .map( + (key, _, arr) => + `${key.padEnd(Math.max(...arr.map((v) => v.length)), " ")}: ${format( + used[key] + )}` + ) + .join("\n") + + "```" +} + +${ + cpus[0] + ? `_Total CPU Usage_ +${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")} + +_CPU Core(s) Usage (${cpus.length} Core CPU)_ +${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")}` + : "" +} +` +conn.relayMessage(m.chat, { +extendedTextMessage:{ + text: txt, + contextInfo: { + externalAdReply: { + title: `${require('os').cpus()[0].model}`, + mediaType: 1, + previewType: 0, + renderLargerThumbnail: true, + thumbnailUrl: 'https://telegra.ph/file/ec8cf04e3a2890d3dce9c.jpg', + sourceUrl: '' + } + }, mentions: [m.sender] +}}, {}) +} +handler.help = ['ping', 'speed']; +handler.tags = ['info']; +handler.command = /^(ping|speed|pong|ingfo)$/i +module.exports = handler; + +function clockString(ms) { + var d = isNaN(ms) ? '--' : Math.floor(ms / 86400000) + var h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) % 24 + var m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 + var s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 + return [d, 'D ', h, 'H ', m, 'M ', s, 'S '].map(v => v.toString().padStart(2, 0)).join('') +} diff --git a/plugins/tools-pln.js b/plugins/tools-pln.js new file mode 100644 index 0000000000000000000000000000000000000000..bde4869a18438f2ddd66673e6350a90179f69820 --- /dev/null +++ b/plugins/tools-pln.js @@ -0,0 +1,68 @@ +let fetch = require('node-fetch'); + +let handler = async (m, { + text, + usedPrefix, + command + }) => { +if (!text) throw `*Example:* ${usedPrefix + command} 172720204487` + m.reply(wait) + try { + let res = await (await fetch(`https://api.botcahx.eu.org/api/tools/cekbillpln?id=${text}&apikey=${btc}`)).json(); + let content = `*T A G I H A N P L N*\n\n`; + + if (res.status && res.result) { + content += ` โ—ฆ *Tanggal:* ${res.result.date}\n`; + content += ` โ—ฆ *Waktu:* ${res.result.time}\n`; + content += ` โ—ฆ *Nama*: ${res.result.name}\n\n`; + + if (res.result.isINQ) { + content += ` โ—ฆ *ID Pelanggan:* ${text}\n`; + content += ` โ—ฆ *Pesan Tambahan:* ${res.result.addMsg}\n`; + content += ` โ—ฆ *Tarif/Daya:* ${res.result.tarif_daya}\n\n`; + + content += `*Tagihan Bulanan:*\n`; + res.result.loop.forEach(item => { + content += ` โ—ฆ - ${item}\n`; + }); + content += `\n`; + + content += ` โ—ฆ - Bulan Tagihan: ${res.result.blTh}\n`; + content += ` โ—ฆ - Stand Meter: ${res.result.standMeter}\n\n`; + + content += `*Rincian Pembayaran:*\n`; + content += ` โ—ฆ - Tagihan: Rp ${res.result.rpTag}\n`; + content += ` โ—ฆ - Admin Bank: Rp ${res.result.adminBank}\n`; + content += ` โ—ฆ - Total: Rp ${res.result.tagihan}\n\n`; + + content += `*Pembayaran:*\n`; + content += ` โ—ฆ - Bayar: Rp ${res.result.bayar}\n`; + content += ` โ—ฆ - Non-Subsidi: Rp ${res.result.nonSubsidi}\n`; + content += ` โ—ฆ - Cashback: Rp ${res.result.cashback}\n`; + content += ` โ—ฆ - Diskon: Rp ${res.result.discountText}\n\n`; + + content += `*Tunggakan:* ${res.result.tunggakan ? 'Ada' : 'Tidak Ada'}\n\n`; + + content += `*Outlet:*\n`; + content += ` โ—ฆ - ID Outlet: ${res.result.outletData.id_outlet}\n`; + content += ` โ—ฆ - Nama Pemilik: ${res.result.outletData.nama_pemilik}\n`; + content += ` โ—ฆ - No. Telepon Pemilik: ${res.result.outletData.notelp_pemilik}\n`; + content += ` โ—ฆ - Email Pemilik: ${res.result.outletData.email}\n\n`; + + content += `${res.result.footer1}\n`; + content += `${res.result.footer2}\n`; + } else { + content += 'Data tagihan tidak ditemukan.'; + } + } else { + content += 'Gagal mengambil data.'; + } + await m.reply(content); + } catch (error) { + throw eror + } + }; +handler.command = handler.help = ['cekbillpln','tagihanpln','pln']; +handler.tags = ['tools']; +handler.limit = true +module.exports = handler; diff --git a/plugins/tools-profile.js b/plugins/tools-profile.js new file mode 100644 index 0000000000000000000000000000000000000000..37be64f6f72544eca79ae9c2d5e8c945b216b534 --- /dev/null +++ b/plugins/tools-profile.js @@ -0,0 +1,123 @@ +let PhoneNumber = require('awesome-phonenumber') +let levelling = require('../lib/levelling') +const { createHash } = require('crypto') +const axios = require ("axios") +const fetch = require("node-fetch") +let handler = async (m, { conn, text, usedPrefix, command }) => { + function no(number){ + return number.replace(/\s/g,'').replace(/([@+-])/g,'') + } + + text = no(text) + + if(isNaN(text)) { + var number = text.split`@`[1] + } else if(!isNaN(text)) { + var number = text + } + + if(!text && !m.quoted) return conn.reply(m.chat, `*โ GET NUMBER*\n\nโ€ข \`\`\`\Tag user:\`\`\`\ *${usedPrefix}profile @Tag*\nโ€ข \`\`\`\Type number:\`\`\`\ *${usedPrefix}profile 6289654360447*\nโ€ข \`\`\`\Check my profile:\`\`\`\ *(Balas / Reply Pesan Anda Sendiri)*\nโ€ข \`\`\`\Reply user which want in\`\`\`\ _*STALKING*_`, m) + if(isNaN(number)) return conn.reply(m.chat, `*โ GET NUMBER*\n\nโ€ข \`\`\`\Tag user:\`\`\`\ *${usedPrefix}profile @Tag*\nโ€ข \`\`\`\Type number:\`\`\`\ *${usedPrefix}profile 6289654360447*\nโ€ข \`\`\`\Check my profile:\`\`\`\ *(Balas / Reply Pesan Anda Sendiri)*\nโ€ข \`\`\`\Reply user which want in\`\`\`\ _*STALKING*_`, m) + if(number.length > 15) return conn.reply(m.chat, `*โ GET NUMBER*\n\nโ€ข \`\`\`\Tag user:\`\`\`\ *${usedPrefix}profile @Tag*\nโ€ข \`\`\`\Type number:\`\`\`\ *${usedPrefix}profile 6289654360447*\nโ€ข \`\`\`\Check my profile:\`\`\`\ *(Balas / Reply Pesan Anda Sendiri)*\nโ€ข \`\`\`\Reply user which want in\`\`\`\ _*STALKING*_`, m) + let pp = 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSXIdvC1Q4WL7_zA6cJm3yileyBT2OsWhBb9Q&usqp=CAU' + try { + //pp = await conn.updateProfilePicture(text) + if(text) { + var who = number + '@s.whatsapp.net' + } else if(m.quoted.sender) { + var who = m.quoted.sender + } else if(m.mentionedJid) { + var who = number + '@s.whatsapp.net' + } + //let pp = './src/avatar_contact.png' + pp = await conn.profilePictureUrl(who, 'image') + } catch (e) { + //pp = 'https://telegra.ph/file/32ffb10285e5482b19d89.jpg' + //} catch (e) { + } finally { + if (typeof db.data.users[who] == 'undefined') throw 'Pengguna tidak ada didalam data base' + let groupMetadata = m.isGroup ? await conn.groupMetadata(m.chat) : {} + let participants = m.isGroup ? groupMetadata.participants : [] + let users = m.isGroup ? participants.find(u => u.jid == who) : {} + let number = who.split('@')[0] + //let pp = await conn.updateProfilePicture(who) + let about = (await conn.fetchStatus(who).catch(console.error) || {}).status || '' + let { name, pasangan, limit, exp, money, bank, lastclaim, premiumDate, premium, registered, regTime, age, level, role } = global.db.data.users[who] + let now = new Date() * 1 + let { min, xp, max } = levelling.xpRange(level, global.multiplier) + let username = conn.getName(who) + // let buffer = await getBuffer(pp) + let math = max - xp + let sn = createHash('md5').update(m.sender).digest('hex') + let prem = global.prems.includes(who.split`@`[0]) + let jodoh = `Berpacaran @${pasangan.split`@`[0]}` + let str = ` +โ”Œโ”€โŠท *PROFILE* +๐Ÿ‘ค โ€ข *Username:* ${username} ${registered ? '(' + name + ') ': ''}(@${who.split`@`[0]}) +๐Ÿ‘ฅ โ€ข *About:* ${about ? '\n: ' + about : ''} +๐Ÿท โ€ข *Status:* ${pasangan ? jodoh : 'Jomblo' } +๐Ÿ“ž โ€ข *Number:* ${PhoneNumber('+' + who.replace('@s.whatsapp.net', '')).getNumber('international')} +๐Ÿ”ข โ€ข *Serial Number:* ${sn} +๐Ÿ”— โ€ข *Link:* https://wa.me/${who.split`@`[0]} +๐Ÿ‘ฅ โ€ข *Umur:* ${registered ? age : ''} +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +โ”Œโ”€โŠท *PROFILE RPG* +โ–ข XP: TOTAL ${exp} (${exp - min} / ${xp}) [${math <= 0 ? `Ready to *${usedPrefix}levelup*` : `${math} XP left to levelup`}] +โ–ข Level: ${level} +โ–ข Role: *${role}* +โ–ข Limit: ${limit} +โ–ข Money: ${money} +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +โ”Œโ”€โŠท *STATUS* +๐Ÿ“‘ โ€ข *Registered:* ${registered ? 'Yes (' + new Date(regTime) + ')': 'No'} +๐ŸŒŸ โ€ข *Premium:* ${premium ? 'Yes' : 'No'} +โฐ โ€ข *PremiumTime:* ${(premiumDate - now) > 1 ? msToDate(premiumDate - now) : '*Tidak diatur expired premium!*'}${lastclaim > 0 ? '\nLast Claim: ' + new Date(lastclaim) : ''} +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +`.trim() + let mentionedJid = [who] + conn.sendFile(m.chat, pp, 'pp.jpg', str, m, false, { contextInfo: { mentionedJid: conn.parseMention(str) }}) + } +} +handler.help = ['profile [@user]'] +handler.tags = ['info'] +handler.command = /^profile$/i +handler.limit = true +handler.register = false +handler.group = true + +module.exports = handler + +function msToDate(ms) { + temp = ms + days = Math.floor(ms / (24*60*60*1000)); + daysms = ms % (24*60*60*1000); + hours = Math.floor((daysms)/(60*60*1000)); + hoursms = ms % (60*60*1000); + minutes = Math.floor((hoursms)/(60*1000)); + minutesms = ms % (60*1000); + sec = Math.floor((minutesms)/(1000)); + return days+" Hari "+hours+" Jam "+ minutes + " Menit"; + // +minutes+":"+sec; + } + + const getBuffer = async (url, options) => { + try { + options ? options : {} + const res = await axios({ + method: "get", + url, + headers: { + 'DNT': 1, + 'User-Agent': 'GoogleBot', + 'Upgrade-Insecure-Request': 1 + }, + ...options, + responseType: 'arraybuffer' + }) + return res.data + } catch (e) { + console.log(`Error : ${e}`) + } + } diff --git a/plugins/tools-qr.js b/plugins/tools-qr.js new file mode 100644 index 0000000000000000000000000000000000000000..f1fbc083314659efa0f3378c1b7a03ea3ba0976e --- /dev/null +++ b/plugins/tools-qr.js @@ -0,0 +1,15 @@ +let qrcode = require("qrcode") + +let handler = async (m, { conn, text }) => { + if (!text) throw 'teksnya mana?' + conn.sendFile(m.chat, await qrcode.toDataURL(text.slice(0, 2048), { scale: 8 }), 'qrcode.png', '', m) +} +handler.help = ['', 'code'].map(v => 'qr' + v + ' <teks>') +handler.tags = ['tools'] +handler.command = /^qr(code)?$/i +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler diff --git a/plugins/tools-react.js b/plugins/tools-react.js new file mode 100644 index 0000000000000000000000000000000000000000..6680bbff9dd909d1f22925515d4ac9a4245f0572 --- /dev/null +++ b/plugins/tools-react.js @@ -0,0 +1,18 @@ +let handler = async (m, { conn, usedPrefix: _p, __dirname, args, text, usedPrefix}) => { + let notreply = 'Balas Chatnya !' + if (!m.quoted) throw notreply + let notemo = `๐Ÿ“ Contoh Penggunaan :\n${usedPrefix}react ๐Ÿ—ฟ` + if (!text) throw notemo +conn.relayMessage(m.chat, { reactionMessage: { +key: { + id: m.quoted.id, + remoteJid: m.chat, + fromMe: true +}, + text: `${text}`}}, { messageId: m.id }) + } + handler.help = ['react <emoji>'] +handler.tags = ['tools'] +handler.command = /^(react)$/i + +module.exports = handler diff --git a/plugins/tools-readmore.js b/plugins/tools-readmore.js new file mode 100644 index 0000000000000000000000000000000000000000..c9f3c94e27ac9f7368a9e1e02a02f5357f2d7b93 --- /dev/null +++ b/plugins/tools-readmore.js @@ -0,0 +1,24 @@ +let handler = async (m, { conn, text }) => { + let [ l, r ] = text.split`|` + if (!l) l = '' + if (!r) r = '' + conn.reply(m.chat, l + readMore + r, m) +} +handler.help = ['readmore'].map(v => v + ' <teks>|<teks>') +handler.tags = ['tools'] +handler.command = /^(spoiler|hidetext|readmore|selengkapnya)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null + +module.exports = handler + +const more = String.fromCharCode(8206) +const readMore = more.repeat(4001) diff --git a/plugins/tools-recolor.js b/plugins/tools-recolor.js new file mode 100644 index 0000000000000000000000000000000000000000..f8a69f98caa7091577a5c59b4c8be54a88108230 --- /dev/null +++ b/plugins/tools-recolor.js @@ -0,0 +1,34 @@ +const uploadImage = require('../lib/uploadImage'); +const fetch = require("node-fetch"); +let handler = async (m, { +conn, +usedPrefix, +command + }) => { + var q = m.quoted ? m.quoted : m + var mime = (q.msg || q).mimetype || q.mediaType || '' + if (/image/g.test(mime) && !/webp/g.test(mime)) { + await conn.reply(m.chat, wait, m) + try { + const img = await q.download?.() + let out = await uploadImage(img) + let old = new Date() + let res = await fetch(`https://api.botcahx.eu.org/api/tools/recolor?url=${out}&apikey=${btc}`) + let convert = await res.json() + let buff = await fetch(convert.result) + .then(res => res.buffer()) + await conn.sendMessage(m.chat, { image: buff, caption: `๐ŸŸ *Fetching* : ${((new Date - old) * 1)} ms` }, { quoted: m }) + } catch (e) { + console.log(e) + m.reply(`[ ! ] Identifikasi Gagal.`) + } + } else { + m.reply(`Kirim gambar dengan caption *${usedPrefix + command}* atau tag gambar yang sudah dikirim`) + } +}; +handler.help = ['recolor']; +handler.command = ['recolor']; +handler.tags = ['maker']; +handler.premium = false; +handler.limit = 5; +module.exports = handler; diff --git a/plugins/tools-remini.js b/plugins/tools-remini.js new file mode 100644 index 0000000000000000000000000000000000000000..7d4f343877df0295aa6b6391eac72b4fd4403bd5 --- /dev/null +++ b/plugins/tools-remini.js @@ -0,0 +1,30 @@ +const fetch = require('node-fetch'); +const uploadImage = require('../lib/uploadImage.js'); + +async function handler(m, { conn, usedPrefix, command }) { + try { + const q = m.quoted ? m.quoted : m; + const mime = (q.msg || q).mimetype || q.mediaType || ''; + if (/^image/.test(mime) && !/webp/.test(mime)) { + const img = await q.download(); + const out = await uploadImage(img); + const api = await fetch(`https://api.botcahx.eu.org/api/tools/remini?url=${out}&apikey=${btc}`); + const image = await api.json(); + const { url } = image + conn.sendFile(m.chat, url, null, wm, m); + } else { + m.reply(`Kirim gambar dengan caption *${usedPrefix + command}* atau tag gambar yang sudah dikirim.`); + } + } catch (e) { + console.error(e); + m.reply(`Identifikasi gagal. Silakan coba lagi.`); + } +} + +handler.help = ['remini']; +handler.tags = ['tools']; +handler.command = ['remini']; +handler.premium = false; +handler.limit = false; + +module.exports = handler; diff --git a/plugins/tools-removebg.js b/plugins/tools-removebg.js new file mode 100644 index 0000000000000000000000000000000000000000..552cc976732921cbda29c6991ceb67bdc1148da3 --- /dev/null +++ b/plugins/tools-removebg.js @@ -0,0 +1,52 @@ +const axios = require('axios'); +const FormData = require('form-data'); +const fs = require('fs'); +const path = require('path'); + +async function removeBG(url) { + try { + const formData = new FormData(); + formData.append('size', 'auto'); + formData.append('image_url', url); + + let { data } = await axios({ + method: 'post', + url: 'https://api.remove.bg/v1.0/removebg', + data: formData, + responseType: 'arraybuffer', + headers: { + ...formData.getHeaders(), + 'X-Api-Key': 'wjw84kiS5YHF6WP5ncgk9ckj', + }, + encoding: null + }) + + return { status: true, buffer: data} + } catch(e) { + return { status: false, msg: "Failed Request !" } + } +} + +let handler = async (m, { conn, usedPrefix, command, text }) => { + let who = + m.mentionedJid && m.mentionedJid[0] + ? m.mentionedJid[0] + : m.fromMe + ? conn.user.jid + : m.sender; + let name = await conn.getName(who); + let q = m.quoted ? m.quoted : m; + let mime = (q.msg || q).mimetype || ""; + if (!mime) throw `*โ€ข Example :* ${usedPrefix + command} *[reply/send media]*`; + m.reply(wait); + let media = await q.download(); + let url = await Uploader.Uguu(media); + let hasil = await removeBG(url); + await conn.sendFile(m.chat, hasil.buffer, "", done, m); +}; +handler.help = ["removebg", "nobg"].map((a) => a + " *[reply/send media]*"); +handler.tags = ["tools"]; +handler.command = ["removebg","nobg"]; +handler.limit = true; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/tools-repeat.js b/plugins/tools-repeat.js new file mode 100644 index 0000000000000000000000000000000000000000..4783322400b7fe602bd86f9ef270b30a3215b245 --- /dev/null +++ b/plugins/tools-repeat.js @@ -0,0 +1,1023 @@ +let handler = async (m, { conn, text }) => { + + if (!text) return conn.reply(m.chat, 'Harap Masukan Teks yang akan direpeat!', m) + + conn.reply(m.chat, ` +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +${text} +`.trim(), m) +} +handler.help = ['repeat <teks>'] +handler.tags = ['tools'] +handler.command = /^(repeat)$/i +handler.owner = false +handler.mods = false +handler.premium = false +handler.group = false +handler.private = false + +handler.admin = false +handler.botAdmin = false + +handler.fail = null +handler.limit = true + +module.exports = handler diff --git a/plugins/tools-resize.js b/plugins/tools-resize.js new file mode 100644 index 0000000000000000000000000000000000000000..82ba1e1b314d8e9ec6fe044aed3ea0c99deb34e5 --- /dev/null +++ b/plugins/tools-resize.js @@ -0,0 +1,49 @@ +const jimp = require("jimp") +const uploadImage = require("../lib/uploadImage.js") +const uploadFile = require("../lib/uploadFile.js") + +let handler = async (m, { conn, usedPrefix, args }) => { + let toWidth = args[0] + let toHeight = args[1] + if (!toWidth) throw 'Please provide the width.' + if (!toHeight) throw 'Please provide the height.' + let quotedMsg = m.quoted ? m.quoted : m + let mime = (quotedMsg.msg || quotedMsg).mimetype || '' + if (!mime) throw "Media not found." + + let media = await quotedMsg.download() + let isMedia = /image\/(png|jpe?g|gif)|video\/mp4/.test(mime) + if (!isMedia) throw `The "${mime}" type is not supported.` + let link = await (isMedia ? uploadImage : uploadImage)(media) + let source = await jimp.read(await link) + let size = { + before: { + height: await source.getHeight(), + width: await source.getWidth() + }, + after: { + height: toHeight, + width: toWidth, + } + } + let compres = await conn.resize(link, toWidth - 0, toHeight - 0) + let linkCompres = await (isMedia ? uploadImage : uploadImage)(compres) + conn.sendFile(m.chat, compres, null, ` +โ€ข BEFORE +*+* Width : ${size.before.width} +*+* Height : ${size.before.height} + +โ€ข AFTER +*+* Width : ${size.after.width} +*+* Height : ${size.after.height} + +โ€ข LINK +*+* Original: ${link} +*+* Compressed: ${linkCompres}`, m) +} + +handler.help = ['resize <width> <height> (reply|caption)'] +handler.tags = ['tools'] +handler.command = /^(resize)$/i + +module.exports = handler diff --git a/plugins/tools-rvo.js b/plugins/tools-rvo.js new file mode 100644 index 0000000000000000000000000000000000000000..7599b48829005ccd81d2e10496235e03e6c1b0f8 --- /dev/null +++ b/plugins/tools-rvo.js @@ -0,0 +1,37 @@ +/* +Script By Reelly XD + โ€ข YT: ReellyXD + โ€ข IG: reellyxd +Buy Script? + โ€ข WA: +62 857-0436-85323 + โ€ข TELE: t.me/rely_xd + โ€ข Github: github.com/ReellyXD +*/ + +const { downloadContentFromMessage } = require('@adiwajshing/baileys') + +let handler = async (m, { conn }) => { + if (!m.quoted) throw 'Reply gambar/video yang ingin Anda lihat' + if (m.quoted.mtype !== 'viewOnceMessageV2') throw 'Ini bukan pesan viewonce.' + let msg = m.quoted.message + let type = Object.keys(msg)[0] + let media = await downloadContentFromMessage(msg[type], type == 'imageMessage' ? 'image' : 'video') + let buffer = Buffer.from([]) + for await (const chunk of media) { + buffer = Buffer.concat([buffer, chunk]) + } + if (/video/.test(type)) { + return conn.sendFile(m.chat, buffer, 'media.mp4', msg[type].caption || '', m) + } else if (/image/.test(type)) { + return conn.sendFile(m.chat, buffer, 'media.jpg', msg[type].caption || '', m) + } +} + +handler.help = ['readvo'] +handler.tags = ['tools'] +handler.command = ['readviewonce', 'read', 'rvo', 'liat', 'readvo'] +handler.premium = false +handler.register = false +handler.limit = true + +module.exports = handler diff --git a/plugins/tools-say.js b/plugins/tools-say.js new file mode 100644 index 0000000000000000000000000000000000000000..e636c4896b14f81a6f574c85e0135df7d33b4d1e --- /dev/null +++ b/plugins/tools-say.js @@ -0,0 +1,9 @@ +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) throw `Harap masukkan text!\n\ncontoh:\n${usedPrefix + command} Haruno` + conn.reply(m.chat, text, null) +} +handler.help = ['say <teks>'] +handler.tags = ['tools'] +handler.command = /^(say)$/i + +module.exports = handler diff --git a/plugins/tools-subfinder.js b/plugins/tools-subfinder.js new file mode 100644 index 0000000000000000000000000000000000000000..7561d54fc18dd02adc2f54335d9bf24023006d1c --- /dev/null +++ b/plugins/tools-subfinder.js @@ -0,0 +1,33 @@ +const fetch = require("node-fetch"); +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `Masukkan Domain!\n\n*Contoh:* botcahx.eu.org`; + if (text.includes('https://') || text.includes('http://')) throw `Tolong masukkan tanpa domain *https/http!*. Contoh: botcahx.eu.org`; + + try { + const waiting = `_Sedang mencari informasi Subdomain untuk ${text}..._`; + m.reply(waiting); + let data = await fetch(`https://api.botcahx.eu.org/api/tools/subdomain-finder?query=${text}&apikey=${btc}`) + .then(result => result.json()) + .then(response => { + if (response.status && response.code === 200) { + let subdomains = response.result; + let message = `Subdomain untuk ${text}:\n\n` + subdomains.map((sub, i) => `${i + 1}. ${sub}`).join('\n'); + m.reply(message); + } else { + m.reply('Terjadi kesalahan saat mengambil data subdomain. Silakan coba lagi nanti.'); + } + }) + .catch(error => { + m.reply('Terjadi error saat mencari informasi Subdomain, silakan coba lagi nanti'); + }); + } catch (error) { + m.reply('Terjadi error saat mencari informasi Subdomain, silakan coba lagi nanti'); + } +}; + +handler.command = ['subdomainfinder', 'subfinder']; +handler.help = ['subdomainfinder', 'subfinder']; +handler.tags = ['tools']; +handler.premium = false; +handler.limit = true; +module.exports = handler; diff --git a/plugins/tools-tinyurl.js b/plugins/tools-tinyurl.js new file mode 100644 index 0000000000000000000000000000000000000000..20a5273fdf93dfced0b05e76020b1d077e190f78 --- /dev/null +++ b/plugins/tools-tinyurl.js @@ -0,0 +1,13 @@ +let fetch = require('node-fetch') +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `Masukan url/link!\n ${usedPrefix + command} https://google.com` + let res = await fetch(`https://api.botcahx.eu.org/api/linkshort/tinyurl?link=${text}&apikey=${btc}`) + let json = await res.json() + if (json.status) m.reply(json.result) + else throw 'Link Invalid!\nPeriksa url anda' +} +handler.help = ['tinyurl'].map(v => v + ' <link>') +handler.tags = ['shortlink'] +handler.command = /^tinyurl$/i + +module.exports = handler diff --git a/plugins/tools-tomp3.js b/plugins/tools-tomp3.js new file mode 100644 index 0000000000000000000000000000000000000000..06fbc52d2d1d8813047c0abf474a98ca10e8da7b --- /dev/null +++ b/plugins/tools-tomp3.js @@ -0,0 +1,17 @@ +const { toPTT, toAudio } = require('../lib/converter') + +let handler = async (m, { conn, usedPrefix, command }) => { + let q = m.quoted ? m.quoted : m + let mime = (m.quoted ? m.quoted : m.msg).mimetype || '' + if (!/video|audio/.test(mime)) throw `Balas video/audio dengan perintah *${usedPrefix + command}*` + let media = await q.download() + if (!media) throw 'Media tidak dapat diunduh' + let audio = await toAudio(media, 'mp4') + if (!audio.data) throw 'Gagal melakukan konversi.' + conn.sendMessage(m.chat, { audio: audio.data, mimetype: 'audio/mpeg' }, { quoted: m }) +} +handler.help = ['toaudio (reply)'] +handler.tags = ['tools'] +handler.command = /^to(a(udio)?)$/i + +module.exports = handler diff --git a/plugins/tools-uploader.js b/plugins/tools-uploader.js new file mode 100644 index 0000000000000000000000000000000000000000..1b9cb4fc246d4f15cda5991576ea62cb4421e112 --- /dev/null +++ b/plugins/tools-uploader.js @@ -0,0 +1,23 @@ +const uploadFile = require('../lib/uploadFile') +const uploadImage = require('../lib/uploadImage') + +let handler = async (m) => { + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || '' + if (!mime) throw 'Tidak ada media yang ditemukan' + let media = await q.download() + let isTele = /image\/(png|jpe?g|gif)|video\/mp4/.test(mime) + let fileSizeLimit = 5 * 1024 * 1024 + if (media.length > fileSizeLimit) { + throw 'Ukuran media tidak boleh melebihi 5MB' + } + let link = await (isTele ? uploadImage : uploadFile)(media) + m.reply(`${link} +${media.length} Byte(s) +${isTele ? '(Tidak Ada Tanggal Kedaluwarsa)' : '(Tidak Ada Tanggal Kedaluwarsa)'}`) +} +handler.help = ['tourl <reply image>'] +handler.tags = ['sticker'] +handler.command = /^(upload|tourl)$/i +handler.limit = true +module.exports = handler diff --git a/plugins/tools-vocalremover.js b/plugins/tools-vocalremover.js new file mode 100644 index 0000000000000000000000000000000000000000..b16658283badc67be4899025d33cb0b57c8c4b63 --- /dev/null +++ b/plugins/tools-vocalremover.js @@ -0,0 +1,38 @@ +const fetch = require('node-fetch'); +const uploader = require('../lib/uploadFile'); + +let handler = async (m, { conn, usedPrefix, command }) => { + let q = m.quoted ? m.quoted : m; + let mime = (q.msg || q).mimetype || q.mediaType || ''; + if (/audio/.test(mime)) { + let buffer = await q.download(); + await m.reply(wait); + try { + let fileSizeLimit = 5 * 1024 * 1024; + if (buffer.length > fileSizeLimit) { + throw 'Ukuran media tidak boleh melebihi 5MB'; + } + let media = await uploader(buffer); + let response = await fetch(`https://api.botcahx.eu.org/api/tools/voiceremover?url=${media}&apikey=${btc}`); + let res = await response.json(); + if (!res.status) { + throw null + } + if (command === 'vocalremover') { + await conn.sendMessage(m.chat, { audio: { url: res.result.instrumental_path }, mimetype: 'audio/mpeg' }, { quoted: m }); + } else if (command === 'instrumenremover') { + await conn.sendMessage(m.chat, { audio: { url: res.result.vocal_path }, mimetype: 'audio/mpeg' }, { quoted: m }); + } + } catch (e) { + throw '*[INTERNAL SERVER ERROR!]*' + } + } else { + await m.reply(`Reply *audio* with command ${usedPrefix + command}`); + } +} + +handler.command = handler.help = ['vocalremover', 'instrumenremover']; +handler.tags = ['tools']; +handler.limit = true; + +module.exports = handler; diff --git a/plugins/tools-wastalk.js b/plugins/tools-wastalk.js new file mode 100644 index 0000000000000000000000000000000000000000..bea814956b995630d664a1485c63c38007e9e43f --- /dev/null +++ b/plugins/tools-wastalk.js @@ -0,0 +1,41 @@ +const moment = require('moment-timezone') +const PhoneNum = require('awesome-phonenumber') + +let regionNames = new Intl.DisplayNames(['en'], { + type: 'region' +}) + +let handler = async (m, { + conn, + text, + usedPrefix, + command: cmd +}) => { + let num = m.quoted?.sender || m.mentionedJid?.[0] || text + if (!num) throw `Ex: ${usedPrefix + cmd} @tag / 628xxx` + num = num.replace(/\D/g, '') + '@s.whatsapp.net' + if (!(await conn.onWhatsApp(num))[0]?.exists) throw 'User not exists' + let img = await conn.profilePictureUrl(num, 'image').catch(_ => 'https://btch.pages.dev/file/70e8de9b1879568954f09.jpg') + let bio = await conn.fetchStatus(num).catch(_ => {}) + let name = await conn.getName(num) + let business = await conn.getBusinessProfile(num) + let format = PhoneNum(`+${num.split('@')[0]}`) + let country = regionNames.of(format.getRegionCode('international')) + let res = `\t\t\t\t*โ–พ WHATSAPP โ–พ*\n\n*ยฐ Country :* ${country.toUpperCase()}\n*ยฐ Name :* ${name ? name : '-'}\n*ยฐ Format Number :* ${format.getNumber('international')}\n*ยฐ Url Api :* wa.me/${num.split('@')[0]}\n*ยฐ Mentions :* @${num.split('@')[0]}\n*ยฐ Status :* ${bio?.status || '-'}\n*ยฐ Date Status :* ${bio?.setAt ? moment(bio.setAt.toDateString()).locale('id').format('LL') : '-'}\n\n${business ? `\t\t\t\t*โ–พ INFO BUSINESS โ–พ*\n\n*ยฐ BusinessId :* ${business.wid}\n*ยฐ Website :* ${business.website ? business.website : '-'}\n*ยฐ Email :* ${business.email ? business.email : '-'}\n*ยฐ Category :* ${business.category}\n*ยฐ Address :* ${business.address ? business.address : '-'}\n*ยฐ Timeone :* ${business.business_hours.timezone ? business.business_hours.timezone : '-'}\n*ยฐ Descripcion* : ${business.description ? business.description : '-'}` : '*Standard WhatsApp Account*'}` + img ? await conn.sendMessage(m.chat, { + image: { + url: img + }, + caption: res, + mentions: [num] + }, { + quoted: m + }) : m.reply(res) +} + +handler.help = ['wastalk'] +handler.tags = ['tools'] +handler.command = /^(wa|whatsapp)stalk$/i +handler.limit = true + +module.exports = handler diff --git a/plugins/tools-whatmusic.js b/plugins/tools-whatmusic.js new file mode 100644 index 0000000000000000000000000000000000000000..48cc998020e06402fb841e10f465369d38dfdcc5 --- /dev/null +++ b/plugins/tools-whatmusic.js @@ -0,0 +1,24 @@ +const fetch = require('node-fetch'); +const uploader = require('../lib/uploadFile'); + +let handler = async (m, { conn, usedPrefix, command }) => { + let q = m.quoted ? m.quoted : m + let mime = (q.msg || q).mimetype || q.mediaType || '' + if (/video|audio/.test(mime)) { + let buffer = await q.download() + await m.reply(wait) + try { + let media = await uploader(buffer) + let json = await (await fetch(`https://api.botcahx.eu.org/api/tools/whatmusic?url=${media}&apikey=${btc}`)).json() + conn.sendMessage(m.chat, { text: json.result }, { quoted: m }) + } catch (err) { + throw `${eror}` + } + } else throw `Reply audio/video with command ${usedPrefix + command}` +} +handler.help = ['whatmusic'] +handler.tags = ['tools'] +handler.command = /^(whatmusic)$/i +handler.limit = true; + +module.exports = handler diff --git a/plugins/tools-whois.js b/plugins/tools-whois.js new file mode 100644 index 0000000000000000000000000000000000000000..6de63ae7514daa58cc3d450a298b94b14cd8d0d1 --- /dev/null +++ b/plugins/tools-whois.js @@ -0,0 +1,28 @@ +const fetch = require("node-fetch"); +let handler = async (m, { text, usedPrefix, command }) => { + if (!text) throw `Masukkan Domain!\n\n*Contoh:* botcahx.eu.org`; + if (text.includes('https://') || text.includes('http://')) throw `Tolong masukkan tanpa domain *https/http!*. Contoh: botcahx.eu.org`; + try { + const waiting = `_Sedang mencari informasi WHOIS untuk ${text}..._`; + m.reply(waiting); + let data = fetch(`https://api.botcahx.eu.org/api/webzone/whois?query=${text}&apikey=${btc}`) + .then(result => result.json()) + .then(response => { + m.reply(response.result); + }) + .catch(error => { + console.error(error); + m.reply('Terjadi error saat mencari informasi WHOIS, silakan coba lagi nanti'); + }); + } catch (error) { + console.error(error); + m.reply('Terjadi error saat mencari informasi WHOIS, silakan coba lagi nanti'); + } +}; + +handler.command = ['whois', 'whoislookup']; +handler.help = ['whois', 'whoislookup']; +handler.tags = ['tools']; +handler.premium = false; +handler.limit = true +module.exports = handler; diff --git a/plugins/tools-whois2.js b/plugins/tools-whois2.js new file mode 100644 index 0000000000000000000000000000000000000000..68498ed469985c530829696176a53e7874945648 --- /dev/null +++ b/plugins/tools-whois2.js @@ -0,0 +1,26 @@ +const fetch = require('node-fetch'); +const handler = async (m, { text, usedPrefix, command }) => { + if (!text) { + throw `Masukkan Domain/Sub Domain!\n\n*Contoh:* botcahx.eu.org`; + } + if (text.includes('https://') || text.includes('http://')) { + throw `Tolong masukkan domain/sub domain secara lengkap. Contoh: botcahx.eu.org`; + } + const options = { + method: 'GET', + headers: { + 'Authorization': 'Token=6c7bd1ce704d92c90e2f78d42641a9ee0cbcef198a6ad62a3dd06deb22af6fd3' //ganti apikey sendiri kalo abis :v + } + }; + try { + const response = await fetch(`https://whoisjson.com/api/v1/whois?domain=${text}`, options); + const data = await response.json(); + m.reply(JSON.stringify(data)); + } catch (error) { + console.error(error); + } +}; +handler.command = ['whois2']; +handler.tags = ['internet']; +handler.premium = false; +module.exports = handler; \ No newline at end of file diff --git a/plugins/tools-zodiac.js b/plugins/tools-zodiac.js new file mode 100644 index 0000000000000000000000000000000000000000..ceae038eed03e83319874b590259bba3252b8b52 --- /dev/null +++ b/plugins/tools-zodiac.js @@ -0,0 +1,51 @@ +let handler = (m, { usedPrefix, command, text }) => { + if (!text) throw `contoh:\n${usedPrefix + command} 2002 02 25` + + const date = new Date(text) + if (date == 'Invalid Date') throw date + const d = new Date() + const [tahun, bulan, tanggal] = [d.getFullYear(), d.getMonth() + 1, d.getDate()] + const birth = [date.getFullYear(), date.getMonth() + 1, date.getDate()] + + const zodiac = getZodiac(birth[1], birth[2]) + const ageD = new Date(d - date) + const age = ageD.getFullYear() - new Date(1970, 0, 1).getFullYear() + + const birthday = [tahun + (+ new Date(1970, bulan - 1, tanggal) > + new Date(1970, birth[1] - 1, birth[2])), ...birth.slice(1)] + const cekusia = bulan === birth[1] && tanggal === birth[2] ? `Selamat ulang tahun yang ke-${age} ๐Ÿฅณ` : age + + const teks = ` +Lahir : ${birth.join('-')} +Ultah Mendatang : ${birthday.join('-')} +Usia : ${cekusia} +Zodiak : ${zodiac} +`.trim() + m.reply(teks) +} +handler.help = ['zodiac *2002 02 25*'] +handler.tags = ['tools', 'internet', 'fun'] + +handler.command = /^zodia[kc]$/i + +module.exports = handler + +const zodiak = [ + ["Capricorn", new Date(1970, 0, 1)], + ["Aquarius", new Date(1970, 0, 20)], + ["Pisces", new Date(1970, 1, 19)], + ["Aries", new Date(1970, 2, 21)], + ["Taurus", new Date(1970, 3, 21)], + ["Gemini", new Date(1970, 4, 21)], + ["Cancer", new Date(1970, 5, 22)], + ["Leo", new Date(1970, 6, 23)], + ["Virgo", new Date(1970, 7, 23)], + ["Libra", new Date(1970, 8, 23)], + ["Scorpio", new Date(1970, 9, 23)], + ["Sagittarius", new Date(1970, 10, 22)], + ["Capricorn", new Date(1970, 11, 22)] +].reverse() + +function getZodiac(month, day) { + let d = new Date(1970, month - 1, day) + return zodiak.find(([_,_d]) => d >= _d)[0] +} diff --git a/plugins/whois.js b/plugins/whois.js new file mode 100644 index 0000000000000000000000000000000000000000..6aed97d6715da13b09c6dee7e1370f3d3dd6341a --- /dev/null +++ b/plugins/whois.js @@ -0,0 +1,17 @@ +let handler = async (m, { conn, text, usedPrefix, command }) => { + if (!text) throw `*โ€ข Example :* ${usedPrefix + command} *[domain name]*`; + + try { + let data = await axios.get(`https://api.hackertarget.com/dnslookup/?q=${text}`); + m.reply(data.data); + } catch (error) { + m.reply(`Error: ${error.message}`); + } +}; + +handler.command = ['whois', 'whoislookup']; +handler.help = ['whois', 'whoislookup']; +handler.tags = ['tools']; +handler.premium = false; + +module.exports = handler; \ No newline at end of file diff --git a/plugins/xp-levelup.js b/plugins/xp-levelup.js new file mode 100644 index 0000000000000000000000000000000000000000..49406972c037517a09ac64933a32c4ca80c4d7a5 --- /dev/null +++ b/plugins/xp-levelup.js @@ -0,0 +1,28 @@ +let levelling = require('../lib/levelling') + +let handler = m => { + let user = global.db.data.users[m.sender] + if (!levelling.canLevelUp(user.level, user.exp, global.multiplier)) { + let { min, xp, max } = levelling.xpRange(user.level, global.multiplier) + throw ` +Level *${user.level} (${user.exp - min}/${xp})* +Kurang *${max - user.exp}* lagi! +`.trim() + } + let before = user.level * 1 + while (levelling.canLevelUp(user.level, user.exp, global.multiplier)) user.level++ + if (before !== user.level) { + m.reply(` +Selamat, anda telah naik level! +*${before}* -> *${user.level}* +gunakan *.profile* untuk mengecek + `.trim()) + } +} + +handler.help = ['levelup'] +handler.tags = ['xp'] + +handler.command = /^level(|up)$/i + +module.exports = handler diff --git a/plugins/xp-limit.js b/plugins/xp-limit.js new file mode 100644 index 0000000000000000000000000000000000000000..82b41f05a4bd38d0ad57f1b12ac569779dd92f1f --- /dev/null +++ b/plugins/xp-limit.js @@ -0,0 +1,22 @@ +let handler = async (m) => { + let who + if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.sender + else who = m.sender + fdoc = { + key : { + remoteJid: 'status@broadcast', + participant : '0@s.whatsapp.net' + }, + message: { + documentMessage: { + title: wm, + } + } + } +m.reply(`${global.db.data.users[who].limit} Limit Tersisaเฒฅ_เฒฅ`) + +} +handler.help = ['limit [@user]'] +handler.tags = ['xp'] +handler.command = /^(limit)$/i +module.exports = handler \ No newline at end of file diff --git a/plugins/xp-regist.js b/plugins/xp-regist.js new file mode 100644 index 0000000000000000000000000000000000000000..bc44f810698d50cbf464e2a42ad9998a729004ea --- /dev/null +++ b/plugins/xp-regist.js @@ -0,0 +1,34 @@ +const { createHash } = require('crypto') +let Reg = /\|?(.*)([.|] *?)([0-9]*)$/i +let handler = async function (m, { text, usedPrefix }) { + let user = global.db.data.users[m.sender] + if (user.registered === true) throw `Anda sudah terdaftar\nMau daftar ulang? ${usedPrefix}unreg <SN|SERIAL NUMBER>` + if (!Reg.test(text)) throw `Format salah\n*${usedPrefix}daftar nama.umur*` + let [_, name, splitter, age] = text.match(Reg) + if (!name) throw 'Nama tidak boleh kosong (Alphanumeric)' + if (!age) throw 'Umur tidak boleh kosong (Angka)' + age = parseInt(age) + if (age > 120) throw 'Umur terlalu tua ๐Ÿ˜‚' + if (age < 5) throw 'Bayi bisa ngetik sesuai format bjir ._.' + user.name = name.trim() + user.age = age + user.regTime = + new Date + user.registered = true + let sn = createHash('md5').update(m.sender).digest('hex') + m.reply(` +Daftar berhasil! + +โ•ญโ”€ใ€Œ Info ใ€ +โ”‚ Nama: ${name} +โ”‚ Umur: ${age} tahun +โ•ฐโ”€โ”€โ”€โ”€ +Serial Number: +${sn} +`.trim()) +} +handler.help = ['daftar', 'reg', 'register'].map(v => v + ' <nama>.<umur>') +handler.tags = ['xp'] + +handler.command = /^(daftar|reg(ister)?)$/i + +module.exports = handler diff --git a/plugins/xp_unregist.js b/plugins/xp_unregist.js new file mode 100644 index 0000000000000000000000000000000000000000..e9bfaf3e5bc4b18600644fa14f0d2488fd708700 --- /dev/null +++ b/plugins/xp_unregist.js @@ -0,0 +1,18 @@ +//import db from '../lib/database.js' + +const {createHash} = require ('crypto'); +let handler = async function (m, { conn, args, command, usedPrefix}) { + if (!args[0]) throw `โœณ๏ธ *Masukkan nomor seri*\ncontoh! ${usedPrefix + command} nomorseri\n\nNomor seri dapat di lihat di\n\n*${usedPrefix}nomorseri*` + let user = global.db.data.users[m.sender] + let sn = createHash('md5').update(m.sender).digest('hex') + if (args[0] !== sn) throw 'โš ๏ธ *Nomor seri salah*' + user.registered = false + m.reply(`โœ… Success`) +} +handler.help = ['unreg <Nomor Seri>'] +handler.tags = ['xp'] + +handler.command = ['unreg'] +handler.register = true + +module.exports = handler diff --git a/plugins/ytmp4.js b/plugins/ytmp4.js new file mode 100644 index 0000000000000000000000000000000000000000..5fccfd863638fdaeb34c951a58e9a8fc4900aa7f --- /dev/null +++ b/plugins/ytmp4.js @@ -0,0 +1,58 @@ +const axios = require("axios"); +const yts = require("yt-search"); + +let handler = async (m, { conn, usedPrefix, command, text }) => { + // Memastikan ada input teks + if (!text) { + throw `*โ€ข Contoh :* ${usedPrefix + command} *<query>*`; + } + + m.reply("Tunggu sebentar..."); + + let videoUrl; + + // Mencari video berdasarkan teks + let result = await yts(text); + videoUrl = result.videos[0]?.url; // Ambil URL video pertama + if (!videoUrl) { + return m.reply("Tidak ada video ditemukan dengan pencarian tersebut."); + } + + // Encode URL untuk digunakan dalam permintaan API + const encodedUrl = encodeURIComponent(videoUrl); + const apiUrl = `https://Ikygantengbangetanjay-api.hf.space/yt?query=${encodedUrl}`; + + try { + console.log(`Mengirim permintaan ke API: ${apiUrl}`); // Log URL API + let response = await axios.get(apiUrl); + console.log(`Respons dari API:`, response.data); // Log respons dari API + + let data = response.data; + + // Memeriksa apakah hasil valid + if (!data.success || !data.result) { + return m.reply("Tidak ada hasil ditemukan."); + } + + let videoData = data.result; + + // Mengirim video langsung + await conn.sendMessage(m.chat, { video: { url: videoData.download.video }, caption: `*ไน‚ Y T M P 4 - P L A Y*\n\n` + + `โ—ฆ Judul : ${videoData.title}\n` + + `โ—ฆ Link Video : ${videoData.url}\n` + + `โ—ฆ Durasi : ${videoData.timestamp}\n` + + `โ—ฆ Penulis : ${videoData.author.name}\n` + + `โ—ฆ Views : ${videoData.views}\n` + + `โ—ฆ Diunggah : ${videoData.ago}` }, { quoted: m }); + + } catch (error) { + console.error("Terjadi kesalahan:", error); // Log kesalahan + m.reply("Terjadi kesalahan saat mengunduh video. Silakan periksa log untuk detail."); + } +} + +handler.help = ["ytmp4"].map(a => a + " *[query]*"); +handler.tags = ["downloader"]; +handler.command = ["ytmp4"]; + +module.exports = handler; \ No newline at end of file diff --git a/run.js b/run.js new file mode 100644 index 0000000000000000000000000000000000000000..f728b3c873846377185030b94b90e27534f28056 --- /dev/null +++ b/run.js @@ -0,0 +1,5 @@ +const cp = require('child_process'); +process.env.TZ = 'Asia/Jakarta'; +const bsp = cp.spawn('bash', [], { + stdio: ['inherit', 'inherit', 'inherit', 'ipc'] +}); diff --git a/server.js b/server.js new file mode 100644 index 0000000000000000000000000000000000000000..c7a623a03e7ed6c44360dbbc7df3fa2ceb284f16 --- /dev/null +++ b/server.js @@ -0,0 +1,55 @@ +const express = require('express') +const path = require('path') +const SocketIO = require('socket.io') +const qrcode = require('qrcode') +const fetch = require('node-fetch') + +function connect(conn, PORT) { + let app = global.app = express() + + // app.use(express.static(path.join(__dirname, 'views'))) + let _qr = 'invalid' + + conn.ev.on('connection.update', function appQR({ qr }) { + if (qr) _qr = qr + }) + + app.use(async (req, res) => { + res.setHeader('content-type', 'image/png') + res.end(await qrcode.toBuffer(_qr)) + }) + + let server = app.listen(7860, () => { + console.log('App listened on port 7860') + if (opts['keepalive']) keepAlive() + }) + let io = SocketIO(server) + io.on('connection', socket => { + let { unpipeEmit } = pipeEmit(conn, socket, 'conn-') + socket.on('disconnect', unpipeEmit) + }) +} + +function pipeEmit(event, event2, prefix = '') { + let old = event.emit + event.emit = function (event, ...args) { + old.emit(event, ...args) + event2.emit(prefix + event, ...args) + } + return { + unpipeEmit() { + event.emit = old + } + } +} + +function keepAlive() { + const url = `https://${process.env.REPL_SLUG}.${process.env.REPL_OWNER}.repl.co` + if (/(\/\/|\.)undefined\./.test(url)) return + setInterval(()=> { + fetch(url).catch(console.error) + }, 5 * 1000 * 60) +} + + +module.exports = connect diff --git a/sessions/app-state-sync-key-AAAAAFdk.json b/sessions/app-state-sync-key-AAAAAFdk.json new file mode 100644 index 0000000000000000000000000000000000000000..b2261005ef6523a3ad7844792849b3a00a59a789 --- /dev/null +++ b/sessions/app-state-sync-key-AAAAAFdk.json @@ -0,0 +1 @@ +{"keyData":"jzUe3jP2kqwNLRnam8ZwMyJgbP02kT93MAMbVpUA34k=","fingerprint":{"rawId":603457874,"currentIndex":1,"deviceIndexes":[0,1]},"timestamp":"1732074157340"} \ No newline at end of file diff --git a/sessions/app-state-sync-version-critical_block.json b/sessions/app-state-sync-version-critical_block.json new file mode 100644 index 0000000000000000000000000000000000000000..b17de53883b1fedffc5d58eab0f82a6b7f2edfa7 --- /dev/null +++ b/sessions/app-state-sync-version-critical_block.json @@ -0,0 +1 @@ +{"version":1,"hash":{"type":"Buffer","data":"Tg4Du1YFs8/+nS98nR4qaK0F2b8qMkFcHScGXiixFx8SGeBn78ddQunzxag6dA5dEg2X1vTddw364MG0NV3plq0wH/Mwc3qD8M2nhJAuybAztnm6xDVg1mWYK2TNq3MH0ZxBTpVwDbwt0A4iZvnAJf3KKFdcfDh61mm/56i48cc="},"indexValueMap":{"+e7R6eStVeumGtUF3YmIyVst0epgR1kH7Q+JwDbCcuw=":{"valueMac":{"type":"Buffer","data":"oHPrQlA2wuFJskILQVSTKi4Xzp1t4V8d8Jd1ckpNJk4="}},"3wLHDot807OHtxlbwMMcw0C4a/DUZ4uXDCLf8x7lItM=":{"valueMac":{"type":"Buffer","data":"eAgKPGafx4njuD0/ZDX8GZQ5fVjWjcIFA5V29BZTs4o="}}}} \ No newline at end of file diff --git a/sessions/app-state-sync-version-regular.json b/sessions/app-state-sync-version-regular.json new file mode 100644 index 0000000000000000000000000000000000000000..144180687980326a1320f90caf4101eb9ece0aa1 --- /dev/null +++ b/sessions/app-state-sync-version-regular.json @@ -0,0 +1 @@ +{"version":1,"hash":{"type":"Buffer","data":"yOfRQ8X7RDuWh5ej4GkiuLOImZ40+6IzznazCoojdZEk9Cga3Qk8UmbNKw3Dkz6sDx8FEeWNaL+1A1VmRCgc0hETaSthz3Ycbft5/3U3zrMAUNqtXfefiBrvNIk4CXEVf+iXDxN2vNcxhEymckJ4x3PQGTyj97a8hsrpBTcGnNU="},"indexValueMap":{"LCDw71BjHF39I/QjQqVZvnAL5FBNkET1wPnlT/rEsik=":{"valueMac":{"type":"Buffer","data":"y4+bOUrjIHUafVOe4FMP77IN12PbtCw6nWdLNGotvN8="}},"DNFPtlmXKI+TqZOx4WALA5g5gQ22FDL7ezFzS3yotpA=":{"valueMac":{"type":"Buffer","data":"40YnA06k+FXjoc04SfYHRUwvKyS6ItAkV27nBAiisII="}}}} \ No newline at end of file diff --git a/sessions/creds.json b/sessions/creds.json new file mode 100644 index 0000000000000000000000000000000000000000..8549f0324ca4e2558924151280ab26bef1b28e16 --- /dev/null +++ b/sessions/creds.json @@ -0,0 +1 @@ +{"noiseKey":{"private":{"type":"Buffer","data":"YKWhvBF1/uHNVpVNG7cHb+pBkwXS8TnwRobfOmTj1Vc="},"public":{"type":"Buffer","data":"ruFotjAlk7O8TCu7YQAYayysAX6hhJnS7iOHEsr+oSM="}},"pairingEphemeralKeyPair":{"private":{"type":"Buffer","data":"0LZLx/V/9T5dchuQvbljNMe5tv+LAL2ee3MQaVWgN20="},"public":{"type":"Buffer","data":"fEyB1/LnkD8WW0ib9xCcieFjlw19ZFPHFMH2esZh+n8="}},"signedIdentityKey":{"private":{"type":"Buffer","data":"uFsaOfNb6sGLwcX8iXU7VTTEhwKRMlEeMlQDMMCHqls="},"public":{"type":"Buffer","data":"O0wHovOohrvGUGR3VNlzTbzaoKv1z8F4+CHbFQvtRkI="}},"signedPreKey":{"keyPair":{"private":{"type":"Buffer","data":"wKmvt0N37v+Evz69vFZkKfnrs3Rp1J5t7hs7GMPX0nk="},"public":{"type":"Buffer","data":"aXeV6x+iynRTDFCpVKKoUaRkExtoLXhxMM7OcqRV71M="}},"signature":{"type":"Buffer","data":"vEL/ty70r4gSRN2gKq/SP3YF6yz5kAdORpBWCuMaxh09+Npbovq9R9TBIIFPeIP/4nydaoc10i4V4XSEyTK5Dw=="},"keyId":1},"registrationId":159,"advSecretKey":"JbK1ihP64X6B/j2CdxxBfqfjLECP+8fFP8fyUNfiFRw=","processedHistoryMessages":[{"key":{"remoteJid":"6287821561429@s.whatsapp.net","fromMe":true,"id":"9790826FEC91B173A5F044D56286BD7E"},"messageTimestamp":1733914626},{"key":{"remoteJid":"6287821561429@s.whatsapp.net","fromMe":true,"id":"30BEAA49EE29C6C60F33C352DE88A0CF"},"messageTimestamp":1733914640},{"key":{"remoteJid":"6287821561429@s.whatsapp.net","fromMe":true,"id":"9790826FEC91B173A5F044D56286BD7E"},"messageTimestamp":1733914640}],"nextPreKeyId":31,"firstUnuploadedPreKeyId":31,"accountSyncCounter":1,"accountSettings":{"unarchiveChats":false},"deviceId":"-cwfUr8wTR-UVdYhTgIAtg","phoneId":"49b28762-bdca-4d09-a5d3-a1475637580e","identityId":{"type":"Buffer","data":"5gAcH4c0b5hMzMYdSjANFc3eOXs="},"registered":true,"backupToken":{"type":"Buffer","data":"cpQnD1XP5LOZsd5qQXLx1VMElHI="},"registration":{},"pairingCode":"T6PXXCER","routingInfo":{"type":"Buffer","data":"CAgIBQ=="},"me":{"id":"6287821561429:1@s.whatsapp.net","name":"Hehdhej","jid":"6287821561429@s.whatsapp.net","lid":"276965797937291:1@lid"},"account":{"details":"CKLapEkQ2N/lugYYASAAKAA=","accountSignatureKey":"xs0elkZ/lv4qlvL89xtyKXQnXtfToDQNp3CMVNRVbEg=","accountSignature":"o6PULOG9fmA8SkX0+JS6guVHkUkWc4bEWp68RCajrayM2IEVnCinAJNg/taXYWVsZm7sZZ8kCqnTfG+OY2fBCA==","deviceSignature":"uUs+zm20e6oJZKT3eY9vOF9MoWmsFFdoU790vXh80GjMYYLpP3ufv7etC76dre+hYOfLjHBsXjw2o6kCFr7tCw=="},"signalIdentities":[{"identifier":{"name":"6287821561429:1@s.whatsapp.net","deviceId":0},"identifierKey":{"type":"Buffer","data":"BcbNHpZGf5b+Kpby/Pcbcil0J17X06A0DadwjFTUVWxI"}}],"platform":"android","lastAccountSyncTimestamp":1733916891,"myAppStateKeyId":"AAAAAF8k"} \ No newline at end of file diff --git a/sessions/pre-key-1.json b/sessions/pre-key-1.json new file mode 100644 index 0000000000000000000000000000000000000000..7cd2e98466c1217ce06f8e18416771bcc1c1fd13 --- /dev/null +++ b/sessions/pre-key-1.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"0MQn/azh4HbfZh/XMv+PUiWh9tUTThKWhzlig5O/PFA="},"public":{"type":"Buffer","data":"rs+WRMVw8rpKX3yOCIvT043XyiPvqAjtdkDVcGhL2hc="}} \ No newline at end of file diff --git a/sessions/pre-key-10.json b/sessions/pre-key-10.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8e9e83966fa06feefa8d74238d3a8849d25ae5 --- /dev/null +++ b/sessions/pre-key-10.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"MIiaPDIeDb/hFQAht5zFa+xsc0YoWqHR/QVxJOasVlY="},"public":{"type":"Buffer","data":"Odr4C4IKCwqOxyERnZNHcm0T5PrshTlCI6MwFo5FvDU="}} \ No newline at end of file diff --git a/sessions/pre-key-11.json b/sessions/pre-key-11.json new file mode 100644 index 0000000000000000000000000000000000000000..649e8f0c661088f663bd596835cbd930430fe393 --- /dev/null +++ b/sessions/pre-key-11.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"YMatjH4wXHJSno3Yo9g5TbPUiD0Wt0hEbPjkvx1/bWY="},"public":{"type":"Buffer","data":"KhrFg5nuaxwMv3zQgEN5YsluKm8Qq/zB83ndH3S+ZjI="}} \ No newline at end of file diff --git a/sessions/pre-key-13.json b/sessions/pre-key-13.json new file mode 100644 index 0000000000000000000000000000000000000000..b2d35eecee18390afd72c7ecf6e45bc60a5f3b50 --- /dev/null +++ b/sessions/pre-key-13.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"6NrckjLm+akrzpTyy3dhx826JXD8p/WCqWJwzvRGTWg="},"public":{"type":"Buffer","data":"pmOd0+oeN6AGudLSQHyR7qj/GZdmsX9sgaZbH1kp+Wc="}} \ No newline at end of file diff --git a/sessions/pre-key-14.json b/sessions/pre-key-14.json new file mode 100644 index 0000000000000000000000000000000000000000..1e4086bcfcf756ff1204e2cc8f41c7486083b664 --- /dev/null +++ b/sessions/pre-key-14.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"QL+m+zDrWJEJINQFhJiZnBcKEijStP/C3YhSjrQMDWI="},"public":{"type":"Buffer","data":"wDeJYPfTUR3wfqNDZ45eqR3kg0NZI9+LxEZ0RjA6tS8="}} \ No newline at end of file diff --git a/sessions/pre-key-15.json b/sessions/pre-key-15.json new file mode 100644 index 0000000000000000000000000000000000000000..09b6a9809c79a193ded429d8e29f44a09a2a24a7 --- /dev/null +++ b/sessions/pre-key-15.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"wId5JPs9pelJxTrUMZ82t3H7ZxpY0UY2ktIN3UMS+XM="},"public":{"type":"Buffer","data":"4b+3HJ1JCXQdovfuuuvWqNwUZDOM7J4PVZb3nWmu+S0="}} \ No newline at end of file diff --git a/sessions/pre-key-16.json b/sessions/pre-key-16.json new file mode 100644 index 0000000000000000000000000000000000000000..8783098aa47b83fe7bce2e49bbe215b9d7e809d7 --- /dev/null +++ b/sessions/pre-key-16.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"iIn+38bug2aRF8FpEFEouSlkNJ1AozEbxlQGrVJIfmc="},"public":{"type":"Buffer","data":"p4FKLlp8/RurH/3IwHHUtQqiHPVai/jHKz2InlBKjX0="}} \ No newline at end of file diff --git a/sessions/pre-key-17.json b/sessions/pre-key-17.json new file mode 100644 index 0000000000000000000000000000000000000000..3d3dc146024d0683f725b2865f9f50988e4de623 --- /dev/null +++ b/sessions/pre-key-17.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"mPAVdDnUjquOsAFHImc+BhDG37VmWkWJgk9OnDkJn2w="},"public":{"type":"Buffer","data":"71L+gVWZKgEjugEBwBrpyElD2yahFk6/fRmt902aNhM="}} \ No newline at end of file diff --git a/sessions/pre-key-18.json b/sessions/pre-key-18.json new file mode 100644 index 0000000000000000000000000000000000000000..2fe89e60830f52c2d69e664efa55677538c1b244 --- /dev/null +++ b/sessions/pre-key-18.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"cGAer9kXPLuUTnpOw3Rf1O66gkvEZ1pRB4yFt9ZuzGE="},"public":{"type":"Buffer","data":"E9MfM/ecMnkD9jLMGPUB3Vdtv6KyVUNMkxcm85onMGE="}} \ No newline at end of file diff --git a/sessions/pre-key-19.json b/sessions/pre-key-19.json new file mode 100644 index 0000000000000000000000000000000000000000..f386b5e4f4b8956fa46faf6b6d6b590cabb158d4 --- /dev/null +++ b/sessions/pre-key-19.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"QPU7WQncji8vJcnpflninqxUub1+nHirVPm0BS8/uEc="},"public":{"type":"Buffer","data":"eSajD5ZhtwxG/W7fRAkIQ+5d2aklju/XfXWM8KgimSA="}} \ No newline at end of file diff --git a/sessions/pre-key-2.json b/sessions/pre-key-2.json new file mode 100644 index 0000000000000000000000000000000000000000..a1077b0e2e3a3765a3b00a92d1ec2164d4122f4b --- /dev/null +++ b/sessions/pre-key-2.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"yNC6ANsCfhYABh3dAT35xnjh7hjtJkso3Ff5I41LxEE="},"public":{"type":"Buffer","data":"5OZDUCS9oxlDOZsnCxb6wS4F81Z4ualUjKM5a5zw0Sw="}} \ No newline at end of file diff --git a/sessions/pre-key-20.json b/sessions/pre-key-20.json new file mode 100644 index 0000000000000000000000000000000000000000..717edbc0e1fa820d9dcb48872fb9f37d4ced36e0 --- /dev/null +++ b/sessions/pre-key-20.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"sErScfgRxNtXJ98dBtSXsXeRRVYq8EF/OOOg1Ig/12A="},"public":{"type":"Buffer","data":"CPx4UZwNSzYwi1xwEF76QX95fsLhr26pvIKAXp4OuF8="}} \ No newline at end of file diff --git a/sessions/pre-key-21.json b/sessions/pre-key-21.json new file mode 100644 index 0000000000000000000000000000000000000000..194d572c5239930efff54aa47dfc95f42115b3fd --- /dev/null +++ b/sessions/pre-key-21.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"QJZs9d6khIB/ZAxs/EQrYq1m368ArjyedVBuVHwGuEI="},"public":{"type":"Buffer","data":"0iVjsez5LnClEM0/Ql3oPX5KzRUedYAZ+MmLhmsJpS8="}} \ No newline at end of file diff --git a/sessions/pre-key-22.json b/sessions/pre-key-22.json new file mode 100644 index 0000000000000000000000000000000000000000..a6a23d7a4b7f325dab6a9310a90680dce0d18070 --- /dev/null +++ b/sessions/pre-key-22.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"QCYblYfjaPgNyqhclwF/wfeJ+3CQZOsR7/Zrr9Mr72k="},"public":{"type":"Buffer","data":"J2W8xS0aKkEzZAlULdZEnETS4UKBWTSYtx0BKWNPyGQ="}} \ No newline at end of file diff --git a/sessions/pre-key-23.json b/sessions/pre-key-23.json new file mode 100644 index 0000000000000000000000000000000000000000..52eb35c5e662efbed012f6a0ebc822afecd59501 --- /dev/null +++ b/sessions/pre-key-23.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"0E/wHs59AbL8Gcln8FT3hZyybEikU1o8eZea4/OQF1s="},"public":{"type":"Buffer","data":"RmEABAWWVhlJM77/D4bat0PIU5ljRa2GM+0USHx7YlU="}} \ No newline at end of file diff --git a/sessions/pre-key-24.json b/sessions/pre-key-24.json new file mode 100644 index 0000000000000000000000000000000000000000..3ed9f34faa677aa4b84bf007221be9e84ddc0d13 --- /dev/null +++ b/sessions/pre-key-24.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"aCtTZJRPiqYQN/5AQTcEmMbS30LMS3plx6jJ36zL4lE="},"public":{"type":"Buffer","data":"PDcnem5sDSk5I2GK/oVCD5Y0awbOP3wfykys/2FdKXs="}} \ No newline at end of file diff --git a/sessions/pre-key-25.json b/sessions/pre-key-25.json new file mode 100644 index 0000000000000000000000000000000000000000..acf33e807f15eb3e7cd69c126303574245ecc982 --- /dev/null +++ b/sessions/pre-key-25.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"UCMXkhPmQiF10yX8NadvosPp51DkRa5gax53YUBYY2M="},"public":{"type":"Buffer","data":"HYBdm/yRYXKDnuPkf8YpxaDCal+kY2F8w0wuHC/gZDM="}} \ No newline at end of file diff --git a/sessions/pre-key-26.json b/sessions/pre-key-26.json new file mode 100644 index 0000000000000000000000000000000000000000..9d1ac3d2c52800a34b55d7751f26f09c9c036d45 --- /dev/null +++ b/sessions/pre-key-26.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"8Ng6SwAPhm5jruwJpeoVm6fqrD7QcQBg7PJbk2HQb0Y="},"public":{"type":"Buffer","data":"yOGhuR1y4ddXw6Ojy4vpsjYMu7yVlVd2rftUo71cGUs="}} \ No newline at end of file diff --git a/sessions/pre-key-27.json b/sessions/pre-key-27.json new file mode 100644 index 0000000000000000000000000000000000000000..16b1e57d5818bde3468d85b66d1c25a21d1a1836 --- /dev/null +++ b/sessions/pre-key-27.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"eMR6rsFpSQPdWanEsGuzhyEAuEcQhRio7tSl0B1QQHA="},"public":{"type":"Buffer","data":"xrVj8cVFWxPuXR6iV5mWzHLVdPAws5CUbh46UJm3bEw="}} \ No newline at end of file diff --git a/sessions/pre-key-28.json b/sessions/pre-key-28.json new file mode 100644 index 0000000000000000000000000000000000000000..6795a71784b1b865634f2e34ace6b888fa09fd27 --- /dev/null +++ b/sessions/pre-key-28.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"kBLUyHp0kVMWRamUiklx0KJqPedkWNsmja2UoMV67Wk="},"public":{"type":"Buffer","data":"zpOMEqEi6/spDmYJSNM+DXKlOOIgu1e8yO+peAX7JQw="}} \ No newline at end of file diff --git a/sessions/pre-key-29.json b/sessions/pre-key-29.json new file mode 100644 index 0000000000000000000000000000000000000000..0cb508257aa9cf7260e7eeedc69ea7dbb89481ce --- /dev/null +++ b/sessions/pre-key-29.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"+IEIgOzJTHJ/k5dORCB7V2ze1FkAglJfLDm2zIHm4kM="},"public":{"type":"Buffer","data":"eZlGk+Gu3hYCjxcTybPFyMblM3TDGtc+ZyKbXvkwrFM="}} \ No newline at end of file diff --git a/sessions/pre-key-3.json b/sessions/pre-key-3.json new file mode 100644 index 0000000000000000000000000000000000000000..ad2ba48ad180e8a5493dfc87e2bc5697627dca34 --- /dev/null +++ b/sessions/pre-key-3.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"MMc1G4VDHd9Wr0g59XOoVDoOAeUIB18k7H8bmKlloWw="},"public":{"type":"Buffer","data":"dUm8ZP7mSCJudCG7ppwlXyrwklQqistQSFZlPi47hGQ="}} \ No newline at end of file diff --git a/sessions/pre-key-30.json b/sessions/pre-key-30.json new file mode 100644 index 0000000000000000000000000000000000000000..ed08a50932deac9c3eea5832d2edad2e971cb758 --- /dev/null +++ b/sessions/pre-key-30.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"eOiQgCeQwG/VoIGEeHimzIjqVgL1xt5sMNW/pghbUEk="},"public":{"type":"Buffer","data":"Ejz5kgzeo6GR2aEQFN8l4Pc0JsWfG9rEx6UNvR/aPG8="}} \ No newline at end of file diff --git a/sessions/pre-key-4.json b/sessions/pre-key-4.json new file mode 100644 index 0000000000000000000000000000000000000000..dd18554435ab0b73a0008325994e0466a3033cc9 --- /dev/null +++ b/sessions/pre-key-4.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"yFvp9Cy3uRlGl4QRO9hs2vQ4ALEpnqHuD+jRA9DoXXA="},"public":{"type":"Buffer","data":"QXoFz4eyNiSh9blnR0cF4IARqcvxOOjNAQJVaT5APTU="}} \ No newline at end of file diff --git a/sessions/pre-key-5.json b/sessions/pre-key-5.json new file mode 100644 index 0000000000000000000000000000000000000000..0e05692eab4210444204cff83d0a26a8bf3a40d6 --- /dev/null +++ b/sessions/pre-key-5.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"gGylGQHa+g3qSntxb7ZoVD7Bu9Mv7azy9VJ5AZZaCmw="},"public":{"type":"Buffer","data":"sCYGwAUeutaxHTIF4KMCL8gT48/XGtM5npUvV8qVy3M="}} \ No newline at end of file diff --git a/sessions/pre-key-6.json b/sessions/pre-key-6.json new file mode 100644 index 0000000000000000000000000000000000000000..01d0815f34629914b97f3887edc3f7ab80860ce4 --- /dev/null +++ b/sessions/pre-key-6.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"iJwDz8ay/OyzItxghGrK0HuL1LpmSXpbv0d6NpOMHWI="},"public":{"type":"Buffer","data":"jf7/u69M1wdjJVbU/YSCDv/XVX3ShLPzbLC8yqps2Qc="}} \ No newline at end of file diff --git a/sessions/pre-key-7.json b/sessions/pre-key-7.json new file mode 100644 index 0000000000000000000000000000000000000000..558f81195f9caae6d88db10f78e320caf09517f9 --- /dev/null +++ b/sessions/pre-key-7.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"qPMtVbdLr2e41zPluxnpprM7XGZP2/9muW/7FNIFzXk="},"public":{"type":"Buffer","data":"vP8tSwFDZoofxKFiCj6jk8LoHZvdlQsoj6UohZSI6Cs="}} \ No newline at end of file diff --git a/sessions/pre-key-8.json b/sessions/pre-key-8.json new file mode 100644 index 0000000000000000000000000000000000000000..b87702ced1a8135ba450ff00a3fa7b4796b7494f --- /dev/null +++ b/sessions/pre-key-8.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"oF1c/Bsmvs6ncJkVR76Cn8xHkmledwlaNnMv4rJ/tGM="},"public":{"type":"Buffer","data":"WslzGRV7GtTockaYEf3Gl/ysIydkOb6SNDQUy5r003Y="}} \ No newline at end of file diff --git a/sessions/pre-key-9.json b/sessions/pre-key-9.json new file mode 100644 index 0000000000000000000000000000000000000000..b2f37eeb579984f8348264c3a3dc6d1ccf4218f0 --- /dev/null +++ b/sessions/pre-key-9.json @@ -0,0 +1 @@ +{"private":{"type":"Buffer","data":"sLraNiwwkn4Q6sCsYa7ATZpsyfmIZkYFfqprRt0Vdlc="},"public":{"type":"Buffer","data":"TgdzsR/RwYLs5qqV/wjc5PPPQYyVlu0BYL6r3hiIJQU="}} \ No newline at end of file diff --git a/sessions/session-6283121935164.0.json b/sessions/session-6283121935164.0.json new file mode 100644 index 0000000000000000000000000000000000000000..1f9b358ecfb994c5e5c4aa2e901ec3cf6c107693 --- /dev/null +++ b/sessions/session-6283121935164.0.json @@ -0,0 +1 @@ +{"_sessions":{"Bext770OkFS7A8tt7PBTJDI8cmpFGTe/9T7rNjE0/q0l":{"registrationId":541474113,"currentRatchet":{"ephemeralKeyPair":{"pubKey":"BazBpB9a1BodYpYjR60mz8iOQIu4TFMpkvqC7akwDfdg","privKey":"KJwLvUCAaWSfUIrd0SFNxOSWkQOSiw47z6os7tnG5VY="},"lastRemoteEphemeralKey":"BYk0n5smclZSUVq7LosbKuS14URr1//akc3s5xi+uDdY","previousCounter":0,"rootKey":"87WLuspwwFfoG85bBW5GrKdZvb2pC8ssPXHodXyDcaQ="},"indexInfo":{"baseKey":"Bext770OkFS7A8tt7PBTJDI8cmpFGTe/9T7rNjE0/q0l","baseKeyType":2,"closed":-1,"used":1732074157481,"created":1732074157481,"remoteIdentityKey":"Bf+wOpVPsuY5kCSIzNCK3pm/AN6hqfVObxTP/17u5Qoo"},"_chains":{"BYk0n5smclZSUVq7LosbKuS14URr1//akc3s5xi+uDdY":{"chainKey":{"counter":8,"key":"FAbMb613J5GvGYFx7bZDLTmBHJnkcaW9zWawfkf4XBk="},"chainType":2,"messageKeys":{}},"BazBpB9a1BodYpYjR60mz8iOQIu4TFMpkvqC7akwDfdg":{"chainKey":{"counter":4,"key":"ekOtgyLa+A/9b6z2gFQA/LMXcuJg6HpHr8WV5pQf/0g="},"chainType":1,"messageKeys":{}}}}},"version":"v1"} \ No newline at end of file diff --git a/sessions/session-6285878836361.0.json b/sessions/session-6285878836361.0.json new file mode 100644 index 0000000000000000000000000000000000000000..1ccfb8c4e3064abaadd914a1af9f0f9a8381bed6 --- /dev/null +++ b/sessions/session-6285878836361.0.json @@ -0,0 +1 @@ +{"_sessions":{"BaY3/I+IVf5qjK8SDaEDD4bhxShySgsGh8pJYdFZAP1e":{"registrationId":288609832,"currentRatchet":{"ephemeralKeyPair":{"pubKey":"BfN4uIuUsYrpryYhmOCA8e0eYVyxBJmpYO3BZYBnBNV8","privKey":"OGALbqajm+dhkZrwVVPvlzCLoRmb6xRisgEeDUVegHE="},"lastRemoteEphemeralKey":"BQi9vKuv6g4ZcEmR/P+NRt/vTua+bvv7KXCyV4O8xDYH","previousCounter":0,"rootKey":"QWDGnxnFHZOy19Ak9QGcF/gXWbq629Ckz77B5yl6DIc="},"indexInfo":{"baseKey":"BaY3/I+IVf5qjK8SDaEDD4bhxShySgsGh8pJYdFZAP1e","baseKeyType":2,"closed":-1,"used":1732075230699,"created":1732074268134,"remoteIdentityKey":"BRO4x2QdfNTmoF0hRRUDlN/AVLraWGLbE5dEFaA65ZZb"},"_chains":{"BUCumztvviXzCbblSZW4YMePETjgE7as41vUST30M5Fo":{"chainKey":{"counter":0},"chainType":2,"messageKeys":{}},"BfAZCcoJtfRFQkrUivvRCBJGQ6fVodezSgYJ2U7QPuQf":{"chainKey":{"counter":1},"chainType":2,"messageKeys":{}},"BXo9+xrBmVqVgZ9hurGkzPgXt4ijc1hYReQ605HvKQl9":{"chainKey":{"counter":1},"chainType":2,"messageKeys":{}},"BU3EEECdpWN9mW/4O9cVSXjubxGMKmHH16kq6qEiBX48":{"chainKey":{"counter":0},"chainType":2,"messageKeys":{}},"Bd23ox2KS5DkDjdNm0hiab+sI7hpCBFf8Gfo+uMIung3":{"chainKey":{"counter":0},"chainType":2,"messageKeys":{}},"BQi9vKuv6g4ZcEmR/P+NRt/vTua+bvv7KXCyV4O8xDYH":{"chainKey":{"counter":0,"key":"6C6pnxtyNf4FG+CYgmC9funG3o/466yt95CdIF1nU30="},"chainType":2,"messageKeys":{}},"BfN4uIuUsYrpryYhmOCA8e0eYVyxBJmpYO3BZYBnBNV8":{"chainKey":{"counter":-1,"key":"B5wN1fhgHBxS5wR+HblK7mC51eTKL7bpriPN3KMTb5k="},"chainType":1,"messageKeys":{}}}}},"version":"v1"} \ No newline at end of file diff --git a/speed.py b/speed.py new file mode 100644 index 0000000000000000000000000000000000000000..cb8785c1b6bcc738264f313608fdbbbaacf3df8c --- /dev/null +++ b/speed.py @@ -0,0 +1,2008 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright 2012 Matt Martz +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import csv +import datetime +import errno +import math +import os +import platform +import re +import signal +import socket +import sys +import threading +import timeit +import xml.parsers.expat + +try: + import gzip + GZIP_BASE = gzip.GzipFile +except ImportError: + gzip = None + GZIP_BASE = object + +__version__ = '2.1.4b1' + + +class FakeShutdownEvent(object): + """Class to fake a threading.Event.isSet so that home of this module + are not required to register their own threading.Event() + """ + + @staticmethod + def isSet(): + "Dummy method to always return false""" + return False + + is_set = isSet + + +# Some global variables we use +DEBUG = False +_GLOBAL_DEFAULT_TIMEOUT = object() +PY25PLUS = sys.version_info[:2] >= (2, 5) +PY26PLUS = sys.version_info[:2] >= (2, 6) +PY32PLUS = sys.version_info[:2] >= (3, 2) +PY310PLUS = sys.version_info[:2] >= (3, 10) + +# Begin import game to handle Python 2 and Python 3 +try: + import json +except ImportError: + try: + import simplejson as json + except ImportError: + json = None + +try: + import xml.etree.ElementTree as ET + try: + from xml.etree.ElementTree import _Element as ET_Element + except ImportError: + pass +except ImportError: + from xml.dom import minidom as DOM + from xml.parsers.expat import ExpatError + ET = None + +try: + from urllib2 import (urlopen, Request, HTTPError, URLError, + AbstractHTTPHandler, ProxyHandler, + HTTPDefaultErrorHandler, HTTPRedirectHandler, + HTTPErrorProcessor, OpenerDirector) +except ImportError: + from urllib.request import (urlopen, Request, HTTPError, URLError, + AbstractHTTPHandler, ProxyHandler, + HTTPDefaultErrorHandler, HTTPRedirectHandler, + HTTPErrorProcessor, OpenerDirector) + +try: + from httplib import HTTPConnection, BadStatusLine +except ImportError: + from http.client import HTTPConnection, BadStatusLine + +try: + from httplib import HTTPSConnection +except ImportError: + try: + from http.client import HTTPSConnection + except ImportError: + HTTPSConnection = None + +try: + from httplib import FakeSocket +except ImportError: + FakeSocket = None + +try: + from Queue import Queue +except ImportError: + from queue import Queue + +try: + from urlparse import urlparse +except ImportError: + from urllib.parse import urlparse + +try: + from urlparse import parse_qs +except ImportError: + try: + from urllib.parse import parse_qs + except ImportError: + from cgi import parse_qs + +try: + from hashlib import md5 +except ImportError: + from md5 import md5 + +try: + from argparse import ArgumentParser as ArgParser + from argparse import SUPPRESS as ARG_SUPPRESS + PARSER_TYPE_INT = int + PARSER_TYPE_STR = str + PARSER_TYPE_FLOAT = float +except ImportError: + from optparse import OptionParser as ArgParser + from optparse import SUPPRESS_HELP as ARG_SUPPRESS + PARSER_TYPE_INT = 'int' + PARSER_TYPE_STR = 'string' + PARSER_TYPE_FLOAT = 'float' + +try: + from cStringIO import StringIO + BytesIO = None +except ImportError: + try: + from StringIO import StringIO + BytesIO = None + except ImportError: + from io import StringIO, BytesIO + +try: + import __builtin__ +except ImportError: + import builtins + from io import TextIOWrapper, FileIO + + class _Py3Utf8Output(TextIOWrapper): + """UTF-8 encoded wrapper around stdout for py3, to override + ASCII stdout + """ + def __init__(self, f, **kwargs): + buf = FileIO(f.fileno(), 'w') + super(_Py3Utf8Output, self).__init__( + buf, + encoding='utf8', + errors='strict' + ) + + def write(self, s): + super(_Py3Utf8Output, self).write(s) + self.flush() + + _py3_print = getattr(builtins, 'print') + try: + _py3_utf8_stdout = _Py3Utf8Output(sys.stdout) + _py3_utf8_stderr = _Py3Utf8Output(sys.stderr) + except OSError: + # sys.stdout/sys.stderr is not a compatible stdout/stderr object + # just use it and hope things go ok + _py3_utf8_stdout = sys.stdout + _py3_utf8_stderr = sys.stderr + + def to_utf8(v): + """No-op encode to utf-8 for py3""" + return v + + def print_(*args, **kwargs): + """Wrapper function for py3 to print, with a utf-8 encoded stdout""" + if kwargs.get('file') == sys.stderr: + kwargs['file'] = _py3_utf8_stderr + else: + kwargs['file'] = kwargs.get('file', _py3_utf8_stdout) + _py3_print(*args, **kwargs) +else: + del __builtin__ + + def to_utf8(v): + """Encode value to utf-8 if possible for py2""" + try: + return v.encode('utf8', 'strict') + except AttributeError: + return v + + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5. + + Taken from https://pypi.python.org/pypi/six/ + + Modified to set encoding to UTF-8 always, and to flush after write + """ + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + encoding = 'utf8' # Always trust UTF-8 for output + if (isinstance(fp, file) and + isinstance(data, unicode) and + encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(encoding, errors) + fp.write(data) + fp.flush() + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) + +# Exception "constants" to support Python 2 through Python 3 +try: + import ssl + try: + CERT_ERROR = (ssl.CertificateError,) + except AttributeError: + CERT_ERROR = tuple() + + HTTP_ERRORS = ( + (HTTPError, URLError, socket.error, ssl.SSLError, BadStatusLine) + + CERT_ERROR + ) +except ImportError: + ssl = None + HTTP_ERRORS = (HTTPError, URLError, socket.error, BadStatusLine) + +if PY32PLUS: + etree_iter = ET.Element.iter +elif PY25PLUS: + etree_iter = ET_Element.getiterator + +if PY26PLUS: + thread_is_alive = threading.Thread.is_alive +else: + thread_is_alive = threading.Thread.isAlive + + +def event_is_set(event): + try: + return event.is_set() + except AttributeError: + return event.isSet() + + +class SpeedtestException(Exception): + """Base exception for this module""" + + +class SpeedtestCLIError(SpeedtestException): + """Generic exception for raising errors during CLI operation""" + + +class SpeedtestHTTPError(SpeedtestException): + """Base HTTP exception for this module""" + + +class SpeedtestConfigError(SpeedtestException): + """Configuration XML is invalid""" + + +class SpeedtestServersError(SpeedtestException): + """Servers XML is invalid""" + + +class ConfigRetrievalError(SpeedtestHTTPError): + """Could not retrieve config.php""" + + +class ServersRetrievalError(SpeedtestHTTPError): + """Could not retrieve speedtest-servers.php""" + + +class InvalidServerIDType(SpeedtestException): + """Server ID used for filtering was not an integer""" + + +class NoMatchedServers(SpeedtestException): + """No servers matched when filtering""" + + +class SpeedtestMiniConnectFailure(SpeedtestException): + """Could not connect to the provided speedtest mini server""" + + +class InvalidSpeedtestMiniServer(SpeedtestException): + """Server provided as a speedtest mini server does not actually appear + to be a speedtest mini server + """ + + +class ShareResultsConnectFailure(SpeedtestException): + """Could not connect to speedtest.net API to POST results""" + + +class ShareResultsSubmitFailure(SpeedtestException): + """Unable to successfully POST results to speedtest.net API after + connection + """ + + +class SpeedtestUploadTimeout(SpeedtestException): + """testlength configuration reached during upload + Used to ensure the upload halts when no additional data should be sent + """ + + +class SpeedtestBestServerFailure(SpeedtestException): + """Unable to determine best server""" + + +class SpeedtestMissingBestServer(SpeedtestException): + """get_best_server not called or not able to determine best server""" + + +def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, + source_address=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :fun`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + + Largely vendored from Python 2.7, modified to work with Python 2.4 + """ + + host, port = address + err = None + for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + if timeout is not _GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(float(timeout)) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error: + err = get_exception() + if sock is not None: + sock.close() + + if err is not None: + raise err + else: + raise socket.error("getaddrinfo returns an empty list") + + +class SpeedtestHTTPConnection(HTTPConnection): + """Custom HTTPConnection to support source_address across + Python 2.4 - Python 3 + """ + def __init__(self, *args, **kwargs): + source_address = kwargs.pop('source_address', None) + timeout = kwargs.pop('timeout', 10) + + self._tunnel_host = None + + HTTPConnection.__init__(self, *args, **kwargs) + + self.source_address = source_address + self.timeout = timeout + + def connect(self): + """Connect to the host and port specified in __init__.""" + try: + self.sock = socket.create_connection( + (self.host, self.port), + self.timeout, + self.source_address + ) + except (AttributeError, TypeError): + self.sock = create_connection( + (self.host, self.port), + self.timeout, + self.source_address + ) + + if self._tunnel_host: + self._tunnel() + + +if HTTPSConnection: + class SpeedtestHTTPSConnection(HTTPSConnection): + """Custom HTTPSConnection to support source_address across + Python 2.4 - Python 3 + """ + default_port = 443 + + def __init__(self, *args, **kwargs): + source_address = kwargs.pop('source_address', None) + timeout = kwargs.pop('timeout', 10) + + self._tunnel_host = None + + HTTPSConnection.__init__(self, *args, **kwargs) + + self.timeout = timeout + self.source_address = source_address + + def connect(self): + "Connect to a host on a given (SSL) port." + try: + self.sock = socket.create_connection( + (self.host, self.port), + self.timeout, + self.source_address + ) + except (AttributeError, TypeError): + self.sock = create_connection( + (self.host, self.port), + self.timeout, + self.source_address + ) + + if self._tunnel_host: + self._tunnel() + + if ssl: + try: + kwargs = {} + if hasattr(ssl, 'SSLContext'): + if self._tunnel_host: + kwargs['server_hostname'] = self._tunnel_host + else: + kwargs['server_hostname'] = self.host + self.sock = self._context.wrap_socket(self.sock, **kwargs) + except AttributeError: + self.sock = ssl.wrap_socket(self.sock) + try: + self.sock.server_hostname = self.host + except AttributeError: + pass + elif FakeSocket: + # Python 2.4/2.5 support + try: + self.sock = FakeSocket(self.sock, socket.ssl(self.sock)) + except AttributeError: + raise SpeedtestException( + 'This version of Python does not support HTTPS/SSL ' + 'functionality' + ) + else: + raise SpeedtestException( + 'This version of Python does not support HTTPS/SSL ' + 'functionality' + ) + + +def _build_connection(connection, source_address, timeout, context=None): + """Cross Python 2.4 - Python 3 callable to build an ``HTTPConnection`` or + ``HTTPSConnection`` with the args we need + + Called from ``http(s)_open`` methods of ``SpeedtestHTTPHandler`` or + ``SpeedtestHTTPSHandler`` + """ + def inner(host, **kwargs): + kwargs.update({ + 'source_address': source_address, + 'timeout': timeout + }) + if context: + kwargs['context'] = context + return connection(host, **kwargs) + return inner + + +class SpeedtestHTTPHandler(AbstractHTTPHandler): + """Custom ``HTTPHandler`` that can build a ``HTTPConnection`` with the + args we need for ``source_address`` and ``timeout`` + """ + def __init__(self, debuglevel=0, source_address=None, timeout=10): + AbstractHTTPHandler.__init__(self, debuglevel) + self.source_address = source_address + self.timeout = timeout + + def http_open(self, req): + return self.do_open( + _build_connection( + SpeedtestHTTPConnection, + self.source_address, + self.timeout + ), + req + ) + + http_request = AbstractHTTPHandler.do_request_ + + +class SpeedtestHTTPSHandler(AbstractHTTPHandler): + """Custom ``HTTPSHandler`` that can build a ``HTTPSConnection`` with the + args we need for ``source_address`` and ``timeout`` + """ + def __init__(self, debuglevel=0, context=None, source_address=None, + timeout=10): + AbstractHTTPHandler.__init__(self, debuglevel) + self._context = context + self.source_address = source_address + self.timeout = timeout + + def https_open(self, req): + return self.do_open( + _build_connection( + SpeedtestHTTPSConnection, + self.source_address, + self.timeout, + context=self._context, + ), + req + ) + + https_request = AbstractHTTPHandler.do_request_ + + +def build_opener(source_address=None, timeout=10): + """Function similar to ``urllib2.build_opener`` that will build + an ``OpenerDirector`` with the explicit handlers we want, + ``source_address`` for binding, ``timeout`` and our custom + `User-Agent` + """ + + printer('Timeout set to %d' % timeout, debug=True) + + if source_address: + source_address_tuple = (source_address, 0) + printer('Binding to source address: %r' % (source_address_tuple,), + debug=True) + else: + source_address_tuple = None + + handlers = [ + ProxyHandler(), + SpeedtestHTTPHandler(source_address=source_address_tuple, + timeout=timeout), + SpeedtestHTTPSHandler(source_address=source_address_tuple, + timeout=timeout), + HTTPDefaultErrorHandler(), + HTTPRedirectHandler(), + HTTPErrorProcessor() + ] + + opener = OpenerDirector() + opener.addheaders = [('User-agent', build_user_agent())] + + for handler in handlers: + opener.add_handler(handler) + + return opener + + +class GzipDecodedResponse(GZIP_BASE): + """A file-like object to decode a response encoded with the gzip + method, as described in RFC 1952. + + Largely copied from ``xmlrpclib``/``xmlrpc.client`` and modified + to work for py2.4-py3 + """ + def __init__(self, response): + # response doesn't support tell() and read(), required by + # GzipFile + if not gzip: + raise SpeedtestHTTPError('HTTP response body is gzip encoded, ' + 'but gzip support is not available') + IO = BytesIO or StringIO + self.io = IO() + while 1: + chunk = response.read(1024) + if len(chunk) == 0: + break + self.io.write(chunk) + self.io.seek(0) + gzip.GzipFile.__init__(self, mode='rb', fileobj=self.io) + + def close(self): + try: + gzip.GzipFile.close(self) + finally: + self.io.close() + + +def get_exception(): + """Helper function to work with py2.4-py3 for getting the current + exception in a try/except block + """ + return sys.exc_info()[1] + + +def distance(origin, destination): + """Determine distance between 2 sets of [lat,lon] in km""" + + lat1, lon1 = origin + lat2, lon2 = destination + radius = 6371 # km + + dlat = math.radians(lat2 - lat1) + dlon = math.radians(lon2 - lon1) + a = (math.sin(dlat / 2) * math.sin(dlat / 2) + + math.cos(math.radians(lat1)) * + math.cos(math.radians(lat2)) * math.sin(dlon / 2) * + math.sin(dlon / 2)) + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + d = radius * c + + return d + + +def build_user_agent(): + """Build a Mozilla/5.0 compatible User-Agent string""" + + ua_tuple = ( + 'Mozilla/5.0', + '(%s; U; %s; en-us)' % (platform.platform(), + platform.architecture()[0]), + 'Python/%s' % platform.python_version(), + '(KHTML, like Gecko)', + 'speedtest-cli/%s' % __version__ + ) + user_agent = ' '.join(ua_tuple) + printer('User-Agent: %s' % user_agent, debug=True) + return user_agent + + +def build_request(url, data=None, headers=None, bump='0', secure=False): + """Build a urllib2 request object + + This function automatically adds a User-Agent header to all requests + + """ + + if not headers: + headers = {} + + if url[0] == ':': + scheme = ('http', 'https')[bool(secure)] + schemed_url = '%s%s' % (scheme, url) + else: + schemed_url = url + + if '?' in url: + delim = '&' + else: + delim = '?' + + # WHO YOU GONNA CALL? CACHE BUSTERS! + final_url = '%s%sx=%s.%s' % (schemed_url, delim, + int(timeit.time.time() * 1000), + bump) + + headers.update({ + 'Cache-Control': 'no-cache', + }) + + printer('%s %s' % (('GET', 'POST')[bool(data)], final_url), + debug=True) + + return Request(final_url, data=data, headers=headers) + + +def catch_request(request, opener=None): + """Helper function to catch common exceptions encountered when + establishing a connection with a HTTP/HTTPS request + + """ + + if opener: + _open = opener.open + else: + _open = urlopen + + try: + uh = _open(request) + if request.get_full_url() != uh.geturl(): + printer('Redirected to %s' % uh.geturl(), debug=True) + return uh, False + except HTTP_ERRORS: + e = get_exception() + return None, e + + +def get_response_stream(response): + """Helper function to return either a Gzip reader if + ``Content-Encoding`` is ``gzip`` otherwise the response itself + + """ + + try: + getheader = response.headers.getheader + except AttributeError: + getheader = response.getheader + + if getheader('content-encoding') == 'gzip': + return GzipDecodedResponse(response) + + return response + + +def get_attributes_by_tag_name(dom, tag_name): + """Retrieve an attribute from an XML document and return it in a + consistent format + + Only used with xml.dom.minidom, which is likely only to be used + with python versions older than 2.5 + """ + elem = dom.getElementsByTagName(tag_name)[0] + return dict(list(elem.attributes.items())) + + +def print_dots(shutdown_event): + """Built in callback function used by Thread classes for printing + status + """ + def inner(current, total, start=False, end=False): + if event_is_set(shutdown_event): + return + + sys.stdout.write('.') + if current + 1 == total and end is True: + sys.stdout.write('\n') + sys.stdout.flush() + return inner + + +def do_nothing(*args, **kwargs): + pass + + +class HTTPDownloader(threading.Thread): + """Thread class for retrieving a URL""" + + def __init__(self, i, request, start, timeout, opener=None, + shutdown_event=None): + threading.Thread.__init__(self) + self.request = request + self.result = [0] + self.starttime = start + self.timeout = timeout + self.i = i + if opener: + self._opener = opener.open + else: + self._opener = urlopen + + if shutdown_event: + self._shutdown_event = shutdown_event + else: + self._shutdown_event = FakeShutdownEvent() + + def run(self): + try: + if (timeit.default_timer() - self.starttime) <= self.timeout: + f = self._opener(self.request) + while (not event_is_set(self._shutdown_event) and + (timeit.default_timer() - self.starttime) <= + self.timeout): + self.result.append(len(f.read(10240))) + if self.result[-1] == 0: + break + f.close() + except IOError: + pass + except HTTP_ERRORS: + pass + + +class HTTPUploaderData(object): + """File like object to improve cutting off the upload once the timeout + has been reached + """ + + def __init__(self, length, start, timeout, shutdown_event=None): + self.length = length + self.start = start + self.timeout = timeout + + if shutdown_event: + self._shutdown_event = shutdown_event + else: + self._shutdown_event = FakeShutdownEvent() + + self._data = None + + self.total = [0] + + def pre_allocate(self): + chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' + multiplier = int(round(int(self.length) / 36.0)) + IO = BytesIO or StringIO + try: + self._data = IO( + ('content1=%s' % + (chars * multiplier)[0:int(self.length) - 9] + ).encode() + ) + except MemoryError: + raise SpeedtestCLIError( + 'Insufficient memory to pre-allocate upload data. Please ' + 'use --no-pre-allocate' + ) + + @property + def data(self): + if not self._data: + self.pre_allocate() + return self._data + + def read(self, n=10240): + if ((timeit.default_timer() - self.start) <= self.timeout and + not event_is_set(self._shutdown_event)): + chunk = self.data.read(n) + self.total.append(len(chunk)) + return chunk + else: + raise SpeedtestUploadTimeout() + + def __len__(self): + return self.length + + +class HTTPUploader(threading.Thread): + """Thread class for putting a URL""" + + def __init__(self, i, request, start, size, timeout, opener=None, + shutdown_event=None): + threading.Thread.__init__(self) + self.request = request + self.request.data.start = self.starttime = start + self.size = size + self.result = 0 + self.timeout = timeout + self.i = i + + if opener: + self._opener = opener.open + else: + self._opener = urlopen + + if shutdown_event: + self._shutdown_event = shutdown_event + else: + self._shutdown_event = FakeShutdownEvent() + + def run(self): + request = self.request + try: + if ((timeit.default_timer() - self.starttime) <= self.timeout and + not event_is_set(self._shutdown_event)): + try: + f = self._opener(request) + except TypeError: + # PY24 expects a string or buffer + # This also causes issues with Ctrl-C, but we will concede + # for the moment that Ctrl-C on PY24 isn't immediate + request = build_request(self.request.get_full_url(), + data=request.data.read(self.size)) + f = self._opener(request) + f.read(11) + f.close() + self.result = sum(self.request.data.total) + else: + self.result = 0 + except (IOError, SpeedtestUploadTimeout): + self.result = sum(self.request.data.total) + except HTTP_ERRORS: + self.result = 0 + + +class SpeedtestResults(object): + """Class for holding the results of a speedtest, including: + + Download speed + Upload speed + Ping/Latency to test server + Data about server that the test was run against + + Additionally this class can return a result data as a dictionary or CSV, + as well as submit a POST of the result data to the speedtest.net API + to get a share results image link. + """ + + def __init__(self, download=0, upload=0, ping=0, server=None, client=None, + opener=None, secure=False): + self.download = download + self.upload = upload + self.ping = ping + if server is None: + self.server = {} + else: + self.server = server + self.client = client or {} + + self._share = None + self.timestamp = '%sZ' % datetime.datetime.utcnow().isoformat() + self.bytes_received = 0 + self.bytes_sent = 0 + + if opener: + self._opener = opener + else: + self._opener = build_opener() + + self._secure = secure + + def __repr__(self): + return repr(self.dict()) + + def share(self): + """POST data to the speedtest.net API to obtain a share results + link + """ + + if self._share: + return self._share + + download = int(round(self.download / 1000.0, 0)) + ping = int(round(self.ping, 0)) + upload = int(round(self.upload / 1000.0, 0)) + + # Build the request to send results back to speedtest.net + # We use a list instead of a dict because the API expects parameters + # in a certain order + api_data = [ + 'recommendedserverid=%s' % self.server['id'], + 'ping=%s' % ping, + 'screenresolution=', + 'promo=', + 'download=%s' % download, + 'screendpi=', + 'upload=%s' % upload, + 'testmethod=http', + 'hash=%s' % md5(('%s-%s-%s-%s' % + (ping, upload, download, '297aae72')) + .encode()).hexdigest(), + 'touchscreen=none', + 'startmode=pingselect', + 'accuracy=1', + 'bytesreceived=%s' % self.bytes_received, + 'bytessent=%s' % self.bytes_sent, + 'serverid=%s' % self.server['id'], + ] + + headers = {'Referer': 'http://c.speedtest.net/flash/speedtest.swf'} + request = build_request('://www.speedtest.net/api/api.php', + data='&'.join(api_data).encode(), + headers=headers, secure=self._secure) + f, e = catch_request(request, opener=self._opener) + if e: + raise ShareResultsConnectFailure(e) + + response = f.read() + code = f.code + f.close() + + if int(code) != 200: + raise ShareResultsSubmitFailure('Could not submit results to ' + 'speedtest.net') + + qsargs = parse_qs(response.decode()) + resultid = qsargs.get('resultid') + if not resultid or len(resultid) != 1: + raise ShareResultsSubmitFailure('Could not submit results to ' + 'speedtest.net') + + self._share = 'http://www.speedtest.net/result/%s.png' % resultid[0] + + return self._share + + def dict(self): + """Return dictionary of result data""" + + return { + 'download': self.download, + 'upload': self.upload, + 'ping': self.ping, + 'server': self.server, + 'timestamp': self.timestamp, + 'bytes_sent': self.bytes_sent, + 'bytes_received': self.bytes_received, + 'share': self._share, + 'client': self.client, + } + + @staticmethod + def csv_header(delimiter=','): + """Return CSV Headers""" + + row = ['Server ID', 'Sponsor', 'Server Name', 'Timestamp', 'Distance', + 'Ping', 'Download', 'Upload', 'Share', 'IP Address'] + out = StringIO() + writer = csv.writer(out, delimiter=delimiter, lineterminator='') + writer.writerow([to_utf8(v) for v in row]) + return out.getvalue() + + def csv(self, delimiter=','): + """Return data in CSV format""" + + data = self.dict() + out = StringIO() + writer = csv.writer(out, delimiter=delimiter, lineterminator='') + row = [data['server']['id'], data['server']['sponsor'], + data['server']['name'], data['timestamp'], + data['server']['d'], data['ping'], data['download'], + data['upload'], self._share or '', self.client['ip']] + writer.writerow([to_utf8(v) for v in row]) + return out.getvalue() + + def json(self, pretty=False): + """Return data in JSON format""" + + kwargs = {} + if pretty: + kwargs.update({ + 'indent': 4, + 'sort_keys': True + }) + return json.dumps(self.dict(), **kwargs) + + +class Speedtest(object): + """Class for performing standard speedtest.net testing operations""" + + def __init__(self, config=None, source_address=None, timeout=10, + secure=False, shutdown_event=None): + self.config = {} + + self._source_address = source_address + self._timeout = timeout + self._opener = build_opener(source_address, timeout) + + self._secure = secure + + if shutdown_event: + self._shutdown_event = shutdown_event + else: + self._shutdown_event = FakeShutdownEvent() + + self.get_config() + if config is not None: + self.config.update(config) + + self.servers = {} + self.closest = [] + self._best = {} + + self.results = SpeedtestResults( + client=self.config['client'], + opener=self._opener, + secure=secure, + ) + + @property + def best(self): + if not self._best: + self.get_best_server() + return self._best + + def get_config(self): + """Download the speedtest.net configuration and return only the data + we are interested in + """ + + headers = {} + if gzip: + headers['Accept-Encoding'] = 'gzip' + request = build_request('://www.speedtest.net/speedtest-config.php', + headers=headers, secure=self._secure) + uh, e = catch_request(request, opener=self._opener) + if e: + raise ConfigRetrievalError(e) + configxml_list = [] + + stream = get_response_stream(uh) + + while 1: + try: + configxml_list.append(stream.read(1024)) + except (OSError, EOFError): + raise ConfigRetrievalError(get_exception()) + if len(configxml_list[-1]) == 0: + break + stream.close() + uh.close() + + if int(uh.code) != 200: + return None + + configxml = ''.encode().join(configxml_list) + + printer('Config XML:\n%s' % configxml, debug=True) + + try: + try: + root = ET.fromstring(configxml) + except ET.ParseError: + e = get_exception() + raise SpeedtestConfigError( + 'Malformed speedtest.net configuration: %s' % e + ) + server_config = root.find('server-config').attrib + download = root.find('download').attrib + upload = root.find('upload').attrib + # times = root.find('times').attrib + client = root.find('client').attrib + + except AttributeError: + try: + root = DOM.parseString(configxml) + except ExpatError: + e = get_exception() + raise SpeedtestConfigError( + 'Malformed speedtest.net configuration: %s' % e + ) + server_config = get_attributes_by_tag_name(root, 'server-config') + download = get_attributes_by_tag_name(root, 'download') + upload = get_attributes_by_tag_name(root, 'upload') + # times = get_attributes_by_tag_name(root, 'times') + client = get_attributes_by_tag_name(root, 'client') + + ignore_servers = [ + int(i) for i in server_config['ignoreids'].split(',') if i + ] + + ratio = int(upload['ratio']) + upload_max = int(upload['maxchunkcount']) + up_sizes = [32768, 65536, 131072, 262144, 524288, 1048576, 7340032] + sizes = { + 'upload': up_sizes[ratio - 1:], + 'download': [350, 500, 750, 1000, 1500, 2000, 2500, + 3000, 3500, 4000] + } + + size_count = len(sizes['upload']) + + upload_count = int(math.ceil(upload_max / size_count)) + + counts = { + 'upload': upload_count, + 'download': int(download['threadsperurl']) + } + + threads = { + 'upload': int(upload['threads']), + 'download': int(server_config['threadcount']) * 2 + } + + length = { + 'upload': int(upload['testlength']), + 'download': int(download['testlength']) + } + + self.config.update({ + 'client': client, + 'ignore_servers': ignore_servers, + 'sizes': sizes, + 'counts': counts, + 'threads': threads, + 'length': length, + 'upload_max': upload_count * size_count + }) + + try: + self.lat_lon = (float(client['lat']), float(client['lon'])) + except ValueError: + raise SpeedtestConfigError( + 'Unknown location: lat=%r lon=%r' % + (client.get('lat'), client.get('lon')) + ) + + printer('Config:\n%r' % self.config, debug=True) + + return self.config + + def get_servers(self, servers=None, exclude=None): + """Retrieve a the list of speedtest.net servers, optionally filtered + to servers matching those specified in the ``servers`` argument + """ + if servers is None: + servers = [] + + if exclude is None: + exclude = [] + + self.servers.clear() + + for server_list in (servers, exclude): + for i, s in enumerate(server_list): + try: + server_list[i] = int(s) + except ValueError: + raise InvalidServerIDType( + '%s is an invalid server type, must be int' % s + ) + + urls = [ + '://www.speedtest.net/speedtest-servers-static.php', + 'http://c.speedtest.net/speedtest-servers-static.php', + '://www.speedtest.net/speedtest-servers.php', + 'http://c.speedtest.net/speedtest-servers.php', + ] + + headers = {} + if gzip: + headers['Accept-Encoding'] = 'gzip' + + errors = [] + for url in urls: + try: + request = build_request( + '%s?threads=%s' % (url, + self.config['threads']['download']), + headers=headers, + secure=self._secure + ) + uh, e = catch_request(request, opener=self._opener) + if e: + errors.append('%s' % e) + raise ServersRetrievalError() + + stream = get_response_stream(uh) + + serversxml_list = [] + while 1: + try: + serversxml_list.append(stream.read(1024)) + except (OSError, EOFError): + raise ServersRetrievalError(get_exception()) + if len(serversxml_list[-1]) == 0: + break + + stream.close() + uh.close() + + if int(uh.code) != 200: + raise ServersRetrievalError() + + serversxml = ''.encode().join(serversxml_list) + + printer('Servers XML:\n%s' % serversxml, debug=True) + + try: + try: + try: + root = ET.fromstring(serversxml) + except ET.ParseError: + e = get_exception() + raise SpeedtestServersError( + 'Malformed speedtest.net server list: %s' % e + ) + elements = etree_iter(root, 'server') + except AttributeError: + try: + root = DOM.parseString(serversxml) + except ExpatError: + e = get_exception() + raise SpeedtestServersError( + 'Malformed speedtest.net server list: %s' % e + ) + elements = root.getElementsByTagName('server') + except (SyntaxError, xml.parsers.expat.ExpatError): + raise ServersRetrievalError() + + for server in elements: + try: + attrib = server.attrib + except AttributeError: + attrib = dict(list(server.attributes.items())) + + if servers and int(attrib.get('id')) not in servers: + continue + + if (int(attrib.get('id')) in self.config['ignore_servers'] + or int(attrib.get('id')) in exclude): + continue + + try: + d = distance(self.lat_lon, + (float(attrib.get('lat')), + float(attrib.get('lon')))) + except Exception: + continue + + attrib['d'] = d + + try: + self.servers[d].append(attrib) + except KeyError: + self.servers[d] = [attrib] + + break + + except ServersRetrievalError: + continue + + if (servers or exclude) and not self.servers: + raise NoMatchedServers() + + return self.servers + + def set_mini_server(self, server): + """Instead of querying for a list of servers, set a link to a + speedtest mini server + """ + + urlparts = urlparse(server) + + name, ext = os.path.splitext(urlparts[2]) + if ext: + url = os.path.dirname(server) + else: + url = server + + request = build_request(url) + uh, e = catch_request(request, opener=self._opener) + if e: + raise SpeedtestMiniConnectFailure('Failed to connect to %s' % + server) + else: + text = uh.read() + uh.close() + + extension = re.findall('upload_?[Ee]xtension: "([^"]+)"', + text.decode()) + if not extension: + for ext in ['php', 'asp', 'aspx', 'jsp']: + try: + f = self._opener.open( + '%s/speedtest/upload.%s' % (url, ext) + ) + except Exception: + pass + else: + data = f.read().strip().decode() + if (f.code == 200 and + len(data.splitlines()) == 1 and + re.match('size=[0-9]', data)): + extension = [ext] + break + if not urlparts or not extension: + raise InvalidSpeedtestMiniServer('Invalid Speedtest Mini Server: ' + '%s' % server) + + self.servers = [{ + 'sponsor': 'Speedtest Mini', + 'name': urlparts[1], + 'd': 0, + 'url': '%s/speedtest/upload.%s' % (url.rstrip('/'), extension[0]), + 'latency': 0, + 'id': 0 + }] + + return self.servers + + def get_closest_servers(self, limit=5): + """Limit servers to the closest speedtest.net servers based on + geographic distance + """ + + if not self.servers: + self.get_servers() + + for d in sorted(self.servers.keys()): + for s in self.servers[d]: + self.closest.append(s) + if len(self.closest) == limit: + break + else: + continue + break + + printer('Closest Servers:\n%r' % self.closest, debug=True) + return self.closest + + def get_best_server(self, servers=None): + """Perform a speedtest.net "ping" to determine which speedtest.net + server has the lowest latency + """ + + if not servers: + if not self.closest: + servers = self.get_closest_servers() + servers = self.closest + + if self._source_address: + source_address_tuple = (self._source_address, 0) + else: + source_address_tuple = None + + user_agent = build_user_agent() + + results = {} + for server in servers: + cum = [] + url = os.path.dirname(server['url']) + stamp = int(timeit.time.time() * 1000) + latency_url = '%s/latency.txt?x=%s' % (url, stamp) + for i in range(0, 3): + this_latency_url = '%s.%s' % (latency_url, i) + printer('%s %s' % ('GET', this_latency_url), + debug=True) + urlparts = urlparse(latency_url) + try: + if urlparts[0] == 'https': + h = SpeedtestHTTPSConnection( + urlparts[1], + source_address=source_address_tuple + ) + else: + h = SpeedtestHTTPConnection( + urlparts[1], + source_address=source_address_tuple + ) + headers = {'User-Agent': user_agent} + path = '%s?%s' % (urlparts[2], urlparts[4]) + start = timeit.default_timer() + h.request("GET", path, headers=headers) + r = h.getresponse() + total = (timeit.default_timer() - start) + except HTTP_ERRORS: + e = get_exception() + printer('ERROR: %r' % e, debug=True) + cum.append(3600) + continue + + text = r.read(9) + if int(r.status) == 200 and text == 'test=test'.encode(): + cum.append(total) + else: + cum.append(3600) + h.close() + + avg = round((sum(cum) / 6) * 1000.0, 3) + results[avg] = server + + try: + fastest = sorted(results.keys())[0] + except IndexError: + raise SpeedtestBestServerFailure('Unable to connect to servers to ' + 'test latency.') + best = results[fastest] + best['latency'] = fastest + + self.results.ping = fastest + self.results.server = best + + self._best.update(best) + printer('Best Server:\n%r' % best, debug=True) + return best + + def download(self, callback=do_nothing, threads=None): + """Test download speed against speedtest.net + + A ``threads`` value of ``None`` will fall back to those dictated + by the speedtest.net configuration + """ + + urls = [] + for size in self.config['sizes']['download']: + for _ in range(0, self.config['counts']['download']): + urls.append('%s/random%sx%s.jpg' % + (os.path.dirname(self.best['url']), size, size)) + + request_count = len(urls) + requests = [] + for i, url in enumerate(urls): + requests.append( + build_request(url, bump=i, secure=self._secure) + ) + + max_threads = threads or self.config['threads']['download'] + in_flight = {'threads': 0} + + def producer(q, requests, request_count): + for i, request in enumerate(requests): + thread = HTTPDownloader( + i, + request, + start, + self.config['length']['download'], + opener=self._opener, + shutdown_event=self._shutdown_event + ) + while in_flight['threads'] >= max_threads: + timeit.time.sleep(0.001) + thread.start() + q.put(thread, True) + in_flight['threads'] += 1 + callback(i, request_count, start=True) + + finished = [] + + def consumer(q, request_count): + _is_alive = thread_is_alive + while len(finished) < request_count: + thread = q.get(True) + while _is_alive(thread): + thread.join(timeout=0.001) + in_flight['threads'] -= 1 + finished.append(sum(thread.result)) + callback(thread.i, request_count, end=True) + + q = Queue(max_threads) + prod_thread = threading.Thread(target=producer, + args=(q, requests, request_count)) + cons_thread = threading.Thread(target=consumer, + args=(q, request_count)) + start = timeit.default_timer() + prod_thread.start() + cons_thread.start() + _is_alive = thread_is_alive + while _is_alive(prod_thread): + prod_thread.join(timeout=0.001) + while _is_alive(cons_thread): + cons_thread.join(timeout=0.001) + + stop = timeit.default_timer() + self.results.bytes_received = sum(finished) + self.results.download = ( + (self.results.bytes_received / (stop - start)) * 8.0 + ) + if self.results.download > 100000: + self.config['threads']['upload'] = 8 + return self.results.download + + def upload(self, callback=do_nothing, pre_allocate=True, threads=None): + """Test upload speed against speedtest.net + + A ``threads`` value of ``None`` will fall back to those dictated + by the speedtest.net configuration + """ + + sizes = [] + + for size in self.config['sizes']['upload']: + for _ in range(0, self.config['counts']['upload']): + sizes.append(size) + + # request_count = len(sizes) + request_count = self.config['upload_max'] + + requests = [] + for i, size in enumerate(sizes): + # We set ``0`` for ``start`` and handle setting the actual + # ``start`` in ``HTTPUploader`` to get better measurements + data = HTTPUploaderData( + size, + 0, + self.config['length']['upload'], + shutdown_event=self._shutdown_event + ) + if pre_allocate: + data.pre_allocate() + + headers = {'Content-length': size} + requests.append( + ( + build_request(self.best['url'], data, secure=self._secure, + headers=headers), + size + ) + ) + + max_threads = threads or self.config['threads']['upload'] + in_flight = {'threads': 0} + + def producer(q, requests, request_count): + for i, request in enumerate(requests[:request_count]): + thread = HTTPUploader( + i, + request[0], + start, + request[1], + self.config['length']['upload'], + opener=self._opener, + shutdown_event=self._shutdown_event + ) + while in_flight['threads'] >= max_threads: + timeit.time.sleep(0.001) + thread.start() + q.put(thread, True) + in_flight['threads'] += 1 + callback(i, request_count, start=True) + + finished = [] + + def consumer(q, request_count): + _is_alive = thread_is_alive + while len(finished) < request_count: + thread = q.get(True) + while _is_alive(thread): + thread.join(timeout=0.001) + in_flight['threads'] -= 1 + finished.append(thread.result) + callback(thread.i, request_count, end=True) + + q = Queue(threads or self.config['threads']['upload']) + prod_thread = threading.Thread(target=producer, + args=(q, requests, request_count)) + cons_thread = threading.Thread(target=consumer, + args=(q, request_count)) + start = timeit.default_timer() + prod_thread.start() + cons_thread.start() + _is_alive = thread_is_alive + while _is_alive(prod_thread): + prod_thread.join(timeout=0.1) + while _is_alive(cons_thread): + cons_thread.join(timeout=0.1) + + stop = timeit.default_timer() + self.results.bytes_sent = sum(finished) + self.results.upload = ( + (self.results.bytes_sent / (stop - start)) * 8.0 + ) + return self.results.upload + + +def ctrl_c(shutdown_event): + """Catch Ctrl-C key sequence and set a SHUTDOWN_EVENT for our threaded + operations + """ + def inner(signum, frame): + shutdown_event.set() + printer('\nCancelling...', error=True) + sys.exit(0) + return inner + + +def version(): + """Print the version""" + + printer('speedtest-cli %s' % __version__) + printer('Python %s' % sys.version.replace('\n', '')) + sys.exit(0) + + +def csv_header(delimiter=','): + """Print the CSV Headers""" + + printer(SpeedtestResults.csv_header(delimiter=delimiter)) + sys.exit(0) + + +def parse_args(): + """Function to handle building and parsing of command line arguments""" + description = ( + 'Command line interface for testing internet bandwidth using ' + 'speedtest.net.\n' + '------------------------------------------------------------' + '--------------\n' + 'https://github.com/sivel/speedtest-cli') + + parser = ArgParser(description=description) + # Give optparse.OptionParser an `add_argument` method for + # compatibility with argparse.ArgumentParser + try: + parser.add_argument = parser.add_option + except AttributeError: + pass + parser.add_argument('--no-download', dest='download', default=True, + action='store_const', const=False, + help='Do not perform download test') + parser.add_argument('--no-upload', dest='upload', default=True, + action='store_const', const=False, + help='Do not perform upload test') + parser.add_argument('--single', default=False, action='store_true', + help='Only use a single connection instead of ' + 'multiple. This simulates a typical file ' + 'transfer.') + parser.add_argument('--bytes', dest='units', action='store_const', + const=('byte', 8), default=('bit', 1), + help='Display values in bytes instead of bits. Does ' + 'not affect the image generated by --share, nor ' + 'output from --json or --csv') + parser.add_argument('--share', action='store_true', + help='Generate and provide a URL to the speedtest.net ' + 'share results image, not displayed with --csv') + parser.add_argument('--simple', action='store_true', default=False, + help='Suppress verbose output, only show basic ' + 'information') + parser.add_argument('--csv', action='store_true', default=False, + help='Suppress verbose output, only show basic ' + 'information in CSV format. Speeds listed in ' + 'bit/s and not affected by --bytes') + parser.add_argument('--csv-delimiter', default=',', type=PARSER_TYPE_STR, + help='Single character delimiter to use in CSV ' + 'output. Default ","') + parser.add_argument('--csv-header', action='store_true', default=False, + help='Print CSV headers') + parser.add_argument('--json', action='store_true', default=False, + help='Suppress verbose output, only show basic ' + 'information in JSON format. Speeds listed in ' + 'bit/s and not affected by --bytes') + parser.add_argument('--list', action='store_true', + help='Display a list of speedtest.net servers ' + 'sorted by distance') + parser.add_argument('--server', type=PARSER_TYPE_INT, action='append', + help='Specify a server ID to test against. Can be ' + 'supplied multiple times') + parser.add_argument('--exclude', type=PARSER_TYPE_INT, action='append', + help='Exclude a server from selection. Can be ' + 'supplied multiple times') + parser.add_argument('--mini', help='URL of the Speedtest Mini server') + parser.add_argument('--source', help='Source IP address to bind to') + parser.add_argument('--timeout', default=10, type=PARSER_TYPE_FLOAT, + help='HTTP timeout in seconds. Default 10') + parser.add_argument('--secure', action='store_true', + help='Use HTTPS instead of HTTP when communicating ' + 'with speedtest.net operated servers') + parser.add_argument('--no-pre-allocate', dest='pre_allocate', + action='store_const', default=True, const=False, + help='Do not pre allocate upload data. Pre allocation ' + 'is enabled by default to improve upload ' + 'performance. To support systems with ' + 'insufficient memory, use this option to avoid a ' + 'MemoryError') + parser.add_argument('--version', action='store_true', + help='Show the version number and exit') + parser.add_argument('--debug', action='store_true', + help=ARG_SUPPRESS, default=ARG_SUPPRESS) + + options = parser.parse_args() + if isinstance(options, tuple): + args = options[0] + else: + args = options + return args + + +def validate_optional_args(args): + """Check if an argument was provided that depends on a module that may + not be part of the Python standard library. + + If such an argument is supplied, and the module does not exist, exit + with an error stating which module is missing. + """ + optional_args = { + 'json': ('json/simplejson python module', json), + 'secure': ('SSL support', HTTPSConnection), + } + + for arg, info in optional_args.items(): + if getattr(args, arg, False) and info[1] is None: + raise SystemExit('%s is not installed. --%s is ' + 'unavailable' % (info[0], arg)) + + +def printer(string, quiet=False, debug=False, error=False, **kwargs): + """Helper function print a string with various features""" + + if debug and not DEBUG: + return + + if debug: + if sys.stdout.isatty(): + out = '\033[1;30mDEBUG: %s\033[0m' % string + else: + out = 'DEBUG: %s' % string + else: + out = string + + if error: + kwargs['file'] = sys.stderr + + if not quiet: + print_(out, **kwargs) + + +def shell(): + """Run the full speedtest.net test""" + + global DEBUG + shutdown_event = threading.Event() + + signal.signal(signal.SIGINT, ctrl_c(shutdown_event)) + + args = parse_args() + + # Print the version and exit + if args.version: + version() + + if not args.download and not args.upload: + raise SpeedtestCLIError('Cannot supply both --no-download and ' + '--no-upload') + + if len(args.csv_delimiter) != 1: + raise SpeedtestCLIError('--csv-delimiter must be a single character') + + if args.csv_header: + csv_header(args.csv_delimiter) + + validate_optional_args(args) + + debug = getattr(args, 'debug', False) + if debug == 'SUPPRESSHELP': + debug = False + if debug: + DEBUG = True + + if args.simple or args.csv or args.json: + quiet = True + else: + quiet = False + + if args.csv or args.json: + machine_format = True + else: + machine_format = False + + # Don't set a callback if we are running quietly + if quiet or debug: + callback = do_nothing + else: + callback = print_dots(shutdown_event) + + printer('', quiet) + try: + speedtest = Speedtest( + source_address=args.source, + timeout=args.timeout, + secure=args.secure + ) + except (ConfigRetrievalError,) + HTTP_ERRORS: + printer('Cannot retrieve speedtest configuration', error=True) + raise SpeedtestCLIError(get_exception()) + + if args.list: + try: + speedtest.get_servers() + except (ServersRetrievalError,) + HTTP_ERRORS: + printer('Cannot retrieve speedtest server list', error=True) + raise SpeedtestCLIError(get_exception()) + + for _, servers in sorted(speedtest.servers.items()): + for server in servers: + line = ('%(id)5s) %(sponsor)s (%(name)s, %(country)s) ' + '[%(d)0.2f km]' % server) + try: + printer(line) + except IOError: + e = get_exception() + if e.errno != errno.EPIPE: + raise + sys.exit(0) + + printer('*๐Ÿ”ญ Testing From %(isp)s...*\n' % speedtest.config['client'], + quiet) + + if not args.mini: + printer('๐Ÿ“‘ Retrieving speedtest.net server list...', quiet) + try: + speedtest.get_servers(servers=args.server, exclude=args.exclude) + except NoMatchedServers: + raise SpeedtestCLIError( + 'No matched servers: %s' % + ', '.join('%s' % s for s in args.server) + ) + except (ServersRetrievalError,) + HTTP_ERRORS: + printer('Cannot retrieve speedtest server list', error=True) + raise SpeedtestCLIError(get_exception()) + except InvalidServerIDType: + raise SpeedtestCLIError( + '%s is an invalid server type, must ' + 'be an int' % ', '.join('%s' % s for s in args.server) + ) + + if args.server and len(args.server) == 1: + printer('๐Ÿ“ฐ Retrieving information for the selected server...', quiet) + else: + printer('๐Ÿ”Ž Selecting best server based on ping...', quiet) + speedtest.get_best_server() + elif args.mini: + speedtest.get_best_server(speedtest.set_mini_server(args.mini)) + + results = speedtest.results + + printer('\n...................................................................................\n๐Ÿฌ *Hosted By :* %(sponsor)s\n๐ŸŒŽ *Location :* %(name)s [%(d)0.2f km] ' + '\nโšก *Ping :* %(latency)s ms' % results.server, quiet) + + if args.download: + printer('', quiet, + end=('', '\n')[bool(debug)]) + speedtest.download( + callback=callback, + threads=(None, 1)[args.single] + ) + printer('*๐Ÿ“ซ Download:* %0.2f M%s/s' % + ((results.download / 1000.0 / 1000.0) / args.units[1], + args.units[0]), + quiet) + else: + printer('Skipping download test', quiet) + + if args.upload: + speedtest.upload() + printer('*๐Ÿš€ Upload:* %0.2f M%s/s' % + ((results.upload / 1000.0 / 1000.0) / args.units[1], + args.units[0]), + quiet) + printer("\n...................................................................................\nโ–ถ๏ธŽ POWERED BY *OOKLA*\nโ–ถ๏ธŽ Script By *rizkiirfan*") + else: + printer('Skipping upload test', quiet) + + printer('Results:\n%r' % results.dict(), debug=True) + + if not args.simple and args.share: + results.share() + + if args.simple: + printer('Ping: %s ms\nDownload: %0.2f M%s/s\nUpload: %0.2f M%s/s' % + (results.ping, + (results.download / 1000.0 / 1000.0) / args.units[1], + args.units[0], + (results.upload / 1000.0 / 1000.0) / args.units[1], + args.units[0])) + elif args.csv: + printer(results.csv(delimiter=args.csv_delimiter)) + elif args.json: + printer(results.json()) + + if args.share and not machine_format: + printer('Share results: %s' % results.share()) + + +def main(): + try: + shell() + except KeyboardInterrupt: + printer('\nCancelling...', error=True) + except (SpeedtestException, SystemExit): + e = get_exception() + # Ignore a successful exit, or argparse exit + if getattr(e, 'code', 1) not in (0, 2): + msg = '%s' % e + if not msg: + msg = '%r' % e + raise SystemExit('ERROR: %s' % msg) + + +if __name__ == '__main__': + main() diff --git a/src/Aesthetic/Aesthetic_000.jpeg b/src/Aesthetic/Aesthetic_000.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..cbddcc1dd4f916e194bcb0616502673d39237f0c Binary files /dev/null and b/src/Aesthetic/Aesthetic_000.jpeg differ diff --git a/src/Aesthetic/Aesthetic_001.jpg b/src/Aesthetic/Aesthetic_001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d51b7019d885e1d49ba6f091579729ab2796666 Binary files /dev/null and b/src/Aesthetic/Aesthetic_001.jpg differ diff --git a/src/Aesthetic/Aesthetic_002.jpg b/src/Aesthetic/Aesthetic_002.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c3b91f85bc83c84de23935f52e849e9f46f4a30 Binary files /dev/null and b/src/Aesthetic/Aesthetic_002.jpg differ diff --git a/src/LICENSE b/src/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64 --- /dev/null +++ b/src/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/font/212BabyGirl.otf b/src/font/212BabyGirl.otf new file mode 100644 index 0000000000000000000000000000000000000000..91fdbbd01b14a29db0f50f4fc91a28cd485969ac Binary files /dev/null and b/src/font/212BabyGirl.otf differ diff --git a/src/font/212LeahleeSans.ttf b/src/font/212LeahleeSans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..68372182efb2cba5d34a8ee2abf109b704b27d8b Binary files /dev/null and b/src/font/212LeahleeSans.ttf differ diff --git a/src/font/99HandWritting.ttf b/src/font/99HandWritting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ccd2bd0236e6f558d0c904a5e9ef02e3b0c49356 Binary files /dev/null and b/src/font/99HandWritting.ttf differ diff --git a/src/font/ACallingFontDby7NTypes.otf b/src/font/ACallingFontDby7NTypes.otf new file mode 100644 index 0000000000000000000000000000000000000000..8dd02819601ebf22ac88761ef7f429cd243b7151 Binary files /dev/null and b/src/font/ACallingFontDby7NTypes.otf differ diff --git a/src/font/ACasualHandwrittenPenNoncommercial.ttf b/src/font/ACasualHandwrittenPenNoncommercial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..300a40debca04ba41fe2a257dba4a038fd4898d8 Binary files /dev/null and b/src/font/ACasualHandwrittenPenNoncommercial.ttf differ diff --git a/src/font/ADayinSeptember.otf b/src/font/ADayinSeptember.otf new file mode 100644 index 0000000000000000000000000000000000000000..02f249e7dbfbfbed3e67da6aedf5de70fcaa62ae Binary files /dev/null and b/src/font/ADayinSeptember.otf differ diff --git a/src/font/ASMelanieHandwritting.ttf b/src/font/ASMelanieHandwritting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..33e028eb51b787ff75a55ce66351e41bc3ce06b5 Binary files /dev/null and b/src/font/ASMelanieHandwritting.ttf differ diff --git a/src/font/Alittlesunshine.ttf b/src/font/Alittlesunshine.ttf new file mode 100644 index 0000000000000000000000000000000000000000..de7d500b271a4e6b3f611d929b1638593c786b3c Binary files /dev/null and b/src/font/Alittlesunshine.ttf differ diff --git a/src/font/And-This-Happened.ttf b/src/font/And-This-Happened.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ea8886b22f5152487d1b59dbca70a1f22a3ab5fa Binary files /dev/null and b/src/font/And-This-Happened.ttf differ diff --git a/src/font/AvenirCondensedHand.ttf b/src/font/AvenirCondensedHand.ttf new file mode 100644 index 0000000000000000000000000000000000000000..763366c50c4193fa08f34723799504d1b60a973c Binary files /dev/null and b/src/font/AvenirCondensedHand.ttf differ diff --git a/src/font/Avocados.ttf b/src/font/Avocados.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6b671055bd261eb452a0ab96f348eccd49cf5ca0 Binary files /dev/null and b/src/font/Avocados.ttf differ diff --git a/src/font/BabyDoll.ttf b/src/font/BabyDoll.ttf new file mode 100644 index 0000000000000000000000000000000000000000..49aaa04888b44518e17153609debe7e853b0f290 Binary files /dev/null and b/src/font/BabyDoll.ttf differ diff --git a/src/font/BattleOfKingsRegular.ttf b/src/font/BattleOfKingsRegular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1e51ba6273a032c344cef8b6b91102a01ad59efb Binary files /dev/null and b/src/font/BattleOfKingsRegular.ttf differ diff --git a/src/font/BrayNotes.ttf b/src/font/BrayNotes.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6d0bc242e67f39a8d28489ec183272b29f6df0fb Binary files /dev/null and b/src/font/BrayNotes.ttf differ diff --git a/src/font/Convered-By-Your-Grace.ttf b/src/font/Convered-By-Your-Grace.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58448e1e2f23cc9ef06ec8191666816a50ccc4b6 Binary files /dev/null and b/src/font/Convered-By-Your-Grace.ttf differ diff --git a/src/font/Edoms-Handwritting-Normal.ttf b/src/font/Edoms-Handwritting-Normal.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1ff10ce42390043728157a5ca79fc859b21b7f73 Binary files /dev/null and b/src/font/Edoms-Handwritting-Normal.ttf differ diff --git a/src/font/Futura Bold Italic font.ttf b/src/font/Futura Bold Italic font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..095bbdff60d46dd14809f8d65cca82c5e5ff10a5 Binary files /dev/null and b/src/font/Futura Bold Italic font.ttf differ diff --git a/src/font/Futura Bold font.ttf b/src/font/Futura Bold font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0725025e5a903c1020a16f006ff760f04a717316 Binary files /dev/null and b/src/font/Futura Bold font.ttf differ diff --git a/src/font/Futura Book Italic font.ttf b/src/font/Futura Book Italic font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..99cd8a6ada31ce1012eca2e05355d30ec6d82c52 Binary files /dev/null and b/src/font/Futura Book Italic font.ttf differ diff --git a/src/font/Futura Book font.ttf b/src/font/Futura Book font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8abcf15912a589ac2172edb4135f4c58369d8132 Binary files /dev/null and b/src/font/Futura Book font.ttf differ diff --git a/src/font/Futura Extra Black font.ttf b/src/font/Futura Extra Black font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f6f1b39462897544e17fdcc4623b6dc74997c623 Binary files /dev/null and b/src/font/Futura Extra Black font.ttf differ diff --git a/src/font/Futura Heavy Italic font.ttf b/src/font/Futura Heavy Italic font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8a49a3695cb63dc65a89c8c8ff76622a2fd30a92 Binary files /dev/null and b/src/font/Futura Heavy Italic font.ttf differ diff --git a/src/font/Futura Heavy font.ttf b/src/font/Futura Heavy font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..97eded13a2e44285191f18a635967fe8803b97ce Binary files /dev/null and b/src/font/Futura Heavy font.ttf differ diff --git a/src/font/Futura Light Italic font.ttf b/src/font/Futura Light Italic font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cfb5ce4132db75fe54f36acb3f77d3c84d57a29f Binary files /dev/null and b/src/font/Futura Light Italic font.ttf differ diff --git a/src/font/Futura Light font.ttf b/src/font/Futura Light font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..250162f49392b2fd004193988d4eb76d8fb6c02c Binary files /dev/null and b/src/font/Futura Light font.ttf differ diff --git a/src/font/Futura Medium Italic font.ttf b/src/font/Futura Medium Italic font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..81878d5f4c26d8e00cb18f86e626795d2df86c3c Binary files /dev/null and b/src/font/Futura Medium Italic font.ttf differ diff --git a/src/font/Futura XBlk BT.ttf b/src/font/Futura XBlk BT.ttf new file mode 100644 index 0000000000000000000000000000000000000000..06a53a8e162704d4d5b8c998c93c082249641d7e Binary files /dev/null and b/src/font/Futura XBlk BT.ttf differ diff --git a/src/font/Futura-CondensedLight.otf b/src/font/Futura-CondensedLight.otf new file mode 100644 index 0000000000000000000000000000000000000000..aebc4d947c37f67809b16d225ad4bf8179cdff69 Binary files /dev/null and b/src/font/Futura-CondensedLight.otf differ diff --git a/src/font/GloriaHallelujah-Regular.ttf b/src/font/GloriaHallelujah-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..98cf0440cd1feaa7a415ed0dbb4d90770e255608 Binary files /dev/null and b/src/font/GloriaHallelujah-Regular.ttf differ diff --git a/src/font/HandwritingCR-2.ttf b/src/font/HandwritingCR-2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a8b904d301a7ee73b2de544df49249a29dd73010 Binary files /dev/null and b/src/font/HandwritingCR-2.ttf differ diff --git a/src/font/Kempton-Demo-Handwritting.ttf b/src/font/Kempton-Demo-Handwritting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a44766bc46e8d681f53b2f9c0cd57c4e1dcba6de Binary files /dev/null and b/src/font/Kempton-Demo-Handwritting.ttf differ diff --git a/src/font/MyHandsareHoldingYou.ttf b/src/font/MyHandsareHoldingYou.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9b90a016a4215688862af86ed618ecb353d45766 Binary files /dev/null and b/src/font/MyHandsareHoldingYou.ttf differ diff --git a/src/font/My_handwriting.ttf b/src/font/My_handwriting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..711f25170b31e8e030fea0cfd5350e667cac88d1 Binary files /dev/null and b/src/font/My_handwriting.ttf differ diff --git a/src/font/Nadeznas-Handwritting.ttf b/src/font/Nadeznas-Handwritting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7b0c08f603ef1df118e08707948425010aedd8d4 Binary files /dev/null and b/src/font/Nadeznas-Handwritting.ttf differ diff --git a/src/font/Roboto-Black.ttf b/src/font/Roboto-Black.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2d452383651a6ef279743a9926b90234b8b79366 Binary files /dev/null and b/src/font/Roboto-Black.ttf differ diff --git a/src/font/Roboto-BlackItalic.ttf b/src/font/Roboto-BlackItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..29a4359ed0ba945a1af87078f3c0f08d298b0285 Binary files /dev/null and b/src/font/Roboto-BlackItalic.ttf differ diff --git a/src/font/Roboto-Bold.ttf b/src/font/Roboto-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d998cf5b468413ca1c950096dc9d0f5dfdb1359f Binary files /dev/null and b/src/font/Roboto-Bold.ttf differ diff --git a/src/font/Roboto-BoldItalic.ttf b/src/font/Roboto-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b4e22103936078c50cdc7ddf7a3e2d51dd2d3c44 Binary files /dev/null and b/src/font/Roboto-BoldItalic.ttf differ diff --git a/src/font/Roboto-Italic.ttf b/src/font/Roboto-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5b390ff950e6539bdfd4d84265fdb01e0c35f291 Binary files /dev/null and b/src/font/Roboto-Italic.ttf differ diff --git a/src/font/Roboto-Light.ttf b/src/font/Roboto-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35267989deca17116c70c987e90035303e2e3404 Binary files /dev/null and b/src/font/Roboto-Light.ttf differ diff --git a/src/font/Roboto-LightItalic.ttf b/src/font/Roboto-LightItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..46e9bf7c95adb27c042d0646deb1f8a3beb8087e Binary files /dev/null and b/src/font/Roboto-LightItalic.ttf differ diff --git a/src/font/Roboto-Medium.ttf b/src/font/Roboto-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f714a514d94e495095e2f1e525a341eade187c17 Binary files /dev/null and b/src/font/Roboto-Medium.ttf differ diff --git a/src/font/Roboto-MediumItalic.ttf b/src/font/Roboto-MediumItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5dc6a2dc6c38c1b1ee54b0ad5072c6e29968ed24 Binary files /dev/null and b/src/font/Roboto-MediumItalic.ttf differ diff --git a/src/font/Roboto-Regular.ttf b/src/font/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2b6392ffe8712b9c5450733320cd220d6c0f4bce Binary files /dev/null and b/src/font/Roboto-Regular.ttf differ diff --git a/src/font/Roboto-Thin.ttf b/src/font/Roboto-Thin.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4e797cf7ef9758a9209fae4e0b07e6b186b2c69d Binary files /dev/null and b/src/font/Roboto-Thin.ttf differ diff --git a/src/font/Roboto-ThinItalic.ttf b/src/font/Roboto-ThinItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..eea836f4a37fea4afe61d6483692dc431a9b1c20 Binary files /dev/null and b/src/font/Roboto-ThinItalic.ttf differ diff --git a/src/font/ShadowsIntoLight-Regular.ttf b/src/font/ShadowsIntoLight-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b7bc796b1260871c1893f410fd19eeca9e416ad7 Binary files /dev/null and b/src/font/ShadowsIntoLight-Regular.ttf differ diff --git a/src/font/Zahraaa.ttf b/src/font/Zahraaa.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a1509139deb6f7f429fa7678e610225a5262eff7 Binary files /dev/null and b/src/font/Zahraaa.ttf differ diff --git a/src/font/angelina.ttf b/src/font/angelina.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fe880ab9109467e86eed45cf29feb297eef4686e Binary files /dev/null and b/src/font/angelina.ttf differ diff --git a/src/font/futur.ttf b/src/font/futur.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cde2c37adfe93844d940b3a92d01d0d7de94d7c9 Binary files /dev/null and b/src/font/futur.ttf differ diff --git a/src/font/futura light bt.ttf b/src/font/futura light bt.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3fb654f1566b2e20ee7eb5639874513ebc293600 Binary files /dev/null and b/src/font/futura light bt.ttf differ diff --git a/src/font/futura medium bt.ttf b/src/font/futura medium bt.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1ef199e9153a580ea105cca6896d954acbc35f63 Binary files /dev/null and b/src/font/futura medium bt.ttf differ diff --git a/src/font/futura medium condensed bt.ttf b/src/font/futura medium condensed bt.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7c3fe9e37ba50c240f4f9dc1bda7790197cc4b9b Binary files /dev/null and b/src/font/futura medium condensed bt.ttf differ diff --git a/src/font/michellehandwritting.ttf b/src/font/michellehandwritting.ttf new file mode 100644 index 0000000000000000000000000000000000000000..88e7a5f3d444134884fa1807531bc63680406b4b Binary files /dev/null and b/src/font/michellehandwritting.ttf differ diff --git a/src/kertas/magernulis1.jpg b/src/kertas/magernulis1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d4acb2c8a36cc5efbbdb55245a0864c89cebeb21 Binary files /dev/null and b/src/kertas/magernulis1.jpg differ diff --git a/test.js b/test.js new file mode 100644 index 0000000000000000000000000000000000000000..b58ec685dce4656e5d978eb4ecee46fd61a690d6 --- /dev/null +++ b/test.js @@ -0,0 +1,32 @@ +let fs = require('fs') +let path = require('path') +let assert = require('assert') +let { spawn } = require('child_process') + +const RESET = '\x1b[0m' +const BRIGHT = '\x1b[1m' +const DIM = '\x1b[2m' +const RED = '\x1b[31m' +const GREEN = '\x1b[32m' +const BLUE = '\x1b[34m' + +let folders = ['.', ...Object.keys(require('./package.json').directories)] +let files = [] + +for (let folder of folders) { + for (let file of fs.readdirSync(folder).filter(v => v.endsWith('.js'))) { + files.push(path.resolve(path.join(folder, file))) + } +} + +for (let file of files) { + if (file == path.join(__dirname, __filename)) continue + + console.error(`${BRIGHT}${BLUE}Checking${RESET} ${file}`) // Highlight "Checking" in console logs with blue color + spawn(process.argv0, ['-c', file]) + .on('close', () => { + assert.ok(file) + console.log(`${BRIGHT}${GREEN}Done${RESET} ${file} ${BRIGHT}${Math.floor(Math.random() * 100)}%${RESET}`) + }) + .stderr.on('data', chunk => assert.ok(chunk.length < 1, `${RED}${DIM}${file}\n\n${chunk}${RESET}`)) +} diff --git a/tmp/.gitkeep b/tmp/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/tmp/.gitkeep @@ -0,0 +1 @@ + diff --git a/views/img/dark/balloon_centered_normal.9.png b/views/img/dark/balloon_centered_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a43905033c57907958f3d1e0e08e59d1d22a6924 Binary files /dev/null and b/views/img/dark/balloon_centered_normal.9.png differ diff --git a/views/img/dark/balloon_centered_pressed.9.png b/views/img/dark/balloon_centered_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..74e12dd72e6d69fcc4ad6f9bdff861e665518641 Binary files /dev/null and b/views/img/dark/balloon_centered_pressed.9.png differ diff --git a/views/img/dark/balloon_centered_shadow.9.png b/views/img/dark/balloon_centered_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0e448b036ed167c4132ca69ef66322cb7721deb4 Binary files /dev/null and b/views/img/dark/balloon_centered_shadow.9.png differ diff --git a/views/img/dark/balloon_incoming_frame.9.png b/views/img/dark/balloon_incoming_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0b648e38aa9e6c123c6eebc75595e9acbc018158 Binary files /dev/null and b/views/img/dark/balloon_incoming_frame.9.png differ diff --git a/views/img/dark/balloon_incoming_normal.9.png b/views/img/dark/balloon_incoming_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6d305f3becfa32110125bf44f180f67f82b4b1a3 Binary files /dev/null and b/views/img/dark/balloon_incoming_normal.9.png differ diff --git a/views/img/dark/balloon_incoming_normal_ext.9.png b/views/img/dark/balloon_incoming_normal_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5c4d800c27756de185e8255dfca84f93f0759aef Binary files /dev/null and b/views/img/dark/balloon_incoming_normal_ext.9.png differ diff --git a/views/img/dark/balloon_incoming_normal_stkr.9.png b/views/img/dark/balloon_incoming_normal_stkr.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e0336f09a1ef93df388c1f851fed46a0d2111958 Binary files /dev/null and b/views/img/dark/balloon_incoming_normal_stkr.9.png differ diff --git a/views/img/dark/balloon_incoming_pressed.9.png b/views/img/dark/balloon_incoming_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdb3602a80abf311f6007d78024c0977ece7573 Binary files /dev/null and b/views/img/dark/balloon_incoming_pressed.9.png differ diff --git a/views/img/dark/balloon_incoming_pressed_ext.9.png b/views/img/dark/balloon_incoming_pressed_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..57ffde9a981e878cfd7129b9862bb5d3f41f807b Binary files /dev/null and b/views/img/dark/balloon_incoming_pressed_ext.9.png differ diff --git a/views/img/dark/balloon_live_location_incoming_frame.9.png b/views/img/dark/balloon_live_location_incoming_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2033f52faf096badc10be3fe886be72d4bb040 Binary files /dev/null and b/views/img/dark/balloon_live_location_incoming_frame.9.png differ diff --git a/views/img/dark/balloon_live_location_outgoing_frame.9.png b/views/img/dark/balloon_live_location_outgoing_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..10cd935dc833403505870d0f947e7a5a0a4a72a9 Binary files /dev/null and b/views/img/dark/balloon_live_location_outgoing_frame.9.png differ diff --git a/views/img/dark/balloon_outgoing_frame.9.png b/views/img/dark/balloon_outgoing_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e205348d3f48f10ee390326544288a57d3c433c Binary files /dev/null and b/views/img/dark/balloon_outgoing_frame.9.png differ diff --git a/views/img/dark/balloon_outgoing_normal.9.png b/views/img/dark/balloon_outgoing_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1afa8bfa9cc493b49dfd56d057a40d9750fad3be Binary files /dev/null and b/views/img/dark/balloon_outgoing_normal.9.png differ diff --git a/views/img/dark/balloon_outgoing_normal_ext.9.png b/views/img/dark/balloon_outgoing_normal_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..44646d856b96316e6a7a16e12e7cb22c1ac6437e Binary files /dev/null and b/views/img/dark/balloon_outgoing_normal_ext.9.png differ diff --git a/views/img/dark/balloon_outgoing_normal_stkr.9.png b/views/img/dark/balloon_outgoing_normal_stkr.9.png new file mode 100644 index 0000000000000000000000000000000000000000..69f9ca8a72c605fc2256be1e433c67fb8b58caf9 Binary files /dev/null and b/views/img/dark/balloon_outgoing_normal_stkr.9.png differ diff --git a/views/img/dark/balloon_outgoing_pressed.9.png b/views/img/dark/balloon_outgoing_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..39142d2d173781e136402f29a8162d3e34bd2fb9 Binary files /dev/null and b/views/img/dark/balloon_outgoing_pressed.9.png differ diff --git a/views/img/dark/balloon_outgoing_pressed_ext.9.png b/views/img/dark/balloon_outgoing_pressed_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9792daf8cea2b341d4899072457f679d1da4718a Binary files /dev/null and b/views/img/dark/balloon_outgoing_pressed_ext.9.png differ diff --git a/views/img/light/balloon_centered_normal.9.png b/views/img/light/balloon_centered_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a43905033c57907958f3d1e0e08e59d1d22a6924 Binary files /dev/null and b/views/img/light/balloon_centered_normal.9.png differ diff --git a/views/img/light/balloon_centered_pressed.9.png b/views/img/light/balloon_centered_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..74e12dd72e6d69fcc4ad6f9bdff861e665518641 Binary files /dev/null and b/views/img/light/balloon_centered_pressed.9.png differ diff --git a/views/img/light/balloon_centered_shadow.9.png b/views/img/light/balloon_centered_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0e448b036ed167c4132ca69ef66322cb7721deb4 Binary files /dev/null and b/views/img/light/balloon_centered_shadow.9.png differ diff --git a/views/img/light/balloon_incoming_frame.9.png b/views/img/light/balloon_incoming_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0b648e38aa9e6c123c6eebc75595e9acbc018158 Binary files /dev/null and b/views/img/light/balloon_incoming_frame.9.png differ diff --git a/views/img/light/balloon_incoming_normal.9.png b/views/img/light/balloon_incoming_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6d305f3becfa32110125bf44f180f67f82b4b1a3 Binary files /dev/null and b/views/img/light/balloon_incoming_normal.9.png differ diff --git a/views/img/light/balloon_incoming_normal_ext.9.png b/views/img/light/balloon_incoming_normal_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5c4d800c27756de185e8255dfca84f93f0759aef Binary files /dev/null and b/views/img/light/balloon_incoming_normal_ext.9.png differ diff --git a/views/img/light/balloon_incoming_normal_stkr.9.png b/views/img/light/balloon_incoming_normal_stkr.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e0336f09a1ef93df388c1f851fed46a0d2111958 Binary files /dev/null and b/views/img/light/balloon_incoming_normal_stkr.9.png differ diff --git a/views/img/light/balloon_incoming_pressed.9.png b/views/img/light/balloon_incoming_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdb3602a80abf311f6007d78024c0977ece7573 Binary files /dev/null and b/views/img/light/balloon_incoming_pressed.9.png differ diff --git a/views/img/light/balloon_incoming_pressed_ext.9.png b/views/img/light/balloon_incoming_pressed_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..57ffde9a981e878cfd7129b9862bb5d3f41f807b Binary files /dev/null and b/views/img/light/balloon_incoming_pressed_ext.9.png differ diff --git a/views/img/light/balloon_live_location_incoming_frame.9.png b/views/img/light/balloon_live_location_incoming_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2033f52faf096badc10be3fe886be72d4bb040 Binary files /dev/null and b/views/img/light/balloon_live_location_incoming_frame.9.png differ diff --git a/views/img/light/balloon_live_location_outgoing_frame.9.png b/views/img/light/balloon_live_location_outgoing_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..10cd935dc833403505870d0f947e7a5a0a4a72a9 Binary files /dev/null and b/views/img/light/balloon_live_location_outgoing_frame.9.png differ diff --git a/views/img/light/balloon_outgoing_frame.9.png b/views/img/light/balloon_outgoing_frame.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e205348d3f48f10ee390326544288a57d3c433c Binary files /dev/null and b/views/img/light/balloon_outgoing_frame.9.png differ diff --git a/views/img/light/balloon_outgoing_normal.9.png b/views/img/light/balloon_outgoing_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1afa8bfa9cc493b49dfd56d057a40d9750fad3be Binary files /dev/null and b/views/img/light/balloon_outgoing_normal.9.png differ diff --git a/views/img/light/balloon_outgoing_normal_ext.9.png b/views/img/light/balloon_outgoing_normal_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..44646d856b96316e6a7a16e12e7cb22c1ac6437e Binary files /dev/null and b/views/img/light/balloon_outgoing_normal_ext.9.png differ diff --git a/views/img/light/balloon_outgoing_normal_stkr.9.png b/views/img/light/balloon_outgoing_normal_stkr.9.png new file mode 100644 index 0000000000000000000000000000000000000000..69f9ca8a72c605fc2256be1e433c67fb8b58caf9 Binary files /dev/null and b/views/img/light/balloon_outgoing_normal_stkr.9.png differ diff --git a/views/img/light/balloon_outgoing_pressed.9.png b/views/img/light/balloon_outgoing_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..39142d2d173781e136402f29a8162d3e34bd2fb9 Binary files /dev/null and b/views/img/light/balloon_outgoing_pressed.9.png differ diff --git a/views/img/light/balloon_outgoing_pressed_ext.9.png b/views/img/light/balloon_outgoing_pressed_ext.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9792daf8cea2b341d4899072457f679d1da4718a Binary files /dev/null and b/views/img/light/balloon_outgoing_pressed_ext.9.png differ diff --git a/views/index.html b/views/index.html new file mode 100644 index 0000000000000000000000000000000000000000..5d874fe40ae67fa8d2ca30561c5c9521933840dd --- /dev/null +++ b/views/index.html @@ -0,0 +1,29 @@ +<html> +<head> + <title>Web + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + diff --git a/views/index.js b/views/index.js new file mode 100644 index 0000000000000000000000000000000000000000..8f5b955d8be30828e305a4275ba97719ce0e9de6 --- /dev/null +++ b/views/index.js @@ -0,0 +1,11 @@ +window.onload = () => { +let chat = document.querySelector('div.container-fluid') +function addMsg(obj) { + let html = document.createElement('span') + html.className = 'msg' + html.innerHTML = obj + chat.appendChild(html) +} + +window.onclick = () => addMsg(12) +} diff --git a/views/style.css b/views/style.css new file mode 100644 index 0000000000000000000000000000000000000000..31a58b0008753bcb1c368b604bee5e9493d5cc1f --- /dev/null +++ b/views/style.css @@ -0,0 +1,3 @@ +span.msg { +} +