├── src ├── key.json ├── byegc.webp ├── grupos.jpg ├── texts.otf ├── welgc.webp ├── level_c.otf ├── nuevobot.jpg ├── sinfoto.jpg ├── avatar_contact.png ├── lvlup_template.jpg ├── cuentas.json └── nsfw │ ├── tetas.json │ └── pechos.json ├── audio └── file ├── lib ├── kant.json ├── tictactoe.d.ts ├── validators.js ├── logs.js ├── levelling.js ├── cloudDBAdapter.js ├── uploadImage.js ├── database.js ├── tiktok.js ├── gdrive.js ├── uploadFile.js ├── canvas.js ├── _checkLang.js ├── converter.js └── tictactoe.js ├── Procfile ├── Menu2.jpg ├── menu.jpg ├── media ├── a.mp3 ├── Menu1.jpg ├── Menu2.jpg ├── Menu3.jpg └── Menu4.jpg ├── render.yaml ├── start.sh ├── Dockerfile ├── plugins ├── owner-leavegc.js ├── so-a.js ├── grupo-link.js ├── owner-autoadmin.js ├── owner-setbotname.js ├── jadibot-serbot-stop.js ├── grupo-resetLink.js ├── afk-afk.js ├── grupo-setdesc.js ├── owner-banchat.js ├── grupo-setbye.js ├── maker-blackpink.js ├── grupo-setpp.js ├── info-gruposofc.js ├── grupo-kick.js ├── grupo-setname.js ├── grupo-setwelcome.js ├── owner-unbanchat.js ├── herramientas-ssweb.js ├── owner-exec2.js ├── convertidor-tourl.js ├── owner-setppbot.js ├── grupo-tagall.js ├── owner-setprefix.js ├── owner-getplugin.js ├── grupo-pin.js ├── game-cf.js ├── herramientas-readmore.js ├── owner-banuser.js ├── convertidor-togifaud.js ├── rpg-shop.js ├── convertidor-toimg.js ├── grupo-listwarn.js ├── sticker-exif.js ├── herramientas-acortar.js ├── owner-fetch.js ├── rpg-pareja-divorce.js ├── afk-_afk.js ├── grupo-delwarn.js ├── owner-restart.js ├── herramientas-styletext.js ├── _cmdWithMedia.js ├── maker-txt.js ├── convertidor-tomp3.js ├── sticker-dado.js ├── grupo-staff.js ├── herramientas-encuesta.js ├── descargas-pinterest.js ├── rpg-balance.js ├── owner-broadcastchats.js ├── owner-delprem.js ├── owner-block-unblock.js ├── grupo-config.js ├── jadibot-codeToken.js ├── descargas-imagen.js ├── convertidor-tovideo.js ├── herramientas-fakeReply.js ├── grupo-mute.js ├── herramientas-npm.js ├── jadibot-broadcast.js ├── grupo-promote.js ├── grupo-demote.js ├── _autosticker.js ├── info-cuentas-oficiales.js ├── sticker-kiss.js ├── herramientas-translate.js ├── owner-unbanuser.js ├── herramientas-fixmsgespera.js ├── _antifakes.js ├── herramientas-clima.js ├── grupo-simulate.js ├── convertidor-tts.js ├── rpg-levelup.js ├── jadibot-primary.js ├── convertidor-toanime.js ├── grupo-warn.js ├── rpg-daily.js ├── info-dashboard.js ├── _antiArabe.js ├── herramientas-autoresponder_prompt.js ├── jadibot-deleteSesion.js ├── buscador-wikipedia.js ├── game-rt.js ├── owner-update.js ├── herramientas-whatmusic.js ├── grupo-delete.js ├── rpg-add.js ├── rpg-mine.js ├── herramientas-nowa.js ├── owner-exec.js ├── descargas-tiktokstalk.js ├── descargas-tiktokimg.js ├── sticker-emojimix.js ├── _simsimi.js ├── rpg-rob.js ├── descargas-tiktok.js ├── grupo-config_time.js ├── info-estado.js ├── sticker-attp y ttp.js ├── rpg-banc.js ├── descargas-gitclone.js ├── jadibot-privacidad.js ├── buscador-animeinfo.js ├── herramienta-img2text.js ├── _antitrabas.js ├── sticker-wm.js ├── jadibot-serbot-bots.js ├── sticker-qc.js ├── owner-cmd.js ├── _antilink2.js ├── rpg-adel.js ├── owner-banlist.js ├── herramientas-hd.js ├── sticker-sticker.js ├── audio-efectos.js ├── descargas-fb.js ├── owner-join.js ├── grupo-hidetag.js └── descargas-igstalk.js ├── replit.nix ├── app.json ├── koyeb.js ├── .github └── FUNDING.yml ├── LICENSE ├── test.js ├── server.js ├── index.js └── package.json /src/key.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /audio/file: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /lib/kant.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: node . --server 2 | -------------------------------------------------------------------------------- /Menu2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/Menu2.jpg -------------------------------------------------------------------------------- /menu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/menu.jpg -------------------------------------------------------------------------------- /media/a.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/media/a.mp3 -------------------------------------------------------------------------------- /src/byegc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/src/byegc.webp -------------------------------------------------------------------------------- /src/grupos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/src/grupos.jpg -------------------------------------------------------------------------------- /src/texts.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/src/texts.otf -------------------------------------------------------------------------------- /src/welgc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/src/welgc.webp -------------------------------------------------------------------------------- /media/Menu1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/media/Menu1.jpg -------------------------------------------------------------------------------- /media/Menu2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/media/Menu2.jpg -------------------------------------------------------------------------------- /media/Menu3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/media/Menu3.jpg -------------------------------------------------------------------------------- /media/Menu4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/media/Menu4.jpg -------------------------------------------------------------------------------- /src/level_c.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/src/level_c.otf -------------------------------------------------------------------------------- /src/nuevobot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/src/nuevobot.jpg -------------------------------------------------------------------------------- /src/sinfoto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/src/sinfoto.jpg -------------------------------------------------------------------------------- /src/avatar_contact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/src/avatar_contact.png -------------------------------------------------------------------------------- /src/lvlup_template.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crxsmods/KANTU-BOT/HEAD/src/lvlup_template.jpg -------------------------------------------------------------------------------- /render.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | - type: web 3 | name: the-lolibot-md 4 | env: docker 5 | region: Frankfurt 6 | plan: free 7 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | #!bin/bash 2 | GREEN='\033[0;32m' 3 | while : 4 | do 5 | echo "" 6 | npm start 7 | sleep 1 8 | 9 | done 10 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-buster 2 | 3 | RUN apt-get update && \ 4 | apt-get install -y \ 5 | ffmpeg \ 6 | imagemagick \ 7 | webp && \ 8 | apt-get upgrade -y && \ 9 | rm -rf /var/lib/apt/lists/* 10 | 11 | COPY package.json . 12 | 13 | RUN npm install && npm install qrcode-terminal 14 | 15 | COPY . . 16 | 17 | EXPOSE 5000 18 | 19 | CMD ["node", "index.js"] 20 | -------------------------------------------------------------------------------- /plugins/owner-leavegc.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, text, command }) => { 2 | let id = text ? text : m.chat 3 | await conn.reply(id, '*𝐄𝐥 𝐁𝐨𝐭 𝐚𝐛𝐚𝐧𝐝𝐨𝐧𝐚 𝐞𝐥 𝐠𝐫𝐮𝐩𝐨, 𝐜𝐡𝐚𝐮 👋*') 4 | await conn.groupLeave(id)} 5 | handler.help = ["leave"] 6 | handler.tags = ["owner"] 7 | handler.command = /^(salir|leavegc|salirdelgrupo|leave)$/i 8 | handler.rowner = true 9 | export default handler 10 | -------------------------------------------------------------------------------- /plugins/so-a.js: -------------------------------------------------------------------------------- 1 | import util from 'util' 2 | import path from 'path' 3 | let handler = async (m, { conn }) => { 4 | if (!db.data.chats[m.chat].audios && m.isGroup) throw 0 5 | let vn = './media/a.mp3' 6 | conn.sendFile(m.chat, vn, 'a.mp3', null, m, true, { 7 | type: 'audioMessage', 8 | ptt: true 9 | }) 10 | } 11 | handler.customPrefix = /ª|a|A/ 12 | handler.command = /^(a|ª|A?$)/ 13 | export default handler -------------------------------------------------------------------------------- /plugins/grupo-link.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | const handler = async (m, {conn, args}) => { 3 | const group = m.chat; 4 | m.reply('https://chat.whatsapp.com/' + await conn.groupInviteCode(group)) 5 | }; 6 | handler.help = ['linkgroup']; 7 | handler.tags = ['group']; 8 | handler.command = /^link(gro?up)?$/i; 9 | handler.group = true; 10 | handler.botAdmin = true; 11 | handler.register = true 12 | export default handler; 13 | -------------------------------------------------------------------------------- /plugins/owner-autoadmin.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, isAdmin }) => { 2 | if (m.fromMe) throw 'Nggk' 3 | if (isAdmin) throw 'Ya eres admin del grupo mi creador 🫡' 4 | await conn.groupParticipantsUpdate(m.chat, [m.sender], "promote")} 5 | handler.help = ['autoadmin'] 6 | handler.tags = ['owner'] 7 | handler.command = /^admin.|atad|autoadmin$/i 8 | handler.rowner = true 9 | handler.botAdmin = true 10 | export default handler 11 | -------------------------------------------------------------------------------- /plugins/owner-setbotname.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, text, usedPrefix, command }) => { 2 | if (!text) throw `Y EL TEXTO?` 3 | try { 4 | await conn.updateProfileName(text) 5 | m.reply('LISTO!') 6 | } catch (e) { 7 | console.log(e) 8 | throw `Error` 9 | }} 10 | handler.help = ['setbotname '] 11 | handler.tags = ['owner'] 12 | handler.command = /^(setbotname|cambianombre)$/i 13 | 14 | handler.owner = true 15 | 16 | export default handler 17 | -------------------------------------------------------------------------------- /plugins/jadibot-serbot-stop.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn }) => { 2 | if (global.conn.user.jid === conn.user.jid) { 3 | await m.reply('*⚠️ Este comando sólo puede ser ejecutado por un usuario que sea Sub-Bot*'); 4 | } else { 5 | await m.reply(`Adios bot :(`); 6 | conn.ws.close(); 7 | }}; 8 | handler.help = ['stop']; 9 | handler.tags = ['jadibot']; 10 | handler.command = /^(berhenti|stop|detener)$/i 11 | handler.private = true 12 | export default handler -------------------------------------------------------------------------------- /lib/tictactoe.d.ts: -------------------------------------------------------------------------------- 1 | export declare class TicTacToe { 2 | /* X PlayerName */ 3 | playerX: string; 4 | /* Y PlayerName */ 5 | playerY: string; 6 | /* X if true, Y if false */ 7 | _currentTurn: boolean; 8 | _x: number; 9 | _y: number; 10 | _turns: number; 11 | constructor(playerX: string, playerY: string); 12 | get board(): number; 13 | turn(player, index: number): boolean; 14 | turn(player, x: number, y: number): boolean; 15 | } 16 | -------------------------------------------------------------------------------- /replit.nix: -------------------------------------------------------------------------------- 1 | { pkgs }: { 2 | deps = [ 3 | pkgs.nodejs 4 | pkgs.nodePackages.typescript 5 | pkgs.ffmpeg 6 | pkgs.imagemagick 7 | pkgs.git 8 | pkgs.neofetch 9 | pkgs.libwebp 10 | pkgs.speedtest-cli 11 | pkgs.wget 12 | pkgs.yarn 13 | pkgs.libuuid 14 | ]; 15 | env = { 16 | LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [ 17 | pkgs.libuuid 18 | ]; 19 | }; 20 | } 21 | -------------------------------------------------------------------------------- /plugins/grupo-resetLink.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {conn}) => { 2 | const revoke = await conn.groupRevokeInvite(m.chat); 3 | await conn.reply(m.chat, `*_Se restableció con éxito el link del grupo._*\n*• Link Nuevo:* ${'https://chat.whatsapp.com/' + revoke}`, m); 4 | }; 5 | handler.help = ['resetlink'] 6 | handler.tags = ['group'] 7 | handler.command = ['resetlink', 'revoke']; 8 | handler.botAdmin = true; 9 | handler.admin = true; 10 | handler.group = true; 11 | handler.register = true 12 | export default handler; 13 | -------------------------------------------------------------------------------- /plugins/afk-afk.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {text}) => { 2 | const user = global.db.data.users[m.sender]; 3 | user.afk = + new Date; 4 | user.afkReason = text; 5 | m.reply(`『 AFK 』 6 | 7 | > ᴇsᴛᴇ ᴜsᴜᴀʀɪᴏ : ${conn.getName(m.sender)} ᴇsᴛᴀ ɪɴᴀᴄᴛɪᴠᴏ. 8 | 9 | \`💤 NO LOS ETIQUETE 💤\` 10 | *☣️ ᴍᴏᴛɪᴠᴏs :* ${text ? ': ' + text : 'paja'}`); 11 | }; 12 | handler.help = ['afk [alasan]']; 13 | handler.tags = ['econ']; 14 | handler.command = /^afk$/i; 15 | handler.money = 75 16 | handler.register = true 17 | export default handler; 18 | -------------------------------------------------------------------------------- /plugins/grupo-setdesc.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, args }) => { 2 | const pp = await conn.profilePictureUrl(m.chat, 'image').catch(_ => 'https://telegra.ph/file/2a1d71ab744b55b28f1ae.jpg') 3 | await conn.groupUpdateDescription(m.chat, `${args.join(" ")}`); 4 | m.react("✅️") 5 | } 6 | handler.help = ['setdesc']; 7 | handler.tags = ['group']; 8 | handler.command = /^setdesk|setdesc|newdesc|descripción|descripcion$/i 9 | handler.group = true 10 | handler.admin = true 11 | handler.botAdmin = true 12 | export default handler -------------------------------------------------------------------------------- /lib/validators.js: -------------------------------------------------------------------------------- 1 | // Funciones básicas de validación 2 | export const isUrl = (url) => { 3 | 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')); 4 | } 5 | 6 | export const isCreditCard = (number) => { 7 | return number.match(/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}(?:2131|1800|35\d{3})\d{11})$/); 8 | } 9 | 10 | export default { 11 | isUrl, 12 | isCreditCard 13 | } -------------------------------------------------------------------------------- /plugins/owner-banchat.js: -------------------------------------------------------------------------------- 1 | let handler = async (m) => { 2 | global.db.data.chats[m.chat].isBanned = true 3 | conn.reply(m.chat, '*BOT OFF*', m, {contextInfo: { externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: ag, body: '𝐂𝐡𝐚𝐭 𝐛𝐚𝐧𝐞𝐚𝐝𝐨', previewType: 0, thumbnail: imagen4, sourceUrl: [md, yt, tiktok].getRandom()}}}) 4 | } 5 | handler.help = ['banchat'] 6 | handler.tags = ['owner'] 7 | handler.command = /^banchat|ban2|banchat1$/i 8 | //handler.botAdmin = true 9 | handler.rowner = true 10 | export default handler 11 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Kantu-Bot", 3 | "description": "Super Bot WhatsApp", 4 | "repository": "https://github.com/elrebelde21/The-LoliBot-MD", 5 | "logo": "https://i.imgur.com/8fK4h6F.jpg", 6 | "keywords": ["java", "bot", "whatsapp-bot", "whatsapp-automation"], 7 | "buildpacks": [ 8 | { 9 | "url": "heroku/nodejs" 10 | }, 11 | { 12 | "url": "https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest" 13 | }, 14 | { 15 | "url": "https://github.com/bogini/heroku-buildpack-graphicsmagick" 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /koyeb.js: -------------------------------------------------------------------------------- 1 | FROM fedora:37 2 | 3 | RUN sudo dnf -y update &&\ 4 | sudo dnf install -y https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm &&\ 5 | sudo dnf install -y git ffmpeg ImageMagick nodejs yarnpkg libwebp &&\ 6 | sudo dnf clean all -y 7 | 8 | RUN git clone https://github.com/crxsmods/KANTU-BOT 9 | 10 | WORKDIR /root/KANTU-BOT 11 | 12 | COPY ./root/KANTU-BOT 13 | 14 | RUN yarn install 15 | 16 | CMD ["node", "index.js"] 17 | -------------------------------------------------------------------------------- /plugins/grupo-setbye.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {conn, text, isROwner, isOwner}) => { 2 | if (text) { 3 | global.db.data.chats[m.chat].sBye = text; 4 | m.reply('*⚠️ 𝙼𝙴𝙽𝚂𝙰𝙹𝙴 𝙳𝙴 𝙳𝙴𝚂𝙿𝙴𝙳𝙸𝙳𝙰 𝙲𝙾𝙽𝙵𝙸𝙶𝚄𝚁𝙰𝙳𝙾 𝙲𝙾𝚁𝚁𝙴𝙲𝚃𝙰𝙼𝙴𝙽𝚃𝙴 𝙿𝙰𝚁𝙰 𝙴𝚂𝚃𝙴 𝙶𝚁𝚄𝙿𝙾*'); 5 | } else throw `*⚠️ 𝙸𝙽𝙶𝚁𝙴𝚂𝙴 𝙴𝙻 𝙼𝙴𝙽𝚂𝙰𝙹𝙴 𝙳𝙴 𝙳𝙴𝚂𝙿𝙴𝙳𝙸𝙳𝙰 𝚀𝚄𝙴 𝙳𝙴𝚂𝙴𝙴 𝙰𝙶𝚁𝙴𝙶𝙰𝚁, 𝚄𝚂𝙴:*\n*- @user (mención)*`; 6 | }; 7 | handler.help = ['setbye ']; 8 | handler.tags = ['group']; 9 | handler.command = ['setbye']; 10 | handler.admin = true; 11 | handler.register = true 12 | export default handler; 13 | -------------------------------------------------------------------------------- /plugins/maker-blackpink.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, text, args, usedPrefix, command }) => { 2 | let response = args.join(' ').split('|') 3 | if (!text) throw `⚠️ Ingresa un texto junto al comando.` 4 | await m.react('🕓') 5 | try { 6 | let res = `https://api.lolhuman.xyz/api/textprome/blackpink?apikey=${lolkeysapi}&text=${text}` 7 | await conn.sendFile(m.chat, res, 'thumbnail.jpg', listo, m) 8 | await m.react('✅') 9 | } catch { 10 | await m.react('❌') 11 | }} 12 | handler.help = ['blackpink **'] 13 | handler.tags = ['logo'] 14 | handler.command = /^(blackpink)$/i 15 | handler.limit = 3 16 | handler.register = true 17 | export default handler -------------------------------------------------------------------------------- /plugins/grupo-setpp.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, usedPrefix, command }) => { 2 | let q = m.quoted ? m.quoted : m 3 | let mime = (q.msg || q).mimetype || q.mediaType || '' 4 | if (/image/.test(mime)) { 5 | let img = await q.download() 6 | if (!img) throw `⚠️ ️𝙍𝙀𝙎𝙋𝙊𝙉𝘿𝙀 𝘼 𝙐𝙉𝘼 𝙄𝙈𝘼𝙂𝙀𝙉` 7 | await conn.updateProfilePicture(m.chat, img).then(_ => m.react("✅️")) 8 | } else throw `⚠️ 𝙍𝙀𝙎𝙋𝙊𝙉𝘿𝙀 𝘼 𝙐𝙉𝘼 𝙄𝙈𝘼𝙂𝙀𝙉` 9 | } 10 | handler.help = ['setppgc']; 11 | handler.tags = ['group']; 12 | handler.command = /^setpp(group|grup|gc)?$/i 13 | handler.group = true 14 | handler.admin = true 15 | handler.botAdmin = true 16 | export default handler -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | github: [crxsmods] 3 | patreon: # Replace 4 | open_collective: # Replace with a single Open Collective username 5 | ko_fi: # Replace with a single Ko-fi username 6 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 7 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 8 | liberapay: # Replace with a single Liberapay username 9 | issuehunt: # Replace with a single IssueHunt username 10 | otechie: # Replace with a single Otechie username 11 | custom: ['https://github.com/crxsmods','https://hackstorex.com', 'https://crxsmods.site'] 12 | -------------------------------------------------------------------------------- /plugins/info-gruposofc.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, usedPrefix: _p }) => { 2 | let info = `*✅ BIENVENIDO A LOS GRUPOS OFICIALES* 3 | 4 | 1) *${nn}* 5 | 6 | 2) *${nnn}* 7 | 8 | ➤ *¡Visita streaming barato!!* 9 | https://hackstorex.com 10 | 11 | ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 12 | 13 | *ᴋᴀɴᴛᴜ - ʙᴏᴛ* 14 | *${nnnttt}*`.trim() 15 | conn.reply(m.chat, info, m) 16 | //conn.fakeReply(m.chat, info, '0@s.whatsapp.net', '𝙏𝙝𝙚-l-𝙈𝘿', 'status@broadcast') 17 | } 18 | handler.help = ['grupos'] 19 | handler.tags = ['main'] 20 | handler.command = /^linkgc|grupos|gruposgatabot|gatabotgrupos|gruposdegatabot|groupofc|gruposgb|grupogb|groupgb$/i 21 | handler.register = true 22 | export default handler 23 | -------------------------------------------------------------------------------- /plugins/grupo-kick.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, participants, usedPrefix, command, isROwner }) => { 2 | let kickte = `A quien eliminó? etiquetas a una persona con @tag pendejo` 3 | if (!m.mentionedJid[0] && !m.quoted) return m.reply(kickte, m.chat, { mentions: conn.parseMention(kickte)}) 4 | let user = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted.sender 5 | let owr = m.chat.split`-`[0] 6 | await conn.groupParticipantsUpdate(m.chat, [user], 'remove')} 7 | handler.help = ['kick *@user*'] 8 | handler.tags = ['group'] 9 | handler.command = ['kick', 'expulsar'] 10 | handler.admin = true 11 | handler.group = true 12 | handler.botAdmin = true 13 | handler.register = true 14 | export default handler -------------------------------------------------------------------------------- /lib/logs.js: -------------------------------------------------------------------------------- 1 | const stdouts = []; 2 | export default (maxLength = 200) => { 3 | const oldWrite = process.stdout.write.bind(process.stdout); 4 | module.exports.disable = () => { 5 | module.exports.isModified = false; 6 | return process.stdout.write = oldWrite; 7 | }; 8 | process.stdout.write = (chunk, encoding, callback) => { 9 | stdouts.push(Buffer.from(chunk, encoding)); 10 | oldWrite(chunk, encoding, callback); 11 | if (stdouts.length > maxLength) stdouts.shift(); 12 | }; 13 | module.exports.isModified = true; 14 | return module.exports; 15 | }; 16 | 17 | export const isModified = false; 18 | export function logs() { 19 | return Buffer.concat(stdouts); 20 | } 21 | 22 | -------------------------------------------------------------------------------- /plugins/grupo-setname.js: -------------------------------------------------------------------------------- 1 | let Presence = (await import(global.baileys)).default 2 | let handler = async (m, { conn, args, text }) => { 3 | const pp = await conn.profilePictureUrl(m.chat, 'image').catch(_ => null) || './src/grupos.jpg' 4 | if (!text) throw "⚠️ Ingresar el texto para el grupo" 5 | try { 6 | let text = args.join` ` 7 | if(!args || !args[0]) { 8 | } else { 9 | conn.groupUpdateSubject(m.chat, text) 10 | } 11 | m.react("✅️") 12 | } catch (e) { 13 | throw "error" 14 | }} 15 | handler.help = ['setname']; 16 | handler.tags = ['group']; 17 | handler.command = /^(setname|newnombre|nuevonombre)$/i 18 | handler.group = true 19 | handler.admin = true 20 | handler.botAdmin = true 21 | export default handler -------------------------------------------------------------------------------- /plugins/grupo-setwelcome.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {conn, text, isROwner, isOwner}) => { 2 | if (text) { 3 | global.db.data.chats[m.chat].sWelcome = text; 4 | m.reply('*✅ 𝐌𝐞𝐧𝐬𝐚𝐣𝐞 𝐝𝐞 𝐛𝐢𝐞𝐧𝐯𝐞𝐧𝐢𝐝𝐚 𝐜𝐨𝐧𝐟𝐢𝐠𝐮𝐫𝐚𝐝𝐨 𝐜𝐨𝐫𝐫𝐞𝐜𝐭𝐚𝐦𝐞𝐧𝐭𝐞 𝐩𝐚𝐫𝐚 𝐞𝐬𝐭𝐞 𝐠𝐫𝐮𝐩𝐨*'); 5 | } else throw `*⚠️ 𝐢𝐧𝐠𝐫𝐞𝐬𝐞 𝐞𝐥 𝐦𝐞𝐧𝐬𝐚𝐣𝐞 𝐝𝐞 𝐛𝐢𝐞𝐧𝐯𝐞𝐧𝐢𝐝𝐚 𝐪𝐮𝐞 𝐝𝐞𝐬𝐞𝐞 𝐚𝐠𝐫𝐞𝐠𝐚𝐫, 𝐮𝐬𝐞:*\n*- @user (mención)*\n*- @group (nombre de grupo)*\n*- @desc (description de grupo)*`; 6 | }; 7 | handler.help = ['setwelcome ']; 8 | handler.tags = ['group']; 9 | handler.command = ['setwelcome']; 10 | handler.admin = true; 11 | handler.register = true 12 | export default handler; 13 | -------------------------------------------------------------------------------- /plugins/owner-unbanchat.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn }) => { 2 | if (!(m.chat in global.db.data.chats)) return m.reply('*Este chat no está registrado en la base de datos!*') 3 | let chat = global.db.data.chats[m.chat] 4 | if (!chat.isBanned) return m.reply('*Este chat no está baneado!!*') 5 | chat.isBanned = false 6 | conn.reply(m.chat, '*BOT ONLINE 🚀*', m, {contextInfo: { externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: ag, body: '𝐂𝐡𝐚𝐭 𝐝𝐞𝐬𝐛𝐚𝐧𝐞𝐚𝐝𝐨', previewType: 0, thumbnail: imagen4, sourceUrl: [md, yt, tiktok].getRandom()}}}) 7 | } 8 | handler.command = /^unbanchat$/i 9 | //handler.botAdmin = true 10 | handler.rowner = true 11 | 12 | export default handler 13 | -------------------------------------------------------------------------------- /plugins/herramientas-ssweb.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch' 2 | let handler = async (m, { conn, command, args }) => { 3 | if (!args[0]) return conn.reply(m.chat, '⚠️ 𝐈𝐧𝐠𝐫𝐞𝐬𝐚 𝐮𝐧 𝐥𝐢𝐧𝐤 𝐩𝐚𝐫𝐚 𝐬𝐚𝐜𝐚𝐫 𝐜𝐚𝐩𝐭𝐮𝐫𝐚, ej: https://hackstorex.com', m) 4 | await m.react('⌛') 5 | try { 6 | let ss = await (await fetch(`https://api.dorratz.com/ssweb?url=${args[0]}`)).buffer() 7 | conn.sendFile(m.chat, ss, 'error.png', '✅', m, null, fake) 8 | await m.react('✅') 9 | } catch { 10 | await m.react('❌') 11 | }} 12 | handler.help = ['ss', 'ssweb'].map(v => v + ' **') 13 | handler.tags = ['tools'] 14 | handler.command = /^ss(web)?f?$/i 15 | handler.register = true 16 | handler.limit = 1 17 | export default handler -------------------------------------------------------------------------------- /plugins/owner-exec2.js: -------------------------------------------------------------------------------- 1 | import cp, { exec as _exec } from 'child_process' 2 | import { promisify } from 'util' 3 | let exec = promisify(_exec).bind(cp) 4 | let handler = async (m, { conn, isOwner, isROwner, command, text }) => { 5 | if (!isROwner) return 6 | if (conn.user.jid != conn.user.jid) return 7 | m.react("💻") 8 | let o 9 | try { 10 | o = await exec(command.trimStart() + ' ' + text.trimEnd()) 11 | } catch (e) { 12 | o = e 13 | } finally { 14 | let { stdout, stderr } = o 15 | if (stdout.trim()) m.reply(stdout) 16 | if (stderr.trim()) m.reply(stderr) 17 | }} 18 | handler.help = ['$'] 19 | handler.tags = ['owner']; 20 | handler.customPrefix = /^[$] / 21 | handler.command = new RegExp 22 | //handler.rowner = true 23 | 24 | export default handler 25 | -------------------------------------------------------------------------------- /plugins/convertidor-tourl.js: -------------------------------------------------------------------------------- 1 | import uploadFile from '../lib/uploadFile.js'; 2 | import uploadImage from '../lib/uploadImage.js'; 3 | const handler = async (m) => { 4 | const q = m.quoted ? m.quoted : m; 5 | const mime = (q.msg || q).mimetype || ''; 6 | if (!mime) throw '*⚠️ ¿𝐘 𝐋𝐀 𝐈𝐌𝐀𝐆𝐄𝐍? 𝐑𝐞𝐬𝐩𝐨𝐧𝐝𝐞 𝐚 𝐮𝐧𝐚 𝐢𝐦𝐚𝐠𝐞𝐧 𝐨 𝐯𝐢𝐝𝐞𝐨 𝐞𝐥 𝐜𝐮𝐚𝐥 𝐬𝐞𝐫𝐚 𝐜𝐨𝐧𝐯𝐞𝐫𝐭𝐢𝐝𝐨 𝐚 𝐞𝐧𝐥𝐚𝐜𝐞*'; 7 | const media = await q.download(); 8 | const isTele = /image\/(png|jpe?g|gif)|video\/mp4/.test(mime); 9 | const link = await (isTele ? uploadImage : uploadFile)(media); 10 | m.reply(link); 11 | }; 12 | handler.help = ['tourl ']; 13 | handler.tags = ['convertidor'] 14 | handler.command = /^(upload|tourl)$/i; 15 | handler.register = true 16 | export default handler; 17 | -------------------------------------------------------------------------------- /src/cuentas.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "text": "CUENTA REAL O NO 👀 (NETFLIX)\n\nCorreo: juan.perez.24@gmail.com\nContraseña: Jp@2024!", 4 | "uses": 2 5 | }, 6 | { 7 | "text": "PREMIUM GRATIS 💎(SPOTIFY)\n\nCorreo: maria.gonzalez.89@hotmail.com\nContraseña: Mg#1989!", 8 | "uses": 2 9 | }, 10 | { 11 | "text": "CUENTA RANDOM ⚡(SPOTIFY)\n\nCorreo: carlos.lopez.12@yahoo.com\nContraseña: Cl$2023!", 12 | "uses": 2 13 | }, 14 | { 15 | "text": "¿SERÁS UN GANADOR? 🏆(DISNEY)\n\nCorreo: ana.martinez.45@gmail.com\nContraseña: Am@2025!", 16 | "uses": 2 17 | }, 18 | { 19 | "text": "EXCLUSIVO 🔥(MAX + CRUNCHYROLL)\n\nCorreo: luis.rodriguez.78@outlook.com\nContraseña: Lr&2023!", 20 | "uses": 2 21 | } 22 | ] -------------------------------------------------------------------------------- /plugins/owner-setppbot.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, usedPrefix, command }) => { 2 | const userProfile = conn.user.jid || global.conn.user.jid 3 | let q = m.quoted ? m.quoted : m 4 | let mime = (q.msg || q).mimetype || q.mediaType || '' 5 | if (/image/.test(mime)) { 6 | let img = await q.download() 7 | if (!img) throw `*⚠️ No se encontró la imagen, por favor responde a una imagen usando el comando ${usedPrefix + command}*`; 8 | await conn.updateProfilePicture(userProfile, img).then(_ => m.reply("*⚠️ Se cambió con éxito la foto de perfil del número del bot*")) 9 | } else throw `⚠️ 𝙍𝙀𝙎𝙋𝙊𝙉𝘿𝙀 𝘼 𝙐𝙉𝘼 𝙄𝙈𝘼𝙂𝙀𝙉` 10 | } 11 | handler.help = ["setppbot"] 12 | handler.tags = ["owner"] 13 | handler.command = /^setppbot|cambiafoto|fotobot$/i; 14 | handler.owner = true; 15 | 16 | export default handler; -------------------------------------------------------------------------------- /plugins/grupo-tagall.js: -------------------------------------------------------------------------------- 1 | let handler = async(m, { isOwner, isAdmin, conn, text, participants, args, command }) => { 2 | if (!(isAdmin || isOwner)) { 3 | global.dfail('admin', m, conn) 4 | throw false 5 | } 6 | let pesan = args.join` ` 7 | let oi = `*𝙈𝙚𝙣𝙨𝙖𝙟𝙚:* ${pesan}` 8 | let teks = `*⺀ ACTIVE GRUPO 🗣️⺀* 9 | 10 | ❏ ${oi} 11 | 12 | ❏ *𝙀𝙩𝙞𝙦𝙪𝙚𝙩𝙖𝙨:* 13 | ` 14 | for (let mem of participants) { 15 | teks += `➥ @${mem.id.split('@')[0]}\n`} 16 | teks += `> ➥ ${wm}` 17 | conn.sendMessage(m.chat, { text: teks, mentions: participants.map(a => a.id) }, ) 18 | } 19 | handler.help = ['tagall ','invocar '] 20 | handler.tags = ['group'] 21 | handler.command = /^(tagall|invocar|invocacion|todos|invocación)$/i 22 | handler.admin = true 23 | handler.group = true 24 | handler.botAdmin = true 25 | export default handler 26 | -------------------------------------------------------------------------------- /plugins/owner-setprefix.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, { conn, text, usedPrefix, command }) => { 2 | if (!text) throw `⚠️ 𝙉𝙊 𝙎𝙀 𝙀𝙉𝘾𝙊𝙉𝙏𝙍𝙊 𝙉𝙄𝙉𝙂𝙐𝙉 𝙋𝙍𝙀𝙁𝙄𝙅𝙊, 𝙋𝙊𝙍 𝙁𝘼𝙑𝙊𝙍 𝙄𝙉𝙂𝙍𝙀𝙎𝙀 𝙀𝙇 𝙋𝙍𝙀𝙁𝙄𝙅𝙊 𝙌𝙐𝙀 𝙌𝙐𝙄𝙀𝙍𝘼 𝙀𝙎𝙏𝘼𝘽𝙇𝙀𝘾𝙀𝙍, 𝙀𝙅: ${usedPrefix + command} #`; 3 | const prefix = new RegExp('^[' + text.replace(/[|\\{}()[\]^$+*?.\-\^]/g, '\\$&') + ']'); 4 | const settings = global.db.data.settings[conn.user.jid] || {}; 5 | settings.prefix = text; 6 | global.db.data.settings[conn.user.jid] = settings; 7 | await m.reply(`✅ *𝙀𝙇 𝙋𝙍𝙀𝙁𝙄𝙅𝙊 𝘼𝘾𝙏𝙐𝘼𝙇 𝘿𝙀𝙇 ${wm} 𝙎𝙀 𝙀𝙎𝙏𝘼𝘽𝙇𝙀𝘾𝙄𝙊 𝘼 :* [ ${text} ]`); 8 | }; 9 | handler.help = ['setprefix'].map(v => v + ' [prefix]'); 10 | handler.tags = ['owner']; 11 | handler.command = /^(setprefix)$/i; 12 | handler.rowner = true; 13 | export default handler; 14 | -------------------------------------------------------------------------------- /plugins/owner-getplugin.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import fuzzysort from 'fuzzysort'; 3 | 4 | let handler = async (m, { usedPrefix, command, text }) => { 5 | let ar = Object.keys(plugins); 6 | let ar1 = ar.map(v => v.replace('.js', '')); 7 | 8 | if (!text) { 9 | throw `*¿Qué buscar?*\nEjemplo:\n${usedPrefix + command} sticker`; 10 | } 11 | 12 | let results = fuzzysort.go(text, ar1); 13 | 14 | if (results.length === 0) { 15 | return m.reply(`'${text}' no encontrado.\n\nSugerencias:\n${ar1.map(v => ' ' + v).join`\n`}`); 16 | } 17 | 18 | let match = results[0].target; 19 | m.reply(fs.readFileSync('./plugins/' + match + '.js', 'utf-8')); 20 | }; 21 | 22 | handler.help = ['getplugin'].map(v => v + ' '); 23 | handler.tags = ['owner']; 24 | handler.command = /^(getplugin|gp)$/i; 25 | handler.rowner = true; 26 | export default handler; 27 | -------------------------------------------------------------------------------- /plugins/grupo-pin.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, command }) => { 2 | if (!m.quoted) return m.reply(`⚠️ Responde a un mensaje para ${command === 'pin' ? 'fijarlo' : 'desfijarlo'}.`); 3 | try { 4 | let messageKey = {remoteJid: m.chat, 5 | fromMe: m.quoted.fromMe, 6 | id: m.quoted.id, 7 | participant: m.quoted.sender 8 | }; 9 | 10 | if (command === 'pin') { 11 | await conn.sendMessage(m.chat, {pin: {type: 1, time: 604800, key: messageKey }}); 12 | m.react("✅️") 13 | } 14 | 15 | if (command === 'unpin') { 16 | await conn.sendMessage(m.chat, { pin: { type: 0, key: messageKey }}); 17 | m.react("✅️") 18 | }} catch (error) { 19 | console.error(error); 20 | }}; 21 | handler.help = ['pin'] 22 | handler.tags = ['group'] 23 | handler.command = ['pin', 'unpin'] 24 | handler.admin = true 25 | handler.group = true 26 | handler.botAdmin = true 27 | handler.register = true 28 | export default handler -------------------------------------------------------------------------------- /plugins/game-cf.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { args }) => { 2 | const bet = parseInt(args[0], 10); 3 | let user = global.db.data.users[m.sender]; 4 | 5 | if (!bet || bet <= 0) return m.reply('❌ Ingresa una cantidad válida para apostar.'); 6 | if (!user || user.exp < bet) return m.reply(`❌ No tienes suficiente experiencia (exp) para esta apuesta. Solo tiene ${user.exp.toLocaleString()} `); 7 | 8 | const outcome = Math.random() < 0.5 ? 'cara' : 'cruz'; 9 | const win = outcome === 'cara'; // 10 | 11 | if (win) { 12 | user.exp += bet; 13 | m.reply(`🎉 La moneda cayó en *${outcome}* y ganaste *${bet.toLocaleString()}* exp.`); 14 | } else { 15 | user.exp -= bet; 16 | m.reply(`💀 La moneda cayó en *${outcome}* y perdiste *${bet.toLocaleString()}* exp.`); 17 | }}; 18 | handler.help = ['cf ']; 19 | handler.tags = ['games']; 20 | handler.command = ['cf']; 21 | handler.register = true; 22 | 23 | export default handler; -------------------------------------------------------------------------------- /plugins/herramientas-readmore.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, text }) => { 2 | let [l, r] = text.split`|` 3 | if (!l) l = '' 4 | if (!r) r = '' 5 | 6 | function insertReadMoreEverySixWords(str) { 7 | let words = str.split(' '); 8 | let result = []; 9 | for (let i = 0; i < words.length; i += 6) { 10 | result.push(words.slice(i, i + 6).join(' ')); 11 | } 12 | return result.join(` ${readMore} `); 13 | } 14 | 15 | if (l.split(' ').length > 6) { 16 | l = insertReadMoreEverySixWords(l); 17 | } 18 | if (r.split(' ').length > 6) { 19 | r = insertReadMoreEverySixWords(r); 20 | } 21 | 22 | conn.reply(m.chat, l + readMore + r, m) 23 | } 24 | handler.help = ['readmore |'] 25 | handler.tags = ['tools'] 26 | handler.command = ['leermas', 'readmore'] 27 | handler.register = true 28 | handler.limit = 1 29 | export default handler 30 | 31 | const more = String.fromCharCode(8206) 32 | const readMore = more.repeat(4001) 33 | -------------------------------------------------------------------------------- /plugins/owner-banuser.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, text, usedPrefix, command }) => { 2 | let who 3 | if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : false 4 | else who = m.chat 5 | let user = global.db.data.users[who] 6 | if (!who) throw `🤓 Etiqueta al usuario boludito` 7 | let users = global.db.data.users 8 | users[who].banned = true 9 | let ban = 'https://qu.ax/SJJt.mp3' 10 | conn.sendMessage(m.chat, { audio: { url: ban }, contextInfo: { "externalAdReply": { "title": `⚠️ ᴱˡ ᵘˢᵘᵃʳᶦᵒ(ᵃ) ᶠᵘᵉ ᵇᵃⁿᵉᵃᵈᵒ(ᵃ) 🙀 ⁿᵒ ᵖᵒᵈʳᵃ ᵘˢᵃʳ ᵃ ${wm}`, "body": ``, "previewType": "PHOTO", "thumbnailUrl": null,"thumbnail": imagen1, "sourceUrl": md, "showAdAttribution": true}}, ptt: true, mimetype: 'audio/mpeg', fileName: `error.mp3` }, { quoted: m }) 11 | } 12 | handler.help = ['banuser'] 13 | handler.tags = ['owner'] 14 | handler.command = /^banuser$/i 15 | handler.rowner = true 16 | 17 | export default handler -------------------------------------------------------------------------------- /plugins/convertidor-togifaud.js: -------------------------------------------------------------------------------- 1 | /* 𝐂𝐑𝐄𝐀𝐃𝐎 𝐏𝐎𝐑 https://github.com/BrunoSobrino */ 2 | 3 | const handler = async (m, {conn, usedPrefix, command}) => { 4 | if (!m.quoted) throw `*⚠️ 𝐑𝐞𝐬𝐩𝐨𝐧𝐝𝐞 𝐚 𝐮𝐧 𝐯𝐢𝐝𝐞𝐨 𝐪𝐮𝐞 𝐝𝐞𝐬𝐞𝐞 𝐜𝐨𝐧𝐯𝐞𝐫𝐭𝐢𝐫 𝐞𝐧 𝐠𝐢𝐟 𝐜𝐨𝐧 𝐚𝐮𝐝𝐢𝐨*`; 5 | const q = m.quoted || m; 6 | const mime = (q.msg || q).mimetype || ''; 7 | if (!/(mp4)/.test(mime)) throw `*⚠️ 𝐄𝐥 𝐭𝐢𝐩𝐨 𝐝𝐞 𝐚𝐫𝐜𝐡𝐢𝐯𝐨 ${mime} 𝐧𝐨 𝐞𝐬 𝐜𝐨𝐫𝐫𝐞𝐜𝐭𝐨, 𝐫𝐞𝐬𝐩𝐨𝐧𝐝𝐚 𝐚 𝐮𝐧 𝐯𝐢𝐝𝐞𝐨 𝐪𝐮𝐞 𝐝𝐞𝐬𝐬𝐞 𝐜𝐨𝐧𝐯𝐞𝐫𝐭𝐢𝐫 𝐞𝐧 𝐠𝐢𝐟 𝐜𝐨𝐧 𝐚𝐮𝐝𝐢𝐨*`; 8 | m.reply(global.wait); 9 | const media = await q.download(); 10 | conn.sendMessage(m.chat, {video: media, gifPlayback: true, caption: '*ᴀϙᴜɪ ᴇsᴛᴀ sᴜ ɢɪғ ᴄᴏɴ ᴀᴜᴅɪᴏ*'}, {quoted: m}); 11 | }; 12 | handler.help = ['togif']; 13 | handler.tags = ['convertidor'] 14 | handler.command = ['togifaud', 'togif']; 15 | handler.register = true 16 | export default handler; 17 | -------------------------------------------------------------------------------- /plugins/rpg-shop.js: -------------------------------------------------------------------------------- 1 | const xpperlimit = 750 2 | const handler = async (m, {conn, command, args}) => { 3 | let count = command.replace(/^buy/i, ''); 4 | count = count ? /all/i.test(count) ? Math.floor(global.db.data.users[m.sender].exp / xpperlimit) : parseInt(count) : args[0] ? parseInt(args[0]) : 1; 5 | count = Math.max(1, count); 6 | if (global.db.data.users[m.sender].exp >= xpperlimit * count) { 7 | global.db.data.users[m.sender].exp -= xpperlimit * count; 8 | global.db.data.users[m.sender].limit += count; 9 | conn.reply(m.chat, `╔═❖ *NOTA DE PAGO* 10 | ║‣ *Has comprando :* ${count} 💎 11 | ║‣ *Gastado :* ${xpperlimit * count} XP 12 | ╚═══════════════`, m)} else conn.reply(m.chat, `⚠ Lo siento, no tienes suficientes *XP* para comprar *${count}* Diamantes💎`, m) 13 | } 14 | handler.help = ['Buy', 'Buyall']; 15 | handler.tags = ['econ']; 16 | handler.command = ['buy', 'buyall']; 17 | handler.register = true 18 | export default handler; 19 | -------------------------------------------------------------------------------- /plugins/convertidor-toimg.js: -------------------------------------------------------------------------------- 1 | import {webp2png} from '../lib/webp2mp4.js'; 2 | const handler = async (m, {conn, usedPrefix, command}) => { 3 | const notStickerMessage = `*⚠️ 𝐑𝐞𝐬𝐩𝐨𝐧𝐝𝐞 𝐚 𝐮𝐧 𝐬𝐭𝐢𝐜𝐤𝐞𝐫 𝐪𝐮𝐞 𝐝𝐞𝐬𝐞𝐞 𝐜𝐨𝐧𝐯𝐞𝐫𝐭𝐢𝐫 𝐞𝐧 𝐢𝐦𝐚𝐠𝐞𝐧 𝐜𝐨𝐧 𝐞𝐥 𝐬𝐢𝐠𝐮𝐢𝐞𝐧𝐭𝐞 𝐜𝐨𝐦𝐚𝐧𝐝𝐨:* ${usedPrefix + command}`; 4 | if (!m.quoted) throw notStickerMessage; 5 | m.reply(`Euu flaco 🥴\n\n> *Convirtiendo tu Sticker a Imagen 🔄*`) 6 | const q = m.quoted || m; 7 | const mime = q.mediaType || ''; 8 | if (!/sticker/.test(mime)) throw notStickerMessage; 9 | const media = await q.download(); 10 | const out = await webp2png(media).catch((_) => null) || Buffer.alloc(0); 11 | await conn.sendFile(m.chat, out, 'error.png', null, m, null, fake); 12 | }; 13 | handler.help = ['toimg (reply)']; 14 | handler.tags = ['convertidor'] 15 | handler.command = ['toimg', 'jpg', 'img']; 16 | handler.register = true 17 | export default handler; 18 | -------------------------------------------------------------------------------- /plugins/grupo-listwarn.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {conn, isOwner}) => { 2 | const adv = Object.entries(global.db.data.users).filter((user) => user[1].warn); 3 | const warns = global.db.data.users.warn; 4 | const user = global.db.data.users; 5 | const imagewarn = './src/warn.jpg'; 6 | const caption = `⚠️ 𝚄𝚂𝚄𝙰𝚁𝙸𝙾𝚂 𝙰𝙳𝚅𝙴𝚁𝚃𝙸𝙳𝙾𝚂\n 7 | *╔═══════════════════·•* 8 | ║ *Total : ${adv.length} Usuarios* ${adv ? '\n' + adv.map(([jid, user], i) => ` 9 | ║ 10 | ║ 1.- ${isOwner ? '@' + jid.split`@`[0] : jid} *(${user.warn}/3)*\n║\n║ - - - - - - - - -`.trim()).join('\n') : ''} 11 | *╚══════════════════·•*`; 12 | await conn.sendMessage(m.chat, {text: caption}, {quoted: m}, {mentions: await conn.parseMention(caption)}); 13 | }; 14 | handler.help = ['listwarn'] 15 | handler.tags = ['group'] 16 | handler.command = /^(listwarn)$/i; 17 | handler.group = true; 18 | handler.admin = true; 19 | handler.register = true 20 | export default handler; 21 | -------------------------------------------------------------------------------- /plugins/sticker-exif.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, args, usedPrefix, command }) => { 2 | if (!args[0]) return m.reply(`*⚠️ ${await tr("Usa de esta manera")}:* ${usedPrefix + command} packname | author\n*${await tr("Ejemplo")}:* ${usedPrefix + command} KantuBot | Crxs`) 3 | let text = args.join(" ").split("|") 4 | let packname = text[0].trim() 5 | let author = text[1] ? text[1].trim() : '' 6 | if (!packname) return m.reply(`⚠️ ${await tr("Debes ingresar al menos un packname")}`) 7 | global.db.data.users[m.sender].packname = packname 8 | global.db.data.users[m.sender].author = author 9 | m.reply(`✅ ${await tr("Perfecto, hemos actualizado el *EXIF* de tus stickers, eso significa que cada sticker que vayas a crear tendrá tu personalizado")}\nPackname: ${packname}\nAuthor: ${author || ''}`) 10 | } 11 | handler.help = ['exif | '] 12 | handler.tags = ['sticker']; 13 | handler.command = ['exif'] 14 | handler.register = true 15 | export default handler -------------------------------------------------------------------------------- /plugins/herramientas-acortar.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | const handler = async (m, {conn, args, text}) => { 3 | if (!text) throw '*⚠️ 𝐈𝐧𝐠𝐫𝐞𝐬𝐞 𝐮𝐧 𝐞𝐧𝐥𝐚𝐜𝐞/𝐮𝐫𝐥 𝐞𝐥 𝐜𝐮𝐚𝐥 𝐝𝐞𝐬𝐞𝐚 𝐚𝐜𝐨𝐫𝐭𝐚𝐫?*'; 4 | const shortUrl1 = await (await fetch(`https://tinyurl.com/api-create.php?url=${args[0]}`)).text(); 5 | if (!shortUrl1) throw `*[❗] 𝐄𝐑𝐑𝐎𝐑, 𝐂𝐎𝐌𝐏𝐑𝐔𝐄𝐁𝐄 𝐐𝐔𝐄 𝐄𝐋 𝐓𝐄𝐗𝐓𝐎 𝐈𝐍𝐆𝐑𝐄𝐒𝐀𝐃𝐎 𝐒𝐄𝐀 𝐔𝐍 𝐓𝐄𝐗𝐓𝐎 𝐈𝐍𝐆𝐑𝐄𝐒𝐀𝐃𝐎 𝐒𝐄𝐀 𝐔𝐍 𝐓𝐄𝐗𝐓𝐎 𝐄 𝐈𝐍𝐓𝐄𝐍𝐓𝐄𝐋𝐎 𝐃𝐄 𝐍𝐔𝐄𝐕𝐎*`; 6 | const done = `*🔶 𝐋𝐢𝐧𝐤 𝐚𝐜𝐨𝐫𝐭𝐚𝐝𝐨 𝐜𝐨𝐫𝐫𝐞𝐜𝐭𝐚𝐦𝐞𝐧𝐭𝐞!!*\n\n*• 𝐋𝐢𝐧𝐤 𝐚𝐧𝐭𝐞𝐫𝐢𝐨𝐫:*\n${text}\n*• 𝐋𝐢𝐧𝐤 𝐚𝐜𝐨𝐫𝐭𝐚𝐝𝐨:*\n${shortUrl1}`.trim(); 7 | m.reply(done); 8 | }; 9 | handler.help = ['tinyurl', 'acortar'].map((v) => v + ' '); 10 | handler.tags = ['tools']; 11 | handler.command = /^(tinyurl|short|acortar|corto)$/i; 12 | handler.fail = null; 13 | handler.register = true 14 | export default handler; 15 | -------------------------------------------------------------------------------- /plugins/owner-fetch.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch' 2 | import { format } from 'util' 3 | 4 | let handler = async (m, { conn, text }) => { 5 | if (m.fromMe) return 6 | if (!/^https?:\/\//.test(text)) throw 'Ejemplo:\nhttps://hackstorex.com' 7 | m.react("💻") 8 | let url = text 9 | let res = await fetch(url) 10 | if (res.headers.get('content-length') > 100 * 1024 * 1024 * 1024) { 11 | throw `Content-Length: ${res.headers.get('content-length')}` 12 | } 13 | 14 | if (!/text|json/.test(res.headers.get('content-type'))) return conn.sendFile(m.chat, url, 'file', text, m) 15 | let txt = await res.buffer() 16 | try { 17 | txt = format(JSON.parse(txt + '')) 18 | } catch (e) { 19 | txt = txt + '' 20 | } finally { 21 | m.reply(txt.slice(0, 65536) + '') 22 | } 23 | } 24 | handler.help = ['fetch'].map(v => v + ' **') 25 | handler.tags = ['owner'] 26 | handler.command = /^(fetch|get)$/i 27 | //handler.rowner = true 28 | handler.limit = 1 29 | handler.register = true 30 | 31 | export default handler; 32 | -------------------------------------------------------------------------------- /plugins/rpg-pareja-divorce.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, args, usedPrefix, command }) => { 2 | const user = global.db.data.users[m.sender]; 3 | let targetUser = m.mentionedJid[0] || args[0]; 4 | if (!targetUser) return m.reply("⚠️ Debes etiquetar a la persona con la que deseas divorciarte."); 5 | if (!user.marry || user.marry !== targetUser) return m.reply("⚠️ No estás casado con esta persona para poder divorciarte."); 6 | 7 | global.db.data.users[user.marry] = global.db.data.users[user.marry] || {}; 8 | global.db.data.users[user.marry].marry = null; 9 | global.db.data.users[m.sender].marry = null; 10 | conn.reply(m.chat, `@${m.sender.split('@')[0]} (${global.db.data.users[m.sender].name}) se Divorcio de @${targetUser.split('@')[0]} (${global.db.data.users[targetUser].name}) ahora están separados 😔\n\nEspero Vuelvan.`, m, { mentions: [m.sender, targetUser] }); 11 | }; 12 | handler.help = ['divorce <@tag>']; 13 | handler.tags = ['econ']; 14 | handler.command = ['divorce']; 15 | handler.register = true; 16 | 17 | export default handler; 18 | -------------------------------------------------------------------------------- /plugins/afk-_afk.js: -------------------------------------------------------------------------------- 1 | export function before(m) { 2 | const user = global.db.data.users[m.sender]; 3 | if (user.afk > -1) { 4 | m.reply(`『 DEJASTE DE ESTA AFK 』 5 | 6 | ${user.afkReason ? '*🔸️ ʀᴀᴢᴏɴ :* ' + user.afkReason : ''}* 7 | *🔸 ᴇsᴛᴜᴠᴏ ɪɴᴀᴄᴛɪᴠᴏ ᴅᴜʀᴀɴᴛᴇ:* ${(new Date - user.afk).toTimeString()}*`.trim()); 8 | user.afk = -1; 9 | user.afkReason = ''; 10 | } 11 | const jids = [...new Set([...(m.mentionedJid || []), ...(m.quoted ? [m.quoted.sender] : [])])]; 12 | for (const jid of jids) { 13 | const user = global.db.data.users[jid]; 14 | if (!user) { 15 | continue; 16 | } 17 | const afkTime = user.afk; 18 | if (!afkTime || afkTime < 0) { 19 | continue; 20 | } 21 | const reason = user.afkReason || ''; 22 | m.reply(`『 💤 NO LOS ETIQUETE 💤 』 23 | > *ᴇsᴛᴇ ᴜsᴜᴀʀɪᴏ ǫᴜᴇ ᴍᴇɴᴄɪᴏɴᴀs ᴇsᴛᴀ ᴀғᴋ* 24 | 25 | *🔸 ${reason ? 'ᴍᴏᴛɪᴠᴏ ᴅᴇ ɪɴᴀᴄᴛɪᴠɪᴅᴀᴅ (ᴀғᴋ): ' + reason : 'ᴍᴏᴛɪᴠᴏ ᴅᴇ ɪɴᴀᴄᴛɪᴠɪᴅᴀᴅ (ᴀғᴋ): Paja xD\n> _El usuario no especificó un motivo_'}* 26 | *🔸 ᴛɪᴇᴍᴘᴏ ᴛʀᴀɴsᴄᴜʀʀɪᴅᴏ ᴅᴇ ɪɴᴀᴄᴛɪᴠɪᴅᴀᴅ (ᴀғᴋ): ${(new Date - afkTime).toTimeString()}*`.trim()); 27 | } 28 | return true; 29 | } 30 | -------------------------------------------------------------------------------- /plugins/grupo-delwarn.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, args, groupMetadata}) => { 2 | let who 3 | if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : false 4 | else who = m.chat 5 | if (!who) throw `*¿A quien le doy advertencia?* etiquetas a una persona no soy adivinó :)` 6 | if (!(who in global.db.data.users)) throw `*⚠️ ¿Quien carajo es ese?* No se encuentra en mi base de datos` 7 | let warn = global.db.data.users[who].warn 8 | if (warn > 0) { 9 | global.db.data.users[who].warn -= 1 10 | m.reply(`*⚠️ SE QUITÓ UNA ADVERTENCIA ⚠️* 11 | 12 | *• Advertencia:* -1 13 | *• Total:* ${warn - 1}`) 14 | //m.reply(`Un admin redujo su advertencia, ahora tienes *${warn - 1}*`, who) 15 | } else if (warn == 0) { 16 | m.reply('*⚠️ El usuario no tiene ninguna advertencia*') 17 | }} 18 | handler.help = ['delwarn *@user*'] 19 | handler.tags = ['group'] 20 | handler.command = ['delwarn', 'unwarn'] 21 | handler.group = true 22 | handler.admin = true 23 | handler.botAdmin = true 24 | handler.register = true 25 | export default handler 26 | -------------------------------------------------------------------------------- /plugins/owner-restart.js: -------------------------------------------------------------------------------- 1 | import { spawn } from 'child_process' 2 | let handler = async (m, { conn, isROwner, text }) => { 3 | if (!process.send) throw 'Dont: node main.js\nDo: node index.js' 4 | if (conn.user.jid == conn.user.jid) { 5 | async function loading() { 6 | var hawemod = ["10%", "30%", "50%", "80%", "100%" ] 7 | let { key } = await conn.sendMessage(m.chat, {text: `*Reiniciando...*`}, {quoted: m}) 8 | for (let i = 0; i < hawemod.length; i++) { 9 | await new Promise(resolve => setTimeout(resolve, 1000)); 10 | await conn.sendMessage(m.chat, {text: hawemod[i], edit: key}, {quoted: m})} 11 | await conn.sendMessage(m.chat, {text: `🚀 Reiniciando Bot...\nPor favor espere un momento`, edit: key}, {quoted: m}); 12 | //process.send("reset") 13 | process.exit() 14 | } 15 | loading() 16 | } else throw 'eh' 17 | } 18 | handler.help = ['restart'] 19 | handler.tags = ['owner'] 20 | handler.command = ['restart','reiniciar'] 21 | handler.rowner = true 22 | export default handler 23 | 24 | const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) 25 | -------------------------------------------------------------------------------- /plugins/herramientas-styletext.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch' 2 | import { JSDOM } from 'jsdom' 3 | let handler = async (m, { conn, text }) => { 4 | conn.reply(m.chat, Object.entries(await stylizeText(text ? text : m.quoted && m.quoted.text ? m.quoted.text : m.text)).map(([name, value]) => `*${name}*\n${value}`).join`\n\n`, m) 5 | } 6 | handler.help = ['style'].map(v => v + ' **') 7 | handler.tags = ['tools'] 8 | handler.command = /^(style(text)?)$/i 9 | handler.register = true 10 | handler.limit = 1 11 | export default handler 12 | 13 | async function stylizeText(text) { 14 | let res = await fetch('http://qaz.wtf/u/convert.cgi?text=' + encodeURIComponent(text)) 15 | let html = await res.text() 16 | let dom = new JSDOM(html) 17 | let table = dom.window.document.querySelector('table').children[0].children 18 | let obj = {} 19 | for (let tr of table) { 20 | let name = tr.querySelector('.aname').innerHTML 21 | let content = tr.children[1].textContent.replace(/^\n/, '').replace(/\n$/, '') 22 | obj[name + (obj[name] ? ' Reversed' : '')] = content 23 | } 24 | return obj 25 | } 26 | -------------------------------------------------------------------------------- /plugins/_cmdWithMedia.js: -------------------------------------------------------------------------------- 1 | const { proto, generateWAMessage, areJidsSameUser } = (await import('@whiskeysockets/baileys')).default 2 | 3 | export async function all(m, chatUpdate) { 4 | if (m.isBaileys) return; 5 | if (!m.message) return; 6 | if (!m.msg.fileSha256) return; 7 | if (!(Buffer.from(m.msg.fileSha256).toString('base64') in global.db.data.sticker)) return; 8 | 9 | const hash = global.db.data.sticker[Buffer.from(m.msg.fileSha256).toString('base64')]; 10 | const {text, mentionedJid} = hash; 11 | const messages = await generateWAMessage(m.chat, {text: text, mentions: mentionedJid}, { 12 | userJid: this.user.id, 13 | quoted: m.quoted && m.quoted.fakeObj, 14 | }); 15 | messages.key.fromMe = m.isBaileys || (m.sender === m.conn?.user?.jid) 16 | messages.key.id = m.key.id 17 | messages.pushName = m.pushName 18 | if (m.isGroup) messages.participant = m.sender 19 | const msg = { 20 | ...chatUpdate, 21 | messages: [proto.WebMessageInfo.fromObject(messages)], 22 | type: 'append', 23 | }; 24 | this.ev.emit('messages.upsert', msg); 25 | } 26 | -------------------------------------------------------------------------------- /plugins/maker-txt.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, text, usedPrefix, command }) => { 2 | let teks = text ? text : m.quoted && m.quoted.text ? m.quoted.text : '' 3 | 4 | if (command == 'txt' || command == 'escribir') { 5 | if (!teks) throw `⚠️ 𝙌𝙐𝙀 𝙀𝙎𝘾𝙍𝙄𝘽𝙄𝙊? 𝙐𝙎𝘼𝙍 𝙀𝙎𝙏𝙀 𝘾𝙊𝙈𝘼𝙉𝘿𝙊 𝘿𝙀 𝙇𝘼 𝙎𝙄𝙂𝙐𝙄𝙀𝙉𝙏𝙀 𝙁𝙊𝙍𝙈𝘼\n\n𝙀𝙅𝙀𝙈𝙋𝙇𝙊: *${usedPrefix + command}* Hola LoliBot`; 6 | let img = `${global.APIs.fgmods.url}/maker/txt?text=${encodeURIComponent(teks)}&apikey=${global.APIs.fgmods.key}`; 7 | conn.sendFile(m.chat, img, 'img.png', `✍🏻 𝙀𝙎𝙏𝘼 𝙇𝙄𝙎𝙏𝙊!!\n${wm}`, m, null, fake); 8 | } 9 | 10 | if (command == 'brat') { 11 | if (!teks) throw `⚠️ Ingresar en texto\nEj: *${usedPrefix + command}* case "hola":\nm.reply("que onda")\nbreak` 12 | let res = `${global.APIs.fgmods.url}/maker/carbon?text=${teks}&apikey=${global.APIs.fgmods.key}` 13 | } 14 | } 15 | handler.help = ['txt', 'brat'] 16 | handler.tags = ['game'] 17 | handler.command = ['txt', 'escribir', 'brat'] 18 | handler.limit = 1 19 | handler.register = true 20 | export default handler 21 | 22 | -------------------------------------------------------------------------------- /plugins/convertidor-tomp3.js: -------------------------------------------------------------------------------- 1 | import {toAudio} from '../lib/converter.js'; 2 | const handler = async (m, {conn, usedPrefix, command}) => { 3 | const q = m.quoted ? m.quoted : m; 4 | const mime = (q || q.msg).mimetype || q.mediaType || ''; 5 | if (!/video|audio/.test(mime)) throw `*⚠️ ¿𝐘 𝐞𝐥 𝐯𝐢𝐝𝐞𝐨? 𝐑𝐞𝐬𝐩𝐨𝐧𝐝𝐞 𝐚 𝐮𝐧 𝐯𝐢𝐝𝐞𝐨 𝐨 𝐧𝐨𝐭𝐚 𝐝𝐞 𝐯𝐨𝐳 𝐩𝐚𝐫𝐚 𝐜𝐨𝐧𝐯𝐞𝐫𝐭𝐢𝐫 𝐚 𝐌𝐏𝟑*`; 6 | const media = await q.download(); 7 | if (!media) throw '*⚠️ 𝐎𝐂𝐔𝐑𝐑𝐈𝐎́ 𝐔𝐍 𝐄𝐑𝐑𝐎𝐑 𝐍𝐎𝐒𝐄 𝐐𝐔𝐄 𝐏𝐀𝐒𝐎? 𝐓𝐔 𝐒𝐀𝐁𝐄𝐒?* :)'; 8 | m.reply(`Calmaoooo estoy procesando 😎\n\n> *Convirtiendo de MP4 a MP3 🔄*`) 9 | const audio = await toAudio(media, 'mp4'); 10 | if (!audio.data) throw '*⚠️ 𝐓𝐑𝐄𝐌𝐄𝐍𝐃𝐎 ¿𝐍𝐨 𝐬𝐚𝐛𝐞𝐬 𝐮𝐬𝐚𝐫 𝐞𝐥 𝐜𝐨𝐦𝐚𝐧𝐝𝐨? 𝐫𝐞𝐬𝐩𝐨𝐧𝐝𝐞𝐫 𝐚 𝐮𝐧 𝐯𝐢𝐝𝐞𝐨 𝐨 𝐧𝐨𝐭𝐚 𝐝𝐞 𝐯𝐨𝐳 𝐛𝐨𝐛𝐨*'; 11 | conn.sendMessage(m.chat, {audio: audio.data, mimetype: 'audio/mpeg', fake, }, {quoted: m}); 12 | }; 13 | handler.help = ['tomp3']; 14 | handler.tags = ['convertidor'] 15 | handler.command = /^to(mp3|audio)$/i; 16 | handler.register = true 17 | export default handler; 18 | -------------------------------------------------------------------------------- /plugins/sticker-dado.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn }) => { 2 | let dados = ['https://tinyurl.com/gdd01', 3 | 'https://tinyurl.com/gdd02', 4 | 'https://tinyurl.com/gdd003', 5 | 'https://tinyurl.com/gdd004', 6 | 'https://tinyurl.com/gdd05', 7 | 'https://tinyurl.com/gdd006'] 8 | let url = dados[Math.floor(Math.random() * dados.length)] 9 | m.react("🎲") 10 | //await conn.reply(m.chat, `${lenguajeGB['smsAvisoEG']()}𝙋𝙊𝙍 𝙁𝘼𝙑𝙊𝙍 𝙀𝙎𝙋𝙀𝙍𝙀, 𝙎𝙐 𝘿𝘼𝘿𝙊 𝙎𝙀 𝙀𝙎𝙏𝘼 𝘾𝙍𝙀𝘼𝙉𝘿𝙊\n\n𝙋𝙇𝙀𝘼𝙎𝙀 𝙒𝘼𝙄𝙏, 𝙔𝙊𝙐𝙍 𝘿𝙄𝘾𝙀 𝙄𝙎 𝘽𝙀𝙄𝙉𝙂 𝘾𝙍𝙀𝘼𝙏𝙀𝘿`, fkontak, m) 11 | conn.sendFile(m.chat, url, 'sticker.webp', '',m, true, { contextInfo: { 'forwardingScore': 200, 'isForwarded': false, externalAdReply:{ showAdAttribution: false, title: m.pushName, body: wm, mediaType: 2, sourceUrl: [nna, nn, md, yt].getRandom(), thumbnail: imagen4}}}, { quoted: m }) 12 | //conn.sendFile(m.chat, url, 'error.webp', null, m, { asSticker: true }) 13 | } 14 | handler.help = ['dados']; 15 | handler.tags = ['game']; 16 | handler.command = ['dado', 'dados', 'dadu'] 17 | handler.register = true 18 | export default handler 19 | -------------------------------------------------------------------------------- /plugins/grupo-staff.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, participants, groupMetadata, args }) => { 2 | const pp = await conn.profilePictureUrl(m.chat, 'image').catch(_ => null) || './src/avatar_contact.png' 3 | const groupAdmins = participants.filter(p => p.admin) 4 | const listAdmin = groupAdmins.map((v, i) => `${i + 1}. @${v.id.split('@')[0]}`).join('\n➥ ') 5 | const owner = groupMetadata.owner || groupAdmins.find(p => p.admin === 'superadmin')?.id || m.chat.split`-`[0] + '@s.whatsapp.net' 6 | 7 | let text = `•══✪〘 *STAFF* 〙✪══• 8 | 9 | > *𝐒𝐞 𝐧𝐞𝐜𝐞𝐬𝐢𝐭𝐚 𝐥𝐚 𝐩𝐫𝐞𝐬𝐞𝐧𝐜𝐢𝐚 𝐝𝐞 𝐮𝐧 𝐚𝐝𝐦𝐢𝐧𝐬* 10 | 11 | *• 𝐆𝐫𝐮𝐩𝐨𝐬:* _${groupMetadata.subject}_ 12 | 13 | *• 𝐀𝐝𝐦𝐢𝐧𝐬: 14 | ${listAdmin} 15 | 16 | > [ ⚠ ️] *ᵁˢᵃʳ ᵉˢᵗᵉ ᶜᵒᵐᵃⁿᵈᵒ ˢᵒˡᵒ ᶜᵘᵃⁿᵈᵒ ˢᵉ ᵗʳᵃᵗᵉ ᵈᵉ ᵘⁿᵃ ᵉᵐᵉʳᵍᵉⁿᶜᶦᵃ* 17 | `.trim() 18 | conn.sendFile(m.chat, pp, 'staff.png', text, m, false, { mentions: [...groupAdmins.map(v => v.id), owner] }) 19 | } 20 | handler.help = ['staff'] 21 | handler.tags = ['group'] 22 | handler.command = ['staff', 'admins', 'listadmin'] 23 | handler.group = true 24 | handler.register = true 25 | 26 | export default handler 27 | -------------------------------------------------------------------------------- /plugins/herramientas-encuesta.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, text, args, usedPrefix, command }) => { 2 | let opciones = text.split('|'); 3 | if (!opciones[0]) return conn.reply(m.chat, await tr(`⚠️ Usar el comando de la siguiente forma:\n*${usedPrefix + command} Motivo de Encuesta|Opción1|Opción2|Opción3...*`), m); 4 | if (!opciones[1]) return conn.reply(m.chat, await tr(`⚠️ Para crear opciones, este es el formato:\n*${usedPrefix + command} Motivo de Encuesta|Opción1|Opción2|Opción3...*`), m); 5 | if (opciones.length > 13) return conn.reply(m.chat, `⚠️ 𝙈𝘼𝙓𝙄𝙈𝙊 *12* 𝙊𝙋𝘾𝙄𝙊𝙉𝙀𝙎!!`, m); 6 | let pregunta = opciones[0]; 7 | let respuestas = opciones.slice(1); 8 | let mensaje = `📊 ${await tr("Encuesta creada por")}:\n*❤️⇢ ${conn.getName(m.sender)}*\n\n${pregunta}`; 9 | await conn.sendMessage(m.chat, { poll: { name: pregunta, values: respuestas, selectableCount: 1 }}, { quoted: m }); 10 | }; 11 | handler.help = ['poll', 'encuesta']; 12 | handler.tags = ['tools']; 13 | handler.command = ['poll', 'encuesta', 'crearencuesta', 'startpoll', 'encuestas', 'polls']; 14 | handler.register = true 15 | export default handler; 16 | -------------------------------------------------------------------------------- /plugins/descargas-pinterest.js: -------------------------------------------------------------------------------- 1 | import {pinterest} from '@bochilteam/scraper'; 2 | const handler = async (m, {conn, text, usedPrefix, command}) => { 3 | if (!text) throw `*⚠️ Ejemplo:* ${usedPrefix + command} Kantu`; 4 | try { 5 | const json = await pinterest(text); 6 | conn.sendFile(m.chat, json.getRandom(), 'error.jpg', `_🔎 𝙍𝙚𝙨𝙪𝙡𝙩𝙖𝙙𝙤𝙨 𝙙𝙚: ${text}_`, m, null, fake); 7 | } catch (error1) { 8 | try { 9 | const response=await fetch(`https://deliriussapi-oficial.vercel.app/search/pinterest?text=${text}`) 10 | const dataR = await response.json() 11 | const json = dataR.result 12 | conn.sendFile(m.chat, json.getRandom(), 'error.jpg', `_🔎 𝙍𝙚𝙨𝙪𝙡𝙩𝙖𝙙𝙤𝙨 𝙙𝙚: ${text}_`, m, null, fake); 13 | //conn.sendButton(m.chat, `💞 ${mid.buscador} ${text}`, `𝙋𝙞𝙣𝙩𝙚𝙧𝙚𝙨𝙩 | ${wm}`, json.getRandom(), [['🔄 𝙎𝙞𝙜𝙪𝙞𝙚𝙣𝙩𝙚 | 𝙉𝙚𝙭𝙩', `${usedPrefix}pinterest ${text}`]], null, null, m) 14 | } catch (e) { 15 | console.log(e) 16 | }}} 17 | handler.help = ['pinterest ']; 18 | handler.tags = ['buscadores']; 19 | handler.command = /^(pinterest)$/i; 20 | handler.register = true 21 | handler.limit = 1 22 | export default handler; 23 | -------------------------------------------------------------------------------- /plugins/rpg-balance.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, {conn, usedPrefix}) => { 2 | 3 | let who = m.quoted ? m.quoted.sender : m.mentionedJid && m.mentionedJid[0] ? m.mentionedJid[0] : m.fromMe ? conn.user.jid : m.sender 4 | let user = global.db.data.users[who] 5 | if (!(who in global.db.data.users)) throw `✳️ ᴇʟ ᴜsᴜᴀʀɪᴏ ɴᴏ sᴇ ᴇɴᴄᴜᴇɴᴛʀᴀ ᴇɴ ᴍɪ ʙᴀsᴇ ᴅᴇ ᴅᴀᴛᴏs` 6 | conn.reply(m.chat, `*•───⧼⧼⧼ 𝙱𝙰𝙻𝙰𝙽𝙲𝙴 ⧽⧽⧽───•* 7 | 8 | @${who.split('@')[0]} Tiene: 9 | 10 | *• 𝐃𝐢𝐚𝐦𝐚𝐧𝐭𝐞:* _${user.limit} 💎_ 11 | *• 𝐄𝐱𝐩:* _${user.exp} ⬆️_ 12 | *• KantuCoins:* _${user.money} 🪙_ 13 | > Afuera del Banco 14 | 15 | *•───⧼⧼⧼ 𝙱𝙰𝙽𝙲𝙾 ⧽⧽⧽───•* 16 | 17 | *🏦 𝐃𝐢𝐧𝐞𝐫𝐨 :* _${user.banco} 💎_ 18 | > Adentro del Banco 🏦 19 | 20 | •───────────────• 21 | 22 | > *𝐍𝐎𝐓𝐀 :* 23 | > 𝐩𝐮𝐞𝐝𝐞𝐬 𝐜𝐨𝐦𝐩𝐫𝐚𝐫 💎 𝐝𝐢𝐚𝐦𝐚𝐧𝐭𝐞 𝐮𝐬𝐚𝐧𝐝𝐨 𝐥𝐨𝐬 𝐜𝐨𝐦𝐚𝐧𝐝𝐨𝐬 24 | > *• ${usedPrefix}buy * 25 | > *• ${usedPrefix}buyall*`, m, { mentions: [who] }) 26 | } 27 | handler.help = ['balance'] 28 | handler.tags = ['econ'] 29 | handler.command = ['bal', 'diamantes', 'diamond', 'balance'] 30 | handler.register = true 31 | 32 | export default handler 33 | -------------------------------------------------------------------------------- /plugins/owner-broadcastchats.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | const handler = async (m, {conn, text} ) => { 3 | const chats = Object.entries(conn.chats).filter(([jid, chat]) => !jid.endsWith('@g.us') && chat.isChats).map((v) => v[0]); 4 | if (!text) throw '*⚠️ 𝐈𝐧𝐠𝐫𝐞𝐬𝐞 𝐞𝐥 𝐦𝐞𝐧𝐬𝐚𝐣𝐞 𝐪𝐮𝐞 𝐪𝐮𝐢𝐞𝐫𝐞 𝐭𝐫𝐚𝐦𝐢𝐭𝐞*' 5 | const cc = text ? m : m.quoted ? await m.getQuotedObj() : false || m; 6 | const teks = text ? text : cc.text; 7 | for (const i of chats) { 8 | await delay(500); 9 | conn.sendMessage(i, { text: `✅ *COMUNICADO OFICIAL* ✅\n\n` + teks, mentions: [m.sender], mentions: (await conn.groupMetadata(id)).participants.map(v => v.id) }, { quoted: fkontak })} 10 | m.reply(`*✅ ᴍᴇɴsᴀɴᴇ ᴇɴᴠɪᴀᴅᴏ ᴀ ${chats.length} ᴄʜᴀᴛs ᴘʀɪᴠᴀᴅᴏs*\n\n*𝐍𝐎𝐓𝐀: ᴇs ᴘᴏsɪʙʟᴇ ǫᴜᴇ ᴛᴇɴɢᴀ ғᴀʟʟᴏs ᴇsᴛᴇ ᴄᴏᴍᴀɴᴅᴏ ʏ ɴᴏ sᴇ ᴇɴᴠɪᴇ ᴀ ᴛᴏᴅᴏs ʟᴏs ᴄʜᴀᴛs, ᴅɪsᴄᴜʟᴘᴇɴ ᴘᴏʀ ᴇʟ ᴍᴏᴍᴇɴᴛᴏ*`)}; 11 | handler.help = ['broadcastchats', 'bcchats'].map((v) => v + ' '); 12 | handler.tags = ['owner']; 13 | handler.command = /^(broadcastchats?|bcc(hats?)?)$/i; 14 | handler.rowner = true; 15 | export default handler; 16 | 17 | const delay = (time) => new Promise((res) => setTimeout(res, time)); -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 elrebelde21 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /plugins/owner-delprem.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, text, command, usedPrefix }) => { 2 | let who 3 | if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : text 4 | else who = m.chat 5 | if (!who) throw `${mg}𝙀𝙏𝙄𝙌𝙐𝙀𝙏𝙀 𝘼 𝙇𝘼 𝙋𝙀𝙍𝙎𝙊𝙉𝘼 𝙌𝙐𝙀 𝙑𝘼 𝙀𝙇𝙄𝙈𝙄𝙉𝘼𝙍 𝘿𝙀 𝙇𝙊𝙎 𝙐𝙎𝙐𝘼𝙍𝙄𝙊𝙎 𝙑𝙄𝙋 😿\n\n𝙀𝙅𝙀𝙈𝙋𝙇𝙊\n*${usedPrefix + command} @tag**` 6 | if (!global.prems.includes(who.split`@`[0])) throw `${iig}𝙀𝙇/𝙇𝘼 𝙐𝙎𝙐𝘼𝙍𝙄𝙊(𝘼) 𝙉𝙊 𝙀𝙎 𝙑𝙄𝙋 🥺` 7 | let index = global.prems.findIndex(v => (v.replace(/[^0-9]/g, '') + '@s.whatsapp.net') === (who.replace(/[^0-9]/g, '') + '@s.whatsapp.net')) 8 | global.prems.splice(index, 1) 9 | conn.reply(m.chat, `${eg}@${who.split`@`[0]} 𝘼𝙃𝙊𝙍𝘼 𝙀𝙇/𝙇𝘼 𝙐𝙎𝙐𝘼𝙍𝙄𝙊(𝘼) 𝙔𝘼 𝙉𝙊 𝙀𝙎 𝙑𝙄𝙋. 𝙏𝙀𝙉𝘿𝙍𝘼 𝙇𝙄𝙈𝙄𝙏𝙀𝙎 𝘾𝙊𝙉 ${lb} 😰`, m, { 10 | contextInfo: { 11 | mentionedJid: [who] 12 | }})} 13 | handler.help = ['delprem <@user>'] 14 | handler.tags = ['owner'] 15 | handler.command = /^(remove|-|del)prem$/i 16 | handler.group = true 17 | handler.admin = true 18 | handler.botAdmin = true 19 | handler.rowner = true 20 | export default handler 21 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs' 2 | import path, { dirname } from 'path' 3 | import assert from 'assert' 4 | import { spawn } from 'child_process' 5 | import syntaxError from 'syntax-error' 6 | import { fileURLToPath } from 'url' 7 | import { createRequire } from 'module' 8 | 9 | const __filename = fileURLToPath(import.meta.url) 10 | const __dirname = dirname(__filename) 11 | const require = createRequire(__dirname) 12 | 13 | let folders = ['.', ...Object.keys(require(path.join(__dirname, './package.json')).directories)] 14 | let files = [] 15 | for (let folder of folders) 16 | for (let file of fs.readdirSync(folder).filter(v => v.endsWith('.js'))) 17 | files.push(path.resolve(path.join(folder, file))) 18 | for (let file of files) { 19 | if (file == __filename) continue 20 | console.error('Checking', file) 21 | const error = syntaxError(fs.readFileSync(file, 'utf8'), file, { 22 | sourceType: 'module', 23 | allowReturnOutsideFunction: true, 24 | allowAwaitOutsideFunction: true 25 | }) 26 | if (error) assert.ok(error.length < 1, file + '\n\n' + error) 27 | assert.ok(file) 28 | console.log('Done', file) 29 | } -------------------------------------------------------------------------------- /plugins/owner-block-unblock.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {text, conn, usedPrefix, command}) => { 2 | const why = `*⚠️ 𝐄𝐣𝐞𝐦𝐩𝐥𝐨:*\n${usedPrefix + command} @${m.sender.split('@')[0]}`; 3 | const who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : text ? text.replace(/[^0-9]/g, '') + '@s.whatsapp.net' : false; 4 | if (!who) conn.reply(m.chat, why, m, {mentions: [m.sender]}); 5 | const res = []; 6 | switch (command) { 7 | case 'blok': case 'block': 8 | if (who) { 9 | await conn.updateBlockStatus(who, 'block').then(() => { 10 | res.push(who)})} else conn.reply(m.chat, why, m, {mentions: [m.sender]}); 11 | break; 12 | case 'unblok': case 'unblock': 13 | if (who) { 14 | await conn.updateBlockStatus(who, 'unblock').then(() => {res.push(who)})} else conn.reply(m.chat, why, m, {mentions: [m.sender]}); 15 | break; 16 | } 17 | if (res[0]) conn.reply(m.chat, `*ᴇʟ ᴜsᴜᴀʀɪᴏs ${res ? `${res.map((v) => '@' + v.split('@')[0])}` : ''} ғᴜᴇ ${command} ᴄᴏɴ ᴇ́xɪᴛᴏ*`, m, {mentions: res}); 18 | }; 19 | handler.help = ["block", "unblock"] 20 | handler.tags = ["owner"] 21 | handler.command = /^(block|unblock)$/i; 22 | handler.rowner = true; 23 | export default handler; 24 | -------------------------------------------------------------------------------- /plugins/grupo-config.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, args, usedPrefix, command }) => { 2 | const pp = await conn.profilePictureUrl(m.chat, 'image').catch(_ => null) || './src/grupos.jpg' 3 | let isClose = { // Switch Case Like :v 4 | 'open': 'not_announcement', 5 | 'close': 'announcement', 6 | 'abierto': 'not_announcement', 7 | 'cerrado': 'announcement', 8 | 'abrir': 'not_announcement', 9 | 'cerrar': 'announcement', 10 | }[(args[0] || '')] 11 | if (isClose === undefined) 12 | throw `*⚠️ ACCION MAL USADA*\n\n*• Usar ejemplo:*\n${usedPrefix + command} abrir\n${usedPrefix + command} cerrar`.trim() 13 | await conn.groupSettingUpdate(m.chat, isClose) 14 | 15 | if (isClose === 'not_announcement'){ 16 | m.reply(`🟢 𝙔𝘼 𝙋𝙐𝙀𝘿𝙀𝙉 𝙀𝙎𝘾𝙍𝙄𝘽𝙄𝙍 𝙏𝙊𝘿𝙊𝙎 𝙀𝙉 𝙂𝙍𝙐𝙋𝙊`) 17 | } 18 | 19 | if (isClose === 'announcement'){ 20 | m.reply(`⚠️ 𝙂𝙍𝙐𝙋𝙊 𝘾𝙀𝙍𝙍𝘼𝘿𝙊 𝙎𝙊𝙇𝙊 𝙇𝙊𝙎 𝘼𝘿𝙈𝙄𝙉𝙎 𝙋𝙐𝙀𝘿𝙀𝙉 𝙀𝙎𝘾𝙍𝙄𝘽𝙄𝙍`) 21 | }} 22 | handler.help = ['group open / close', 'grupo abrir / cerrar'] 23 | handler.tags = ['group'] 24 | handler.command = /^(group|grupo)$/i 25 | handler.admin = true 26 | handler.botAdmin = true 27 | handler.exp = 200 28 | export default handler -------------------------------------------------------------------------------- /plugins/jadibot-codeToken.js: -------------------------------------------------------------------------------- 1 | /* 2 | El codigo de este archivo esta totalmente hecho por: 3 | - ReyEndymion (https://github.com/ReyEndymion) 4 | */ 5 | 6 | import fs from "fs" 7 | let handler = async (m, { conn, usedPrefix }, args, command) => { 8 | let who = m.mentionedJid && m.mentionedJid[0] ? m.mentionedJid[0] : m.fromMe ? conn.user.jid : m.sender 9 | let uniqid = `${who.split`@`[0]}` 10 | try { 11 | if(global.conns.push(conn)) 12 | await conn.sendMessage(m.chat, {text : usedPrefix + 'serbot' + " " + Buffer.from(fs.readFileSync("./jadibts/" + uniqid + "/creds.json"), "utf-8").toString("base64")}, { quoted: m }) 13 | } catch(e) { 14 | await conn.reply(m.chat, `*No eres Sub-Bot de este Bot.* 15 | 16 | > 👉 Para convertirte en Sub-Bot, utiliza el comando: 17 | \`${usedPrefix + 'serbot'}\` 18 | 19 | > ⚠️ ¿Problemas para iniciar sesión? 20 | *Si no puedes acceder a tu sesión, elimina la sesión creada desde los dispositivos vinculados y utiliza el comando:* 21 | \`${usedPrefix + 'eliminarjb'}\` 22 | De esta manera, podrás solicitar una nueva sesión.`, m) 23 | if (m.fromMe) return 24 | }} 25 | handler.command = /^(codetoken)$/i 26 | handler.private = true 27 | export default handler -------------------------------------------------------------------------------- /plugins/descargas-imagen.js: -------------------------------------------------------------------------------- 1 | import {googleImage} from '@bochilteam/scraper'; 2 | const handler = async (m, {conn, text, usedPrefix, command}) => { 3 | if (!text) return m.reply(`𝗤𝘂𝗲 𝗯𝘂𝘀𝗰𝗮𝗿? 🤔️ 𝙪𝘀𝙖𝙧 𝙙𝙚 𝙡𝙖 𝙨𝙞𝙜𝙪𝙞𝙚𝙣𝙩𝙚 𝙢𝙖𝙣𝙚𝙧𝙖\n• 𝗘𝗷𝗲𝗺𝗽𝗹𝗼\n*${usedPrefix + command} Kantu*`) 4 | if (m.text.includes('gore') || m.text.includes('cp')|| m.text.includes('porno')|| m.text.includes('Gore')|| m.text.includes('rule')|| m.text.includes('CP') || m.text.includes('Rule34') || m.text.includes('xxx')) throw '🙄 No voy a buscar tu pendejadas....' 5 | try { 6 | const res = await googleImage(text); 7 | const image = await res.getRandom(); 8 | const link = image; 9 | conn.sendFile(m.chat, link, 'error.jpg', `_🔎 𝙍𝙚𝙨𝙪𝙡𝙩𝙖𝙙𝙤𝙨 𝙙𝙚: ${text}_`, m, null, fake); 10 | //conn.sendButton(m.chat, ``, botname, link, [['🔄 𝐒𝐈𝐆𝐔𝐈𝐄𝐍𝐓𝐄 🔄', `/${command} ${text}`]], null, null, m, null, fake) 11 | } catch (e) { 12 | console.log(e) 13 | }} 14 | handler.help = ['gimage ', 'imagen ']; 15 | handler.tags = ['buscadores']; 16 | handler.command = /^(gimage|image|imagen)$/i; 17 | handler.register = true 18 | handler.limit = 1 19 | export default handler; 20 | -------------------------------------------------------------------------------- /plugins/convertidor-tovideo.js: -------------------------------------------------------------------------------- 1 | import {webp2mp4} from '../lib/webp2mp4.js'; 2 | import {ffmpeg} from '../lib/converter.js'; 3 | const handler = async (m, {conn, usedPrefix, command}) => { 4 | if (!m.quoted) throw `*⚠️ 𝐑𝐄𝐒𝐏𝐎𝐍𝐃𝐄 𝐀 𝐔𝐍 𝐒𝐓𝐈𝐂𝐊𝐄𝐑 𝐐𝐔𝐄 𝐃𝐄𝐒𝐒𝐄 𝐂𝐎𝐍𝐕𝐄𝐑𝐓𝐈𝐑 𝐄𝐍 𝐕𝐈𝐃𝐄𝐎 𝐂𝐎𝐍 𝐄𝐋 𝐂𝐎𝐌𝐀𝐍𝐃𝐎: ${usedPrefix + command}*`; 5 | const mime = m.quoted.mimetype || ''; 6 | if (!/webp/.test(mime)) throw `*⚠️ 𝐑𝐄𝐒𝐏𝐎𝐍𝐃𝐄 𝐀 𝐔𝐍 𝐒𝐓𝐈𝐂𝐊𝐄𝐑 𝐐𝐔𝐄 𝐃𝐄𝐒𝐒𝐄 𝐂𝐎𝐍𝐕𝐄𝐑𝐓𝐈𝐑 𝐄𝐍 𝐕𝐈𝐃𝐄𝐎 𝐂𝐎𝐍 𝐄𝐋 𝐂𝐎𝐌𝐀𝐍𝐃𝐎: ${usedPrefix + command}*`; 7 | const media = await m.quoted.download(); 8 | let out = Buffer.alloc(0); 9 | if (/webp/.test(mime)) { 10 | out = await webp2mp4(media); 11 | } else if (/audio/.test(mime)) { 12 | out = await ffmpeg(media, ['-filter_complex', 'color', 13 | '-pix_fmt', 'yuv420p', 14 | '-crf', '51', 15 | '-c:a', 'copy', 16 | '-shortest', 17 | ], 'mp3', 'mp4')} 18 | await conn.sendFile(m.chat, out, 'error.mp4', '*✅ 𝐄𝐱𝐢𝐭𝐨*', m, null, fake, 0, {thumbnail: out}); 19 | }; 20 | handler.help = ['tovideo']; 21 | handler.tags = ['convertidor'] 22 | handler.command = ['tovideo', 'tomp4', 'mp4', 'togif']; 23 | handler.register = true 24 | export default handler; 25 | -------------------------------------------------------------------------------- /plugins/herramientas-fakeReply.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {conn, text, usedPrefix, command}) => { 2 | if (!text) return m.reply(`*⚠️ 𝐔𝐬𝐨 𝐝𝐞𝐥 𝐜𝐨𝐦𝐚𝐧𝐝𝐨*\n\n*${usedPrefix + command}* hola @${m.sender.split`@`[0]} a`, null, {mentions: [m.sender]}); 3 | const cm = copy(m); 4 | let who; 5 | if (text.includes('@0')) who = '0@s.whatsapp.net'; 6 | else if (m.isGroup) who = cm.participant = m.mentionedJid[0]; 7 | else who = m.chat; 8 | if (!who) return m.reply(`*⚠️ 𝐔𝐬𝐨 𝐝𝐞𝐥 𝐜𝐨𝐦𝐚𝐧𝐝𝐨*\n\n*${usedPrefix + command}* hola @${m.sender.split`@`[0]} a`, null, {mentions: [m.sender]}); 9 | cm.key.fromMe = false; 10 | cm.message[m.mtype] = copy(m.msg); 11 | const sp = '@' + who.split`@`[0]; 12 | const [fake, ...real] = text.split(sp); 13 | conn.fakeReply(m.chat, real.join(sp).trimStart(), who, fake.trimEnd(), m.isGroup ? m.chat : false, { contextInfo: { mentionedJid: conn.parseMention(real.join(sp).trim()), 14 | }, 15 | })}; 16 | handler.help = ['fake @user ']; 17 | handler.tags = ['tools']; 18 | handler.command = /^(fitnah|fakereply|fake)$/; 19 | handler.register = true 20 | handler.limit = 3 21 | export default handler; 22 | 23 | function copy(obj) { 24 | return JSON.parse(JSON.stringify(obj)); 25 | } 26 | -------------------------------------------------------------------------------- /plugins/grupo-mute.js: -------------------------------------------------------------------------------- 1 | let mutedUsers = new Set(); 2 | 3 | let handler = async (m, { conn, args, usedPrefix, command }) => { 4 | if (!m.mentionedJid?.length) return m.reply(`⚠️ Menciona a un usuario para silenciar.`); 5 | 6 | let target = m.mentionedJid[0]; 7 | 8 | if (command === 'mute') { 9 | mutedUsers.add(target); 10 | m.reply(`✅ ${target.includes('@s.whatsapp.net') ? target.split('@')[0] : target} ha sido silenciado.`); 11 | } else if (command === 'unmute') { 12 | mutedUsers.delete(target); 13 | m.reply(`✅ ${target.includes('@s.whatsapp.net') ? target.split('@')[0] : target} ha sido desilenciado.`); 14 | } 15 | }; 16 | 17 | let messageHandler = async (m) => { 18 | if (mutedUsers.has(m.sender)) { 19 | try { 20 | await conn.sendMessage(m.chat, { delete: m.key }); 21 | } catch (err) { 22 | console.error(err); 23 | } 24 | } 25 | }; 26 | 27 | handler.help = ['mute *@user*', 'unmute *@user*']; 28 | handler.tags = ['group']; 29 | handler.command = /^mute|unmute$/i; 30 | handler.group = true; 31 | handler.admin = true; 32 | handler.botAdmin = true; 33 | handler.register = true; 34 | 35 | export default { handler, messageHandler }; -------------------------------------------------------------------------------- /lib/levelling.js: -------------------------------------------------------------------------------- 1 | export const growth = Math.pow(Math.PI / Math.E, 1.618) * Math.E * .75; 2 | export function xpRange(level, multiplier = global.multiplier || 1) { 3 | if (level < 0) { 4 | throw new TypeError('level cannot be negative value'); 5 | } 6 | level = Math.floor(level); 7 | const min = level === 0 ? 0 : Math.round(Math.pow(level, growth) * multiplier) + 1; 8 | const max = Math.round(Math.pow(++level, growth) * multiplier); 9 | return { 10 | min, 11 | max, 12 | xp: max - min, 13 | }; 14 | } 15 | export function findLevel(xp, multiplier = global.multiplier || 1) { 16 | if (xp === Infinity) { 17 | return Infinity; 18 | } 19 | if (isNaN(xp)) { 20 | return NaN; 21 | } 22 | if (xp <= 0) { 23 | return -1; 24 | } 25 | let level = 0; 26 | do { 27 | level++; 28 | } 29 | while (xpRange(level, multiplier).min <= xp); 30 | return --level; 31 | } 32 | export function canLevelUp(level, xp, multiplier = global.multiplier || 1) { 33 | if (level < 0) { 34 | return false; 35 | } 36 | if (xp === Infinity) { 37 | return true; 38 | } 39 | if (isNaN(xp)) { 40 | return false; 41 | } 42 | if (xp <= 0) { 43 | return false; 44 | } 45 | return level < findLevel(xp, multiplier); 46 | } 47 | -------------------------------------------------------------------------------- /plugins/herramientas-npm.js: -------------------------------------------------------------------------------- 1 | //import { generateWAMessageFromContent } from "@whiskeysockets/baileys" 2 | let { generateWAMessageFromContent } = (await import(global.baileys)) 3 | import fetch from 'node-fetch' 4 | 5 | let handler = async (m, { text }) => { 6 | if (!text) throw '⚠️ *𝐈𝐧𝐠𝐫𝐞𝐬𝐞 𝐞𝐥 𝐧𝐨𝐦𝐛𝐫𝐞 𝐝𝐞𝐥 𝐦𝐨́𝐝𝐮𝐥𝐨 𝐪𝐮𝐞 𝐝𝐞𝐬𝐞𝐚 𝐛𝐮𝐬𝐜𝐚𝐫?*' 7 | let res = await fetch(`http://registry.npmjs.com/-/v1/search?text=${text}`) 8 | let { objects } = await res.json() 9 | if (!objects.length) throw `⚠️ *𝐍𝐨 𝐬𝐞 𝐞𝐧𝐜𝐨𝐧𝐭𝐫𝐚𝐫𝐨𝐧 𝐫𝐞𝐬𝐮𝐥𝐭𝐚𝐝𝐨𝐬 𝐝𝐞 _"${text}"_*` 10 | let txt = objects.map(({ package: pkg }) => { 11 | return `*${pkg.name}* (v${pkg.version})\n_${pkg.links.npm}_\n_${pkg.description}_` 12 | }).join`\n\n` 13 | let prep = generateWAMessageFromContent(m.chat, { extendedTextMessage: { text: txt, contextInfo: { externalAdReply: { title: '🔎 𝐁𝐮𝐬𝐜𝐚𝐝𝐨𝐫 𝐍𝐏𝐌𝐉𝐒', body: botname, thumbnailUrl: 'https://telegra.ph/file/f40f44ea9fc4c49fe6f2f.jpg', sourceUrl: md }}}}, { quoted: m }) 14 | conn.relayMessage(m.chat, prep.message, { messageId: prep.key.id }) 15 | } 16 | handler.help = ['npmsearch'] 17 | handler.tags = ['tools'] 18 | handler.command = /^npm(js|search)?$/i 19 | handler.register = true 20 | handler.limit = 1 21 | export default handler -------------------------------------------------------------------------------- /plugins/jadibot-broadcast.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, usedPrefix, text }) => { 2 | if (conn.user.jid !== global.conn.user.jid) throw false 3 | let users = [...new Set([...global.conns.filter(conn => conn.user && conn.state !== 'close').map(conn => conn.user.jid)])] 4 | let cc = text ? m : m.quoted ? await m.getQuotedObj() : false || m 5 | let teks = text ? text : cc.text 6 | let content = conn.cMod(m.chat, cc, /bc|broadcast/i.test(teks) ? teks : '*〔 𝗗𝗜𝗙𝗨𝗦𝗜𝗢𝗡 𝗔 𝗦𝗨𝗕 𝗕𝗢𝗧𝗦 〕*\n\n' + teks) 7 | for (let id of users) { 8 | await delay(1500) 9 | await conn.copyNForward(id, content, true) 10 | } 11 | conn.reply(m.chat, `*𝗗𝗜𝗙𝗨𝗦𝗜𝗢𝗡 𝗘𝗡𝗩𝗜𝗔𝗗𝗔 𝗖𝗢𝗡 𝗘𝗫𝗜𝗧𝗢 𝗔 ${users.length} 𝗦𝗨𝗕 𝗕𝗢𝗧𝗦* 12 | 13 | ${users.map(v => '• Wa.me/' + v.replace(/[^0-9]/g, '') + `?text=${encodeURIComponent(usedPrefix)}estado`).join('\n')}\n*𝗦𝗘 𝗙𝗜𝗡𝗔𝗟𝗜𝗭𝗢 𝗖𝗢𝗡 𝗘𝗟 𝗘𝗡𝗩𝗜𝗢 𝗘𝗡 ${users.length * 1.5} 𝗦𝗘𝗚𝗨𝗡𝗗𝗢𝗦 𝗔𝗣𝗥𝗢𝗫𝗜𝗠𝗔𝗗𝗔𝗠𝗘𝗡𝗧𝗘`.trim(), m)} 14 | handler.help = ['bcbot']; 15 | handler.tags = ['jadibot']; 16 | handler.command = /^bcbot$/i 17 | handler.owner = true 18 | export default handler 19 | 20 | const more = String.fromCharCode(8206) 21 | const readMore = more.repeat(4001) 22 | const delay = time => new Promise(res => setTimeout(res, time)) -------------------------------------------------------------------------------- /plugins/grupo-promote.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {conn, usedPrefix, text}) => { 2 | if (isNaN(text) && !text.match(/@/g)) { 3 | } else if (isNaN(text)) { 4 | var number = text.split`@`[1]; 5 | } else if (!isNaN(text)) { 6 | var number = text; 7 | } 8 | 9 | if (!text && !m.quoted) return conn.reply(m.chat, `*⚠️ ¿A quien le doy admins?* Etiqueta a una persona no soy adivino :)`, m); 10 | if (number.length > 13 || (number.length < 11 && number.length > 0)) return conn.reply(m.chat, `*⚠️ Estas drogado ese número ingresado es incorrecto 🤓*, ingresar un número correcto o mejor etiquetas al usuario @tag`, m); 11 | try { 12 | if (text) { 13 | var user = number + '@s.whatsapp.net'; 14 | } else if (m.quoted.sender) { 15 | var user = m.quoted.sender; 16 | } else if (m.mentionedJid) { 17 | var user = number + '@s.whatsapp.net'; 18 | }} catch (e) { 19 | } finally { 20 | conn.groupParticipantsUpdate(m.chat, [user], 'promote'); 21 | conn.reply(m.chat, `*[ ✅ ] ÓRDENES RECIBIDAS*`, m); 22 | }}; 23 | handler.help = ['*593xxx*', '*@usuario*', '*responder chat*'].map((v) => 'promote ' + v); 24 | handler.tags = ['group']; 25 | handler.command = /^(promote|daradmin|darpoder)$/i; 26 | handler.group = true; 27 | handler.admin = true; 28 | handler.botAdmin = true; 29 | handler.fail = null; 30 | handler.register = true 31 | export default handler; 32 | -------------------------------------------------------------------------------- /plugins/grupo-demote.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {conn, usedPrefix, text}) => { 2 | if (isNaN(text) && !text.match(/@/g)) { 3 | } else if (isNaN(text)) { 4 | var number = text.split`@`[1]; 5 | } else if (!isNaN(text)) { 6 | var number = text; 7 | } 8 | 9 | if (!text && !m.quoted) return conn.reply(m.chat, `*⚠️ ¿A quien le quitó admins?* etiquetas a una persona no soy adivinó :)`, m); 10 | if (number.length > 13 || (number.length < 11 && number.length > 0)) return conn.reply(m.chat, `*Esta drogado o que ese número ingresado es incorrecto 🤓*, ingresa el número correctamente o mejor etiquetas al usuario.`, m); 11 | try { 12 | if (text) { 13 | var user = number + '@s.whatsapp.net'; 14 | } else if (m.quoted.sender) { 15 | var user = m.quoted.sender; 16 | } else if (m.mentionedJid) { 17 | var user = number + '@s.whatsapp.net'; 18 | }} catch (e) { 19 | } finally { 20 | conn.groupParticipantsUpdate(m.chat, [user], 'demote'); 21 | conn.reply(m.chat, `*[ ✅ ] ÓRDENES RECIBIDAS*`, m); 22 | }}; 23 | handler.help = ['*593xxx*', '*@usuario*', '*responder chat*'].map((v) => 'demote ' + v); 24 | handler.tags = ['group']; 25 | handler.command = /^(demote|quitarpoder|quitaradmin)$/i; 26 | handler.group = true; 27 | handler.admin = true; 28 | handler.botAdmin = true; 29 | handler.register = true 30 | handler.fail = null; 31 | export default handler; 32 | -------------------------------------------------------------------------------- /plugins/_autosticker.js: -------------------------------------------------------------------------------- 1 | import {sticker} from '../lib/sticker.js'; 2 | const handler = (m) => m; 3 | 4 | handler.all = async function(m) { 5 | const chat = db.data.chats[m.chat]; 6 | const user = db.data.users[m.sender]; 7 | 8 | if (chat.autosticker && m.isGroup) { 9 | const q = m; 10 | let stiker = false; 11 | const mime = (q.msg || q).mimetype || q.mediaType || ''; 12 | if (/webp/g.test(mime)) return; 13 | if (/image/g.test(mime)) { 14 | const img = await q.download?.(); 15 | if (!img) return; 16 | stiker = await sticker(img, false, packname, author); 17 | } else if (/video/g.test(mime)) { 18 | if (/video/g.test(mime)) if ((q.msg || q).seconds > 8) return await m.reply(`*⚠️ El video solo puede durar 8 seg*`); 19 | const img = await q.download(); 20 | if (!img) return; 21 | stiker = await sticker(img, false, packname, author); 22 | } else if (m.text.split(/\n| /i)[0]) { 23 | if (isUrl(m.text)) stiker = await sticker(false, m.text.split(/\n| /i)[0], packname, author); 24 | else return; 25 | } 26 | if (stiker) { 27 | await conn.sendFile(m.chat, stiker, null, null, fake, {asSticker: true}); 28 | }} 29 | return !0; 30 | }; 31 | export default handler; 32 | 33 | const isUrl = (text) => { 34 | 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')); 35 | }; 36 | -------------------------------------------------------------------------------- /plugins/info-cuentas-oficiales.js: -------------------------------------------------------------------------------- 1 | let media = 'https://qu.ax/dcAc.mp4' 2 | let handler = async (m, { conn, command }) => { 3 | let 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" } 4 | let str = `\`『 CUENTAS OFICIALES 』\` 5 | 6 | \`𝐊𝐚𝐧𝐭𝐮 - 𝐁𝐨𝐭\` 7 | > *${bot}* 8 | 9 | ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 10 | 11 | \`『 GITHUB 』\` 12 | * *${md}* 13 | 14 | \`『 GRUPO 』\` 15 | * *${nn}* 16 | 17 | \`『 GRUPO 2 』\` 18 | * *${nnn}* 19 | 20 | \`『 GRUPO 3 』\` 21 | * *${nna}* 22 | 23 | 24 | 25 | ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 26 | \`『 SITIO WEB』\` 27 | • https://hackstorex.com 28 | 29 | ${wm}` 30 | await conn.reply(m.chat, str, fkontak, {contextInfo: {externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: wm, body: '', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}})} 31 | //conn.sendFile(m.chat, media, mp4', str, fkontak)} 32 | handler.help = ['cuentaoficial'] 33 | handler.tags = ['main'] 34 | handler.command = /^cuentasoficiales|cuentas|cuentaofc|cuentaoficial$/i 35 | handler.register = true 36 | export default handler 37 | -------------------------------------------------------------------------------- /plugins/sticker-kiss.js: -------------------------------------------------------------------------------- 1 | import { sticker } from '../lib/sticker.js' 2 | import fetch from 'node-fetch' 3 | 4 | let handler = async (m, { conn }) => { 5 | try { 6 | if (m.quoted?.sender) m.mentionedJid.push(m.quoted.sender) 7 | if (!m.mentionedJid.length) m.mentionedJid.push(m.sender) 8 | let getName = async (jid) => { 9 | let name = await conn.getName(jid).catch(() => null) 10 | return name || `+${jid.split('@')[0]}` 11 | } 12 | 13 | let senderName = await getName(m.sender) 14 | let mentionedNames = await Promise.all(m.mentionedJid.map(getName)) 15 | let res = await fetch('https://nekos.life/api/kiss') 16 | let json = await res.json() 17 | let { url } = json 18 | let stickerMessage = await sticker(null, url, `${senderName} está besando a ${mentionedNames.join(', ')}`) 19 | conn.sendFile(m.chat, stickerMessage, 'sticker.webp', '',m, true, { contextInfo: { 'forwardingScore': 200, 'isForwarded': false, externalAdReply:{ showAdAttribution: false, title: `${senderName} está besando a ${mentionedNames.join(', ')}`, body: wm, mediaType: 2, sourceUrl: [nna, nn, md, yt].getRandom(), thumbnail: imagen4}}}, { quoted: m }) 20 | //conn.sendFile(m.chat, stickerMessage, null, { asSticker: true }) 21 | } catch (e) { 22 | console.error(e) 23 | }} 24 | handler.help = ['kiss'] 25 | handler.tags = ['sticker'] 26 | handler.command = /^(kiss|skiss|kis|besos|beso|besar|besando)$/i 27 | handler.register = true 28 | 29 | export default handler 30 | -------------------------------------------------------------------------------- /plugins/herramientas-translate.js: -------------------------------------------------------------------------------- 1 | import translate from '@vitalets/google-translate-api'; 2 | import fetch from 'node-fetch'; 3 | const handler = async (m, {args, usedPrefix, command}) => { 4 | const msg = `*⚠️ 𝐔𝐬𝐨 𝐜𝐨𝐫𝐫𝐞𝐜𝐭𝐨 𝐝𝐞𝐥 𝐜𝐨𝐦𝐚𝐧𝐝𝐨 ${usedPrefix + command} (idioma) (texto)*\n*• 𝐄𝐣𝐞𝐦𝐩𝐥𝐨:*\n*${usedPrefix + command} es Hello*\n\n> *𝐂𝐨𝐧𝐨𝐜𝐞 𝐥𝐨𝐬 𝐢𝐝𝐢𝐨𝐦𝐚𝐬 𝐚𝐝𝐦𝐢𝐭𝐢𝐝𝐨𝐬 𝐞𝐧:*\nhttps://cloud.google.com/translate/docs/languages`; 5 | if (!args || !args[0]) return m.reply(msg); 6 | let lang = args[0]; 7 | let text = args.slice(1).join(' '); 8 | const defaultLang = 'es'; 9 | if ((args[0] || '').length !== 2) { 10 | lang = defaultLang; 11 | text = args.join(' '); 12 | } 13 | if (!text && m.quoted && m.quoted.text) text = m.quoted.text; 14 | try { 15 | const result = await translate(`${text}`, {to: lang, autoCorrect: true}); 16 | await m.reply('*Traducción:* ' + result.text); 17 | } catch { 18 | try { 19 | const lol = await fetch(`https://api.lolhuman.xyz/api/translate/auto/${lang}?apikey=${lolkeysapi}&text=${text}`); 20 | const loll = await lol.json(); 21 | const result2 = loll.result.translated; 22 | await m.reply('*Traducción:* ' + result2); 23 | } catch { 24 | await m.reply('*[❗𝐈𝐍𝐅𝐎❗] ERROR, VUELVA A INTENTARLO*'); 25 | }}}; 26 | handler.help = ['traducir', 'translate'] 27 | handler.tags = ['tools'] 28 | handler.command = /^(translate|traducir|trad)$/i; 29 | handler.register = true 30 | export default handler; 31 | -------------------------------------------------------------------------------- /plugins/owner-unbanuser.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, text}) => { 2 | if (!text) return conn.reply(m.chat, '⚠️ 𝙀𝙩𝙞𝙦𝙪𝙚𝙩𝙖𝙨 𝙖𝙡𝙜𝙪𝙣 𝙪𝙨𝙪𝙖𝙧𝙞𝙤𝙨 𝙥𝙖𝙧𝙖 𝙙𝙚𝙨𝙗𝙖𝙣𝙚𝙖\n𝙚𝙟𝙚𝙢𝙥𝙡𝙤: *@tag*', m, {contextInfo: { externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: ag, body: '𝐒𝐮𝐩𝐞𝐫 𝐁𝐨𝐭 𝐃𝐞 𝐖𝐡𝐚𝐭𝐬𝐀𝐩𝐩', previewType: 0, thumbnail: imagen4, sourceUrl: [md, yt, tiktok].getRandom()}}}) 3 | let who 4 | if (m.isGroup) who = m.mentionedJid[0] 5 | else who = m.chat 6 | if (!who) return conn.reply(m.chat, '⚠️ 𝙀𝙩𝙞𝙦𝙪𝙚𝙩𝙖𝙨 𝙖𝙡𝙜𝙪𝙣 𝙪𝙨𝙪𝙖𝙧𝙞𝙤𝙨 𝙥𝙖𝙧𝙖 𝙙𝙚𝙨𝙗𝙖𝙣𝙚𝙖\n𝙚𝙟𝙚𝙢𝙥𝙡𝙤: *@tag*', m, {contextInfo: { externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: ag, body: '𝐒𝐮𝐩𝐞𝐫 𝐁𝐨𝐭 𝐃𝐞 𝐖𝐡𝐚𝐭𝐬𝐀𝐩𝐩', previewType: 0, thumbnail: imagen4, sourceUrl: [md, yt, tiktok].getRandom()}}}) 7 | let users = global.db.data.users 8 | users[who].banned = false 9 | conn.reply(m.chat, '*𝙀𝙡 𝙪𝙨𝙪𝙖𝙧𝙞𝙤 𝙛𝙪𝙚 𝙙𝙚𝙨𝙗𝙖𝙣𝙚𝙖𝙙𝙤 🤩*\n𝘼𝙝𝙤𝙧𝙖 𝙥𝙤𝙙𝙧𝙖 𝙪𝙨𝙖𝙧 𝙖𝙡 𝙚𝙡 𝙗𝙤𝙩', m, {contextInfo: { externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: ag, body: '𝐒𝐮𝐩𝐞𝐫 𝐁𝐨𝐭 𝐃𝐞 𝐖𝐡𝐚𝐭𝐬𝐀𝐩𝐩', previewType: 0, thumbnail: imagen4, sourceUrl: [md, yt, tiktok].getRandom()}}}) 10 | } 11 | handler.help = ['unbanuser'] 12 | handler.tags = ['owner'] 13 | handler.command = /^unbanuser$/i 14 | handler.rowner = true 15 | export default handler 16 | -------------------------------------------------------------------------------- /plugins/herramientas-fixmsgespera.js: -------------------------------------------------------------------------------- 1 | import { readdirSync, unlinkSync, existsSync, promises as fs, rmSync } from 'fs'; 2 | import path from 'path'; 3 | 4 | const handler = async (m, { conn, usedPrefix }) => { 5 | if (global.conn.user.jid !== conn.user.jid) { 6 | return conn.sendMessage(m.chat, {text: '*⚠️ Utiliza este comando directamente en el número principal del Bot*'}, {quoted: m})} 7 | const chatId = m.isGroup ? [m.chat, m.sender] : [m.sender]; 8 | const sessionPath = './sessions' 9 | try { 10 | const files = await fs.readdir(sessionPath); 11 | let filesDeleted = 0; 12 | for (const file of files) { 13 | for (const id of chatId) { 14 | if (file.includes(id.split('@')[0])) { 15 | await fs.unlink(path.join(sessionPath, file)); 16 | filesDeleted++; 17 | break; 18 | }}} 19 | if (filesDeleted === 0) { 20 | await conn.sendMessage(m.chat, {text: '*No se encontró ningún archivo que incluya la ID del chat*'}, {quoted: m}); 21 | } else { 22 | await conn.sendMessage(m.chat, {text: `*Se eliminaron ${filesDeleted} archivos de sesión*`}, {quoted: m}) 23 | }} catch (err) { 24 | console.error('Error al leer la carpeta o los archivos de sesión:', err); 25 | await conn.sendMessage(m.chat, {text: '*Ocurrió un error al eliminar los archivos de sesión*'}, {quoted: m}); 26 | } 27 | await conn.sendMessage(m.chat, {text: `*Hola, Ya funciona? :v`}, {quoted: m}); 28 | }; 29 | handler.help = ['ds'] 30 | handler.tags = ['tools'] 31 | handler.command = /^(fixmsgespera|ds)$/i; 32 | export default handler; -------------------------------------------------------------------------------- /src/nsfw/tetas.json: -------------------------------------------------------------------------------- 1 | [ 2 | "https://img-cf.xvideos-cdn.com/videos/thumbs169lll/d9/1e/6d/d91e6d7d504d0e1112d4fa967b759395/d91e6d7d504d0e1112d4fa967b759395.23.jpg", 3 | 4 | "https://telegra.ph/file/17d7a52fa4d09bffd4021.jpg", 5 | 6 | "https://telegra.ph/file/6e4833070c1db456e3f16.jpg", 7 | 8 | "https://telegra.ph/file/6359a215c404084b4b5a5.jpg", 9 | 10 | "https://telegra.ph/file/39d6125edc9d816edea66.jpg", 11 | 12 | "https://telegra.ph/file/9e17fc2c5736c7bf50c1b.jpg", 13 | 14 | "https://telegra.ph/file/ffaf339d90f17f48e0b1e.jpg", 15 | 16 | "https://telegra.ph/file/36b0f4c3ee3f6da840f5a.jpg", 17 | 18 | "https://telegra.ph/file/e3bb0cfa608635ef709f7.jpg", 19 | 20 | "https://telegra.ph/file/37a490ae79ec506162358.jpg", 21 | 22 | "https://telegra.ph/file/7c59261f11fb56fc69fb3.jpg", 23 | 24 | "https://telegra.ph/file/f426a92690ac973e386ca.jpg", 25 | 26 | "https://telegra.ph/file/cb7188712869229744329.jpg", 27 | 28 | "https://telegra.ph/file/5349111c4713ccda12c87.jpg", 29 | 30 | "https://telegra.ph/file/83527deec9df9ac4b19b8.jpg", 31 | 32 | "https://telegra.ph/file/346fcefaf50115c561c3c.jpg", 33 | 34 | "https://telegra.ph/file/a824ababb101abeb9381b.jpg", 35 | 36 | "https://telegra.ph/file/b26f7a2ec0b020773634b.jpg", 37 | 38 | "https://telegra.ph/file/f071c9a4cef0fac79c614.jpg", 39 | 40 | "https://telegra.ph/file/85d4dc6ba0e3d922c79c3.jpg", 41 | 42 | "https://telegra.ph/file/81f0b276b91501e14c53e.jpg", 43 | 44 | "https://telegra.ph/file/1a4be9852051e5e818903.jpg" 45 | ] 46 | -------------------------------------------------------------------------------- /plugins/_antifakes.js: -------------------------------------------------------------------------------- 1 | let handler = m => m; 2 | 3 | handler.before = async function (m, { conn, isAdmin, isBotAdmin, isOwner, isROwner }) { 4 | if (!m.isGroup) return !1; 5 | let chat = global.db.data.chats[m.chat]; 6 | let bot = global.db.data.settings[conn.user.jid] || {}; 7 | 8 | if (isBotAdmin && chat.antifake && !isAdmin && !isOwner && !isROwner) { 9 | 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" }; 10 | 11 | const prefijosProhibidos = ['91', '92', '222', '93', '265', '61', '62', '966', '229', '40', '49', '20', '963', '967', '234', '210', '212']; 12 | 13 | const senderNumber = m.sender.split('@')[0]; 14 | if (prefijosProhibidos.some(prefijo => senderNumber.startsWith(prefijo))) { 15 | let texto = `*@${senderNumber}* En este grupo no está permitido el uso de números con prefijos prohibidos, será expulsado...`; 16 | 17 | try { 18 | await conn.reply(m.chat, texto, fkontak, m); 19 | let response = await conn.groupParticipantsUpdate(m.chat, [m.sender], 'remove'); 20 | if (response[0].status === "404") return; 21 | } catch (error) { 22 | console.error(`Error al expulsar a ${senderNumber}:`, error); 23 | }}} 24 | return !0; 25 | }; 26 | 27 | export default handler; 28 | -------------------------------------------------------------------------------- /plugins/herramientas-clima.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | const handler = async (m, {args}) => { 3 | if (!args[0]) throw '*⚠️ 𝐄𝐬𝐜𝐫𝐢𝐛𝐚 𝐞𝐥 𝐧𝐨𝐦𝐛𝐫𝐞 𝐝𝐞 𝐬𝐮 𝐩𝐚𝐢𝐬 𝐨 𝐜𝐢𝐮𝐝𝐚𝐝*'; 4 | try { 5 | const response = axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${args}&units=metric&appid=060a6bcfa19809c2cd4d97a212b19273`); 6 | const res = await response; 7 | const name = res.data.name; 8 | const Country = res.data.sys.country; 9 | const Weather = res.data.weather[0].description; 10 | const Temperature = res.data.main.temp + '°C'; 11 | const Minimum_Temperature = res.data.main.temp_min + '°C'; 12 | const Maximum_Temperature = res.data.main.temp_max + '°C'; 13 | const Humidity = res.data.main.humidity + '%'; 14 | const Wind = res.data.wind.speed + 'km/h'; 15 | const wea = `「 📍 」ʟᴜɢᴀʀ: ${name}\n「 🗺️ 」ᴘᴀɪs: ${Country}\n「 🌤️ 」ᴛɪᴇᴍᴘᴏ: ${Weather}\n「 🌡️ 」ᴛᴇᴍᴘᴇʀᴀᴛᴜʀᴀ: ${Temperature}\n「 💠 」 ᴛᴇᴍᴘᴇʀᴀᴛᴜʀᴀ ᴍɪɴɪᴍᴀ: ${Minimum_Temperature}\n「 📛 」 ᴛᴇᴍᴘᴇʀᴀᴛᴜʀᴀ ᴍᴀxɪᴍᴀ: ${Maximum_Temperature}\n「 💦 」ʜᴜᴍᴇᴅᴀᴅ: ${Humidity}\n「 🌬️ 」 ᴠɪᴇɴᴛᴏ: ${Wind}`; 16 | m.reply(wea); 17 | } catch { 18 | return '*⚠️ ɴᴏ sᴇ ʜᴀɴ ᴇɴᴄᴏɴᴛʀᴀᴅᴏ ʀᴇsᴜ𝙽𝙾 𝚂𝙴 𝙷𝙰𝙽 𝙴𝙽𝙲𝙾𝙽𝚃𝚁𝙰𝙳𝙾 𝚁𝙴𝚂𝚄𝙻𝚃𝙰𝙳𝙾𝚂, 𝙲𝙾𝚁𝚁𝙾𝙱𝙾𝚁𝙴 𝚀𝚄𝙴 𝙷𝙰𝚈𝙰 𝙴𝚂𝙲𝚁𝙸𝚃𝙾 𝙲𝙾𝚁𝚁𝙴𝙲𝚃𝙰𝙼𝙴𝙽𝚃𝙴 𝚂𝚄 𝙿𝙰𝙸𝚂 𝙾 𝙲𝙸𝚄𝙳𝙰𝙳*'; 19 | }}; 20 | handler.help = ['clima **']; 21 | handler.tags = ['tools']; 22 | handler.command = /^(clima|tiempo)$/i; 23 | handler.register = true 24 | export default handler; 25 | -------------------------------------------------------------------------------- /plugins/grupo-simulate.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, usedPrefix, command, args: [event], text }) => { 2 | let chat = global.db.data.chats[m.chat] 3 | if (!chat.welcome) throw `⚠️ Para usar este comando debe actvar las Bienvenidas con *${usedPrefix}on* welcome` 4 | let te = `┌─⊷ *EVENTOS* 5 | • welcome 6 | • bye 7 | • promote 8 | • demote 9 | └─────────── 10 | 11 | 📌 Ejemplo : 12 | 13 | *${usedPrefix + command}* welcome @user` 14 | 15 | if (!event) return await m.reply(te) 16 | 17 | let mentions = text.replace(event, '').trimStart() 18 | let who = mentions ? conn.parseMention(mentions) : [] 19 | let part = who.length ? who : [m.sender] 20 | let act = false 21 | m.reply(`✅ Simulando ${event}...`) 22 | switch (event.toLowerCase()) { 23 | case 'add': 24 | case 'bienvenida': 25 | case 'invite': 26 | case 'welcome': 27 | act = 'add' 28 | break 29 | case 'bye': 30 | case 'despedida': 31 | case 'leave': 32 | case 'remove': 33 | act = 'remove' 34 | break 35 | 36 | case 'promote': 37 | case 'promover': 38 | act = 'promote' 39 | break 40 | 41 | case 'demote': 42 | case 'degradar': 43 | act = 'demote' 44 | break 45 | 46 | default: 47 | throw te 48 | } 49 | if (act) return conn.participantsUpdate({ 50 | id: m.chat, 51 | participants: part, 52 | action: act 53 | })} 54 | handler.help = ['simulate @user'] 55 | handler.tags = ['group'] 56 | handler.command = ['simular', 'simulate'] 57 | handler.admin = true 58 | handler.group = true 59 | handler.register = true 60 | 61 | export default handler 62 | -------------------------------------------------------------------------------- /plugins/convertidor-tts.js: -------------------------------------------------------------------------------- 1 | import gtts from 'node-gtts'; 2 | import {readFileSync, unlinkSync} from 'fs'; 3 | import {join} from 'path'; 4 | const defaultLang = 'es'; 5 | const handler = async (m, {conn, args, usedPrefix, command}) => { 6 | let lang = args[0]; 7 | let text = args.slice(1).join(' '); 8 | if ((args[0] || '').length !== 2) { 9 | lang = defaultLang; 10 | text = args.join(' '); 11 | } 12 | if (!text && m.quoted?.text) text = m.quoted.text; 13 | conn.sendPresenceUpdate('recording', m.chat) 14 | let res; 15 | try { 16 | res = await tts(text, lang); 17 | } catch (e) { 18 | m.reply(e + ''); 19 | text = args.join(' '); 20 | if (!text) throw `*⚠️ 𝐄𝐬𝐜𝐫𝐢𝐛𝐞 𝐮𝐧 𝐭𝐞𝐱𝐭𝐨 𝐪𝐮𝐞 𝐪𝐮𝐢𝐞𝐫𝐚 𝐜𝐨𝐧𝐯𝐞𝐫𝐭𝐢𝐫 𝐚 𝐧𝐨𝐭𝐚 𝐝𝐞 𝐯𝐨𝐳, 𝐄𝐣𝐞𝐦𝐩𝐥𝐨:* ${usedPrefix + command} es Hola negros`; 21 | res = await tts(text, defaultLang); 22 | } finally { 23 | if (res) conn.sendFile(m.chat, res, 'tts.opus', null, m, null, fake, true); 24 | }}; 25 | handler.help = ['tts ']; 26 | handler.tags = ['convertidor'] 27 | handler.command = /^g?tts$/i; 28 | handler.register = true 29 | export default handler; 30 | 31 | function tts(text, lang = 'es') { 32 | console.log(lang, text); 33 | return new Promise((resolve, reject) => { 34 | try { 35 | const tts = gtts(lang); 36 | const filePath = join(global.__dirname(import.meta.url), '../tmp', (1 * new Date) + '.wav'); 37 | tts.save(filePath, text, () => { 38 | resolve(readFileSync(filePath)); 39 | unlinkSync(filePath); 40 | }); 41 | } catch (e) { 42 | reject(e); 43 | }})} 44 | -------------------------------------------------------------------------------- /plugins/rpg-levelup.js: -------------------------------------------------------------------------------- 1 | import { canLevelUp, xpRange } from '../lib/levelling.js' 2 | import { levelup } from '../lib/canvas.js' 3 | 4 | let handler = async (m, { conn }) => { 5 | let name = conn.getName(m.sender) 6 | let user = global.db.data.users[m.sender] 7 | if (!canLevelUp(user.level, user.role, user.exp, global.multiplier)) { 8 | let { min, xp, max } = xpRange(user.level, global.multiplier) 9 | throw `『 *TUS ESTADISTICAS 🆙* 』 10 | 11 | Tus estadisticas en tiempo real 🕐 12 | 13 | ├─ ❏ *NOMBRE:* ${name} 14 | ├─ ❏ *XP 🆙:* ${user.exp - min}/${xp} 15 | ├─ ❏ *NIVEL:* ${user.level} 16 | └─ ❏ *RANGO:* ${user.role} 17 | 18 | > Te falta *${max - user.exp}* De *XP* para subir de nivel 19 | `.trim() 20 | } 21 | let before = user.level * 1 22 | while (canLevelUp(user.level, user.exp, global.multiplier)) user.level++ 23 | if (before !== user.level) { 24 | let teks = `🎊 Felicidades ${conn.getName(m.sender)} llegaste a un nuevo nivel:` 25 | let str = `*[ 𝐋𝐄𝐕𝐄𝐋 𝐔𝐏 ]* 26 | 27 | *• 𝐍𝐢𝐯𝐞𝐥 𝐚𝐧𝐭𝐞𝐫𝐢𝐨𝐫:* ${before} 28 | *• 𝐍𝐢𝐯𝐞𝐥 𝐚𝐜𝐭𝐮𝐚𝐥:* ${user.level} 29 | *• 𝐑𝐚𝐧𝐠𝐨:* ${user.role} 30 | 31 | > _*Cuanto mas interactues con los bots, mayor sera tu nivel_* 32 | `.trim() 33 | try { 34 | const img = await levelup(teks, user.level) 35 | conn.sendFile(m.chat, img, 'levelup.jpg', str, m) 36 | } catch (e) { 37 | m.reply(str) 38 | }}} 39 | handler.help = ['levelup'] 40 | handler.tags = ['econ'] 41 | handler.command = ['nivel', 'lvl', 'levelup', 'level'] 42 | handler.register = true 43 | export default handler -------------------------------------------------------------------------------- /plugins/jadibot-primary.js: -------------------------------------------------------------------------------- 1 | import ws from 'ws'; 2 | 3 | let handler = async (m, { conn, usedPrefix, args }) => { 4 | if (!args[0]) return m.reply(`⚠️ Etiquetas en numero de algun bot\nEjemplo: ${usedPrefix}setprimary @tag`); 5 | 6 | const users = [...new Set([...global.conns.filter((conn) => conn.user && conn.ws.socket && conn.ws.socket.readyState !== ws.CLOSED).map((conn) => conn)])]; 7 | let botJid; 8 | let selectedBot; 9 | 10 | if (m.mentionedJid && m.mentionedJid.length > 0) { 11 | botJid = m.mentionedJid[0]; 12 | if (botJid === conn.user.jid || global.conn.user.jid) { 13 | selectedBot = conn; 14 | } else { 15 | selectedBot = users.find(conn => conn.user.jid === botJid); 16 | }} 17 | else { 18 | botJid = args[0].replace(/[^0-9]/g, '') + '@s.whatsapp.net'; 19 | if (botJid === conn.user.jid) { 20 | selectedBot = conn; 21 | } else { 22 | selectedBot = users.find(conn => conn.user.jid === botJid); 23 | }} 24 | 25 | if (!selectedBot) return m.reply("⚠️ No se encontró un bot conectado con esa mención o número. Usa /listjadibot para ver los bots disponibles."); 26 | let chat = global.db.data.chats[m.chat]; 27 | chat.primaryBot = botJid; 28 | conn.sendMessage(m.chat, { text: `✅ El bot @${botJid.split('@')[0]} ha sido establecido como primario en este grupo. Los demás bots no responderán aquí.`, mentions: [botJid] }, { quoted: m }); 29 | }; 30 | handler.help = ['setprimary <@tag>']; 31 | handler.tags = ['jadibot']; 32 | handler.command = ['setprimary']; 33 | handler.group = true; 34 | handler.register = true; 35 | 36 | export default handler; -------------------------------------------------------------------------------- /plugins/convertidor-toanime.js: -------------------------------------------------------------------------------- 1 | import uploadImage from '../lib/uploadImage.js'; 2 | const handler = async (m, {conn, text, args, usedPrefix, command}) => { 3 | const q = m.quoted ? m.quoted : m; 4 | const mime = (q.msg || q).mimetype || q.mediaType || ''; 5 | if (!/image/g.test(mime)) throw '⚠️ ¿𝐇𝐞𝐲 𝐧𝐨 𝐬𝐚𝐛𝐞𝐬 𝐜𝐨𝐦𝐨 𝐮𝐬𝐚𝐫 𝐞𝐬𝐭𝐞 𝐜𝐨𝐦𝐚𝐧𝐝𝐨 𝐩𝐞𝐧𝐝𝐞𝐣𝐨? 𝐫𝐞𝐬𝐩𝐨𝐧𝐝𝐞 𝐚 𝐮𝐧𝐚 𝐢𝐦𝐚𝐠𝐞𝐧'; 6 | m.react(`⌛`) 7 | const data = await q.download?.(); 8 | const image = await uploadImage(data); 9 | try { 10 | const anime = `https://api.lolhuman.xyz/api/imagetoanime?apikey=${lolkeysapi}&img=${image}`; 11 | await conn.sendFile(m.chat, anime, 'error.jpg', null, m, null, fake); 12 | m.react(`✅`) 13 | } catch (i) { 14 | try { 15 | const anime2 = `https://api.zahwazein.xyz/photoeditor/jadianime?url=${image}&apikey=${keysxxx}`; 16 | await conn.sendFile(m.chat, anime2, 'error.jpg', null, m, null, fake); 17 | m.react(`✅`) 18 | } catch (a) { 19 | try { 20 | const anime3 = `https://api.caliph.biz.id/api/animeai?img=${image}&apikey=caliphkey`; 21 | await conn.sendFile(m.chat, anime3, 'error.jpg', null, m, null, fake); 22 | m.react(`✅`) 23 | } catch (e) { 24 | m.reply(`\`\`\`⚠️ OCURRIO UN ERROR ⚠️\`\`\`\n\n> *Reporta el siguiente error a mi creador con el comando:*#report\n\n>>> ${e} <<<< `) 25 | console.log(e) 26 | m.react(`❌`) 27 | }}}}; 28 | handler.help = ['toanime']; 29 | handler.tags = ['convertidor'] 30 | handler.command = /^(jadianime|toanime)$/i; 31 | handler.register = true 32 | export default handler; 33 | -------------------------------------------------------------------------------- /plugins/grupo-warn.js: -------------------------------------------------------------------------------- 1 | let war = global.maxwarn 2 | let handler = async (m, { conn, text, args, groupMetadata, usedPrefix, command }) => { 3 | let who 4 | if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : false 5 | else who = m.chat 6 | if (!who) throw `*¿A quien le doy una advertencia?* etiqueta a la persona con el @tag` 7 | if (!(who in global.db.data.users)) throw `*⚠️ ¿Quien carajo es ese?* No aparece el mi base de datos` 8 | let name = conn.getName(m.sender) 9 | let warn = global.db.data.users[who].warn 10 | if (warn < war) { 11 | global.db.data.users[who].warn += 1 12 | m.reply(`*⚠️ ADVERTENCIA ⚠️* 13 | 14 | @${who.split`@`[0]} fuiste advertido por el admins: ${name} 15 | *• Tiene:* ${warn + 1}/${war} advertencia 16 | *• Razon:* ${text}`, null, { mentions: [who] }) 17 | } else if (warn == war) { 18 | global.db.data.users[who].warn = 0 19 | m.reply(`⚠️ El usuario superó la *${war}* Advertencia por lo tanto sera eliminado del Grupo...`) 20 | await time(3000) 21 | await conn.groupParticipantsUpdate(m.chat, [who], 'remove') 22 | //m.reply(`♻️ 𝙵𝚞𝚒𝚜𝚝𝚎 𝚎𝚕𝚒𝚖𝚒𝚗𝚊𝚍𝚘 𝚍𝚎𝚕 𝚐𝚛𝚞𝚙𝚘 *${groupMetadata.subject}* 𝚙𝚘𝚛𝚚𝚞𝚎 𝚑𝚊 𝚜𝚒𝚍𝚘 𝚊𝚍𝚟𝚎𝚛𝚝𝚒𝚍𝚘 *${war}* 𝚟𝚎𝚌𝚎𝚜`, who) 23 | }} 24 | handler.help = ['warn @user'] 25 | handler.tags = ['group'] 26 | handler.command = ['warn'] 27 | handler.group = true 28 | handler.admin = true 29 | handler.botAdmin = true 30 | handler.register = true 31 | 32 | export default handler 33 | 34 | const time = async (ms) => { 35 | return new Promise(resolve => setTimeout(resolve, ms))} 36 | -------------------------------------------------------------------------------- /plugins/rpg-daily.js: -------------------------------------------------------------------------------- 1 | const free = 5000 2 | const prem = 20000 3 | 4 | let handler = async (m, {conn, isPrems }) => { 5 | let time = global.db.data.users[m.sender].lastclaim + 86400000 6 | if (new Date - global.db.data.users[m.sender].lastclaim < 86400000) throw `⚠️ 𝙔𝙖 𝙧𝙚𝙘𝙡𝙖𝙢𝙖𝙨𝙩𝙚 𝙩𝙪 𝙧𝙚𝙜𝙖𝙡𝙤 🎁\n𝙑𝙪𝙚𝙡𝙫𝙚 𝙚𝙣 *${msToTime(time - new Date())}* 𝙋𝙖𝙧𝙖 𝙫𝙤𝙡𝙫𝙚𝙧 𝙖 𝙧𝙚𝙘𝙡𝙖𝙢𝙖𝙧*` 7 | const limit = Math.floor(Math.random() * 30) 8 | const money = Math.floor(Math.random() * 800) 9 | global.db.data.users[m.sender].limit += limit; 10 | global.db.data.users[m.sender].money += money 11 | global.db.data.users[m.sender].exp += isPrems ? prem : free 12 | m.reply(`🎁 *𝙊𝙗𝙩𝙞𝙚𝙣𝙚 𝙪𝙣 𝙧𝙚𝙜𝙖𝙡𝙤!!* 13 | 14 | 🔸 *𝐇𝐀𝐒 𝐑𝐄𝐂𝐈𝐁𝐈𝐃𝐎:* 15 | *💎 Diamante:* ${limit} 16 | *🪙 KantuCoins:* ${money} 17 | *🆙 Xp:* ${isPrems ? prem : free}`) 18 | global.db.data.users[m.sender].lastclaim = new Date * 1 19 | } 20 | handler.help = ['daily'] 21 | handler.tags = ['econ'] 22 | handler.command = ['daily', 'claim'] 23 | handler.register = true 24 | export default handler 25 | 26 | function msToTime(duration) { 27 | var milliseconds = parseInt((duration % 1000) / 100), 28 | seconds = Math.floor((duration / 1000) % 60), 29 | minutes = Math.floor((duration / (1000 * 60)) % 60), 30 | hours = Math.floor((duration / (1000 * 60 * 60)) % 24) 31 | 32 | hours = (hours < 10) ? "0" + hours : hours 33 | minutes = (minutes < 10) ? "0" + minutes : minutes 34 | seconds = (seconds < 10) ? "0" + seconds : seconds 35 | 36 | return hours + " Horas " + minutes + " Minutos" 37 | } 38 | 39 | -------------------------------------------------------------------------------- /lib/cloudDBAdapter.js: -------------------------------------------------------------------------------- 1 | import got from 'got'; 2 | 3 | const stringify = (obj) => JSON.stringify(obj, null, 2); 4 | const parse = (str) => JSON.parse(str, (_, v) => { 5 | if ( 6 | v !== null && 7 | typeof v === 'object' && 8 | 'type' in v && 9 | v.type === 'Buffer' && 10 | 'data' in v && 11 | Array.isArray(v.data)) { 12 | return Buffer.from(v.data); 13 | } 14 | return v; 15 | }); 16 | class CloudDBAdapter { 17 | constructor(url, { 18 | serialize = stringify, 19 | deserialize = parse, 20 | fetchOptions = {}, 21 | } = {}) { 22 | this.url = url; 23 | this.serialize = serialize; 24 | this.deserialize = deserialize; 25 | this.fetchOptions = fetchOptions; 26 | } 27 | 28 | async read() { 29 | try { 30 | const res = await got(this.url, { 31 | method: 'GET', 32 | headers: { 33 | 'Accept': 'application/json;q=0.9,text/plain', 34 | }, 35 | ...this.fetchOptions, 36 | }); 37 | if (res.statusCode !== 200) throw res.statusMessage; 38 | return this.deserialize(res.body); 39 | } catch (e) { 40 | return null; 41 | } 42 | } 43 | 44 | async write(obj) { 45 | const res = await got(this.url, { 46 | method: 'POST', 47 | headers: { 48 | 'Content-Type': 'application/json', 49 | }, 50 | ...this.fetchOptions, 51 | body: this.serialize(obj), 52 | }); 53 | if (res.statusCode !== 200) throw res.statusMessage; 54 | return res.body; 55 | } 56 | } 57 | 58 | export default CloudDBAdapter; 59 | -------------------------------------------------------------------------------- /plugins/info-dashboard.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn }) => { 2 | let stats = Object.entries(db.data.stats).map(([key, val]) => { 3 | let name = Array.isArray(plugins[key]?.help) ? plugins[key]?.help?.join(' & ') : plugins[key]?.help || key 4 | if (/exec/.test(name)) return 5 | return { name, ...val } 6 | }) 7 | stats = stats.sort((a, b) => b.total - a.total) 8 | let txt = stats.slice(0, 10).map(({ name, total, last }, idx) => { 9 | if (name.includes('-') && name.endsWith('.js')) name = name.split('-')[1].replace('.js', '') 10 | return `[ ${idx + 1} ] *COMANDO:*\n⮕ *${name}*\n*• USOS:*\n⮕ *${total}x*\n` 11 | }).join`\n\n` 12 | m.reply(`*「DASHBOARD」*\n\n*Total :* ${conn.user.name}\n\n${txt}`) 13 | } 14 | handler.help = ['dashboard'] 15 | handler.tags = ['main'] 16 | handler.command = /^dashboard$/i 17 | handler.register = true 18 | 19 | export default handler 20 | 21 | export function parseMs(ms) { 22 | if (typeof ms !== 'number') throw 'El parámetro debe rellenarse con un número' 23 | return { 24 | days: Math.trunc(ms / 86400000), 25 | hours: Math.trunc(ms / 3600000) % 24, 26 | minutes: Math.trunc(ms / 60000) % 60, 27 | seconds: Math.trunc(ms / 1000) % 60, 28 | milliseconds: Math.trunc(ms) % 1000, 29 | microseconds: Math.trunc(ms * 1000) % 1000, 30 | nanoseconds: Math.trunc(ms * 1e6) % 1000 31 | }} 32 | 33 | export function getTime(ms) { 34 | let now = parseMs(+new Date() - ms) 35 | if (now.days) return `Hace ${now.days} días` 36 | else if (now.hours) return `Hace ${now.hours} horas` 37 | else if (now.minutes) return `Hace ${now.minutes} minutos` 38 | else return `hace unos segundos` 39 | } 40 | -------------------------------------------------------------------------------- /plugins/_antiArabe.js: -------------------------------------------------------------------------------- 1 | let handler = m => m; 2 | 3 | handler.before = async function (m, { conn }) { 4 | const prefijosProhibidos = ['91', '92', '222', '93', '265', '61', '62', '966', '229', '40', '49', '20', '963', '967', '234', '210', '212']; 5 | const bot = global.db.data.settings[conn.user.jid] || {}; 6 | const senderNumber = m.sender.split('@')[0]; 7 | const user = global.db.data.users[m.sender] 8 | const text = (m.text || '').toLowerCase(); 9 | 10 | if (["120363371008200788@newsletter", "120363371008200788@newsletter"].includes(m.chat)) return; 11 | if (m.fromMe) return; 12 | if (!bot.anticommand) return; 13 | 14 | const allowedCommands = ['piedra', 'papel', 'tijera', 'menu', 'estado', 'bots', 'serbot', 'jadibot', 'code']; 15 | if (allowedCommands.some(cmd => text.includes(cmd))) { 16 | if (user.banned && m.text.includes('PIEDRA') || m.text.includes('PAPEL') || m.text.includes('TIJERA') || m.text.includes('code') || m.text.includes('estado') || m.text.includes('bots') || m.text.includes('serbot') || m.text.includes('jadibot')) { 17 | user.banned = false; 18 | } 19 | return !0; 20 | } 21 | 22 | if (user.banned) return !1; 23 | const esProhibido = prefijosProhibidos.some(prefijo => senderNumber.startsWith(prefijo)); 24 | if (esProhibido) { 25 | user.banned = true; 26 | console.log(`⚠️ Usuarios baneado ${m.sender}`) 27 | await conn.reply(m.chat, `⚠️ @${m.sender.split`@`[0]} ha sido baneado.\nPor orden de mi owner no puedes usar el bot.\n\nPARA USAR EL BOT HAZTE UN SUB BOT CON:\n/jadibot\n\n⚠️ \`\`\`Serás Baneados\`\`\` ⚠️`, m, { mentions: [m.sender] }); 28 | return !1; 29 | } 30 | return !0; 31 | }; 32 | 33 | export default handler; -------------------------------------------------------------------------------- /plugins/herramientas-autoresponder_prompt.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, text, usedPrefix, command, isOwner, isAdmin, isROwner }) => { 2 | if (!(isOwner || isAdmin || isROwner)) { 3 | conn.reply(m.chat, "❌ *No tienes permitido personalizar la autorespuesta del bot en este chat.*\n\n💡 *Pídele a un administrador en caso que este chat sea un grupo o al creador del bot que lo haga por ti en este chat.*", m) 4 | } 5 | const chatData = global.db.data.chats[m.chat] 6 | if (text) { 7 | if (chatData.sAutorespond) return conn.reply(m.chat, `⚠️ *Actualmente hay el siguiente prompt en uso:*\n\n${chatData.sAutorespond}\n\n💡 *Si quieres cambiarlo, usa el comando sin texto para borrar el prompt actual y luego establece el nuevo prompt.*`, m) 8 | 9 | chatData.sAutorespond = text 10 | conn.reply(m.chat, `✅ *Configuración exitosa.*\n\n*Has establecido un nuevo prompt para este chat.*\n💬 A partir de ahora, activa usando *${usedPrefix}on autoresponder*, el bot usará las indicaciones que hayas establecido.\n\n> *Recuerda etiquetar o responder a un mensaje del bot para que te responda.*`, m) 11 | } else { 12 | if (chatData.sAutorespond) { 13 | chatData.sAutorespond = '' 14 | conn.reply(m.chat, "🗑️ *Prompt borrado con éxito.*", m) 15 | } else { 16 | conn.reply(m.chat, `⚠️ *No hay ningún prompt establecido para este chat.*\n\n💡 *Para establecer un nuevo prompt, utiliza el comando seguido del texto que describa las instrucciones para el bot.*\n\n*Por ejemplo:*\n*${usedPrefix + command}* Actúa como un psicólogo y brinda apoyo emocional a los usuarios.`, m) 17 | }} 18 | } 19 | 20 | handler.help = ['autorespond ']; 21 | handler.tags = ['tools']; 22 | handler.command = /^(autorespond|autoresponder)$/i 23 | export default handler -------------------------------------------------------------------------------- /plugins/jadibot-deleteSesion.js: -------------------------------------------------------------------------------- 1 | /*⚠ PROHIBIDO EDITAR ⚠ -- ⚠ PROHIBIDO EDITAR ⚠ -- ⚠ PROHIBIDO EDITAR ⚠ 2 | El codigo de este archivo fue realizado por: 3 | - ReyEndymion >> https://github.com/ReyEndymion 4 | */ 5 | 6 | import { readdirSync, statSync, unlinkSync, existsSync, readFileSync, watch, rmSync, promises as fs} from "fs" 7 | import path, { join } from 'path' 8 | 9 | let handler = async (m, { conn, usedPrefix, command}, args) => { 10 | let parentw = conn 11 | let who = m.mentionedJid && m.mentionedJid[0] ? m.mentionedJid[0] : m.fromMe ? conn.user.jid : m.sender 12 | let uniqid = `${who.split`@`[0]}` 13 | let userS = `${conn.getName(who)}` 14 | 15 | if (global.conn.user.jid !== conn.user.jid) { 16 | return conn.sendMessage(m.chat, {text: `*⚠️ USE ESTE COMANDO AL BOT PRINCIPAL*\n\nwa.me/${global.conn.user.jid.split`@`[0]}&text=${usedPrefix + command}`}, { quoted: m }) 17 | } else { 18 | try { 19 | await fs.rmdir("./jadibts/" + uniqid, { recursive: true, force: true }) 20 | await conn.sendMessage(m.chat, { text: `*TE VOY A EXTRAÑAR ${wm} CHAOO!! 🥹*` }, { quoted: m }) 21 | await conn.sendMessage(m.chat, { text : `*⚠️ HA CERRADO SESIÓN Y BORRADO TODO RASTRO*` } , { quoted: m }) 22 | } catch(err) { 23 | if (err.code === 'ENOENT' && err.path === `./jadibts/${uniqid}`) { 24 | await conn.sendMessage(m.chat, { text: "⚠️ Usted no es un Sub-Bot" }, { quoted: m }) 25 | } else { 26 | console.error(userS + ' ' + `⚠️ HA CERRADO SESIÓN COMO SUB BOT`, err) 27 | }}} 28 | } 29 | handler.help = ['deletesession', 'eliminarsesion']; 30 | handler.tags = ['jadibot']; 31 | handler.command = /^(deletesess?ion|eliminarsesion|borrarsesion|delsess?ion|cerrarsesion)$/i 32 | handler.private = true 33 | handler.fail = null 34 | 35 | export default handler 36 | -------------------------------------------------------------------------------- /plugins/buscador-wikipedia.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import fetch from 'node-fetch'; 3 | import cheerio from 'cheerio'; 4 | async function wikipedia(querry) { 5 | try { 6 | const link = await axios.get(`https://es.wikipedia.org/wiki/${querry}`); 7 | const $ = cheerio.load(link.data); 8 | const judul = $('#firstHeading').text().trim(); 9 | const thumb = $('#mw-content-text').find('div.mw-parser-output > div:nth-child(1) > table > tbody > tr:nth-child(2) > td > a > img').attr('src') || `//i.ibb.co/nzqPBpC/http-error-404-not-found.png`; 10 | const isi = []; 11 | $('#mw-content-text > div.mw-parser-output').each(function(rayy, Ra) { 12 | const penjelasan = $(Ra).find('p').text().trim(); 13 | isi.push(penjelasan)}); 14 | for (const i of isi) { 15 | const data = {status: link.status, 16 | result: {judul: judul, 17 | thumb: 'https:' + thumb, 18 | isi: i}}; 19 | return data; 20 | }} catch (err) { 21 | const notFond = {status: link.status, 22 | Pesan: eror}; 23 | return notFond; 24 | }} 25 | const handler = async (m, {conn, text, usedPrefix, command}) => { 26 | if (!text) throw `*⚠️ ᴇsᴛᴀs ᴜsᴀɴᴅᴏ ᴍᴀʟ ᴇʟ ᴄᴏᴍᴀɴᴅᴏ!!*\n*ᴜsᴏ ᴄᴏʀʀᴇᴄᴛᴏ:*\n*${usedPrefix + command} 𝙿𝚊𝚕𝚊𝚋𝚛𝚊 𝚌𝚕𝚊𝚟𝚎 𝚊 𝚋𝚞𝚜𝚌𝚊𝚛*\n\n*• ᴇᴊᴇᴍᴘʟᴏ:*\n*${usedPrefix + command} Estrellas*`; 27 | wikipedia(`${text}`).then((res) => { 28 | m.reply(`*ᴀǫᴜɪ ᴛɪᴇɴᴇs ʟᴀ ɪɴғᴏʀᴍᴀᴄɪᴏ́ɴ ᴇɴᴄᴏɴᴛʀᴀᴅᴀ:*\n\n` + res.result.isi)}).catch(() => { 29 | m.reply('*⚠️ ɴᴏ sᴇ ᴇɴᴄᴏɴᴛʀᴏ ɴɪɴɢᴜɴᴀ ɪɴғᴏʀᴍᴀᴄɪᴏ́ɴ, ᴘʀᴜᴇʙᴀ ǫᴜᴇ ʜᴀʏᴀs ᴇsᴄʀɪᴛᴏ ᴜɴᴀ sᴏʟᴀ ᴘᴀʟᴀʙʀᴀ ʏ ʟᴏ ʜᴀʏᴀs ᴇsᴄʀɪᴛᴏ ᴄᴏʀʀᴇᴄᴛᴀᴍᴇɴᴛᴇ*'); 30 | }); 31 | }; 32 | handler.help = ['wikipedia'].map((v) => v + ' '); 33 | handler.tags = ['buscadores']; 34 | handler.command = /^(wiki|wikipedia)$/i; 35 | handler.register = true 36 | handler.limit = 1 37 | export default handler; 38 | -------------------------------------------------------------------------------- /plugins/game-rt.js: -------------------------------------------------------------------------------- 1 | function getRandomColor() { 2 | const random = Math.random() * 100; 3 | if (random < 47.5) return 'red'; 4 | if (random < 95) return 'black'; 5 | return 'green'; 6 | } 7 | 8 | function formatExp(amount) { 9 | if (amount >= 1000) return `${(amount / 1000).toFixed(1)}k (${amount.toLocaleString()})`; 10 | return amount.toLocaleString(); 11 | } 12 | 13 | async function handler(m, { conn, args, command, usedPrefix }) { 14 | let user = global.db.data.users[m.sender]; 15 | 16 | if (args.length < 2) return conn.reply(m.chat, `⚠️ Formato incorrecto. Usa: ${usedPrefix + command} \n\nEjemplo: ${usedPrefix + command} black 100`, m); 17 | 18 | const color = args[0].toLowerCase(); 19 | const betAmount = parseInt(args[1]); 20 | 21 | if (!['red', 'black', 'green'].includes(color)) return conn.reply(m.chat, 'Color no válido. Usa "red", "black" o "green".', m); 22 | if (isNaN(betAmount) || betAmount <= 0) return conn.reply(m.chat, 'Cantidad no válida. Debe ser un número positivo.', m); 23 | if (!user || user.exp < betAmount) return conn.reply(m.chat, 'No tienes suficiente exp para apostar.', m); 24 | const resultColor = getRandomColor(); 25 | const isWin = resultColor === color; 26 | 27 | let winAmount = 0; 28 | if (isWin) { 29 | if (color === 'green') { 30 | winAmount = betAmount * 14; 31 | } else { 32 | winAmount = betAmount; 33 | }} 34 | user.exp = (user.exp || 0) - betAmount + winAmount; 35 | conn.reply(m.chat, `😱 La ruleta cayó en *${resultColor}* y ${isWin ? 'ganaste' : 'perdiste'} *${formatExp(isWin ? winAmount : betAmount)}* exp.`, m); 36 | } 37 | handler.help = ['rt ']; 38 | handler.tags = ['game']; 39 | handler.command = ['rt']; 40 | handler.register = true; 41 | 42 | export default handler; -------------------------------------------------------------------------------- /plugins/owner-update.js: -------------------------------------------------------------------------------- 1 | import { execSync } from 'child_process'; 2 | 3 | const handler = async (m, { conn, text }) => { 4 | try { 5 | const stdout = execSync('git pull' + (m.fromMe && text ? ' ' + text : '')); 6 | let messager = stdout.toString() 7 | if (messager.includes('Already up to date.')) messager = `⚠️ 𝙔𝘼 𝙀𝙎𝙏𝘼 𝘼𝘾𝙏𝙐𝘼𝙇𝙄𝙕𝘼𝘿𝙊 𝘼 𝙇𝘼 𝙑𝙀𝙍𝙎𝙄𝙊́𝙉 𝙍𝙀𝘾𝙄𝙀𝙉𝙏𝙀.` 8 | if (messager.includes('Updating')) messager = `*[ UPDATE ]*\n\n` + stdout.toString() 9 | conn.reply(m.chat, messager, m); 10 | } catch { 11 | try { 12 | const status = execSync('git status --porcelain'); 13 | if (status.length > 0) { 14 | const conflictedFiles = status 15 | .toString() 16 | .split('\n') 17 | .filter(line => line.trim() !== '') 18 | .map(line => { 19 | if (line.includes('.npm/') || line.includes('.cache/') || line.includes('tmp/') || line.includes('BotSession/') || line.includes('npm-debug.log')) { 20 | return null; 21 | } 22 | return '*→ ' + line.slice(3) + '*'}) 23 | .filter(Boolean); 24 | if (conflictedFiles.length > 0) { 25 | const errorMessage = `⚠️ Error\n> *Se han encontrado cambios locales en los archivos del bot que entran en conficto con las nuevas actualizaciones del repositorio. para actualizar, reinstalar el bot o realizar las actualizaciones manualmente.*\n\n*\`ARCHIVO EN CONFLICTO :\`*\n\n${conflictedFiles.join('\n')}.*` 26 | await conn.reply(m.chat, errorMessage, m); 27 | }} 28 | } catch (error) { 29 | console.error(error); 30 | if (error.message) { 31 | const errorMessage2 = `\n${fg}` + error.message; 32 | } 33 | await m.reply(`${fg}`) 34 | }}}; 35 | handler.help = ['update'] 36 | handler.tags = ['owner'] 37 | handler.command = /^(update|actualizar|gitpull)$/i; 38 | handler.rowner = true; 39 | export default handler; 40 | -------------------------------------------------------------------------------- /lib/uploadImage.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch' 2 | import { FormData, Blob } from 'formdata-node' 3 | import { fileTypeFromBuffer } from 'file-type' 4 | 5 | /** 6 | * Upload file to qu.ax 7 | * Supported mimetypes: 8 | * - `image/jpeg` 9 | * - `image/jpg` 10 | * - `image/png` 11 | * - `video/mp4` 12 | * - `video/webm` 13 | * - `audio/mpeg` 14 | * - `audio/wav` 15 | * @param {Buffer} buffer File Buffer 16 | * @return {Promise} 17 | */ 18 | export default async (buffer) => { 19 | const { ext, mime } = await fileTypeFromBuffer(buffer) 20 | const form = new FormData() 21 | const blob = new Blob([buffer.toArrayBuffer()], { type: mime }) 22 | form.append('files[]', blob, 'tmp.' + ext) 23 | const res = await fetch('https://qu.ax/upload.php', { method: 'POST', body: form }) 24 | const result = await res.json() 25 | if (result && result.success) { 26 | return result.files[0].url 27 | } else { 28 | throw new Error('Failed to upload the file to qu.ax') 29 | }} 30 | 31 | /** 32 | * Upload file to qu.ax 33 | * Supported mimetypes: 34 | * - `image/jpeg` 35 | * - `image/jpg` 36 | * - `image/png` 37 | * - `video/mp4` 38 | * - `video/webm` 39 | * - `audio/mpeg` 40 | * - `audio/wav` 41 | * @param {Buffer} buffer File Buffer 42 | * @return {Promise} 43 | */ 44 | 45 | /*export default async (buffer) => { 46 | const {ext, mime} = await fileTypeFromBuffer(buffer) 47 | const form = new FormData() 48 | const blob = new Blob([buffer.toArrayBuffer()], {type: mime}) 49 | form.append('file', blob, 'tmp.' + ext) 50 | const res = await fetch('https://telegra.ph/upload', { 51 | method: 'POST', 52 | body: form, 53 | }) 54 | const img = await res.json() 55 | if (img.error) throw img.error 56 | return 'https://telegra.ph' + img[0].src 57 | }*/ 58 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | import { createServer } from 'http' 3 | import path from 'path' 4 | import { Socket } from 'socket.io' 5 | import { toBuffer } from 'qrcode' 6 | import fetch from 'node-fetch' 7 | 8 | function connect(conn, PORT) { 9 | let app = global.app = express() 10 | console.log(app) 11 | let server = global.server = createServer(app) 12 | // app.use(express.static(path.join(__dirname, 'views'))) 13 | let _qr = 'invalid' 14 | 15 | conn.ev.on('connection.update', function appQR({ qr }) { 16 | if (qr) _qr = qr 17 | }) 18 | 19 | app.use(async (req, res) => { 20 | res.setHeader('content-type', 'image/png') 21 | res.end(await toBuffer(_qr)) 22 | }) 23 | 24 | // let io = new Socket(server) 25 | // io.on('connection', socket => { 26 | // let { unpipeEmit } = pipeEmit(conn, socket, 'conn-') 27 | // socket.on('disconnect', unpipeEmit) 28 | // }) 29 | 30 | server.listen(PORT, () => { 31 | console.log('App listened on port', PORT) 32 | if (opts['keepalive']) keepAlive() 33 | }) 34 | } 35 | 36 | function pipeEmit(event, event2, prefix = '') { 37 | let old = event.emit 38 | event.emit = function (event, ...args) { 39 | old.emit(event, ...args) 40 | event2.emit(prefix + event, ...args) 41 | } 42 | return { 43 | unpipeEmit() { 44 | event.emit = old 45 | } 46 | } 47 | } 48 | 49 | function keepAlive() { 50 | const url = `https://${process.env.REPL_SLUG}.${process.env.REPL_OWNER}.repl.co` 51 | if (/(\/\/|\.)undefined\./.test(url)) return 52 | setInterval(() => { 53 | fetch(url).catch(console.error) 54 | }, 5 * 1000 * 60) 55 | } 56 | 57 | 58 | export default connect -------------------------------------------------------------------------------- /lib/database.js: -------------------------------------------------------------------------------- 1 | import {resolve, dirname as _dirname} from 'path'; 2 | import _fs, {existsSync, readFileSync} from 'fs'; 3 | const {promises: fs} = _fs; 4 | 5 | class Database { 6 | /** 7 | * Create new Database 8 | * @param {String} filepath Path to specified json database 9 | * @param {...any} args JSON.stringify arguments 10 | */ 11 | constructor(filepath, ...args) { 12 | this.file = resolve(filepath); 13 | this.logger = console; 14 | 15 | this._load(); 16 | 17 | this._jsonargs = args; 18 | this._state = false; 19 | this._queue = []; 20 | this._interval = setInterval(async () => { 21 | if (!this._state && this._queue && this._queue[0]) { 22 | this._state = true; 23 | await this[this._queue.shift()]().catch(this.logger.error); 24 | this._state = false; 25 | } 26 | }, 1000); 27 | } 28 | 29 | get data() { 30 | return this._data; 31 | } 32 | 33 | set data(value) { 34 | this._data = value; 35 | this.save(); 36 | } 37 | 38 | /** 39 | * Queue Load 40 | */ 41 | load() { 42 | this._queue.push('_load'); 43 | } 44 | 45 | /** 46 | * Queue Save 47 | */ 48 | save() { 49 | this._queue.push('_save'); 50 | } 51 | 52 | _load() { 53 | try { 54 | return this._data = existsSync(this.file) ? JSON.parse(readFileSync(this.file)) : {}; 55 | } catch (e) { 56 | this.logger.error(e); 57 | return this._data = {}; 58 | } 59 | } 60 | 61 | async _save() { 62 | const dirname = _dirname(this.file); 63 | if (!existsSync(dirname)) await fs.mkdir(dirname, {recursive: true}); 64 | await fs.writeFile(this.file, JSON.stringify(this._data, ...this._jsonargs)); 65 | return this.file; 66 | } 67 | } 68 | 69 | export default Database; 70 | 71 | -------------------------------------------------------------------------------- /plugins/herramientas-whatmusic.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import acrcloud from 'acrcloud'; 3 | const acr = new acrcloud({host: 'identify-eu-west-1.acrcloud.com', 4 | access_key: 'c33c767d683f78bd17d4bd4991955d81', 5 | access_secret: 'bvgaIAEtADBTbLwiPGYlxupWqkNGIjT7J9Ag2vIu', 6 | }); 7 | 8 | const handler = async (m) => { 9 | const q = m.quoted ? m.quoted : m; 10 | const mime = (q.msg || q).mimetype || ''; 11 | if (/audio|video/.test(mime)) { 12 | if ((q.msg || q).seconds > 20) return m.reply('⚠️ ᴇʟ ᴀʀᴄʜɪᴠᴏ ǫᴜᴇ ᴄᴀʀɢᴀ ᴇs ᴅᴇᴍᴀsɪᴀᴅᴏ ɢʀᴀɴᴅᴇ, ʟᴇ sᴜɢᴇʀɪᴍᴏs ǫᴜᴇ ᴄᴏʀᴛᴇ ᴇʟ ᴀʀᴄʜɪᴠᴏ ɢʀᴀɴᴅᴇ ᴀ ᴜɴ ᴀʀᴄʜɪᴠᴏ ᴍᴀ́s ᴘᴇǫᴜᴇɴ̃ᴏ, 10-20 sᴇɢᴜɴᴅᴏs ʟᴏs ᴅᴀᴛᴏs ᴅᴇ ᴀᴜᴅɪᴏ sᴏɴ sᴜғɪᴄɪᴇɴᴛᴇs ᴘᴀʀᴀ ɪᴅᴇɴᴛɪғɪᴄᴀʀ'); 13 | const media = await q.download(); 14 | const ext = mime.split('/')[1]; 15 | fs.writeFileSync(`./tmp/${m.sender}.${ext}`, media); 16 | const res = await acr.identify(fs.readFileSync(`./tmp/${m.sender}.${ext}`)); 17 | const {code, msg} = res.status; 18 | if (code !== 0) throw msg; 19 | const {title, artists, album, genres, release_date} = res.metadata.music[0]; 20 | const txt = ` 21 | 𝐑𝐄𝐒𝐄𝐋𝐓𝐀𝐃𝐎𝐒 𝐃𝐄 𝐋𝐀 𝐁𝐔𝐒𝐐𝐔𝐄𝐃𝐀 22 | 23 | • 📌 𝐓𝐢𝐭𝐮𝐥𝐨: ${title} 24 | • 👨‍🎤 𝐀𝐫𝐭𝐢𝐬𝐭𝐚: ${artists !== undefined ? artists.map((v) => v.name).join(', ') : 'No encontrado'} 25 | • 💾 𝐀𝐥𝐛𝐮𝐦: ${album.name || 'No encontrado'} 26 | • 🌐 𝐆𝐞𝐧𝐞𝐫𝐨: ${genres !== undefined ? genres.map((v) => v.name).join(', ') : 'No encontrado'} 27 | • 📆 𝐅𝐞𝐜𝐡𝐚 𝐝𝐞 𝐥𝐚𝐧𝐳𝐚𝐦𝐢𝐞𝐧𝐭𝐨: ${release_date || 'No encontrado'} 28 | `.trim(); 29 | fs.unlinkSync(`./tmp/${m.sender}.${ext}`); 30 | m.reply(txt); 31 | } else throw '*⚠️ 𝐑𝐞𝐬𝐩𝐨𝐧𝐝𝐞 𝐚 𝐮𝐧 𝐚𝐮𝐝𝐢𝐨*'; 32 | }; 33 | handler.help = ['quemusica'] 34 | handler.tags = ['tools'] 35 | handler.command = /^quemusica|quemusicaes|whatmusic$/i; 36 | handler.register = true 37 | export default handler; 38 | -------------------------------------------------------------------------------- /plugins/grupo-delete.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, args, usedPrefix, command }) => { 2 | 3 | if (!m.quoted && !m.mentionedJid?.length && !args[0]) return m.reply(`⚠️ Responde al mensaje que quiere eliminar pelotudito.`) 4 | try { 5 | if (m.quoted) { 6 | let delet = m.quoted.sender; 7 | let bang = m.quoted.id; 8 | return conn.sendMessage(m.chat, { delete: { remoteJid: m.chat, fromMe: false, id: bang, participant: delet } }); 9 | } 10 | 11 | let target = ''; 12 | if (m.mentionedJid?.length) { 13 | target = m.mentionedJid[0]; 14 | } else if (args[0] && args[0].startsWith('+')) { 15 | target = args[0].replace(/[^0-9]/g, '') + '@s.whatsapp.net'; 16 | } else { 17 | return m.reply(`⚠️ Mencionar a alguien o responder a un mensaje.`); 18 | } 19 | 20 | let chats = await conn.chats[m.chat]?.messages || []; 21 | let messagesToDelete = Object.values(chats).filter( 22 | msg => (msg.key.participant === target || msg.key.remoteJid === target)); 23 | 24 | if (!messagesToDelete.length) return 25 | let totalToDelete = Math.min(messagesToDelete.length, 200); // Máximo 200 mensajes 26 | let deletedCount = 0; 27 | 28 | for (let i = 0; i < totalToDelete; i++) { 29 | let message = messagesToDelete[i]; 30 | try { 31 | await conn.sendMessage(m.chat, { delete: message.key }); 32 | deletedCount++; 33 | await delay(100); 34 | } catch (err) { 35 | console.log(err); 36 | }} 37 | m.reply(`✅ Se eliminaron ${deletedCount} mensajes de ${target.includes('@s.whatsapp.net')}.`); 38 | } catch (err) { 39 | console.error(err); 40 | }}; 41 | handler.help = ['delete *@user*']; 42 | handler.tags = ['group']; 43 | handler.command = /^del(ete)?$/i; 44 | handler.group = true; 45 | handler.admin = true; 46 | handler.botAdmin = true; 47 | handler.register = true; 48 | 49 | export default handler; 50 | 51 | const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); -------------------------------------------------------------------------------- /lib/tiktok.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import cheerio from 'cheerio'; 3 | 4 | const clean = (data) => { 5 | let regex = /(<([^>]+)>)/gi; 6 | data = data.replace(/()/gi, " \n"); 7 | return data.replace(regex, ""); 8 | }; 9 | 10 | async function shortener(url) { 11 | return url; 12 | } 13 | 14 | export const Tiktok = async (query) => { 15 | let response = await axios("https://lovetik.com/api/ajax/search", { 16 | method: "POST", 17 | data: new URLSearchParams(Object.entries({ query })), 18 | }); 19 | 20 | const result = {}; 21 | 22 | result.creator = "YNTKTS"; 23 | result.title = clean(response.data.desc); 24 | result.author = clean(response.data.author); 25 | result.nowm = await shortener( 26 | (response.data.links[0].a || "").replace("https", "http") 27 | ); 28 | result.watermark = await shortener( 29 | (response.data.links[1].a || "").replace("https", "http") 30 | ); 31 | result.audio = await shortener( 32 | (response.data.links[2].a || "").replace("https", "http") 33 | ); 34 | result.thumbnail = await shortener(response.data.cover); 35 | return result; 36 | } 37 | 38 | async function ttimg(link) { 39 | try { 40 | let url = `https://dlpanda.com/es?url=${link}&token=G7eRpMaa`; 41 | let response = await axios.get(url); 42 | const html = response.data; 43 | const $ = cheerio.load(html); 44 | let imgSrc = []; 45 | $('div.col-md-12 > img').each((index, element) => { 46 | imgSrc.push($(element).attr('src')); 47 | }); 48 | if (imgSrc.length === 0) { 49 | return { data: '*[❗] No se encontraron imágenes en el enlace proporcionado.*' }; 50 | } 51 | return { data: imgSrc }; 52 | } catch (error) { 53 | console.log(error); 54 | return { data: '*[❗] No se obtuvo respuesta de la página, intente más tarde.*' }; 55 | } 56 | } 57 | 58 | export { ttimg }; -------------------------------------------------------------------------------- /plugins/rpg-add.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, command, text }) => { 2 | 3 | if (command == 'añadirdiamantes' || command == 'dardiamantes' || command == 'addlimit') { 4 | const pajak = 0; 5 | let who; 6 | if (m.isGroup) who = m.mentionedJid[0]; 7 | else who = m.chat; 8 | if (!who) return m.reply(`⚠️ etiqueta a una persona con el @tag`) 9 | const txt = text.replace('@' + who.split`@`[0], '').trim(); 10 | if (!txt) return m.reply(`⚠️ Ingresa la cantidad que desea agregar`) 11 | if (isNaN(txt)) return m.reply(`⚠️ Falta el Num`) 12 | const dmt = parseInt(txt); 13 | let limit = dmt; 14 | const pjk = Math.ceil(dmt * pajak); 15 | limit += pjk; 16 | if (limit < 1) return m.reply(`⚠️ No tiene `) 17 | const users = global.db.data.users; 18 | users[who].limit += dmt; 19 | m.reply(`*≡ 💎 SE AGREGADO:* 20 | ┏╍╍╍╍╍╍╍╍╍╍╍╍╍ 21 | ┃• *𝗍᥆𝗍ᥲᥣ:* ${dmt} 22 | ┗╍╍╍╍╍╍╍╍╍╍╍╍╍`)} 23 | 24 | if (command == 'añadirxp' || command == 'addexp' || command == 'addxp') { 25 | const pajak = 0; 26 | let who; 27 | if (m.isGroup) who = m.mentionedJid[0]; 28 | else who = m.chat; 29 | if (!who) return m.reply(`⚠️ etiqueta a una persona con el @tag`) 30 | const txt = text.replace('@' + who.split`@`[0], '').trim(); 31 | if (!txt) return m.reply(`⚠️ Ingresa la cantidad que desea agregar`) 32 | if (isNaN(txt)) return m.reply(`⚠️ Falta el Num`) 33 | const xp = parseInt(txt); 34 | let exp = xp; 35 | const pjk = Math.ceil(xp * pajak); 36 | exp += pjk; 37 | if (exp < 1) return m.reply(`⚠️ Se `) 38 | const users = global.db.data.users; 39 | users[who].exp += xp; 40 | m.reply(`*≡ EXP AGREGADO:* 41 | ┏╍╍╍╍╍╍╍╍╍╍╍╍╍ 42 | ┃• *𝗍᥆𝗍ᥲᥣ:* ${xp} 43 | ┗╍╍╍╍╍╍╍╍╍╍╍╍╍`) 44 | }} 45 | handler.help = ['addexp', 'addlimit'] 46 | handler.tags = ['owner'] 47 | handler.command = /^(añadirdiamantes|dardiamantes|addlimit|añadirxp|addexp|addxp)$/i 48 | handler.rowner = true 49 | handler.register = true 50 | export default handler 51 | 52 | -------------------------------------------------------------------------------- /plugins/rpg-mine.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn }) => { 2 | 3 | let hasil = Math.floor(Math.random() * 6000) 4 | let time = global.db.data.users[m.sender].lastmiming + 400000 5 | if (new Date - global.db.data.users[m.sender].lastmiming < 400000) throw `⏳ 𝐄𝐬𝐩𝐞𝐫𝐚 *${msToTime(time - new Date())}* 𝐏𝐚𝐫𝐚 𝐯𝐨𝐥𝐯𝐞𝐫 𝐚 𝐦𝐢𝐧𝐚𝐫` 6 | let minar = `${pickRandom(['Que pro 😎 has minado', 7 | '🌟✨ Genial!! Obtienes', 8 | 'WOW!! eres un(a) gran Minero(a) ⛏️ Obtienes', 9 | 'Has Minado!!', 10 | '😲 Lograste Minar la cantidad de', 11 | 'Tus Ingresos subiran gracias a que minaste', 12 | '⛏️⛏️⛏️⛏️⛏️ Minando', 13 | '🤩 SII!!! AHORA TIENES', 14 | 'La minaria esta de tu lado, por ello obtienes', 15 | '😻 La suerte de Minar', 16 | '♻️ Tu Mision se ha cumplido, lograste minar', 17 | '⛏️ La Mineria te ha beneficiado con', 18 | '🛣️ Has encontrado un Lugar y por minar dicho lugar Obtienes', 19 | '👾 Gracias a que has minado tus ingresos suman', 20 | 'Felicidades!! Ahora tienes','⛏️⛏️⛏️ Obtienes'])}` 21 | 22 | global.db.data.users[m.sender].exp += hasil 23 | m.reply(`${minar} *${hasil} XP*`) 24 | global.db.data.users[m.sender].lastmiming = new Date * 1 25 | } 26 | handler.help = ['minar'] 27 | handler.tags = ['econ'] 28 | handler.command = ['minar', 'miming', 'mine'] 29 | handler.register = true 30 | export default handler 31 | 32 | function pickRandom(list) { 33 | return list[Math.floor(Math.random() * list.length)]} 34 | 35 | function msToTime(duration) { 36 | var milliseconds = parseInt((duration % 1000) / 100), 37 | seconds = Math.floor((duration / 1000) % 60), 38 | minutes = Math.floor((duration / (1000 * 60)) % 60), 39 | //hours = Math.floor((duration / (1000 * 60 * 60)) % 24) 40 | 41 | //hours = (hours < 10) ? "0" + hours : hours 42 | minutes = (minutes < 10) ? "0" + minutes : minutes 43 | seconds = (seconds < 10) ? "0" + seconds : seconds 44 | return minutes + " minuto(s) " + seconds + " segundo(s)" 45 | } 46 | -------------------------------------------------------------------------------- /lib/gdrive.js: -------------------------------------------------------------------------------- 1 | import {join} from 'path'; 2 | import {promises as fs} from 'fs'; 3 | import {promisify} from 'util'; 4 | import {google} from 'googleapis'; 5 | 6 | 7 | // If modifying these scopes, delete token.json. 8 | const SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly']; 9 | // The file token.json stores the user's access and refresh tokens, and is 10 | // created automatically when the authorization flow completes for the first 11 | // time. 12 | const TOKEN_PATH = join(__dirname, '..', 'token.json'); 13 | 14 | class GoogleAuth extends EventEmitter { 15 | constructor() { 16 | super(); 17 | } 18 | 19 | async authorize(credentials) { 20 | let token; 21 | const {client_secret, client_id} = credentials; 22 | const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, `http://localhost:${port}`); 23 | try { 24 | token = JSON.parse(await fs.readFile(TOKEN_PATH)); 25 | } catch (e) { 26 | const authUrl = oAuth2Client.generateAuthUrl({ 27 | access_type: 'offline', 28 | scope: SCOPES, 29 | }); 30 | this.emit('auth', authUrl); 31 | const code = await promisify(this.once).bind(this)('token'); 32 | token = await oAuth2Client.getToken(code); 33 | await fs.writeFile(TOKEN_PATH, JSON.stringify(token)); 34 | } finally { 35 | await oAuth2Client.setCredentials(token); 36 | } 37 | } 38 | 39 | token(code) { 40 | this.emit('token', code); 41 | } 42 | } 43 | 44 | class GoogleDrive extends GoogleAuth { 45 | constructor() { 46 | super(); 47 | this.path = '/drive/api'; 48 | } 49 | 50 | async getFolderID(path) { 51 | 52 | } 53 | 54 | async infoFile(path) { 55 | 56 | } 57 | 58 | async folderList(path) { 59 | 60 | } 61 | 62 | async downloadFile(path) { 63 | 64 | } 65 | 66 | async uploadFile(path) { 67 | 68 | } 69 | } 70 | 71 | export { 72 | GoogleAuth, 73 | GoogleDrive, 74 | }; 75 | -------------------------------------------------------------------------------- /plugins/herramientas-nowa.js: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------------------- 2 | 🍀 • By https://github.com/ALBERTO9883 3 | 🍀 • ⚘Alberto Y Ashly⚘ 4 | -----------------------------------------------------------------------------------------*/ 5 | let handler = async (m, { conn, text, usedPrefix, command }) => { 6 | let regex = /x/g 7 | if (!text) return await conn.reply(m.chat, '⚠️ 𝙔 𝙚𝙡 𝙣𝙪́𝙢𝙚𝙧𝙤 🤔', m, {contextInfo: { externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: ag, body: '𝐒𝐮𝐩𝐞𝐫 𝐁𝐨𝐭 𝐃𝐞 𝐖𝐡𝐚𝐭𝐬𝐀𝐩𝐩', previewType: 0, thumbnail: imagen4, sourceUrl: [md, yt, fb, tiktok].getRandom()}}}) 8 | if (!text.match(regex)) throw `*𝑬𝒋𝒆𝒎𝒑𝒍𝒐 𝒅𝒆𝒍 𝒖𝒔𝒐: ${usedPrefix + command} 521999340434x*` 9 | let random = text.match(regex).length, total = Math.pow(10, random), array = [] 10 | for (let i = 0; i < total; i++) { 11 | let list = [...i.toString().padStart(random, '0')] 12 | let result = text.replace(regex, () => list.shift()) + '@s.whatsapp.net' 13 | if (await conn.onWhatsApp(result).then(v => (v[0] || {}).exists)) { 14 | let info = await conn.fetchStatus(result).catch(_ => {}) 15 | array.push({ exists: true, jid: result, ...info }) 16 | } else { 17 | array.push({ exists: false, jid: result }) 18 | }} 19 | let txt = '• 𝐑𝐞𝐠𝐢𝐬𝐭𝐫𝐚𝐝𝐨\n\n' + array.filter(v => v.exists).map(v => `• 𝐍𝐮𝐦𝐞𝐫𝐨: wa.me/${v.jid.split('@')[0]}\n*• 𝑫𝒆𝒔𝒄:* ${v.status || 'Sin descripcion'}\n*• 𝐅𝐞𝐜𝐡𝐚::* ${formatDate(v.setAt)}`).join('\n\n') + '\n\n*𝐍𝐨 𝐫𝐞𝐠𝐢𝐬𝐭𝐫𝐚𝐝𝐨:*\n\n' + array.filter(v => !v.exists).map(v => v.jid.split('@')[0]).join('\n') 20 | m.reply(txt) 21 | } 22 | handler.help = ["nowa"] 23 | handler.tags = ["tools"] 24 | handler.command = /^nowa$/i 25 | handler.register = true 26 | export default handler 27 | function formatDate(n, locale = 'id') { 28 | let d = new Date(n) 29 | return d.toLocaleDateString(locale, { timeZone: 'Asia/Jakarta' })} 30 | -------------------------------------------------------------------------------- /plugins/owner-exec.js: -------------------------------------------------------------------------------- 1 | import syntaxerror from 'syntax-error' 2 | import { format } from 'util' 3 | import { fileURLToPath } from 'url' 4 | import { dirname } from 'path' 5 | import { createRequire } from 'module' 6 | 7 | const __dirname = dirname(fileURLToPath(import.meta.url)) 8 | const require = createRequire(__dirname) 9 | let handler = async (m, _2) => { 10 | if (m.fromMe) return 11 | let { conn, isROwner, usedPrefix, noPrefix, args, groupMetadata } = _2 12 | if (!isROwner) return 13 | let _return 14 | let _syntax = '' 15 | let _text = (/^=/.test(usedPrefix) ? 'return ' : '') + noPrefix 16 | let old = m.exp * 1 17 | try { 18 | let i = 15 19 | let f = { 20 | exports: {} 21 | } 22 | let exec = new (async () => { }).constructor('print', 'm', 'handler', 'require', 'conn', 'Array', 'process', 'args', 'groupMetadata', 'module', 'exports', 'argument', _text) 23 | _return = await exec.call(conn, (...args) => { 24 | if (--i < 1) return 25 | console.log(...args) 26 | return conn.reply(m.chat, format(...args), m) 27 | }, m, handler, require, conn, CustomArray, process, args, groupMetadata, f, f.exports, [conn, _2]) 28 | } catch (e) { 29 | let err = syntaxerror(_text, 'Execution Function', { 30 | allowReturnOutsideFunction: true, 31 | allowAwaitOutsideFunction: true, 32 | sourceType: 'module' 33 | }) 34 | if (err) _syntax = '```' + err + '```\n\n' 35 | _return = e 36 | } finally { 37 | conn.reply(m.chat, _syntax + format(_return), m) 38 | m.exp = old 39 | } 40 | } 41 | handler.help = ['> ', '=> '] 42 | handler.tags = ['owner']; 43 | handler.customPrefix = /^=?> / 44 | handler.command = /(?:)/i 45 | //handler.rowner = true 46 | 47 | export default handler 48 | 49 | class CustomArray extends Array { 50 | constructor(...args) { 51 | if (typeof args[0] == 'number') return super(Math.min(args[0], 10000)) 52 | else return super(...args) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /plugins/descargas-tiktokstalk.js: -------------------------------------------------------------------------------- 1 | import fg from 'api-dylux' 2 | let handler = async (m, { conn, text, args }) => { 3 | if (!text) throw `✳️ Ingrese el Username de un usuario de TikTok` 4 | m.react("⌛"); 5 | try { 6 | const apiUrl = `${apis}/tools/tiktokstalk?q=${encodeURIComponent(args[0])}`; 7 | const apiResponse = await fetch(apiUrl); 8 | const delius = await apiResponse.json(); 9 | if (!delius || !delius.result || !delius.result.users) return m.react("❌"); 10 | const profile = delius.result.users; 11 | const stats = delius.result.stats; 12 | const txt = `👤 *Perfil de TikTok*: 13 | *• Nombre de usuario*: ${profile.username} 14 | *• Nickname*: ${profile.nickname} 15 | *• Verificado*: ${profile.verified ? 'Sí' : 'No'} 16 | *• Seguidores*: ${stats.followerCount.toLocaleString()} 17 | *• Seguidos*: ${stats.followingCount.toLocaleString()} 18 | *• Likes Totales*: ${stats.heartCount.toLocaleString()} 19 | *• Videos*: ${stats.videoCount.toLocaleString()} 20 | *• Firma*: ${profile.signature} 21 | *• URL*: 22 | ${profile.url}`; 23 | 24 | await conn.sendFile(m.chat, profile.avatarLarger, 'tt.png', txt, m, null, fake); 25 | m.react("✅"); 26 | } catch (e2) { 27 | try { 28 | let res = await fg.ttStalk(args[0]) 29 | let txt = `👤 *Perfil de TikTok*: 30 | *• Nombre:* ${res.name} 31 | *• Username:* ${res.username} 32 | *• Seguidores:* ${res.followers} 33 | *• Siguiendo:* ${res.following} 34 | *• Desc:* ${res.desc} 35 | *• Link* : https://tiktok.com/${res.username}` 36 | await conn.sendFile(m.chat, res.profile, 'tt.png', txt, m, null, fake) 37 | m.react("✅"); 38 | } catch (e) { 39 | await m.react(`❌`) 40 | m.reply(`\`\`\`⚠️ OCURRIO UN ERROR ⚠️\`\`\`\n\n> *Reporta el siguiente error a mi creador con el comando:*#report\n\n>>> ${e} <<<< `) 41 | console.log(e) 42 | }}} 43 | handler.help = ['tiktokstalk'] 44 | handler.tags = ['downloader'] 45 | handler.command = /^t(tstalk|iktokstalk|iktoksearch|tsearch)$/i 46 | handler.register = true 47 | handler.limit = 1 48 | export default handler -------------------------------------------------------------------------------- /plugins/descargas-tiktokimg.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | const userRequests = {}; 3 | 4 | let handler = async (m, { conn, usedPrefix, command, text }) => { 5 | if (!text) throw `*⚠️ ${await tr("Ingresa el nombre del video que buscas")}.*\n${await tr("Ejemplo")}: ${usedPrefix + command} emilia_mernes` 6 | if (userRequests[m.sender]) return m.reply(`⏳ ${await tr("*Espera...* Ya hay una solicitud en proceso. Por favor, espera a que termine antes de hacer otra.")}`) 7 | userRequests[m.sender] = true; 8 | m.react("⏳") 9 | try { 10 | let resultTxt = await tr("Resultados para") 11 | let { data: response } = await axios.get(`${apis}/search/tiktoksearch?query=${text}`); 12 | if (!response || !response.meta || !Array.isArray(response.meta) || response.meta.length === 0) return m.reply(`❌ ${await tr("No se encontraron resultados para")} "${text}".`); 13 | let searchResults = response.meta; 14 | shuffleArray(searchResults); 15 | let selectedResults = searchResults.slice(0, 5); 16 | if (m.isWABusiness) { 17 | const medias = selectedResults.map(result => ({type: "video", data: { url: result.hd }})); 18 | await conn.sendAlbumMessage(m.chat, medias, `✅ ${resultTxt}: ${text}`, m); 19 | m.react("✅️"); 20 | } else { 21 | let messages = selectedResults.map(result => [``, 22 | `${result.title}`, 23 | result.hd 24 | ]); 25 | await conn.sendCarousel(m.chat, `✅ ${resultTxt}: ${text}`, "🔍 TikTok Search", messages, m); 26 | m.react("✅️"); 27 | } 28 | } catch (error) { 29 | m.react("❌️") 30 | console.error(error); 31 | } finally { 32 | delete userRequests[m.sender]; 33 | }}; 34 | handler.help = ['tiktoksearch ']; 35 | handler.tags = ['downloader']; 36 | handler.command = ['tiktoksearch', 'ttsearch']; 37 | handler.register = true; 38 | handler.limit = 4; 39 | 40 | export default handler; 41 | 42 | function shuffleArray(array) { 43 | for (let i = array.length - 1; i > 0; i--) { 44 | const j = Math.floor(Math.random() * (i + 1)); 45 | [array[i], array[j]] = [array[j], array[i]]; 46 | } 47 | } -------------------------------------------------------------------------------- /plugins/sticker-emojimix.js: -------------------------------------------------------------------------------- 1 | import { sticker } from '../lib/sticker.js' 2 | let MessageType = (await import(global.baileys)).default 3 | import fetch from 'node-fetch' 4 | import fs from "fs" 5 | let handler = async (m, { conn, text, args, usedPrefix, command }) => { 6 | let user = global.db.data.users[m.sender] 7 | let f = user.packname || global.packname 8 | let g = (user.packname && user.author ? user.author : (user.packname && !user.author ? '' : global.author)) 9 | if (!args[0]) return m.reply(`⚠️ 𝘿𝙚𝙗𝙚𝙨 𝙙𝙚 𝙪𝙨𝙖𝙧 2 𝙚𝙢𝙤𝙟𝙞𝙨 𝙮 𝙚𝙣 𝙢𝙚𝙙𝙞𝙤 𝙪𝙨𝙖𝙧 𝙚𝙡 *+*\n• 𝙀𝙟𝙚𝙢𝙥𝙡𝙤 :\n*${usedPrefix + command}* 😺+😆`) 10 | conn.fakeReply(m.chat, `*Esto puede demorar unos minutos*`, '0@s.whatsapp.net', `No haga spam gil`, 'status@broadcast', null, fake) 11 | try { 12 | let [emoji1, emoji2] = text.split`+` 13 | let anu = await fetchJson(`https://tenor.googleapis.com/v2/featured?key=AIzaSyAyimkuYQYF_FXVALexPuGQctUWRURdCYQ&contentfilter=high&media_filter=png_transparent&component=proactive&collection=emoji_kitchen_v5&q=${encodeURIComponent(emoji1)}_${encodeURIComponent(emoji2)}`) 14 | for (let res of anu.results) { 15 | let stiker = await sticker(false, res.url, f, g) 16 | conn.sendFile(m.chat, stiker, 'sticker.webp', '',m, true, { contextInfo: { 'forwardingScore': 200, 'isForwarded': false, externalAdReply:{ showAdAttribution: false, title: wm, body: ``, mediaType: 2, sourceUrl: [nna, nn, md, yt].getRandom(), thumbnail: imagen4}}}, { quoted: m }) 17 | }} catch (e) { 18 | console.log(e)}} 19 | handler.help = ['emojimix'].map(v => v + ' emot1|emot2>') 20 | handler.tags = ['sticker'] 21 | handler.command = /^(emojimix|emogimix|combinaremojis|crearemoji|emojismix|emogismix)$/i 22 | handler.register = true 23 | handler.limit = 1 24 | export default handler 25 | 26 | const fetchJson = (url, options) => new Promise(async (resolve, reject) => { 27 | fetch(url, options) 28 | .then(response => response.json()) 29 | .then(json => { 30 | resolve(json) 31 | }) 32 | .catch((err) => { 33 | reject(err) 34 | })}) 35 | -------------------------------------------------------------------------------- /lib/uploadFile.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | import {FormData, Blob} from 'formdata-node'; 3 | import {fileTypeFromBuffer} from 'file-type'; 4 | /** 5 | * Upload epheremal file to file.io 6 | * `Expired in 1 day` 7 | * `100MB Max Filesize` 8 | * @param {Buffer} buffer File Buffer 9 | */ 10 | const fileIO = async (buffer) => { 11 | const {ext, mime} = await fileTypeFromBuffer(buffer) || {}; 12 | const form = new FormData(); 13 | const blob = new Blob([buffer.toArrayBuffer()], {type: mime}); 14 | form.append('file', blob, 'tmp.' + ext); 15 | const res = await fetch('https://file.io/?expires=1d', { // 1 Day Expiry Date 16 | method: 'POST', 17 | body: form, 18 | }); 19 | const json = await res.json(); 20 | if (!json.success) throw json; 21 | return json.link; 22 | }; 23 | 24 | /** 25 | * Upload file to storage.restfulapi.my.id 26 | * @param {Buffer|ReadableStream|(Buffer|ReadableStream)[]} inp File Buffer/Stream or Array of them 27 | * @return {string|null|(string|null)[]} 28 | */ 29 | const RESTfulAPI = async (inp) => { 30 | const form = new FormData(); 31 | let buffers = inp; 32 | if (!Array.isArray(inp)) buffers = [inp]; 33 | for (const buffer of buffers) { 34 | const blob = new Blob([buffer.toArrayBuffer()]); 35 | form.append('file', blob); 36 | } 37 | const res = await fetch('https://storage.restfulapi.my.id/upload', { 38 | method: 'POST', 39 | body: form, 40 | }); 41 | let json = await res.text(); 42 | try { 43 | json = JSON.parse(json); 44 | if (!Array.isArray(inp)) return json.files[0].url; 45 | return json.files.map((res) => res.url); 46 | } catch (e) { 47 | throw json; 48 | } 49 | }; 50 | 51 | /** 52 | * 53 | * @param {Buffer} inp 54 | * @return {Promise} 55 | */ 56 | export default async function(inp) { 57 | let err = false; 58 | for (const upload of [RESTfulAPI, fileIO]) { 59 | try { 60 | return await upload(inp); 61 | } catch (e) { 62 | err = e; 63 | } 64 | } 65 | if (err) throw err; 66 | } 67 | -------------------------------------------------------------------------------- /plugins/_simsimi.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | const handler = (m) => m; 3 | 4 | handler.before = async (m) => { 5 | const chat = global.db.data.chats[m.chat]; 6 | if (chat.simi) { 7 | if (/^.*false|disnable|(turn)?off|0/i.test(m.text)) return; 8 | let textodem = m.text; 9 | if (m.text.includes('serbot') || m.text.includes('bots')|| m.text.includes('jadibot')|| m.text.includes('menu')|| m.text.includes('play')|| m.text.includes('play2') || m.text.includes('playdoc') || m.text.includes('tiktok') || m.text.includes('facebook') || m.text.includes('menu2') || m.text.includes('infobot') || m.text.includes('estado') || m.text.includes('ping') || m.text.includes('instalarbot') || m.text.includes('sc') || m.text.includes('sticker') || m.text.includes('s') || m.text.includes('wm') || m.text.includes('qc')) return 10 | if (m.fromMe) return 11 | try { 12 | await conn.sendPresenceUpdate('composing', m.chat) 13 | let gpt = await fetch(`${apis}/tools/simi?text=${encodeURIComponent(textodem)}`) 14 | let res = await gpt.json() 15 | await m.reply(res.data.message) 16 | } catch { 17 | /*SI DA ERROR USARA ESTA OTRA OPCION DE API DE IA QUE RECUERDA EL NOMBRE DE LA PERSONA*/ 18 | if (textodem.includes('Hola')) textodem = textodem.replace('Hola', 'Hello'); 19 | if (textodem.includes('hola')) textodem = textodem.replace('hola', 'hello'); 20 | if (textodem.includes('HOLA')) textodem = textodem.replace('HOLA', 'HELLO'); 21 | const reis = await fetch('https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=' + textodem); 22 | const resu = await reis.json(); 23 | const nama = m.pushName || '1'; 24 | const api = await fetch('http://api.brainshop.ai/get?bid=153868&key=rcKonOgrUFmn5usX&uid=' + nama + '&msg=' + resu[0][0][0]); 25 | const res = await api.json(); 26 | const reis2 = await fetch('https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=es&dt=t&q=' + res.cnt); 27 | const resu2 = await reis2.json() 28 | await m.reply(resu2[0][0][0])} 29 | return !0; 30 | } 31 | return true; 32 | }; 33 | export default handler; -------------------------------------------------------------------------------- /plugins/rpg-rob.js: -------------------------------------------------------------------------------- 1 | let ro = 3000 2 | let handler = async (m, { conn, usedPrefix, command}) => { 3 | let time = global.db.data.users[m.sender].lastrob + 7200000 4 | if (new Date - global.db.data.users[m.sender].lastrob < 7200000) throw `🚓 La policía que esta vigilando, vuelve en: ${msToTime(time - new Date())}\n\n‍` 5 | let who 6 | if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.quoted ? m.quoted.sender : false 7 | else who = m.chat 8 | if (!who) return conn.reply(m.chat, `*⚠️ Etiqueta a un usuario para robar*`, m, {contextInfo: {externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: wm, body: '', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}}) 9 | if (!(who in global.db.data.users)) throw `*⚠️ ¿Quien carajo es? No aparece el mi base de datos.*` 10 | let users = global.db.data.users[who] 11 | let rob = Math.floor(Math.random() * ro) 12 | if (users.exp < rob) return m.reply(`@${who.split`@`[0]} Este usuario tiene menos de ${ro} XP\n> No robes a un pobre v:`, null, { mentions: [who] }) 13 | global.db.data.users[m.sender].exp += rob 14 | global.db.data.users[who].exp -= rob 15 | m.reply(`*Robaste ${rob} XP a @${who.split`@`[0]}*`, null, { mentions: [who] }) 16 | //conn.sendMessage(m.chat, {text: `*Robaste ${rob} XP a @${who.split`@`[0]}*`, contextInfo:{ mentions: [who]}}, { quoted: m}) 17 | global.db.data.users[m.sender].lastrob = new Date * 1 18 | } 19 | handler.help = ['rob'] 20 | handler.tags = ['econ'] 21 | handler.command = ['robar', 'rob'] 22 | handler.register = true 23 | export default handler 24 | 25 | function msToTime(duration) { 26 | var milliseconds = parseInt((duration % 1000) / 100), 27 | seconds = Math.floor((duration / 1000) % 60), 28 | minutes = Math.floor((duration / (1000 * 60)) % 60), 29 | hours = Math.floor((duration / (1000 * 60 * 60)) % 24) 30 | hours = (hours < 10) ? "0" + hours : hours 31 | minutes = (minutes < 10) ? "0" + minutes : minutes 32 | seconds = (seconds < 10) ? "0" + seconds : seconds 33 | return hours + " Hora(s) " + minutes + " Minuto(s)"} 34 | -------------------------------------------------------------------------------- /lib/canvas.js: -------------------------------------------------------------------------------- 1 | import {spawn} from 'child_process'; 2 | import {join} from 'path'; 3 | 4 | const __dirname = global.__dirname(import.meta.url); 5 | /** 6 | * Levelup image 7 | * @param {String} teks 8 | * @param {Number} level 9 | * @return {Promise} 10 | */ 11 | export function levelup(teks, level) { 12 | return new Promise(async (resolve, reject) => { 13 | if (!(global.support.convert || global.support.magick || global.support.gm)) return reject('Not Support!'); 14 | const font = join(__dirname, '../src/font'); 15 | const fontLevel = join(font, './level_c.otf'); 16 | const fontTexts = join(font, './texts.otf'); 17 | const xtsx = join(__dirname, '../src/lvlup_template.jpg'); 18 | let anotations = '+1385+260'; // gapake else if kadang error 19 | if (level > 2) anotations = '+1370+260'; 20 | if (level > 10) anotations = '+1330+260'; 21 | if (level > 50) anotations = '+1310+260'; 22 | if (level > 100) anotations = '+1260+260'; 23 | 24 | const [_spawnprocess, ..._spawnargs] = [...(global.support.gm ? ['gm'] : global.support.magick ? ['magick'] : []), 25 | 'convert', 26 | xtsx, 27 | '-font', 28 | fontTexts, 29 | '-fill', 30 | '#0F3E6A', 31 | '-size', 32 | '1024x784', 33 | '-pointsize', 34 | '68', 35 | '-interline-spacing', 36 | '-7.5', 37 | '-annotate', 38 | '+153+200', 39 | teks, 40 | // original together 41 | '-font', 42 | fontLevel, 43 | '-fill', 44 | '#0A2A48', 45 | '-size', 46 | '1024x784', 47 | '-pointsize', 48 | '140', 49 | '-interline-spacing', 50 | '-1.2', 51 | '-annotate', 52 | anotations, 53 | level, 54 | '-append', 55 | 'jpg:-', 56 | ]; 57 | const bufs = []; 58 | spawn(_spawnprocess, _spawnargs) 59 | .on('error', reject) 60 | .on('close', () => { 61 | return resolve(Buffer.concat(bufs)); 62 | }) 63 | .stdout.on('data', (chunk) => bufs.push(chunk)); 64 | }); 65 | } 66 | -------------------------------------------------------------------------------- /plugins/descargas-tiktok.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | const handler = async (m, { conn, text, args, usedPrefix, command }) => { 4 | if (!text) throw `⚠️ *¿Qué TikTok buscar? 🤔*\n\n⚡ *Ingrese un enlace de TikTok para descargar el video*\n*Ej:* ${usedPrefix + command} https://vm.tiktok.com/xxxx`; 5 | 6 | if (!/(?:https:?\/{2})?(?:w{3}|vm|vt|t)?\.?tiktok.com\/([^\s&]+)/gi.test(text)) throw `❌ Error`; 7 | 8 | const { key } = await conn.sendMessage(m.chat, { text: `*🐣 Tranquilo*\n▰▰▰▱▱▱▱▱▱\n𝙔𝙖 𝙚𝙨𝙩𝙤𝙮 𝙙𝙚𝙨𝙘𝙖𝙧𝙜𝙖𝙙𝙤...` }, { quoted: m }); 9 | await delay(1000); 10 | 11 | const apiUrl = `https://api.siputzx.my.id/api/tiktok?url=${encodeURIComponent(text)}`; 12 | 13 | try { 14 | const response = await axios.get(apiUrl); 15 | 16 | if (response.data.status && response.data.data.success) { 17 | const videoUrls = response.data.data.urls; 18 | if (videoUrls.length > 0) { 19 | const videoUrl = videoUrls[0]; // Tomar el primer enlace 20 | await conn.sendMessage(m.chat, { video: { url: videoUrl }, caption: `*🔰 Aquí está tu video de TikTok*` }, { quoted: m }); 21 | await conn.sendMessage(m.chat, { text: `✅ 𝘾𝙤𝙢𝙥𝙡𝙚𝙩𝙖𝙙𝙤\n▰▰▰▰▰▰▰▰▰\n𝘼𝙦𝙪𝙞 𝙚𝙨𝙩𝙖 𝙩𝙪 𝙫𝙞𝙙𝙚𝙤 💫`, edit: key }); 22 | } else { 23 | throw new Error("No se encontraron enlaces de video."); 24 | } 25 | } else { 26 | throw new Error("Error al obtener el video de TikTok."); 27 | } 28 | } catch (error) { 29 | console.error(error); 30 | await conn.sendMessage(m.chat, { text: `⚠️ Ocurrió un error al intentar descargar el video. Intenta nuevamente.` }, { quoted: m }); 31 | m.react(`❌`); 32 | } 33 | }; 34 | 35 | const delay = time => new Promise(res => setTimeout(res, time)); 36 | 37 | handler.help = ['tiktok']; 38 | handler.tags = ['downloader']; 39 | handler.command = /^(tt|tiktok)(dl|nowm)?$/i; 40 | handler.limit = 1; 41 | 42 | export default handler; 43 | -------------------------------------------------------------------------------- /plugins/grupo-config_time.js: -------------------------------------------------------------------------------- 1 | /* Creditos a https://github.com/ALBERTO9883/NyanCatBot-MD */ 2 | 3 | const handler = async (m, {conn, isAdmin, isOwner, args, usedPrefix, command}) => { 4 | if (!(isAdmin || isOwner)) { 5 | global.dfail('admin', m, conn); 6 | throw false; 7 | } 8 | const isClose = {'open': 'not_announcement', 9 | 'buka': 'not_announcement', 10 | 'on': 'not_announcement', 11 | '1': 'not_announcement', 12 | 'close': 'announcement', 13 | 'tutup': 'announcement', 14 | 'off': 'announcement', 15 | '0': 'announcement', 16 | }[(args[0] || '')]; 17 | 18 | if (isClose === undefined) { 19 | const caption = `*• Ejemplo:*\n${usedPrefix + command} open 1\n${usedPrefix + command} close 1\n\n*• Ejemplo de uso:* ${usedPrefix + command} close 1\n\n> *_🌿 Para que el grupo este cerrado una hora._*`; 20 | m.reply(caption); 21 | throw false; 22 | } 23 | const timeoutset = 86400000 * args[1] / 24; 24 | await conn.groupSettingUpdate(m.chat, isClose).then(async (_)=> { 25 | m.reply(`⚠️ *_Grupo ${isClose == 'announcement' ? 'cerrado' : 'abierto'} ${args[1] ? `durante *${clockString(timeoutset)}_*` : ''}`)}); 26 | if (args[1]) { 27 | setTimeout(async () => { 28 | await conn.groupSettingUpdate(m.chat, `${isClose == 'announcement' ? 'not_announcement' : 'announcement'}`).then(async (_)=>{ 29 | conn.reply(m.chat, `${isClose == 'not_announcement' ? '*El grupo ha sido cerrado, ¡ahora solo los administradores pueden enviar mensajes!*' : '*El grupo se ha abierto, ¡ahora todos los miembros pueden enviar mensajes!*'}!`); 30 | })}, timeoutset)}}; 31 | handler.help = ['grouptime ** **']; 32 | handler.tags = ['group']; 33 | handler.command = /^(grouptime|gctime)$/i; 34 | handler.register = true 35 | handler.botAdmin = true; 36 | handler.group = true; 37 | 38 | export default handler; 39 | 40 | function clockString(ms) { 41 | const h = Math.floor(ms / 3600000); 42 | const m = Math.floor(ms / 60000) % 60; 43 | const s = Math.floor(ms / 1000) % 60; 44 | console.log({ms, h, m, s}); 45 | return [h, m, s].map((v) => v.toString().padStart(2, 0) ).join(':'); 46 | } 47 | -------------------------------------------------------------------------------- /plugins/info-estado.js: -------------------------------------------------------------------------------- 1 | 2 | let handler = async (m, { conn, command, usedPrefix }) => { 3 | let name = await conn.getName(m.sender) 4 | let usuario = `${m.sender.split("@")[0]}` 5 | let aa = usuario + '@s.whatsapp.net' 6 | let _uptime = process.uptime() * 1000 7 | let _muptime 8 | if (process.send) { process.send('uptime') 9 | _muptime = await new Promise(resolve => { process.once('message', resolve) 10 | setTimeout(resolve, 1000) }) * 1000} 11 | let 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" } 12 | let uptime = clockString(_uptime) 13 | let estado = `${pickRandom([`*┌───⊷ *ミ🤖 Estado del Bot 🤖彡*\n┆ *=> Bot activo ✅*\n┆┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n┆ *=> Bot uso público ✅️*\n┆┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n┆=> 𝘼𝙘𝙩𝙞𝙫𝙤 𝙙𝙪𝙧𝙖𝙣𝙩𝙚\n┆=> ${uptime} ✅\n╰──────────────────`, `*Online ${uptime} ✅*`, `*Saturado 🥵*`, `Estoy activo desde: ${uptime}`, `Estamos activo papu 🤙`])} 14 | `.trim() 15 | await conn.sendMessage(m.chat, {text: estado, mentions: [m.sender]}, {quoted: fkontak}) 16 | /*await conn.reply(m.chat, `┌───⊷ *ミ🤖 Estado del Bot 🤖彡* 17 | ┆ *=> Bot activo ✅* 18 | ┆┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 19 | ┆ *=> Bot uso público ✅️* 20 | ┆┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 21 | ┆=> 𝘼𝙘𝙩𝙞𝙫𝙤 𝙙𝙪𝙧𝙖𝙣𝙩𝙚 22 | ┆=> ${uptime} ✅ 23 | ╰──────────────────`, fkontak, { mentions: [aa,] })*/ 24 | } 25 | handler.help = ['estado'] 26 | handler.tags = ['main'] 27 | handler.command = /^(estado|status|estate|state|stado|stats|botstat(us)?)$/i 28 | export default handler 29 | 30 | function pickRandom(list) { 31 | return list[Math.floor(Math.random() * list.length)]} 32 | 33 | function clockString(ms) { 34 | let h = isNaN(ms) ? '--' : Math.floor(ms / 3600000) 35 | let m = isNaN(ms) ? '--' : Math.floor(ms / 60000) % 60 36 | let s = isNaN(ms) ? '--' : Math.floor(ms / 1000) % 60 37 | return [h, m, s].map(v => v.toString().padStart(2, 0)).join(':')} 38 | -------------------------------------------------------------------------------- /plugins/sticker-attp y ttp.js: -------------------------------------------------------------------------------- 1 | import { sticker } from '../lib/sticker.js' 2 | import fetch from 'node-fetch' 3 | let handler = async(m, { conn, text, args, usedPrefix, command }) => { 4 | let user = global.db.data.users[m.sender] 5 | let f = user.packname || global.packname 6 | let g = (user.packname && user.author ? user.author : (user.packname && !user.author ? '' : global.author)) 7 | if (!text) return conn.reply(m.chat, `${mg}𝙀𝙨𝙘𝙧𝙞𝙗𝙖 𝙥𝙖𝙧𝙖 𝙦𝙪𝙚 𝙚𝙡 𝙩𝙚𝙭𝙩𝙤 𝙨𝙚 𝙘𝙤𝙣𝙫𝙞𝙚𝙧𝙩𝙖 𝙚𝙡 𝙨𝙩𝙞𝙘𝙠𝙚𝙧\n𝙀𝙟𝙚𝙢𝙥𝙡𝙤\n*${usedPrefix + command}* Nuevo Sticker`, m, {contextInfo: {externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: wm, body: '', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}}) 8 | let teks = encodeURI(text) 9 | conn.fakeReply(m.chat, `*Esto puede demorar unos minutos*`, '0@s.whatsapp.net', `No haga spam gil`, 'status@broadcast', null, fake) 10 | //m.reply(`Calma crack estoy haciendo tu texto a sticker 👏\n\n> *Esto puede demorar unos minutos*`) 11 | 12 | if (command == 'attp') { 13 | let stiker = await sticker(null,`${global.APIs.fgmods.url}/maker/attp?text=${teks}&apikey=${global.APIs.fgmods.key}`, f, g) 14 | conn.sendFile(m.chat, stiker, 'sticker.webp', '',m, true, { contextInfo: { 'forwardingScore': 200, 'isForwarded': false, externalAdReply:{ showAdAttribution: false, title: wm, body: vs, mediaType: 2, sourceUrl: [nna, nn, md, yt].getRandom(), thumbnail: imagen4}}}, { quoted: m })} 15 | 16 | if (command == 'ttp') { 17 | let stiker = await sticker(null,`${global.APIs.fgmods.url}/maker/ttp?text=${teks}&apikey=${global.APIs.fgmods.key}`, f, g) 18 | conn.sendFile(m.chat, stiker, 'sticker.webp', '',m, true, { contextInfo: { 'forwardingScore': 200, 'isForwarded': false, externalAdReply:{ showAdAttribution: false, title: wm, body: vs, mediaType: 2, sourceUrl: [nna, nn, md, yt].getRandom(), thumbnail: imagen4}}}, { quoted: m }) 19 | } 20 | } 21 | handler.help = ['attp']; 22 | handler.tags = ['sticker'] 23 | handler.command = /^(attp|ttp|ttp2|ttp3|ttp4|attp2)$/i 24 | handler.register = true 25 | export default handler -------------------------------------------------------------------------------- /plugins/rpg-banc.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {conn, command, args}) => { 2 | let who; 3 | if (m.isGroup) who = m.mentionedJid[0] ? m.mentionedJid[0] : m.sender; 4 | else who = m.sender; 5 | let users = global.db.data.users[m.sender]; 6 | 7 | if (command == 'dep' || command == 'depositar') { 8 | if (!args[0]) return m.reply(`[ ⚠️ ] *Ingresa la cantidad para agregar a sus cuenta bancaria*`); 9 | if (args[0] == '--all') { 10 | let count = parseInt(users.limit); 11 | users.limit -= count * 1 12 | users.banco += count * 1 13 | await m.reply(`*[ 🏦 ] Has agregados.*`); 14 | return !0; 15 | }; 16 | if (!Number(args[0])) return m.reply(`[ ⚠️ ] *Falto en número de cantidad de diamante 💎*`); 17 | let count = parseInt(args[0]); 18 | if (!users.limit) return m.reply(`*Esta pobre no tener suficiente diamante*`); 19 | if (users.limit < count) return m.reply(`*Che no sabes cuanto dinero tiene el tu cartera? usar el comando:* #bal`); 20 | users.limit -= count * 1; 21 | users.banco += count * 1; 22 | await m.reply(`*[ 🏦 ] Has ingresando ${count} diamante al Banco*`)} 23 | 24 | if (command == 'retirar' || command == 'toremove') { 25 | let user = global.db.data.users[m.sender] 26 | if (!args[0]) return m.reply(`[ ⚠️ ] *ingresa la cantidad a retirar*`); 27 | if (args[0] == '--all') { 28 | let count = parseInt(user.banco); 29 | user.banco -= count * 1 30 | user.limit += count * 1 31 | await m.reply(`*[ 🏦 ] Retiraste (${count}) diamante 💎 del Banco.*`); 32 | return !0 33 | } 34 | if (!Number(args[0])) return m.reply(`La cantidad debe ser un mumero`); 35 | let count = parseInt(args[0]); 36 | if (!user.banco) return m.reply(`Hey fantasma 👻, no tener esa cantidad de dinero el banco 🥲`); 37 | if (user.banco < count) return m.reply(`*Che no sabes cuanto dinero tiene el tu cartera? usar el comando:* #bal`); 38 | user.banco -= count * 1 39 | user.limit += count * 1 40 | await m.reply(`*[ 🏦 ] Has Retirado (${count}) dinero del Banco*`)} 41 | } 42 | handler.help = ['dep', 'retirar'] 43 | handler.tags = ['econ'] 44 | handler.command = /^(dep|depositar|retirar|toremove)$/i 45 | handler.register = true 46 | 47 | export default handler -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | console.log('Iniciando 🚀🚀🚀') 2 | import { join, dirname } from 'path' 3 | import { createRequire } from 'module' 4 | import { fileURLToPath } from 'url' 5 | import { setupMaster, fork } from 'cluster' 6 | import { watchFile, unwatchFile } from 'fs' 7 | import cfonts from 'cfonts' 8 | import { createInterface } from 'readline' 9 | import yargs from 'yargs' 10 | const __dirname = dirname(fileURLToPath(import.meta.url)) 11 | const require = createRequire(__dirname) 12 | const { name, author } = require(join(__dirname, './package.json')) 13 | const { say } = cfonts 14 | const rl = createInterface(process.stdin, process.stdout) 15 | 16 | say('KantuBot', { 17 | font: 'chrome', 18 | align: 'center', 19 | gradient: ['red', 'magenta']}) 20 | say(`by: CrxsMods`, { 21 | font: 'console', 22 | align: 'center', 23 | gradient: ['red', 'magenta']}); 24 | 25 | let isRunning = false 26 | /** 27 | * Start a js file 28 | * @param {String} file `path/to/file` 29 | */ 30 | function start(file) { 31 | if (isRunning) return 32 | isRunning = true 33 | const args = [join(__dirname, file), ...process.argv.slice(2)] 34 | 35 | setupMaster({ 36 | exec: args[0], 37 | args: args.slice(1)}) 38 | const p = fork() 39 | p.on('message', (data) => { 40 | //console.log('╭--------- - - - ✓\n┆ ✅ TIEMPO DE ACTIVIDAD ACTUALIZADA\n╰-------------------- - - -', data) 41 | switch (data) { 42 | case 'reset': 43 | p.process.kill() 44 | isRunning = false 45 | start.apply(this, arguments) 46 | break 47 | case 'uptime': 48 | p.send(process.uptime()) 49 | break 50 | } 51 | }) 52 | p.on('exit', (_, code) => { 53 | isRunning = false; 54 | console.error('⚠️ Error Inesperado ⚠️', code) 55 | p.process.kill() 56 | isRunning = false 57 | start.apply(this, arguments) 58 | if (process.env.pm_id) { 59 | process.exit(1) 60 | } else { 61 | process.exit() 62 | }}) 63 | const opts = new Object(yargs(process.argv.slice(2)).exitProcess(false).parse()) 64 | if (!opts['test']) { 65 | if (!rl.listenerCount()) { 66 | rl.on('line', (line) => { 67 | p.emit('message', line.trim()) 68 | }) 69 | }}} 70 | 71 | setInterval(() => { 72 | console.log('♻️ Reiniciando bot automáticamente...'); 73 | process.exit(0); 74 | }, 14400000) //4hs 75 | 76 | start('main.js'); 77 | 78 | -------------------------------------------------------------------------------- /plugins/descargas-gitclone.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch' 2 | const regex = /(?:https|git)(?::\/\/|@)github\.com[\/:]([^\/:]+)\/(.+)/i 3 | let handler = async (m, { args, usedPrefix, command }) => { 4 | if (!args[0]) return conn.reply(m.chat, `⚠️*𝙄𝙣𝙜𝙧𝙚𝙨𝙚 𝙪𝙣 𝙚𝙣𝙡𝙖𝙘𝙚 𝙙𝙚 𝙂𝙞𝙩𝙝𝙪𝙗*\n• *𝙀𝙟 :* ${usedPrefix + command} ${md}`, m, {contextInfo: {externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: mg, body: ' 💫 𝐒𝐮𝐩𝐞𝐫 𝐁𝐨𝐭 𝐃𝐞 𝐖𝐡𝐚𝐭𝐬𝐚𝐩𝐩 🥳 ', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}}) 5 | if (!regex.test(args[0])) return conn.reply(m.chat, `⚠️ 𝙚𝙨𝙤 𝙣𝙤 𝙚𝙨 𝙪𝙣 𝙚𝙣𝙡𝙖𝙘𝙚 𝙙𝙚 𝙜𝙞𝙩𝙝𝙪𝙗 𝙗𝙤𝙡𝙪𝙙𝙤 🤡`, m, {contextInfo: {externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: iig, body: ' 💫 𝐒𝐮𝐩𝐞𝐫 𝐁𝐨𝐭 𝐃𝐞 𝐖𝐡𝐚𝐭𝐬𝐚𝐩𝐩 🥳 ', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}}) 6 | try { 7 | let [_, user, repo] = args[0].match(regex) || [] 8 | repo = repo.replace(/.git$/, '') 9 | let url = `https://api.github.com/repos/${user}/${repo}/zipball` 10 | let filename = (await fetch(url, { method: 'HEAD' })).headers.get('content-disposition').match(/attachment; filename=(.*)/)[1] 11 | conn.reply(m.chat, `*⌛ 𝐂𝐚𝐥𝐦𝐚 ✋ 𝐂𝐥𝐚𝐜𝐤, 𝐘𝐚 𝐞𝐬𝐭𝐨𝐲 𝐄𝐧𝐯𝐢𝐚𝐝𝐨 𝐞𝐥 𝐚𝐫𝐜𝐡𝐢𝐯𝐨 🚀*\n*𝐒𝐢 𝐧𝐨 𝐥𝐞 𝐥𝐥𝐞𝐠𝐚 𝐞𝐥 𝐚𝐫𝐜𝐡𝐢𝐯𝐨 𝐞𝐬 𝐝𝐞𝐛𝐢𝐝𝐨 𝐚 𝐪𝐮𝐞 𝐞𝐥 𝐑𝐞𝐩𝐨𝐬𝐢𝐭𝐨𝐫𝐢𝐨 𝐞𝐬 𝐦𝐮𝐲 𝐩𝐞𝐬𝐚𝐝𝐨*`, m, {contextInfo: {externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: wm, body: ' 💫 𝐒𝐮𝐩𝐞𝐫 𝐁𝐨𝐭 𝐃𝐞 𝐖𝐡𝐚𝐭𝐬𝐚𝐩𝐩 🥳 ', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}}) 12 | conn.sendFile(m.chat, url, filename, null, m, null, fake) 13 | handler.limit = 2 14 | } catch (e) { 15 | m.reply(`\`\`\`⚠️ OCURRIO UN ERROR ⚠️\`\`\`\n\n> *Reporta el siguiente error a mi creador con el comando:*#report\n\n>>> ${e} <<<< `) 16 | console.log(e) 17 | handler.limit = 0 //❌No gastada diamante si el comando falla 18 | }} 19 | handler.help = ['gitclone '] 20 | handler.tags = ['downloader'] 21 | handler.command = /gitclone|clonarepo|clonarrepo|repoclonar/i 22 | handler.register = true 23 | //handler.limit = 2 24 | handler.level = 2 25 | export default handler 26 | -------------------------------------------------------------------------------- /src/nsfw/pechos.json: -------------------------------------------------------------------------------- 1 | [ 2 | "https://img-l3.xnxx-cdn.com/videos/thumbs169xnxxll/af/a7/46/afa74635c31e3138e1c2d18886abcdf1/afa74635c31e3138e1c2d18886abcdf1.17.jpg", 3 | 4 | "https://cdn-img3.iporntv.net/videos/202106/18/389835601/original/(m=eaf8Ggaaaa)(mh=p4vZW6n5_dtdn8_W)2.jpg", 5 | 6 | "https://www.tubemedia.info/fotos-caseras/2019/KYMHWI811161/medium.jpg", 7 | 8 | "https://cdn.pixabay.com/photo/2017/05/12/09/26/bra-2306600_960_720.jpg", 9 | 10 | "https://di.phncdn.com/videos/201809/28/185185781/original/(m=eaAaGwObaaaa)(mh=HJ58ns-VeXWmKOSc)15.jpg", 11 | 12 | "https://nenastetonas.com/wp-content/uploads/2016/02/tumblr_o1cnxdc5OK1v43mzyo1_1280.jpg", 13 | 14 | "https://nenastetonas.com/wp-content/uploads/2016/12/tumblr_o8nmr7WJ3B1vxu4j9o1_500.jpg", 15 | 16 | "https://nenastetonas.com/wp-content/uploads/2016/01/tumblr_nzfocdAf6a1rgf7zzo1_540.jpg", 17 | 18 | "https://www.chaty.es/host5/7169333_1.jpg", 19 | 20 | "https://static.zeenite.com/contents/videos_screenshots/90000/90431/preview_360p.mp4.jpg", 21 | 22 | "https://cdn-img3.iporntv.net/videos/202003/15/293181551/thumbs_2/(m=eaf8Ggaaaa)(mh=w5jLypXKRw-Y6sCc)2.jpg", 23 | 24 | "https://di.phncdn.com/videos/202104/06/386231081/original/(m=eaAaGwObaaaa)(mh=DXSM7R1TpIx4OEkH)3.jpg", 25 | 26 | "https://cdn-img3.iporntv.net/videos/202009/19/353006632/thumbs_3/(m=eaf8Ggaaaa)(mh=jEeyInvbTNbuOlNr)6.jpg", 27 | 28 | "http://cdn-img2.iporntv.net/videos/202102/27/384357292/thumbs_4/(m=eaf8Ggaaaa)(mh=S6g0NoxjXznjUswb)4.jpg", 29 | 30 | "https://www.xbustyteen.com/wp-content/uploads/2020/07/231950cqoqqb5qybb7g5dz.jpeg", 31 | 32 | "https://pbs.twimg.com/profile_images/917096703391608832/7zES2uGN_400x400.jpg", 33 | 34 | "https://melafollaria.com/wp-content/uploads/2021/12/Deliciosas-tetas-fotos-de-tetas-hermosas.jpg", 35 | 36 | "https://img-hw.xvideos-cdn.com/videos/thumbs169poster/41/fc/66/41fc6635d7c5678a60f8e44467169e18/41fc6635d7c5678a60f8e44467169e18.9.jpg", 37 | 38 | "https://chuporno.com/video/thumb/esas-tetas-lechosas-saca-semen-cualquiera-3235.jpg", 39 | 40 | "https://bs1.qvcdn.com/enhanced-2/d15/5c9/d155c9be3e2eb754efd001898921d35a.jpg", 41 | 42 | "https://www.labiblioteta.com/wp-content/uploads/2020/01/Veronica-Ranking-de-Tetas-12.jpg", 43 | 44 | "https://pbs.twimg.com/media/BqRYahPIQAAJ1vf.jpg" 45 | ] 46 | -------------------------------------------------------------------------------- /lib/_checkLang.js: -------------------------------------------------------------------------------- 1 | const translationCache = new Map(); 2 | 3 | export async function tr(baseText) { 4 | const m = global.currentMessageContext; 5 | const targetLang = m ? global.db?.data?.users[m.sender]?.language || global.lang : global.lang; 6 | if (targetLang === 'es') return baseText; 7 | 8 | const cacheKey = `${baseText}:${targetLang}`; 9 | 10 | if (translationCache.has(cacheKey)) { 11 | return translationCache.get(cacheKey); 12 | } 13 | 14 | const translatedText = await translateText(baseText, targetLang); 15 | 16 | translationCache.set(cacheKey, translatedText); 17 | 18 | if (translationCache.size > 1000) { 19 | const firstKey = translationCache.keys().next().value; 20 | translationCache.delete(firstKey); 21 | } 22 | 23 | return translatedText; 24 | } 25 | 26 | export async function translateText(text, targetLang) { 27 | if (typeof text !== 'string' || !text.trim()) return text; 28 | 29 | try { 30 | const textRegex = /\b(?![\w.]*\.[\w.]*)([\p{L}0-9][\p{L}0-9\s]*)\b/gu; 31 | const translatableParts = [...text.matchAll(textRegex)].map(match => match[1].trim()).filter(Boolean); 32 | 33 | if (translatableParts.length === 0) { 34 | return text; 35 | } 36 | 37 | const res = await fetch("https://tr.skyultraplus.com/translate", { 38 | method: "POST", 39 | headers: { "Content-Type": "application/json" }, 40 | body: JSON.stringify({ 41 | q: translatableParts.join("\n"), 42 | source: "auto", 43 | target: targetLang 44 | }), 45 | timeout: 5000 46 | }); 47 | 48 | const contentType = res.headers.get('content-type'); 49 | if (!contentType || !contentType.includes('application/json')) { 50 | console.log("Invalid content type:", contentType); 51 | return text; 52 | } 53 | 54 | const data = await res.json(); 55 | 56 | const translated = data.translatedText?.split("\n") || translatableParts; 57 | 58 | let index = 0; 59 | const translatedText = text.replace(textRegex, (match, group1) => { 60 | const current = translated[index++]; 61 | return current ? current : match; 62 | }); 63 | 64 | return translatedText; 65 | } catch (err) { 66 | console.error("Error en traducción:", err); 67 | return text; 68 | } 69 | } -------------------------------------------------------------------------------- /plugins/jadibot-privacidad.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, usedPrefix, text }) => { 2 | const isSubBot = global.conns?.some(bot => bot.user.jid === m.sender); 3 | const isMainBot = m.sender === global.conn.user.jid; 4 | if (!isSubBot && !isMainBot) return m.reply(await tr('⚠️ Este comando solo puede ser usado por el Bot Principal o un Sub-Bot.')); 5 | const bot = isSubBot ? global.conns.find(bot => bot.user.jid === m.sender) : global.conn; 6 | if (!bot) return m.reply(await tr('⚠️ No se pudo identificar el bot.')); 7 | const botConfig = global.db.data.users[bot.user.jid] || {}; 8 | const [option, value] = text.split(' '); 9 | 10 | if (!option || !value) { 11 | return m.reply(await tr(`⚠️ Uso: *${usedPrefix}setconfig * 12 | 13 | Opciones disponibles: 14 | - *privacy*: 1 (activar) / 0 (desactivar) 15 | - *prestar*: 1 (activar) / 0 (desactivar)`)); 16 | } 17 | 18 | if (option === 'privacy') { 19 | if (value === '1') { 20 | botConfig.privacy = true; 21 | await conn.sendMessage(m.chat, { text: await tr('✅ *Privacidad activada.*\n> Tu número no se mostrará en la lista de bots.') }, { quoted: m }); 22 | } else if (value === '0') { 23 | botConfig.privacy = false; 24 | await conn.sendMessage(m.chat, { text: await tr('✅ *Privacidad desactivada.*\n> Tu número se mostrará en la lista de bots.') }, { quoted: m }); 25 | } else { 26 | await conn.sendMessage(m.chat, { text: await tr('⚠️ Valor no válido. Usa: *1* (activar) o *0* (desactivar).') }, { quoted: m }); 27 | }} else if (option === 'prestar') { 28 | if (value === '1') { 29 | botConfig.prestar = true; 30 | await conn.sendMessage(m.chat, { text: await tr('✅ *Prestar bot activado.*\n> Los usuarios pueden usar el bot para unirlo a grupos.') }, { quoted: m }); 31 | } else if (value === '0') { 32 | botConfig.prestar = false; 33 | await conn.sendMessage(m.chat, { text: await tr('✅ *Prestar bot desactivado.*\n> Los usuarios no podrán unir el bot a grupos.') }, { quoted: m }); 34 | } else { 35 | await conn.sendMessage(m.chat, { text: await tr('⚠️ Valor no válido. Usa: *1* (activar) o *0* (desactivar).') }, { quoted: m }); 36 | }} else { 37 | return m.reply(await tr('⚠️ Opción no válida.')); 38 | } 39 | global.db.data.users[bot.user.jid] = botConfig; 40 | }; 41 | handler.command = handler.help = ['setconfig']; 42 | handler.tags = ['jadibot']; 43 | handler.register = true; 44 | 45 | export default handler; 46 | -------------------------------------------------------------------------------- /plugins/buscador-animeinfo.js: -------------------------------------------------------------------------------- 1 | import translate from '@vitalets/google-translate-api'; 2 | import {Anime} from '@shineiichijo/marika'; 3 | const client = new Anime(); 4 | const handler = async (m, {conn, text, usedPrefix}) => { 5 | if (!text) return m.reply(`*⚠️ INGRESE EL NOMBRE DE ALGUN ANIME A BUSCAR*`); 6 | m.react("✨") 7 | try { 8 | const anime = await client.searchAnime(text); 9 | const result = anime.data[0]; 10 | const resultes = await translate(`${result.background}`, {to: 'es', autoCorrect: true}); 11 | const resultes2 = await translate(`${result.synopsis}`, {to: 'es', autoCorrect: true}); 12 | const AnimeInfo = `🟢 • *ᴛɪ́ᴛᴜʟᴏ:* ${result.title} 13 | 🎋 • *ғᴏʀᴍᴀᴛᴏ:* ${result.type} 14 | 📈 • *ᴇsᴛᴀᴅᴏ:* ${result.status.toUpperCase().replace(/\_/g, ' ')} 15 | 🍥 • *ᴇᴘɪsᴏᴅɪᴏs ᴛᴏᴛᴀʟᴇs:* ${result.episodes} 16 | 🎈 • *ᴅᴜʀᴀᴄɪᴏ́ɴ: ${result.duration}* 17 | ✨ • *ʙᴀsᴀᴅᴏ ᴇɴ:* ${result.source.toUpperCase()} 18 | 💫 • *ᴇsᴛʀᴇɴᴀᴅᴏ:* ${result.aired.from} 19 | 🎗 • *ғɪɴᴀʟɪᴢᴀᴅᴏ:* ${result.aired.to} 20 | 🎐 • *ᴘᴏᴘᴜʟᴀʀɪᴅᴀᴅ:* ${result.popularity} 21 | 🎏 • *ғᴀᴠᴏʀɪᴛᴏs:* ${result.favorites} 22 | 🎇 • *ᴄʟᴀsɪғɪᴄᴀᴄɪᴏ́ɴ:* ${result.rating} 23 | 🏅 • *ʀᴀɴɢᴏ:* ${result.rank} 24 | ♦ • *ᴛʀᴀɪʟᴇʀ:* ${result.trailer.url} 25 | 🌐 • *ᴜʀʟ:* ${result.url} 26 | 🎆 • *ʙᴀᴄᴋɢʀᴏᴜɴᴅ:* ${resultes.text} 27 | ❄ • *ʀɪɴɢᴋᴀsᴀɴ:* ${resultes2.text}`; 28 | conn.sendFile(m.chat, result.images.jpg.image_url, 'error.jpg', AnimeInfo, m, null, fake); 29 | m.react("✅") 30 | } catch (error) { 31 | try { 32 | const res = await fetch(`https://deliriussapi-oficial.vercel.app/search/animesearch?q=${encodeURIComponent(text)}`); 33 | const data = await res.json(); 34 | if (data && data.data && data.data.length > 0) { 35 | const result = data.data[0]; 36 | const AnimeInfo = `*• Título:* ${result.title}\n` + 37 | `*• Tipo:* ${result.type}\n` + 38 | `*• Episodios:* ${result.episode}\n` + 39 | `*• Puntuación:* ${result.score}\n` + 40 | `*• URL:* ${result.url}`; 41 | await conn.sendFile(m.chat, result.image, 'anime.jpg', AnimeInfo, m, null, fake); 42 | m.react("✅") 43 | }} catch (e) { 44 | m.reply(`\`\`\`⚠️ OCURRIO UN ERROR ⚠️\`\`\`\n\n> *Reporta el siguiente error a mi creador con el comando:*#report\n\n>>> ${e} <<<< `) 45 | console.log(e) 46 | m.react("❌") 47 | }}} 48 | handler.help = ['animeinfo'] 49 | handler.tags = ['buscadores'] 50 | handler.command = /^(anime|animeinfo)$/i; 51 | handler.register = true 52 | export default handler; 53 | -------------------------------------------------------------------------------- /plugins/herramienta-img2text.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, { conn, text, usedPrefix, command }) => { 2 | // Verificar si se proporcionó una URL de imagen 3 | if (!text) return m.reply(`*🖼️ Image2Text IA*\n\n*Por favor, ingresa la URL de una imagen*\n\nEjemplo:\n.img2text https://ejemplo.com/imagen.jpg`) 4 | 5 | try { 6 | // Enviar mensaje inicial de "Procesando" 7 | const { key } = await conn.sendMessage(m.chat, {text: `*🖼️ Image2Text IA*\n▰▱▱▱▱▱▱▱▱\n🔍 Iniciando análisis de imagen...`}, {quoted: m}); 8 | 9 | // Pequeña pausa 10 | await delay(1000); 11 | 12 | // Actualizar progreso 13 | await conn.sendMessage(m.chat, {text: `*🖼️ Image2Text IA*\n▰▰▰▱▱▱▱▱▱\n🔎 Detectando elementos...`, edit: key}); 14 | 15 | // Otra pausa 16 | await delay(1000); 17 | 18 | // Más progreso 19 | await conn.sendMessage(m.chat, {text: `*🖼️ Image2Text IA*\n▰▰▰▰▰▱▱▱▱\n📝 Generando descripción...`, edit: key}); 20 | 21 | // Codificar la URL de la imagen para la solicitud 22 | const encodedUrl = encodeURIComponent(text) 23 | 24 | // Realizar la solicitud a la API 25 | const response = await fetch(`https://api.siputzx.my.id/api/ai/image2text?url=${encodedUrl}`) 26 | 27 | // Verificar si la respuesta es válida 28 | if (!response.ok) { 29 | throw new Error('Error en la solicitud a la API') 30 | } 31 | 32 | // Parsear la respuesta JSON 33 | const data = await response.json() 34 | 35 | // Verificar si hay un resultado válido 36 | if (data && data.status && data.data) { 37 | // Enviar respuesta final editando el mismo mensaje 38 | await conn.sendMessage(m.chat, { 39 | text: `*🖼️ Image2Text IA*\n▰▰▰▰▰▰▰▰▰\n> *KantuBot*\n\n📸 *Descripción de la imagen:*\n\n${data.data}`, 40 | edit: key 41 | }); 42 | } else { 43 | throw new Error('No se recibió respuesta válida') 44 | } 45 | 46 | } catch (error) { 47 | console.error('Error en Image2Text:', error) 48 | m.reply(`❌ *Error en Image2Text IA*\n\nNo se pudo analizar la imagen. Verifica que la URL sea válida y accesible.\n\nError: ${error.message}`) 49 | } 50 | } 51 | 52 | // Función de delay 53 | const delay = (time) => new Promise(resolve => setTimeout(resolve, time)) 54 | 55 | handler.help = ['img2text'] 56 | handler.tags = ['tools'] 57 | handler.command = /^(img2text|image2text|imagetotext|i2t)$/i 58 | 59 | export default handler -------------------------------------------------------------------------------- /plugins/_antitrabas.js: -------------------------------------------------------------------------------- 1 | //By @NeKosmic || https://github.com/NeKosmic/ // 2 | 3 | import * as fs from 'fs' 4 | 5 | export async function before(m, { conn, isAdmin, isBotAdmin, usedPrefix }) { 6 | if (m.isBaileys && m.fromMe) return !0 7 | if (!m.isGroup) return !1 8 | m.isBot = m.id.startsWith('BAE5') && m.id.length === 16 || m.id.startsWith('3EB0') && m.id.length === 12 || m.id.startsWith('3EB0') && (m.id.length === 20 || m.id.length === 22) || m.id.startsWith('B24E') && m.id.length === 20; 9 | if (m.isBot) return 10 | let chat = global.db.data.chats[m.chat] 11 | let bot = global.db.data.settings[this.user.jid] || {} 12 | let delet = m.key.participant 13 | let bang = m.key.id 14 | let name = await conn.getName(m.sender) 15 | let fakemek = {key: {participant: "0@s.whatsapp.net","remoteJid": "0@s.whatsapp.net"},"message": {"groupInviteMessage": {"groupJid": "5217121649714-5217121649714@g.us","inviteCode": "m","groupName": "P", "caption": '𝙺𝚊𝚗𝚝𝚞 - 𝙱𝚘𝚝', 'jpegThumbnail': null}}} 16 | if (chat.antiTraba && m.text.length > 5000) { //Cantidad máxima de caracteres aceptados en un mensaje// 17 | if (isAdmin) return conn.sendMessage(m.chat, { text: `⚠️El administrador @${m.sender.split("@")[0]} acaba de enviar un texto que contiene muchos caracteres -.-!`, mentions: [m.sender] }, { quoted: fakemek }) 18 | conn.sendButton(m.chat, `*[ ! ] Se detecto un mensaje que contiene muchos caracteres [ ! ]*\n`, `${isBotAdmin ? '' : 'No soy administrador, no puedo hacer nada :/'}`, null, [['ᴅᴇsᴀᴄᴛɪᴠᴀ ᴀɴᴛɪᴛʀᴀʙᴀ', `/disable antitraba`]], null, null, m) 19 | //await conn.sendButton(m.chat, `*[ ! ] Se detecto un mensaje que contiene muchos caracteres [ ! ]*\n`, `${isBotAdmin ? '' : 'No soy administrador, no puedo hacer nada :/'}`, author, ['[ ]', usedPrefix+'apagar antitraba'], fakemek ) 20 | if (isBotAdmin) { 21 | conn.sendMessage(m.chat, { delete: { remoteJid: m.chat, fromMe: false, id: bang, participant: delet }}) 22 | setTimeout(() => { 23 | conn.sendMessage(m.chat, { text: `Marcar el chat como leido ✓\n${"\n".repeat(400)}\n• El número : wa.me/${m.sender.split("@")[0]}\n• Alias : ${name}\n‼️Acaba de enviar un texto que contiene muchos caracteres que puede ocasionar fallos en los dispositivos`, mentions: [m.sender] }, { quoted: fakemek }) 24 | }, 0) 25 | setTimeout(() => { 26 | conn.groupParticipantsUpdate(m.chat, [m.sender], 'remove') 27 | }, 1000)} else if (!bot.restrict) return m.reply(`Este comando esta desactivado por mi jefe`) 28 | } 29 | return !0 30 | } 31 | -------------------------------------------------------------------------------- /plugins/sticker-wm.js: -------------------------------------------------------------------------------- 1 | import {addExif} from '../lib/sticker.js'; 2 | const handler = async (m, {conn, text}) => { 3 | if (!m.quoted) return conn.reply(m.chat, '╰⊱❗️⊱ *𝙇𝙊 𝙐𝙎𝙊́ 𝙈𝘼𝙇* ⊱❗️⊱╮\n\n𝙍𝙀𝙎𝙋𝙊𝙉𝘿𝙀 𝘼𝙇 𝙎𝙏𝙄𝘾𝙆𝙀𝙍 𝙌𝙐𝙀 𝘿𝙀𝙎𝙀𝘼 𝘼𝙂𝙍𝙀𝙂𝘼 𝙐𝙉 𝙋𝘼𝙌𝙐𝙀𝙏𝙀 𝙔 𝙐𝙉 𝙉𝙊𝙈𝘽𝙍𝙀', m, {contextInfo: {externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: wm, body: '', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}}) 4 | 5 | let stiker = false; 6 | try { 7 | let [packname, ...author] = text.split('|'); 8 | author = (author || []).join('|'); 9 | const mime = m.quoted.mimetype || ''; 10 | if (!/webp/.test(mime)) return conn.reply(m.chat, '╰⊱❗️⊱ *𝙇𝙊 𝙐𝙎𝙊́ 𝙈𝘼𝙇* ⊱❗️⊱╮\n\n𝙍𝙀𝙎𝙋𝙊𝙉𝘿𝙀 𝘼𝙇 𝙎𝙏𝙄𝘾𝙆𝙀𝙍 𝙌𝙐𝙀 𝘿𝙀𝙎𝙀𝘼 𝘼𝙂𝙍𝙀𝙂𝘼 𝙐𝙉 𝙋𝘼𝙌𝙐𝙀𝙏𝙀 𝙔 𝙐𝙉 𝙉𝙊𝙈𝘽𝙍𝙀', m, {contextInfo: {externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: wm, body: '', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}}) 11 | const img = await m.quoted.download(); 12 | if (!img) return conn.reply(m.chat, '╰⊱❗️⊱ *𝙇𝙊 𝙐𝙎𝙊́ 𝙈𝘼𝙇* ⊱❗️⊱╮\n\n𝙍𝙀𝙎𝙋𝙊𝙉𝘿𝙀 𝘼𝙇 𝙎𝙏𝙄𝘾𝙆𝙀𝙍 𝙌𝙐𝙀 𝘿𝙀𝙎𝙀𝘼 𝘼𝙂𝙍𝙀𝙂𝘼 𝙐𝙉 𝙋𝘼𝙌𝙐𝙀𝙏𝙀 𝙔 𝙐𝙉 𝙉𝙊𝙈𝘽𝙍𝙀', m, {contextInfo: {externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: wm, body: '', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}}) 13 | stiker = await addExif(img, packname || global.packname, author || global.author); 14 | } catch (e) { 15 | console.error(e); 16 | if (Buffer.isBuffer(e)) stiker = e; 17 | } finally { 18 | if (stiker) conn.sendFile(m.chat, stiker, 'sticker.webp', '',m, true, { contextInfo: { 'forwardingScore': 200, 'isForwarded': false, externalAdReply:{ showAdAttribution: false, title: wm, body: ``, mediaType: 2, sourceUrl: redes.getRandom(), thumbnail: img.getRandom()}}}, { quoted: m }) 19 | else return conn.reply(m.chat, '╰⊱❗️⊱ *𝙇𝙊 𝙐𝙎𝙊́ 𝙈𝘼𝙇* ⊱❗️⊱╮\n\n𝙍𝙀𝙎𝙋𝙊𝙉𝘿𝙀 𝘼𝙇 𝙎𝙏𝙄𝘾𝙆𝙀𝙍 𝙌𝙐𝙀 𝘿𝙀𝙎𝙀𝘼 𝘼𝙂𝙍𝙀𝙂𝘼 𝙐𝙉 𝙋𝘼𝙌𝙐𝙀𝙏𝙀 𝙔 𝙐𝙉 𝙉𝙊𝙈𝘽𝙍𝙀', m, {contextInfo: {externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: wm, body: '', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}}) 20 | }} 21 | handler.help = ['wm |']; 22 | handler.tags = ['sticker']; 23 | handler.command = /^take|robar|wm$/i; 24 | handler.register = true 25 | export default handler; 26 | -------------------------------------------------------------------------------- /plugins/jadibot-serbot-bots.js: -------------------------------------------------------------------------------- 1 | import ws from 'ws'; 2 | async function handler(m, { conn: _envio, usedPrefix }) { 3 | const users = [...new Set([...global.conns.filter((conn) => conn.user && conn.ws.socket && conn.ws.socket.readyState !== ws.CLOSED).map((conn) => conn)])]; 4 | function convertirMsADiasHorasMinutosSegundos(ms) { 5 | var segundos = Math.floor(ms / 1000); 6 | var minutos = Math.floor(segundos / 60); 7 | var horas = Math.floor(minutos / 60); 8 | var días = Math.floor(horas / 24); 9 | segundos %= 60; 10 | minutos %= 60; 11 | horas %= 24; 12 | var resultado = ""; 13 | if (días !== 0) { 14 | resultado += días + " días, "; 15 | } 16 | if (horas !== 0) { 17 | resultado += horas + " horas, "; 18 | } 19 | if (minutos !== 0) { 20 | resultado += minutos + " minutos, "; 21 | } 22 | if (segundos !== 0) { 23 | resultado += segundos + " segundos"; 24 | } 25 | return resultado; 26 | } 27 | const message = users.map((v, index) => `👉🏻 wa.me/${v.user.jid.replace(/[^0-9]/g, '')}?text=${usedPrefix}estado (${v.user.name || '-'})\n*🔰 Tiempo activo :* ${ v.uptime ? convertirMsADiasHorasMinutosSegundos(Date.now() - v.uptime) : "Desconocido"}`).join('\n\n') 28 | const replyMessage = message.length === 0 ? '*No hay Sub bots conectado, verifique mas tardes.*' : message; 29 | const totalUsers = users.length; 30 | const responseMessage = `*🤖 Aquí tienes la lista de algunos sub bots (jadibot/serbot) 🤖️*\n\n*👉🏻 Puedes contactarlos para ver si se unen a tu grupo*\n\n*Te pedimos de favor que:*\n*1.- Seas amable ✅*\n*2.- No insistas ni discutas ✅*\n\n*✳ ️Si le aparece el siguiente texto en blanco es que no hay ningún sub bot disponible en este momento inténtelo mas tarde*\n\n*_⚠ NOTA: ️ELLOS SON PERSONAS QUE NO CONOCEMOS.. POR LO QUE EL EQUIPO DE KantuBot NO SE HACE RESPONSABLE DE LO QUE PUEDA OCURRIR AHI.._*\n\n*🤖 SUBBOTS CONECTADO :* ${totalUsers || '0'}\n\n${replyMessage.trim()}`.trim(); 31 | await _envio.sendMessage(m.chat, { text: responseMessage, contextInfo: {mentionedJid: _envio.parseMention(responseMessage), externalAdReply :{ mediaUrl: null, mediaType: 1, description: null, title: wm, body: '𝐒𝐮𝐩𝐞𝐫 𝐁𝐨𝐭 𝐃𝐞 𝐖𝐡𝐚𝐭𝐬𝐀𝐩𝐩', previewType: 0, thumbnail: img.getRandom(), sourceUrl: redes.getRandom()}}}, {quoted: m})} 32 | //_envio.sendMessage(m.chat, {text: responseMessage, mentions: _envio.parseMention(responseMessage)}, {quoted: m})} 33 | handler.command = handler.help = ['listjadibot', 'bots']; 34 | handler.tags = ['jadibot']; 35 | handler.register = true 36 | export default handler; 37 | -------------------------------------------------------------------------------- /plugins/sticker-qc.js: -------------------------------------------------------------------------------- 1 | import { sticker } from '../lib/sticker.js'; 2 | import axios from 'axios'; 3 | const handler = async (m, {conn, args, usedPrefix, command}) => { 4 | let user = global.db.data.users[m.sender] 5 | let f = user.packname || global.packname 6 | let g = (user.packname && user.author ? user.author : (user.packname && !user.author ? '' : global.author)) 7 | let text 8 | if (args.length >= 1) { 9 | text = args.slice(0).join(" "); 10 | } else if (m.quoted && m.quoted.text) { 11 | text = m.quoted.text; 12 | } else return m.reply("╰⊱❗️⊱ *𝙇𝙊 𝙐𝙎𝙊́ 𝙈𝘼𝙇 * ⊱❗️⊱╮\n\n𝘼𝙂𝙍𝙀𝙂𝙐𝙀́ 𝙐𝙉 𝙏𝙀𝙓𝙏𝙊 𝙋𝘼𝙍𝘼 𝘾𝙍𝙀𝘼𝙍 𝙀𝙇 𝙎𝙏𝙄𝘾𝙆𝙀𝙍") 13 | if (!text) return m.reply("╰⊱❗️⊱ *𝙇𝙊 𝙐𝙎𝙊́ 𝙈𝘼𝙇* ⊱❗️⊱╮\n\n𝘼𝙂𝙍𝙀𝙂𝙐𝙀́ 𝙐𝙉 𝙏𝙀𝙓𝙏𝙊 𝙋𝘼𝙍𝘼 𝘾𝙍𝙀𝘼𝙍 𝙀𝙇 𝙎𝙏𝙄𝘾𝙆𝙀𝙍") 14 | conn.fakeReply(m.chat, `*Esto puede demorar unos minutos*`, '0@s.whatsapp.net', `No haga spam gil`, 'status@broadcast', null, fake) 15 | const who = m.mentionedJid && m.mentionedJid[0] ? m.mentionedJid[0] : m.fromMe ? conn.user.jid : m.sender; 16 | const mentionRegex = new RegExp(`@${who.split('@')[0].replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*`, 'g'); 17 | const mishi = text.replace(mentionRegex, ''); 18 | if (mishi.length > 65) return m.reply('*⚠️ El texto no puede tener mas de 65 caracteres*'); 19 | const pp = await conn.profilePictureUrl(who).catch((_) => 'https://telegra.ph/file/24fa902ead26340f3df2c.png') 20 | const nombre = await conn.getName(who) 21 | const obj = {"type": "quote", "format": "png", "backgroundColor": "#000000", "width": 512, "height": 768, "scale": 2, "messages": [{"entities": [], "avatar": true, "from": {"id": 1, "name": `${who?.name || nombre}`, "photo": {url: `${pp}`}}, "text": mishi, "replyMessage": {}}]}; 22 | const json = await axios.post('https://bot.lyo.su/quote/generate', obj, {headers: {'Content-Type': 'application/json'}}); 23 | const buffer = Buffer.from(json.data.result.image, 'base64'); 24 | let stiker = await await sticker(buffer, false, f, g) 25 | //sticker(buffer, false, global.packname, global.author); 26 | if (stiker) return conn.sendFile(m.chat, stiker, 'sticker.webp', '',m, true, { contextInfo: { 'forwardingScore': 200, 'isForwarded': false, externalAdReply:{ showAdAttribution: false, title: wm, body: vs, mediaType: 2, sourceUrl: [nna, nn, md, yt].getRandom(), thumbnail: imagen4}}}, { quoted: m }) 27 | } 28 | handler.help = ['qc']; 29 | handler.tags = ['sticker']; 30 | handler.command = /^(qc)$/i; 31 | handler.register = true 32 | export default handler; 33 | -------------------------------------------------------------------------------- /plugins/owner-cmd.js: -------------------------------------------------------------------------------- 1 | const handler = async (m, {conn, text, usedPrefix, command}) => { 2 | global.db.data.sticker = global.db.data.sticker || {}; 3 | 4 | if (command == 'addcmd' || command == 'setcmd') { 5 | if (!m.quoted) throw '⚠️ ʀᴇsᴘᴏɴᴅᴇ ᴀʟ ᴜɴ sᴛɪᴄᴋᴇʀ ᴏ ɪᴍᴀɢᴇɴ ᴀʟ ᴄᴜᴀʟ ᴅᴇsᴇᴀ ᴀɢʀᴇɢᴀʀ ᴜɴ ᴄᴏᴍᴀɴᴅᴏ ᴏ ᴛᴇxᴛᴏ'; 6 | if (!m.quoted.fileSha256) throw '⚠️ sᴏʟᴏ ᴘᴜᴇᴅᴇs ᴀsɪɢɴᴀʀᴀʀ ᴄᴏᴍᴀɴᴅᴏs ᴏ ᴛᴇxᴛᴏs ᴀ sᴛɪᴄᴋᴇʀ ᴇ ɪᴍᴀɢᴇɴ*'; 7 | if (!text) throw `*⚠️ ʀᴇsᴘᴏɴᴅᴇ ᴀʟ ᴜɴ sᴛɪᴄᴋᴇʀ ᴏ ɪᴍᴀɢʀɴ ᴀʟ ᴄᴜᴀʟ ᴅᴇsᴇᴀ ᴀɢʀᴇɢᴀʀ ᴜɴ ᴄᴏᴍᴀɴᴅᴏ ᴏ ᴛᴇxᴛᴏ*\n*• ᴇᴊᴇᴍᴘʟᴏ:* ${usedPrefix + command} * 28 | 29 | ${Object.entries(global.db.data.sticker).map(([key, value], index) => `*${index + 1}.-*\n*ᴄᴏᴅɪɢᴏ:* ${value.locked ? `_*(ʙʟᴏǫᴜᴇᴀᴅᴏ)*_ ${key}` : key}\n*ᴄᴏᴍᴀɴᴅᴏ/ᴛᴇxᴛᴏ:* ${value.text}`).join('\n\n')} 30 | `.trim(), null, {mentions: Object.values(global.db.data.sticker).map((x) => x.mentionedJid).reduce((a, b) => [...a, ...b], [])}); 31 | }} 32 | handler.help = ['addcmd', 'delcmd', 'listcmd'] 33 | handler.tags = ['owner'] 34 | handler.command = ['setcmd', 'addcmd', 'cmdadd', 'cmdset', 'delcmd', 'listcmd', 'cmdlist']; 35 | handler.rowner = true; 36 | export default handler; 37 | -------------------------------------------------------------------------------- /plugins/_antilink2.js: -------------------------------------------------------------------------------- 1 | let linkRegex = /https:/i 2 | export async function before(m, { isAdmin, isBotAdmin, text }) { 3 | if (m.isBaileys && m.fromMe) 4 | return !0 5 | if (!m.isGroup) return !1 6 | 7 | // Asegurarse de que chat existe y tiene un valor predeterminado 8 | let chat = global.db.data.chats[m.chat] || {}; 9 | 10 | let delet = m.key.participant 11 | let bang = m.key.id 12 | const user = `@${m.sender.split`@`[0]}`; 13 | 14 | // Asegurarse de que bot tiene un valor predeterminado 15 | let bot = global.db.data.settings[this.user.jid] || {}; 16 | 17 | const isGroupLink = linkRegex.exec(m.text) 18 | 19 | // Comprobar si chat.antiLink2 existe antes de usarlo 20 | if (chat && chat.antiLink2 && isGroupLink && !isAdmin) { 21 | if (isBotAdmin) { 22 | try { 23 | const linkThisGroup = `https://chat.whatsapp.com/${await this.groupInviteCode(m.chat)}` 24 | const linkThisGroup2 = `https://www.youtube.com/` 25 | const linkThisGroup3 = `https://youtu.be/` 26 | if (m.text.includes(linkThisGroup)) return !0 27 | if (m.text.includes(linkThisGroup2)) return !0 28 | if (m.text.includes(linkThisGroup3)) return !0 29 | } catch (e) { 30 | console.error('Error al obtener el código de invitación del grupo', e); 31 | } 32 | } 33 | 34 | await conn.sendMessage(m.chat, { 35 | text: `*「 ANTILINK DETECTADO 」*\n\n${user} 🤨 Rompiste las reglas del Grupo sera eliminado....`, 36 | mentions: [m.sender] 37 | }, {quoted: m}) 38 | 39 | if (!isBotAdmin) return m.reply('*Te salvarte gil, no soy admin no te puedo eliminar*') 40 | 41 | if (isBotAdmin) { 42 | try { 43 | await conn.sendMessage(m.chat, { 44 | delete: { 45 | remoteJid: m.chat, 46 | fromMe: false, 47 | id: bang, 48 | participant: delet 49 | } 50 | }) 51 | 52 | let responseb = await conn.groupParticipantsUpdate(m.chat, [m.sender], 'remove') 53 | if (responseb[0].status === "404") return 54 | } catch (e) { 55 | console.error('Error al eliminar mensaje o participante', e); 56 | } 57 | } else if (!bot.restrict) { 58 | return m.reply('*𝙀𝙡 𝙥𝙧𝙤𝙥𝙞𝙚𝙩𝙖𝙧𝙞𝙤 𝙙𝙚𝙡 𝙗𝙤𝙩 𝙣𝙤 𝙩𝙞𝙚𝙣𝙚 𝙖𝙘𝙩𝙞𝙫𝙖𝙙𝙤 𝙚𝙡 𝙧𝙚𝙨𝙩𝙧𝙞𝙘𝙘𝙞𝙤́𝙣 (𝙚𝙣𝙖𝙗𝙡𝙚 𝙧𝙚𝙨𝙩𝙧𝙞𝙘𝙩) 𝙘𝙤𝙣𝙩𝙖𝙘𝙩𝙚 𝙘𝙤𝙣 𝙚𝙡 𝙥𝙖𝙧𝙖 𝙦𝙪𝙚 𝙡𝙤𝙨 𝙝𝙖𝙗𝙞𝙡𝙞𝙩𝙚*') 59 | } 60 | } 61 | return !0 62 | } 63 | -------------------------------------------------------------------------------- /plugins/rpg-adel.js: -------------------------------------------------------------------------------- 1 | let handler = async (m, { conn, command, text }) => { 2 | 3 | if (command == 'eliminardiamantes' || command == 'quitardiamantes' || command == 'dellimit') { 4 | const pajak = 0; 5 | let who; 6 | if (m.isGroup) who = m.mentionedJid[0]; 7 | else who = m.chat; 8 | if (!who) return m.reply(`⚠️ etiqueta a una persona con el @tag`) 9 | const txt = text.replace('@' + who.split`@`[0], '').trim(); 10 | if (!txt) return m.reply(`⚠️ Ingresa la cantidad que desea eliminar`) 11 | if (isNaN(txt)) return m.reply(`⚠️ Falta el Num`) 12 | const dmt = parseInt(txt); 13 | let limit = dmt; 14 | const pjk = Math.ceil(dmt * pajak); 15 | limit += pjk; 16 | if (limit < 1) return m.reply(`⚠️ No tiene `) 17 | const users = global.db.data.users; 18 | 19 | // Verificar que no se eliminen más diamantes de los que tiene 20 | if (dmt > users[who].limit) { 21 | return m.reply(`⚠️ No puedes eliminar más diamantes de los que tiene.\n*Diamantes actuales:* ${users[who].limit}`) 22 | } 23 | 24 | users[who].limit -= dmt; 25 | m.reply(`*≡ 💎 SE ELIMINADO:* 26 | ┏╍╍╍╍╍╍╍╍╍╍╍╍╍ 27 | ┃• *𝗍᥆𝗍ᥲᥣ:* ${dmt} 28 | ┃• *𝖣𝗂ᥲ𝗆ᥲ𝗇𝗍ᥱ𝗌 𝗋ᥱ𝗌𝗍ᥲ𝗇𝗍ᥱ𝗌:* ${users[who].limit} 29 | ┗╍╍╍╍╍╍╍╍╍╍╍╍╍`)} 30 | 31 | if (command == 'eliminarxp' || command == 'delexp' || command == 'delxp') { 32 | const pajak = 0; 33 | let who; 34 | if (m.isGroup) who = m.mentionedJid[0]; 35 | else who = m.chat; 36 | if (!who) return m.reply(`⚠️ etiqueta a una persona con el @tag`) 37 | const txt = text.replace('@' + who.split`@`[0], '').trim(); 38 | if (!txt) return m.reply(`⚠️ Ingresa la cantidad que desea eliminar`) 39 | if (isNaN(txt)) return m.reply(`⚠️ Falta el Num`) 40 | const xp = parseInt(txt); 41 | let exp = xp; 42 | const pjk = Math.ceil(xp * pajak); 43 | exp += pjk; 44 | if (exp < 1) return m.reply(`⚠️ Se `) 45 | const users = global.db.data.users; 46 | 47 | // Verificar que no se eliminen más XP de los que tiene 48 | if (xp > users[who].exp) { 49 | return m.reply(`⚠️ No puedes eliminar más XP de los que tiene.\n*XP actual:* ${users[who].exp}`) 50 | } 51 | 52 | users[who].exp -= xp; 53 | m.reply(`*≡ EXP ELIMINADO:* 54 | ┏╍╍╍╍╍╍╍╍╍╍╍╍╍ 55 | ┃• *𝗍᥆𝗍ᥲᥣ:* ${xp} 56 | ┃• *𝖷𝖯 𝗋ᥱ𝗌𝗍ᥲ𝗇𝗍ᥱ:* ${users[who].exp} 57 | ┗╍╍╍╍╍╍╍╍╍╍╍╍╍`) 58 | }} 59 | handler.help = ['delexp', 'dellimit'] 60 | handler.tags = ['owner'] 61 | handler.command = /^(eliminardiamantes|quitardiamantes|dellimit|eliminarxp|delexp|delxp)$/i 62 | handler.rowner = true 63 | handler.register = true 64 | export default handler 65 | -------------------------------------------------------------------------------- /plugins/owner-banlist.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch' 2 | let handler = async (m, { conn, isOwner }) => { 3 | let 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" } 4 | 5 | if (command == 'listban' || command == 'listbaneado') { 6 | let chats = Object.entries(global.db.data.chats).filter(chat => chat[1].isBanned) 7 | let users = Object.entries(global.db.data.users).filter(user => user[1].banned) 8 | let caption = `╭•·––| 👥 𝐔𝐒𝐔𝐀𝐑𝐈𝐎𝐒 𝐁𝐀𝐍𝐄𝐀𝐃𝐎𝐒 |––·• 9 | │ Total: ${users.length} ${users ? '\n' + users.map(([jid], i) => ` 10 | │ ${isOwner ? '@' + jid.split`@`[0] : jid}`.trim()).join('\n') : '├'} 11 | ╰•·–––––––––––––––––––·• 12 | 13 | ╭•·––| 💬 𝘾𝙃𝘼𝙏𝙎 𝘽𝘼𝙉𝙀𝘼𝘿𝙊𝙎 |––·• 14 | │ Total: ${chats.length} ${chats ? '\n' + chats.map(([jid], i) => ` 15 | │ ${isOwner ? '@' + jid.split`@`[0] : jid}`.trim()).join('\n') : '├'} 16 | ╰•·–––––––––––––––––––·• 17 | `.trim() 18 | m.reply(caption, null, {mentions: conn.parseMention(caption)}) 19 | } 20 | 21 | if (command == 'listablock' || command == 'blocklist' || command == 'listabloqueados') { 22 | await conn.fetchBlocklist().then(async data => { 23 | let txt = `📛 𝗟𝗜𝗦𝗧𝗔 𝗗𝗘 𝗕𝗟𝗢𝗤𝗨𝗘𝗔𝗗𝗢𝗦\n\n*Total :* ${data.length}\n\n╭━━━[ *${vs} 𓃠* ]━━━⬣\n` 24 | for (let i of data) { 25 | txt += `┃🚫 @${i.split("@")[0]}\n` 26 | } 27 | txt += "╰━━━━━━━⬣\n\n*Por favor no llame para evitar ser Bloqueado, Gracias.*" 28 | return conn.reply(m.chat, txt, fkontak, m, { mentions: await conn.parseMention(txt) }) 29 | /*conn.sendButton(m.chat, txt, `*Por favor no llame para evitar ser Bloqueado, Gracias.*\n\n*Please do not call to avoid being Blocked, Thank you.*\n\n` + wm, null, [ 30 | ['𝗠 𝗘 𝗡 𝗨 ☘️', '/menu']], m, { mentions: await conn.parseMention(txt) })*/ 31 | }).catch(err => { 32 | console.log(err); 33 | return conn.reply(m.chat, `${rg}𝙉𝘼𝘿𝙄𝙀 𝙃𝘼 𝙎𝙄𝘿𝙊 𝘽𝙇𝙊𝙌𝙐𝙀𝘼𝘿𝙊`, m) 34 | /*conn.sendButton(m.chat, `${rg}𝙉𝘼𝘿𝙄𝙀 𝙃𝘼 𝙎𝙄𝘿𝙊 𝘽𝙇𝙊𝙌𝙐𝙀𝘼𝘿𝙊\n\n𝙉𝙊 𝙊𝙉𝙀 𝙃𝘼𝙎 𝘽𝙀𝙀𝙉 𝘽𝙇𝙊𝘾𝙆𝙀𝘿`, wm, gata, [ 35 | ['𝗠 𝗘 𝗡 𝗨 ☘️', '/menu']], os.getRandom())*/ 36 | }) 37 | }} 38 | handler.help = ['listban', 'listablock'] 39 | handler.tags = ['owner'] 40 | handler.command = /^(listban|listbaneado|listablock|blocklist|listabloqueados)$/i 41 | //handler.rowner = true 42 | export default handler 43 | -------------------------------------------------------------------------------- /plugins/herramientas-hd.js: -------------------------------------------------------------------------------- 1 | import FormData from "form-data" 2 | import Jimp from "jimp" 3 | 4 | const handler = async (m, {conn, usedPrefix, command}) => { 5 | try { 6 | let q = m.quoted ? m.quoted : m 7 | let mime = (q.msg || q).mimetype || q.mediaType || "" 8 | 9 | if (!mime.startsWith('image')) return m.reply(`⚠️ 𝐑𝐞𝐬𝐩𝐨𝐧𝐝𝐞 𝐚 𝐮𝐧𝐚 𝐢𝐦𝐚𝐠𝐞𝐧!`) 10 | await m.react('⌛') 11 | 12 | let img = await q.download?.() 13 | if (!img) return m.reply(`⚠️ No se pudo descargar la imagen. Por favor intenta nuevamente.`) 14 | let pr = await remini(img, "enhance") 15 | 16 | if (!pr) return m.reply(`⚠️ Hubo un problema al procesar la imagen. Intenta nuevamente más tarde.`) 17 | await conn.sendFile(m.chat, pr, 'thumbnail.jpg', "¡Imagen procesada!", m, null, fake) 18 | await m.react('✅') 19 | } catch (e) { 20 | await m.react('❌') 21 | console.error(e) 22 | m.reply(`⚠️ Ocurrió un error: ${e.message}`) 23 | }} 24 | handler.help = ["hd"] 25 | handler.tags = ["tools"] 26 | handler.command = ["remini", "hd", "enhance"] 27 | handler.register = true 28 | handler.limit = 1 29 | export default handler 30 | 31 | async function remini(imageData, operation) { 32 | return new Promise(async (resolve, reject) => { 33 | const availableOperations = ["enhance", "recolor", "dehaze"] 34 | if (!availableOperations.includes(operation)) { 35 | operation = availableOperations[0] 36 | } 37 | 38 | const baseUrl = "https://inferenceengine.vyro.ai/" + operation + ".vyro" 39 | const formData = new FormData() 40 | formData.append("image", Buffer.from(imageData), {filename: "enhance_image_body.jpg", contentType: "image/jpeg"}) 41 | formData.append("model_version", 1, {"Content-Transfer-Encoding": "binary", contentType: "multipart/form-data; charset=utf-8"}) 42 | 43 | formData.submit({ 44 | url: baseUrl, 45 | host: "inferenceengine.vyro.ai", 46 | path: "/" + operation, 47 | protocol: "https:", 48 | headers: { 49 | "User-Agent": "okhttp/4.9.3", 50 | "Connection": "Keep-Alive", 51 | "Accept-Encoding": "gzip" 52 | } 53 | }, function (err, res) { 54 | if (err) { 55 | reject(new Error(`Error en la solicitud a la API: ${err.message}`)) 56 | } 57 | const chunks = [] 58 | res.on("data", function (chunk) { chunks.push(chunk) }) 59 | res.on("end", function () { resolve(Buffer.concat(chunks)) }) 60 | res.on("error", function (err) { 61 | reject(new Error(`Error al recibir la respuesta: ${err.message}`)) 62 | }) 63 | }) 64 | }) 65 | } 66 | -------------------------------------------------------------------------------- /plugins/sticker-sticker.js: -------------------------------------------------------------------------------- 1 | import { sticker } from '../lib/sticker.js' 2 | import uploadFile from '../lib/uploadFile.js' 3 | import uploadImage from '../lib/uploadImage.js' 4 | import { webp2png } from '../lib/webp2mp4.js' 5 | 6 | let handler = async (m, { conn, args, usedPrefix, command }) => { 7 | let user = global.db.data.users[m.sender] 8 | let stiker = false 9 | let stick = args.join(" ").split("|"); 10 | let f = user.packname || global.packname 11 | let g = (user.packname && user.author ? user.author : (user.packname && !user.author ? '' : global.author)) 12 | try { 13 | let q = m.quoted ? m.quoted : m 14 | let mime = (q.msg || q).mimetype || q.mediaType || '' 15 | if (/webp|image|video/g.test(mime)) { 16 | if (/video/g.test(mime)) if ((q.msg || q).seconds > 18) return m.reply('⚠️ ¿Dónde has visto un sticker de 15 segundos, pendejo? Haz el video más corto, con un máximo de 12 segundos.') 17 | let img = await q.download?.() 18 | if (!img) return m.reply(`*Y la imagen? 🤔 Responde a una imagen para hacer el sticker. Usa:* ${usedPrefix + command}`) 19 | let out 20 | try { 21 | stiker = await sticker(img, false, f, g) 22 | } catch (e) { 23 | console.error(e) 24 | } finally { 25 | //conn.reply(m.chat, `Calma crack estoy haciendo tu sticker 👏\n\n> *Recuerda los video son de 7 segundos*`, m) 26 | if (!stiker) { 27 | if (/webp/g.test(mime)) out = await webp2png(img) 28 | else if (/image/g.test(mime)) out = await uploadImage(img) 29 | else if (/video/g.test(mime)) out = await uploadFile(img) 30 | if (typeof out !== 'string') out = await uploadImage(img) 31 | stiker = await sticker(false, out, f, g) 32 | }}} else if (args[0]) { 33 | if (isUrl(args[0])) stiker = await sticker(false, args[0], f, g) 34 | else return m.reply('URL invalido') 35 | }} catch (e) { 36 | console.error(e) 37 | if (!stiker) stiker = e 38 | } finally { 39 | if (stiker) conn.sendFile(m.chat, stiker, 'sticker.webp', '',m, true, { contextInfo: { 'forwardingScore': 200, 'isForwarded': false, externalAdReply:{ showAdAttribution: false, title: wm, body: ``, mediaType: 2, sourceUrl: [nna, nn, md, yt].getRandom(), thumbnail: imagen4}}}, { quoted: m }) 40 | else return m.reply(`*🫵 Responde a un video o imagen*\n> *Usa:* ${usedPrefix + command}`) 41 | }} 42 | handler.help = ['sticker'] 43 | handler.tags = ['sticker'] 44 | handler.command = ['s', 'sticker'] 45 | handler.register = true 46 | export default handler 47 | 48 | const isUrl = (text) => { 49 | 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')) 50 | } 51 | -------------------------------------------------------------------------------- /plugins/audio-efectos.js: -------------------------------------------------------------------------------- 1 | import { unlinkSync, readFileSync } from 'fs' 2 | import { join } from 'path' 3 | import { exec } from 'child_process' 4 | 5 | let handler = async (m, { conn, args, __dirname, usedPrefix, command }) => { 6 | try { 7 | let q = m.quoted ? m.quoted : m 8 | let mime = ((m.quoted ? m.quoted : m.msg).mimetype || '') 9 | let set 10 | if (/bass/.test(command)) set = '-af equalizer=f=94:width_type=o:width=2:g=30' 11 | if (/blown/.test(command)) set = '-af acrusher=.1:1:64:0:log' 12 | if (/deep/.test(command)) set = '-af atempo=4/4,asetrate=44500*2/3' 13 | if (/earrape/.test(command)) set = '-af volume=12' 14 | if (/fast/.test(command)) set = '-filter:a "atempo=1.63,asetrate=44100"' 15 | if (/fat/.test(command)) set = '-filter:a "atempo=1.6,asetrate=22100"' 16 | if (/nightcore/.test(command)) set = '-filter:a atempo=1.06,asetrate=44100*1.25' 17 | if (/reverse/.test(command)) set = '-filter_complex "areverse"' 18 | 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"' 19 | if (/slow/.test(command)) set = '-filter:a "atempo=0.7,asetrate=44100"' 20 | if (/smooth/.test(command)) set = '-filter:v "minterpolate=\'mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120\'"' 21 | if (/tupai|squirrel|chipmunk/.test(command)) set = '-filter:a "atempo=0.5,asetrate=65100"' 22 | if (/audio/.test(mime)) { 23 | let ran = getRandom('.mp3') 24 | let filename = join(__dirname, '../tmp/' + ran) 25 | let media = await q.download(true) 26 | exec(`ffmpeg -i ${media} ${set} ${filename}`, async (err, stderr, stdout) => { 27 | await unlinkSync(media) 28 | if (err) throw `_*Error!*_` 29 | let buff = await readFileSync(filename) 30 | conn.sendFile(m.chat, buff, ran, null, m, true, { 31 | type: 'audioMessage', 32 | ptt: true 33 | })}) 34 | } else throw `⚡ 𝙍𝙚𝙨𝙥𝙤𝙣𝙙𝙖𝙣 𝙖𝙡 𝙖𝙪𝙙𝙞𝙤 𝙤 𝙣𝙤𝙩𝙖 𝙙𝙚𝙡 𝙫𝙤𝙯 𝙥𝙖𝙧𝙖 𝙢𝙤𝙙𝙞𝙛𝙞𝙘𝙖𝙧 𝙪𝙨𝙚 𝙚𝙨𝙩𝙚 𝙘𝙤𝙢𝙖𝙣𝙙𝙤 *${usedPrefix + command}*` 35 | } catch (e) { 36 | m.reply(`\`\`\`⚠️ OCURRIO UN ERROR ⚠️\`\`\`\n\n> *Reporta el siguiente error a mi creador con el comando:*#report\n\n>>> ${e} <<<< `) 37 | console.log(e) 38 | }} 39 | handler.help = ['bass', 'blown', 'deep', 'earrape', 'fast', 'fat', 'nightcore', 'reverse', 'robot', 'slow', 'smooth', 'tupai'].map(v => v + ' [vn]') 40 | handler.tags = ['efec'] 41 | handler.command = /^(bass|blown|deep|earrape|fas?t|nightcore|reverse|robot|slow|smooth|tupai|squirrel|chipmunk)$/i 42 | handler.register = true 43 | export default handler 44 | 45 | const getRandom = (ext) => { 46 | return `${Math.floor(Math.random() * 10000)}${ext}`} 47 | -------------------------------------------------------------------------------- /lib/converter.js: -------------------------------------------------------------------------------- 1 | import {promises} from 'fs'; 2 | import {join} from 'path'; 3 | import {spawn} from 'child_process'; 4 | 5 | function ffmpeg(buffer, args = [], ext = '', ext2 = '') { 6 | return new Promise(async (resolve, reject) => { 7 | try { 8 | const tmp = join(global.__dirname(import.meta.url), '../tmp', + new Date + '.' + ext); 9 | const out = tmp + '.' + ext2; 10 | await promises.writeFile(tmp, buffer); 11 | spawn('ffmpeg', [ 12 | '-y', 13 | '-i', tmp, 14 | ...args, 15 | out, 16 | ]) 17 | .on('error', reject) 18 | .on('close', async (code) => { 19 | try { 20 | await promises.unlink(tmp); 21 | if (code !== 0) return reject(code); 22 | resolve({ 23 | data: await promises.readFile(out), 24 | filename: out, 25 | delete() { 26 | return promises.unlink(out); 27 | }, 28 | }); 29 | } catch (e) { 30 | reject(e); 31 | } 32 | }); 33 | } catch (e) { 34 | reject(e); 35 | } 36 | }); 37 | } 38 | 39 | /** 40 | * Convert Audio to Playable WhatsApp Audio 41 | * @param {Buffer} buffer Audio Buffer 42 | * @param {String} ext File Extension 43 | * @return {Promise<{data: Buffer, filename: String, delete: Function}>} 44 | */ 45 | function toPTT(buffer, ext) { 46 | return ffmpeg(buffer, [ 47 | '-vn', 48 | '-c:a', 'libopus', 49 | '-b:a', '128k', 50 | '-vbr', 'on', 51 | ], ext, 'ogg'); 52 | } 53 | 54 | /** 55 | * Convert Audio to Playable WhatsApp PTT 56 | * @param {Buffer} buffer Audio Buffer 57 | * @param {String} ext File Extension 58 | * @return {Promise<{data: Buffer, filename: String, delete: Function}>} 59 | */ 60 | function toAudio(buffer, ext) { 61 | return ffmpeg(buffer, [ 62 | '-vn', 63 | '-c:a', 'libopus', 64 | '-b:a', '128k', 65 | '-vbr', 'on', 66 | '-compression_level', '10', 67 | ], ext, 'opus'); 68 | } 69 | 70 | /** 71 | * Convert Audio to Playable WhatsApp Video 72 | * @param {Buffer} buffer Video Buffer 73 | * @param {String} ext File Extension 74 | * @return {Promise<{data: Buffer, filename: String, delete: Function}>} 75 | */ 76 | function toVideo(buffer, ext) { 77 | return ffmpeg(buffer, [ 78 | '-c:v', 'libx264', 79 | '-c:a', 'aac', 80 | '-ab', '128k', 81 | '-ar', '44100', 82 | '-crf', '32', 83 | '-preset', 'slow', 84 | ], ext, 'mp4'); 85 | } 86 | 87 | export { 88 | toAudio, 89 | toPTT, 90 | toVideo, 91 | ffmpeg, 92 | }; 93 | -------------------------------------------------------------------------------- /lib/tictactoe.js: -------------------------------------------------------------------------------- 1 | class TicTacToe { 2 | constructor(playerX = 'x', playerO = 'o') { 3 | this.playerX = playerX; 4 | this.playerO = playerO; 5 | this._currentTurn = false; 6 | this._x = 0; 7 | this._o = 0; 8 | this.turns = 0; 9 | } 10 | 11 | get board() { 12 | return this._x | this._o; 13 | } 14 | 15 | get currentTurn() { 16 | return this._currentTurn ? this.playerO : this.playerX; 17 | } 18 | 19 | get enemyTurn() { 20 | return this._currentTurn ? this.playerX : this.playerO; 21 | } 22 | 23 | static check(state) { 24 | for (const combo of [7, 56, 73, 84, 146, 273, 292, 448]) { 25 | if ((state & combo) === combo) { 26 | return !0; 27 | } 28 | } 29 | return !1; 30 | } 31 | 32 | /** 33 | * ```js 34 | * TicTacToe.toBinary(1, 2) // 0b010000000 35 | * ``` 36 | */ 37 | static toBinary(x = 0, y = 0) { 38 | if (x < 0 || x > 2 || y < 0 || y > 2) throw new Error('invalid position'); 39 | return 1 << x + (3 * y); 40 | } 41 | 42 | /** 43 | * @param player `0` is `X`, `1` is `O` 44 | * 45 | * - `-3` `Game Ended` 46 | * - `-2` `Invalid` 47 | * - `-1` `Invalid Position` 48 | * - ` 0` `Position Occupied` 49 | * - ` 1` `Sucess` 50 | * @return {-3|-2|-1|0|1} 51 | */ 52 | turn(player = 0, x = 0, y) { 53 | if (this.board === 511) return -3; 54 | let pos = 0; 55 | if (y == null) { 56 | if (x < 0 || x > 8) return -1; 57 | pos = 1 << x; 58 | } else { 59 | if (x < 0 || x > 2 || y < 0 || y > 2) return -1; 60 | pos = TicTacToe.toBinary(x, y); 61 | } 62 | if (this._currentTurn ^ player) return -2; 63 | if (this.board & pos) return 0; 64 | this[this._currentTurn ? '_o' : '_x'] |= pos; 65 | this._currentTurn = !this._currentTurn; 66 | this.turns++; 67 | return 1; 68 | } 69 | 70 | /** 71 | * @return {('X'|'O'|1|2|3|4|5|6|7|8|9)[]} 72 | */ 73 | static render(boardX = 0, boardO = 0) { 74 | const x = parseInt(boardX.toString(2), 4); 75 | const y = parseInt(boardO.toString(2), 4) * 2; 76 | return [...(x + y).toString(4).padStart(9, '0')].reverse().map((value, index) => value == 1 ? 'X' : value == 2 ? 'O' : ++index); 77 | } 78 | 79 | /** 80 | * @return {('X'|'O'|1|2|3|4|5|6|7|8|9)[]} 81 | */ 82 | render() { 83 | return TicTacToe.render(this._x, this._o); 84 | } 85 | 86 | get winner() { 87 | const x = TicTacToe.check(this._x); 88 | const o = TicTacToe.check(this._o); 89 | return x ? this.playerX : o ? this.playerO : false; 90 | } 91 | } 92 | 93 | new TicTacToe().turn; 94 | 95 | export default TicTacToe; 96 | -------------------------------------------------------------------------------- /plugins/descargas-fb.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | 3 | const handler = async (m, {conn, args, command, usedPrefix}) => { 4 | // Verificar que se proporcionó una URL 5 | if (!args[0]) { 6 | throw `⚠️ Ingrese un enlace de Facebook para descargar el video 7 | • *Ejemplo:* ${usedPrefix + command} https://www.facebook.com/watch?v=636541475139`; 8 | } 9 | 10 | // Verificar que la URL sea de Facebook 11 | if (!args[0].match(/www.facebook.com|fb.watch/g)) { 12 | throw `⚠️ Ingrese un enlace válido de Facebook para descargar el video 13 | • *Ejemplo:* ${usedPrefix + command} https://www.facebook.com/watch?v=636541475139`; 14 | } 15 | 16 | // Indicar que se está procesando 17 | m.react(`⌛`); 18 | 19 | try { 20 | // Usar la API de siputzx para obtener los enlaces de descarga 21 | const apiUrl = `https://api.siputzx.my.id/api/d/facebook?url=${encodeURIComponent(args[0])}`; 22 | const response = await fetch(apiUrl); 23 | const data = await response.json(); 24 | 25 | // Verificar si la respuesta fue exitosa 26 | if (!data.status) { 27 | throw new Error('No se pudo obtener el video de Facebook'); 28 | } 29 | 30 | // Obtener la URL del video en la mejor calidad disponible 31 | const videoOptions = data.data; 32 | 33 | if (!videoOptions || videoOptions.length === 0) { 34 | throw new Error('No se encontraron enlaces de descarga'); 35 | } 36 | 37 | // Prefiere la resolución HD si está disponible, sino usa SD 38 | const hdVideo = videoOptions.find(v => v.resolution.includes('HD')); 39 | const sdVideo = videoOptions.find(v => v.resolution.includes('SD')); 40 | const videoUrl = hdVideo ? hdVideo.url : (sdVideo ? sdVideo.url : videoOptions[0].url); 41 | 42 | // Enviar el video al chat 43 | await conn.sendFile( 44 | m.chat, 45 | videoUrl, 46 | 'facebook_video.mp4', 47 | `✅ *Video descargado exitosamente*\n📱 *Resolución:* ${hdVideo ? 'HD' : 'SD'}`, 48 | m 49 | ); 50 | 51 | // Reacción de éxito 52 | m.react(`✅`); 53 | 54 | } catch (error) { 55 | // Manejar errores 56 | console.error('Error al descargar el video:', error); 57 | m.react(`❌`); 58 | m.reply(`⚠️ *Ocurrió un error al descargar el video*\n\nPor favor, intente con otro enlace o reporte este problema con el comando: #report`); 59 | } 60 | }; 61 | 62 | // Configuración del comando 63 | handler.help = ['fb', 'facebook', 'fbdl']; 64 | handler.tags = ['downloader']; 65 | handler.command = /^(facebook|fb|facebookdl|fbdl)$/i; 66 | handler.limit = 2; // Reducido de 3 a 2 por mayor eficiencia 67 | handler.register = true; 68 | 69 | export default handler; 70 | -------------------------------------------------------------------------------- /plugins/owner-join.js: -------------------------------------------------------------------------------- 1 | let linkRegex = /chat.whatsapp.com\/([0-9A-Za-z]{20,24})/i 2 | let handler = async (m, { conn, text, isMods, isOwner }) => { 3 | let link = (m.quoted ? m.quoted.text ? m.quoted.text : text : text) || text 4 | let [_, code] = link.match(linkRegex) || [] 5 | if (!code) throw `🤔𝙔 𝙚𝙡 𝙀𝙣𝙡𝙖𝙘𝙚, 𝙞𝙣𝙜𝙧𝙚𝙨𝙖 𝙚𝙡 𝙚𝙣𝙡𝙖𝙘𝙚 𝙙𝙚𝙡 𝙜𝙧𝙪𝙥𝙤.\n\n𝙀𝙟𝙚𝙢𝙥𝙡𝙤:\n#join ${nn}` 6 | if ( isMods || isOwner || m.fromMe) { 7 | m.reply(`*El Bot se ha unido al grupo✅*`) 8 | await delay(1 * 1000) 9 | let res = await conn.groupAcceptInvite(code) 10 | } else { 11 | const data = global.owner.filter(([number, _, isDeveloper]) => isDeveloper && number) 12 | await delay(1 * 1000) 13 | await m.reply(`*✅ 𝙎𝙪 𝙚𝙣𝙡𝙖𝙘𝙚 𝙨𝙚 𝙚𝙣𝙫𝙞𝙤́ 𝙖𝙡 𝙢𝙞 𝙥𝙧𝙤𝙥𝙞𝙚𝙩𝙖𝙧𝙞𝙤(𝙖)*.\n┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n⚠️ *𝙎𝙪 𝙜𝙧𝙪𝙥𝙤 𝙨𝙚𝙧𝙖́ 𝙚𝙫𝙖𝙡𝙪𝙖𝙙𝙤 𝙮 𝙦𝙪𝙚𝙙𝙖𝙧𝙖́ 𝙖 𝙙𝙚𝙘𝙞𝙨𝙞𝙤́𝙣 𝙙𝙚𝙡 𝙢𝙞 𝙥𝙧𝙤𝙥𝙞𝙚𝙩𝙖𝙧𝙞𝙤(𝙖).*\n┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n❕ *𝙀𝙨 𝙥𝙤𝙨𝙞𝙗𝙡𝙚 𝙦𝙪𝙚 𝙨𝙪 𝙨𝙤𝙡𝙞𝙘𝙞𝙩𝙪𝙙 𝙨𝙚𝙖 𝙧𝙚𝙘𝙝𝙖𝙯𝙖𝙙𝙖 𝙥𝙤𝙧 𝙡𝙖𝙨 𝙨𝙞𝙜𝙪𝙞𝙚𝙣𝙩𝙚𝙨 𝙘𝙖𝙪𝙨𝙖𝙨:*\n1️⃣ *𝙀𝙡 𝙗𝙤𝙩 𝙚𝙨𝙩𝙖́ 𝙨𝙖𝙩𝙪𝙧𝙖𝙙𝙤* .\n┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n2️⃣ *𝙀𝙡 𝙗𝙤𝙩 𝙛𝙪𝙚 𝙚𝙡𝙞𝙢𝙞𝙣𝙖𝙙𝙤 𝙙𝙚𝙡 𝙜𝙧𝙪𝙥𝙤.*\n┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n3️⃣ *𝙀𝙡 𝙜𝙧𝙪𝙥𝙤 𝙣𝙤 𝙘𝙪𝙢𝙥𝙡𝙞𝙧 𝙘𝙤𝙣 𝙡𝙖𝙨 𝙣𝙤𝙧𝙢𝙖𝙩𝙞𝙫𝙖 𝙙𝙚 𝙀𝙡 𝙗𝙤𝙩*\n┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n4⃣ *𝙚𝙡 𝙜𝙧𝙪𝙥𝙤 𝙩𝙞𝙚𝙣𝙚 𝙦𝙪𝙚 𝙩𝙚𝙣𝙚𝙧 𝙢𝙞𝙣𝙞𝙢𝙤 30 𝙥𝙖𝙧𝙩𝙞𝙘𝙞𝙥𝙖𝙣𝙩𝙚𝙨 𝙥𝙖𝙧𝙖 𝙚𝙫𝙞𝙩𝙖𝙧 𝙜𝙧𝙪𝙥𝙤 𝙞𝙣𝙖𝙘𝙩𝙞𝙫𝙤 𝙮 𝙨𝙖𝙩𝙪𝙧𝙖 𝙖𝙡 𝙗𝙤𝙩*\n┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n5⃣ *𝙀𝙡 𝙚𝙣𝙡𝙖𝙘𝙚 𝙙𝙚𝙡 𝙜𝙧𝙪𝙥𝙤 𝙨𝙚 𝙧𝙚𝙨𝙩𝙖𝙗𝙡𝙚𝙘𝙞𝙤*.\n┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n6️⃣ *𝙉𝙤 𝙨𝙚 𝙖𝙜𝙧𝙚𝙜𝙖 𝙖𝙡 𝙜𝙧𝙪𝙥𝙤 𝙨𝙚𝙜𝙪́𝙣 𝙢𝙞 𝙥𝙧𝙤𝙥𝙞𝙚𝙩𝙖𝙧𝙞𝙤(𝙖)*.\n┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n💌 *𝙇𝙖𝙨 𝙨𝙤𝙡𝙞𝙘𝙞𝙩𝙪𝙙 𝙥𝙪𝙚𝙙𝙚 𝙩𝙖𝙧𝙙𝙖 𝙝𝙤𝙧𝙖𝙨 𝙚𝙣 𝙨𝙚𝙧 𝙧𝙚𝙨𝙥𝙤𝙣𝙙𝙞𝙙𝙖𝙨. 𝙋𝙤𝙧 𝙛𝙖𝙫𝙤𝙧 𝙩𝙚𝙣𝙚𝙧 𝙥𝙖𝙘𝙞𝙚𝙣𝙘𝙞𝙖 𝙜𝙧𝙖𝙘𝙞𝙖𝙨*\n┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n*ᴾᵘᵉᵈᵉ ᵃᵖᵒʸᵃʳ ᵉˡ ᵇᵒᵗ ᶜᵒⁿ ᵘⁿᵃ ᴱˢᵗʳᵉˡˡᶦᵗᵃ ᵉˡ ⁿᵘᵉˢᵗʳᵒ ʳᵉᵖᵒˢᶦᵗᵒʳᶦᵒ ᵒᶠᶦᶜᶦᵃˡ ʸ ˢᵘˢᶜʳᶦʳᵗᵉ ᵃ ⁿᵘᵉˢᵗʳᵒ ᶜᵃⁿᵃˡ ᵈᵉˡ ʸᵒᵘᵀᵘᵇᵉ ᵐᵃⁿᵈᵃ ᶜᵃʳᵗᵘʳᵃ ᵃ ᵐᶦ ᶜʳᵉᵃᵈᵒʳ ᵖᵃʳᵃ ᵠᵘᵉ ᵖᵘᵉᵈᵃ ᵃᵍʳᵉᵍᵃ ᵉˡ ᵇᵒᵗ ᵃ ᵗᵘ ᵍʳᵘᵖᵒ 💫*`) 14 | await delay(2 * 2000) 15 | for (let jid of data.map(([id]) => [id] + '@s.whatsapp.net').filter(v => v != conn.user.jid)) m.reply(`*⪨ 𝙎𝙊𝙇𝙄𝘾𝙄𝙏𝙐𝘿 𝘿𝙀 𝘽𝙊𝙏 𝙋𝘼𝙍𝘼 𝙐𝙉 𝙂𝙍𝙐𝙋𝙊 ⪩*\n\n👤 𝙉𝙪𝙢𝙚𝙧𝙤 𝙨𝙤𝙡𝙞𝙘𝙞𝙩𝙖𝙣𝙩𝙚:\n` + ' wa.me/' + m.sender.split('@')[0] + '\n\n🔮 𝙇𝙞𝙣𝙠 𝙙𝙚𝙡 𝙜𝙧𝙪𝙥𝙤:\n ' + link, jid)}} 16 | handler.help = ['join [chat.whatsapp.com]'] 17 | handler.tags = ['owner'] 18 | handler.command = /^unete|join|nuevogrupo|unir|unite|unirse|entra|entrar$/i 19 | handler.register = true 20 | export default handler 21 | const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) 22 | -------------------------------------------------------------------------------- /plugins/grupo-hidetag.js: -------------------------------------------------------------------------------- 1 | let generateWAMessageFromContent = (await import(global.baileys)).default 2 | import * as fs from 'fs' 3 | 4 | var handler = async (m, { conn, text, participants, isOwner, isAdmin }) => { 5 | if (!m.quoted && !text) return m.reply(`𝙔 𝙀𝙇 𝙏𝙀𝙓𝙏𝙊?`) 6 | try { 7 | let users = participants.map(u => conn.decodeJid(u.id)) 8 | let q = m.quoted ? m.quoted : m || m.text || m.sender 9 | let c = m.quoted ? await m.getQuotedObj() : m.msg || m.text || m.sender 10 | let msg = conn.cMod(m.chat, generateWAMessageFromContent(m.chat, { [m.quoted ? q.mtype : 'extendedTextMessage']: m.quoted ? c.message[q.mtype] : { text: '' || c }}, { quoted: fkontak, userJid: conn.user.id }), text || q.text, conn.user.jid, { mentions: users }) 11 | await conn.relayMessage(m.chat, msg.message, { messageId: msg.key.id }) 12 | } catch { 13 | /** 14 | [ By @NeKosmic || https://github.com/NeKosmic/ ] 15 | **/ 16 | let users = participants.map(u => conn.decodeJid(u.id)) 17 | let quoted = m.quoted ? m.quoted : m 18 | let mime = (quoted.msg || quoted).mimetype || '' 19 | let isMedia = /image|video|sticker|audio/.test(mime) 20 | let more = String.fromCharCode(8206) 21 | let masss = more.repeat(850) 22 | let htextos = `${text ? text : "*CrxsMods!!*"}` 23 | if ((isMedia && quoted.mtype === 'imageMessage') && htextos) { 24 | var mediax = await quoted.download?.() 25 | conn.sendMessage(m.chat, { image: mediax, mentions: users, caption: htextos, mentions: users }, { quoted: null }) 26 | } else if ((isMedia && quoted.mtype === 'videoMessage') && htextos) { 27 | var mediax = await quoted.download?.() 28 | conn.sendMessage(m.chat, { video: mediax, mentions: users, mimetype: 'video/mp4', caption: htextos }, { quoted: null }) 29 | } else if ((isMedia && quoted.mtype === 'audioMessage') && htextos) { 30 | var mediax = await quoted.download?.() 31 | conn.sendMessage(m.chat, { audio: mediax, mentions: users, mimetype: 'audio/mp4', fileName: `Hidetag.mp3` }, { quoted: null }) 32 | } else if ((isMedia && quoted.mtype === 'stickerMessage') && htextos) { 33 | var mediax = await quoted.download?.() 34 | conn.sendMessage(m.chat, {sticker: mediax, mentions: users}, { quoted: null }) 35 | } else { 36 | await conn.sendMessage(m.chat, { text : text ? text : '' , mentions: users}, { quoted: null, ephemeralExpiration: 24*60*100, disappearingMessagesInChat: 24*60*100}) 37 | //await conn.relayMessage(m.chat, {extendedTextMessage:{text: `${masss}\n${htextos}\n`, ...{ contextInfo: { mentionedJid: users, externalAdReply: { thumbnail: imagen1, sourceUrl: md }}}}}, {}) 38 | }}} 39 | handler.help = ['hidetag'] 40 | handler.tags = ['group'] 41 | handler.command = /^(hidetag|notificar|notify)$/i 42 | handler.group = true 43 | handler.admin = true 44 | handler.register = true 45 | export default handler -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "KANTU-BOT", 3 | "version": "1.9.8", 4 | "description": "Super Bot WhatsApp", 5 | "main": "index.js", 6 | "type": "module", 7 | 8 | "directories": { 9 | "lib": "lib", 10 | "src": "src", 11 | "plugins": "plugins" }, 12 | 13 | "scripts": { 14 | "start": "node index.js", 15 | "qr": "node index.js qr", 16 | "code": "node index.js code", 17 | "test": "node test.js", 18 | "test2": "nodemon index.js" }, 19 | 20 | "homepage": "https://github.com/elrebelde21/LoliBot-MD", 21 | "author": { 22 | "name": "elrebelde21" }, 23 | 24 | "repository": { 25 | "type": "git", 26 | "url": "git+https://github.com/elrebelde21/LoliBot-MD.git" }, 27 | 28 | "bugs": { 29 | "url": "https://github.com/crxsmods/KANTU-BOT/issues" }, 30 | "license": "GPL-3.0-or-later", 31 | "dependencies": { 32 | "@whiskeysockets/baileys": "github:elrebelde21/baileys", 33 | "@adiwajshing/keyed-db": "^0.2.4", 34 | "@bochilteam/scraper": "^5.0.1", 35 | "@vitalets/google-translate-api": "^8.0.0", 36 | "awesome-phonenumber": "^3.4.0", 37 | "axios": "^1.7.9", 38 | "hispamemes": "^1.0.7", 39 | "archiver": "^7.0.1", 40 | "systeminformation": "^5.17.12", 41 | "acrcloud": "^1.4.0", 42 | "form-data": "^4.0.0", 43 | "cfonts": "^3.3.0", 44 | "chalk": "^5.4.1", 45 | "url-file-size": "^1.0.5-1", 46 | "cheerio": "1.0.0-rc.12", 47 | "colors": "1.4.0", 48 | "express": "^4.18.1", 49 | "file-type": "^18.0.0", 50 | "fluent-ffmpeg": "^2.1.2", 51 | "formdata-node": "^5.0.0", 52 | "@shineiichijo/marika": "^2.0.6", 53 | "google-libphonenumber": "3.2.38", 54 | "human-readable": "^0.2.1", 55 | "jsdom": "^20.0.1", 56 | "axios-cookiejar-support": "^5.0.5", 57 | "@seald-io/nedb": "^4.1.1", 58 | "node-os-utils": "^1.3.6", 59 | "club-atticus": "1.1.3", 60 | "link-preview-js": "^3.0.0", 61 | "lodash": "^4.17.21", 62 | "lowdb": "^3.0.0", 63 | "mongoose": "^6.6.5", 64 | "node-fetch": "^3.2.10", 65 | "node-gtts": "^2.0.2", 66 | "node-webpmux": "^3.1.3", 67 | "perf_hooks": "^0.0.1", 68 | "pino": "^8.6.1", 69 | "pino-pretty": "^9.1.1", 70 | "qrcode": "^1.5.1", 71 | "qrcode-terminal": "^0.12.0", 72 | "readline": "^1.3.0", 73 | "similarity": "^1.2.1", 74 | "g-i-s": "^2.1.6", 75 | "socket.io": "^4.5.2", 76 | "syntax-error": "^1.4.0", 77 | "terminal-image": "^2.0.0", 78 | "url-regex-safe": "^3.0.0", 79 | "emoji-api": "^2.0.1", 80 | "translate-google-api": "^1.0.4", 81 | "yt-search": "^2.12.1", 82 | "openai": "^3.3.0", 83 | "megajs": "^1.1.3", 84 | "mime-types": "^2.1.35", 85 | "fuzzysort": "^1.0.0", 86 | "api-dylux": "^1.8.3", 87 | "diskusage": "^1.2.0", 88 | "yargs": "^17.6.0", 89 | "@hiudyy/ytdl": "^0.2.3", 90 | "ytdl-core": "latest", 91 | "p-queue": "^7.0.0", 92 | "puppeteer": "^19.0.0" 93 | }, 94 | "optionalDependencies": { 95 | "wa-sticker-formatter": "^4.3.2", 96 | "moment-timezone": "^0.5.37" 97 | }} 98 | -------------------------------------------------------------------------------- /plugins/descargas-igstalk.js: -------------------------------------------------------------------------------- 1 | import fg from 'api-dylux' 2 | 3 | function descifrar(cifrado) { 4 | return atob(cifrado); 5 | } 6 | 7 | let handler = async (m, { conn, args, usedPrefix, command }) => { 8 | if (!args[0]) throw `⚠️ Ingrese el Username de Instagram\n\n*• Ejemplo:* ${usedPrefix + command} crxs_ofc` 9 | m.react("⌛") 10 | 11 | try { 12 | const user = "aHR0cHM6Ly96eWxhbGFicy5jb20vYXBpLzUwNDAvaW5zdGFncmFtK3VzZXIrcHJvZmlsZSthcGkvOTE5OS9wcm9maWxlK2luZm9ybWF0aW9u"; 13 | const urlApi = descifrar(user); 14 | 15 | const descripcion = "Nzc0OXw4WXlxMEd1YkVmeW9OUkNPVGExTmJNdVZZYUFtUHdJbXdVd2tpamhl"; 16 | 17 | const res = await fetch(urlApi, { 18 | method: 'POST', 19 | headers: { 20 | 'Authorization': 'Bearer ' + descifrar(descripcion), 21 | 'Content-Type': 'application/json' 22 | }, 23 | body: JSON.stringify({ username: args[0] }) 24 | }) 25 | const json = await res.json() 26 | if (!json.result) return m.react("❌") 27 | 28 | const p = json.result 29 | const isPrivate = p.is_private ? 'Sí 🔒' : 'No 🔓' 30 | const biography = p.biography?.trim() || '—' 31 | const fullName = p.full_name || '—' 32 | const followers = p.edge_followed_by.count 33 | const following = p.edge_follow.count 34 | const posts = p.edge_owner_to_timeline_media.count 35 | const picUrl = p.profile_pic_url_hd || p.profile_pic_url 36 | 37 | const txt = ` 38 | 👤 *Perfil de Instagram* 39 | 🔹 *Username:* ${p.username} 40 | 🔹 *Nombre completo:* ${fullName} 41 | 🔹 *Biografía:* ${biography} 42 | 🔹 *Privada:* ${isPrivate} 43 | 🔹 *Seguidores:* ${followers} 44 | 🔹 *Seguidos:* ${following} 45 | 🔹 *Publicaciones:* ${posts} 46 | 🔹 *Foto de perfil:*` 47 | 48 | await conn.sendFile( 49 | m.chat, 50 | picUrl, 51 | 'insta.jpg', 52 | txt, 53 | m 54 | ) 55 | m.react("✅") 56 | 57 | } catch (err) { 58 | try { 59 | let res2 = await fg.igStalk(args[0]) 60 | let te = `👤 *Perfil de Instagram*: 61 | *• Nombre:* ${res2.name} 62 | *• Username:* ${res2.username} 63 | *• Seguidores:* ${res2.followersH} 64 | *• Siguiendo:* ${res2.followingH} 65 | *• Bio:* ${res2.description} 66 | *• Posts:* ${res2.postsH} 67 | *• Link:* https://instagram.com/${res2.username.replace(/^@/, '')}` 68 | await conn.sendFile(m.chat, res2.profilePic, 'igstalk.png', te, m) 69 | m.react("⌛") 70 | } catch (e) { 71 | await m.react("❌") 72 | m.reply(`\`\`\`⚠️ OCURRIÓ UN ERROR ⚠️\`\`\`\n\n> *Reporta con #report*:\n\n>>> ${e}`) 73 | console.log(e) 74 | } 75 | } 76 | } 77 | 78 | handler.help = ['igstalk'] 79 | handler.tags = ['downloader'] 80 | handler.command = ['igstalk','igsearch','instagramsearch'] 81 | handler.register = true 82 | handler.limit = 1 83 | export default handler 84 | --------------------------------------------------------------------------------