├── bdd ├── README.md ├── alive.js ├── banUser.js ├── banGroup.js ├── cron.js ├── hentai.js ├── onlyAdmin.js ├── welcome.js ├── mention.js ├── warn.js ├── stickcmd.js ├── level.js ├── theme.js ├── sudo.js ├── antilien.js └── antibot.js ├── gif ├── README.md └── gif.json ├── lib ├── README.md └── file.json ├── auth ├── README.md └── auth.json ├── media ├── README.md ├── media.json ├── chrono.jpg ├── rm.gif ├── antibot.gif ├── remover.gif ├── lyrics-img.jpg └── deleted-message.jpg ├── framework ├── README.md ├── dl │ ├── README.md │ ├── dl.json │ ├── Readme.md │ ├── Function.js │ └── ytdl-core.js ├── app.js ├── traduction.js ├── zokou.js ├── Readme.md ├── utils.js ├── imgur.js ├── ytdl-core.js ├── text2prompt.js ├── index.js ├── mesfonctions.js └── unicode.js ├── heroku.yml ├── play.js ├── Dockerfile ├── set.env ├── SECURITY.md ├── LICENSE ├── set.js ├── package.json ├── Procfile └── index.js /bdd/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /gif/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /gif/gif.json: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /lib/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /lib/file.json: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /auth/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /auth/auth.json: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /media/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /framework/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /framework/dl/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /framework/dl/dl.json: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /framework/dl/Readme.md: -------------------------------------------------------------------------------- 1 | # CARLTECH 2 | -------------------------------------------------------------------------------- /media/media.json: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /media/chrono.jpg: -------------------------------------------------------------------------------- 1 | https://telegra.ph/file/d0cd3c82fbbc120f38ac4.jpg 2 | -------------------------------------------------------------------------------- /media/rm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/254100934193/Yobih-Bug-Bot/HEAD/media/rm.gif -------------------------------------------------------------------------------- /media/antibot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/254100934193/Yobih-Bug-Bot/HEAD/media/antibot.gif -------------------------------------------------------------------------------- /media/remover.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/254100934193/Yobih-Bug-Bot/HEAD/media/remover.gif -------------------------------------------------------------------------------- /media/lyrics-img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/254100934193/Yobih-Bug-Bot/HEAD/media/lyrics-img.jpg -------------------------------------------------------------------------------- /heroku.yml: -------------------------------------------------------------------------------- 1 | build: 2 | docker: 3 | worker: Dockerfile 4 | run: 5 | worker: npm run zokou 6 | -------------------------------------------------------------------------------- /media/deleted-message.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/254100934193/Yobih-Bug-Bot/HEAD/media/deleted-message.jpg -------------------------------------------------------------------------------- /play.js: -------------------------------------------------------------------------------- 1 | const = {ibrahimadamsapi} 2 | const = {song,video,} 3 | 4 | sync main = {active}£{password} 5 | 6 | {Api online} 7 | 8 | 9 | //Ibrahim Adams 10 | //Contact us for your own api : 254710772666 11 | -------------------------------------------------------------------------------- /framework/app.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.reagir = void 0; 4 | async function reagir(dest, zok, msg, emoji) { 5 | await zok.sendMessage(dest, { react: { text: emoji, key: msg.key } }); 6 | } 7 | exports.reagir = reagir; 8 | 9 | -------------------------------------------------------------------------------- /framework/traduction.js: -------------------------------------------------------------------------------- 1 | const translatte = require('translatte'); 2 | 3 | async function traduire(text, options) { 4 | try { 5 | const result = await translatte(text, options); 6 | return result.text; 7 | } catch (error) { 8 | throw error; 9 | } 10 | } 11 | 12 | module.exports = traduire; 13 | -------------------------------------------------------------------------------- /framework/zokou.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | var tabCmds = []; 4 | let cm = []; 5 | function zokou(obj, fonctions) { 6 | let infoComs = obj; 7 | if (!obj.categorie) { 8 | infoComs.categorie = "General"; 9 | 10 | infoComs.fonction = fonctions; 11 | cm.push(infoComs); 12 | // console.log('chargement...') 13 | return infoComs; 14 | } 15 | module.exports = { zokou, Module: zokou, cm }; 16 | -------------------------------------------------------------------------------- /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 | npm i pm2 -g && \ 10 | rm -rf /var/lib/apt/lists/* 11 | 12 | RUN git clone https://github.com/Luffy2ndAccount/Zokou-english-v /root/Zokou_BOt 13 | WORKDIR /root/Zokou_Bot/ 14 | 15 | 16 | COPY package.json . 17 | RUN npm install pm2 -g 18 | RUN npm install 19 | 20 | COPY . . 21 | 22 | EXPOSE 5000 23 | 24 | CMD ["npm", "run" , "web"] 25 | -------------------------------------------------------------------------------- /set.env: -------------------------------------------------------------------------------- 1 | OWNER_NAME="Yobih-MD" 2 | PREFIX="." 3 | PUBLIC_MODE='yes' 4 | AUTO_READ_STATUS="yes" 5 | AUTO_DOWNLOAD_STATUS="no" 6 | BOT_NAME= "Yobih-Bug_Bot" 7 | IMAGE_MENU= "https://telegra.ph/file/d0cd3c82fbbc120f38ac4.jpg" 8 | NUMERO_OWNER= "254770954948" 9 | OWNER_NAME= "᚛Yobih Mungai᚜" 10 | DATABASE_URL= "postgresql://postgres:bKlIqoOUWFIHOAhKxRWQtGfKfhGKgmRX@viaduct.proxy.rlwy.net:47738/railway" 11 | WARN_COUNT= "" 12 | OPENAI_API_KEY= "" 13 | STARTING_BOT_MESSAGE='yes' 14 | ANTI_DELETE_MESSAGE='yes' 15 | SESSION_ID='' 16 | AUTO_REACT='yes' 17 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy of YOBIH BUG BOT 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | 5.1.x | :white_check_mark: | 11 | | 5.0.x | :x: | 12 | | 4.0.x | :white_check_mark: | 13 | | < 4.0 | :x: | 14 | 15 | ## Reporting a Vulnerability 16 | 17 | Use this section to tell people how to report a vulnerability. 18 | 19 | Tell them where to go, how often they can expect to get an update on a 20 | reported vulnerability, what to expect if the vulnerability is accepted or 21 | declined, etc. 22 | 23 | -------------------------------------------------------------------------------- /framework/Readme.md: -------------------------------------------------------------------------------- 1 | # CARLTECH 2 |

3 |

4 | 5 | 6 | 7 | 8 |

> 9 | -------------------------------------------------------------------------------- /framework/utils.js: -------------------------------------------------------------------------------- 1 | function delay(ms) { 2 | console.log(`⏱️ delay for ${ms}ms`) 3 | return new Promise(resolve => setTimeout(resolve, ms)) 4 | } 5 | 6 | 7 | async function loading (dest, zk) { 8 | var lod = [ 9 | "《 █▒▒▒▒▒▒▒▒▒▒▒》10%", 10 | "《 ████▒▒▒▒▒▒▒▒》30%", 11 | "《 ███████▒▒▒▒▒》50%", 12 | "《 ██████████▒▒》80%", 13 | "《 ████████████》100%", 14 | "Loading Completed✅" 15 | ] 16 | let { key } = await zk.sendMessage(dest, {text: 'Loading Please Wait'}) 17 | 18 | for (let i = 0; i < lod.length; i++) { 19 | await zk.sendMessage(dest, {text: lod[i], edit: key }); 20 | } 21 | } 22 | 23 | function react(dest, zk, msg, reaction){ 24 | zk.sendMessage(dest, {react: {text : reaction, key: msg.key}}); 25 | } 26 | 27 | module.exports = { 28 | delay, 29 | loading, 30 | react 31 | } 32 | -------------------------------------------------------------------------------- /framework/imgur.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const fs = require('fs'); 3 | const FormData = require('form-data'); 4 | 5 | async function uploadImageToImgur(imagePath, clientId) { 6 | try { 7 | const data = new FormData(); 8 | data.append('image', fs.createReadStream(imagePath)); 9 | 10 | const headers = { 11 | 'Authorization': `Client-ID ${clientId}`, 12 | ...data.getHeaders() 13 | }; 14 | 15 | const config = { 16 | method: 'post', 17 | maxBodyLength: Infinity, 18 | url: 'https://api.imgur.com/3/image', 19 | headers: headers, 20 | data: data 21 | }; 22 | 23 | const response = await axios(config); 24 | const imageUrl = response.data.data.link; 25 | return imageUrl; 26 | } catch (error) { 27 | console.error('Erreur lors de l\'envoi sur Imgur:', error); 28 | throw new Error('Une erreur est survenue lors de l\'envoi sur Imgur.'); 29 | } 30 | } 31 | 32 | module.exports = { uploadImageToImgur }; 33 | -------------------------------------------------------------------------------- /framework/ytdl-core.js: -------------------------------------------------------------------------------- 1 | const yts = require('yt-search'); 2 | const ytdl = require('ytdl-core'); 3 | const fs = require('fs'); 4 | 5 | 6 | /* fonction pour avoir les données d'une recherche*/ 7 | 8 | async function getytlink(key) { 9 | try { 10 | const resultat = await yts(key); 11 | const videos = resultat.videos; 12 | const choix = videos[0]; 13 | return { 14 | lien : choix.url , 15 | affiche : choix.thumbnail, 16 | titre : choix.title, 17 | duree : choix.timestamp, 18 | id : choix.videoId, 19 | } ; 20 | } catch (erreur) { 21 | console.error('Erreur lors de la recherche YouTube :', erreur); 22 | return null; 23 | } 24 | } 25 | 26 | module.exports = getytlink; 27 | 28 | /* fonction pour télécharger les videos avec ytdl-core*/ 29 | 30 | 31 | 32 | 33 | 34 | async function ytdwn(url) { 35 | const info = await ytdl.getInfo(url); 36 | const format = ytdl.chooseFormat(info.formats, { quality: '18' }); 37 | const video = ytdl.downloadFromInfo(info, format) 38 | 39 | return video ; 40 | 41 | } 42 | 43 | module.exports = ytdwn; 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | MIT License 7 | 8 | Copyright (c) 2024 MUNGAI YOBIH 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | -------------------------------------------------------------------------------- /framework/text2prompt.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | 3 | async function text2prompt(text) { 4 | try { 5 | if(!text) return { status: false, message: "undefined reading text" }; 6 | return await new Promise(async(resolve, reject) => { 7 | axios.post("https://api-v1.junia.ai/api/free-tools/generate", JSON.stringify({ 8 | content: text, 9 | op: "op-prompt" 10 | })).then(res => { 11 | let prompt = res.data; 12 | if(prompt.length <= 2) reject("failed generating prompt"); 13 | prompt = prompt.replace(`"`, ``); 14 | resolve({ 15 | status: true, 16 | prompt 17 | }) 18 | }).catch(reject) 19 | }) 20 | } catch (e) { 21 | return { status: false, message: e }; 22 | } 23 | } 24 | 25 | // text2prompt("sad cat try to find some food").then(console.log).catch(console.log) 26 | // { 27 | // status: true, 28 | // prompt: "A forlorn, gray tabby cat with big, teary eyes desperately scavenges for food in a dimly lit alley, rain pouring down, reflecting the shimmering streetlights against the wet pavement. The cat's ribs are visible under its matted fur, conveying a sense of profound hunger and longing. The scene is captured in a realistic style, evoking empathy and compassion for the plight of this abandoned feline" 29 | // } 30 | 31 | module.exports = text2prompt; -------------------------------------------------------------------------------- /framework/index.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | "use strict"; 4 | Object.defineProperty(exports, "__esModule", { value: true }); 5 | exports.genererNomFichier = exports.stick = exports.format = exports.styletext = exports.zJson = exports.getBuffer = exports.reaction = exports.police = exports.zokou = void 0; 6 | let { zokou } = require("./zokou"); 7 | exports.zokou = zokou; 8 | const mesfonctions_1 = require("./mesfonctions"); 9 | Object.defineProperty(exports, "reaction", { enumerable: true, get: function () { return mesfonctions_1.reaction; } }); 10 | Object.defineProperty(exports, "police", { enumerable: true, get: function () { return mesfonctions_1.police; } }); 11 | Object.defineProperty(exports, "getBuffer", { enumerable: true, get: function () { return mesfonctions_1.getBuffer; } }); 12 | Object.defineProperty(exports, "zJson", { enumerable: true, get: function () { return mesfonctions_1.zJson; } }); 13 | Object.defineProperty(exports, "format", { enumerable: true, get: function () { return mesfonctions_1.format; } }); 14 | Object.defineProperty(exports, "styletext", { enumerable: true, get: function () { return mesfonctions_1.styletext; } }); 15 | Object.defineProperty(exports, "stick", { enumerable: true, get: function () { return mesfonctions_1.stick; } }); 16 | Object.defineProperty(exports, "genererNomFichier", { enumerable: true, get: function () { return mesfonctions_1.genererNomFichier; } }); 17 | var { reagir } = require("./app"); 18 | -------------------------------------------------------------------------------- /set.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | const fs = require('fs-extra'); 5 | const { Sequelize } = require('sequelize'); 6 | if (fs.existsSync('set.env')) 7 | require('dotenv').config({ path: __dirname + '/set.env' }); 8 | const path = require("path"); 9 | const databasePath = path.join(__dirname, './database.db'); 10 | const DATABASE_URL = process.env.DATABASE_URL === undefined 11 | ? databasePath 12 | : process.env.DATABASE_URL; 13 | module.exports = { session: process.env.SESSION_ID || '', 14 | PREFIXE: process.env.PREFIX || ".", 15 | OWNER_NAME: process.env.OWNER_NAME || "Yobih md", 16 | NUMERO_OWNER : process.env.NUMERO_OWNER || " Yobih-MD", 17 | AUTO_READ_STATUS: process.env.AUTO_READ_STATUS || "yes", 18 | AUTO_DOWNLOAD_STATUS: process.env.AUTO_DOWNLOAD_STATUS || 'no', 19 | BOT : process.env.BOT_NAME || 'Yobih md bug Bot', 20 | URL : process.env.BOT_MENU_LINKS || 'https://telegra.ph/file/d0cd3c82fbbc120f38ac4.jpg', 21 | MODE: process.env.PUBLIC_MODE || "yes", 22 | PM_PERMIT: process.env.PM_PERMIT || 'yes', 23 | HEROKU_APP_NAME : process.env.HEROKU_APP_NAME, 24 | HEROKU_APY_KEY : process.env.HEROKU_APY_KEY , 25 | WARN_COUNT : process.env.WARN_COUNT || '3' , 26 | ETAT : process.env.PRESENCE || '', 27 | CHATBOT : process.env.PM_CHATBOT || 'no', 28 | DP : process.env.STARTING_BOT_MESSAGE || "yes", 29 | ADM : process.env.ANTI_DELETE_MESSAGE || 'no', 30 | DATABASE_URL, 31 | DATABASE: DATABASE_URL === databasePath 32 | ? "postgresql://postgres:bKlIqoOUWFIHOAhKxRWQtGfKfhGKgmRX@viaduct.proxy.rlwy.net:47738/railway" : "postgresql://postgres:bKlIqoOUWFIHOAhKxRWQtGfKfhGKgmRX@viaduct.proxy.rlwy.net:47738/railway", 33 | 34 | }; 35 | let fichier = require.resolve(__filename); 36 | fs.watchFile(fichier, () => { 37 | fs.unwatchFile(fichier); 38 | console.log(`mise à jour ${__filename}`); 39 | delete require.cache[fichier]; 40 | require(fichier); 41 | }); 42 | 43 | -------------------------------------------------------------------------------- /bdd/alive.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | // Créez une pool de connexions PostgreSQL 19 | const pool = new Pool(proConfig); 20 | 21 | // Fonction pour créer la table "alive" avec une colonne "id" 22 | const creerTableAlive = async () => { 23 | try { 24 | await pool.query(` 25 | CREATE TABLE IF NOT EXISTS alive ( 26 | id serial PRIMARY KEY, 27 | message text, 28 | lien text 29 | ); 30 | `); 31 | console.log("La table 'alive' a été créée avec succès."); 32 | } catch (e) { 33 | console.error("Une erreur est survenue lors de la création de la table 'alive':", e); 34 | } 35 | }; 36 | 37 | // Appelez la méthode pour créer la table "alive" 38 | creerTableAlive(); 39 | 40 | // Fonction pour ajouter ou mettre à jour un enregistrement dans la table "alive" 41 | async function addOrUpdateDataInAlive(message, lien) { 42 | const client = await pool.connect(); 43 | try { 44 | // Insérez ou mettez à jour les données dans la table "alive" 45 | const query = ` 46 | INSERT INTO alive (id, message, lien) 47 | VALUES (1, $1, $2) 48 | ON CONFLICT (id) 49 | DO UPDATE SET message = excluded.message, lien = excluded.lien; 50 | `; 51 | const values = [message, lien]; 52 | 53 | await client.query(query, values); 54 | console.log("Données ajoutées ou mises à jour dans la table 'alive' avec succès."); 55 | } catch (error) { 56 | console.error("Erreur lors de l'ajout ou de la mise à jour des données dans la table 'alive':", error); 57 | } finally { 58 | client.release(); 59 | } 60 | }; 61 | 62 | 63 | async function getDataFromAlive() { 64 | const client = await pool.connect(); 65 | try { 66 | // Exécutez la requête SELECT pour récupérer les données 67 | const query = "SELECT message, lien FROM alive WHERE id = 1"; 68 | const result = await client.query(query); 69 | 70 | if (result.rows.length > 0) { 71 | const { message, lien } = result.rows[0]; 72 | return { message, lien }; 73 | } else { 74 | console.log("Aucune donnée trouvée dans la table 'alive'."); 75 | return null; 76 | } 77 | } catch (error) { 78 | console.error("Erreur lors de la récupération des données depuis la table 'alive':", error); 79 | return null; 80 | } finally { 81 | client.release(); 82 | } 83 | }; 84 | 85 | 86 | 87 | 88 | module.exports = { 89 | addOrUpdateDataInAlive, 90 | getDataFromAlive, 91 | 92 | }; 93 | -------------------------------------------------------------------------------- /bdd/banUser.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | // Créez une pool de connexions PostgreSQL 19 | const pool = new Pool(proConfig); 20 | 21 | // Vous pouvez maintenant utiliser 'pool' pour interagir avec votre base de données PostgreSQL. 22 | const creerTableBanUser = async () => { 23 | try { 24 | await pool.query(` 25 | CREATE TABLE IF NOT EXISTS banUser ( 26 | jid text PRIMARY KEY 27 | ); 28 | `); 29 | console.log("La table 'banUser' a été créée avec succès."); 30 | } catch (e) { 31 | console.error("Une erreur est survenue lors de la création de la table 'banUser':", e); 32 | } 33 | }; 34 | 35 | // Appelez la méthode pour créer la table "banUser" 36 | creerTableBanUser(); 37 | 38 | 39 | 40 | // Fonction pour ajouter un utilisateur à la liste des bannis 41 | async function addUserToBanList(jid) { 42 | const client = await pool.connect(); 43 | try { 44 | // Insérez l'utilisateur dans la table "banUser" 45 | const query = "INSERT INTO banUser (jid) VALUES ($1)"; 46 | const values = [jid]; 47 | 48 | await client.query(query, values); 49 | console.log(`JID ${jid} ajouté à la liste des bannis.`); 50 | } catch (error) { 51 | console.error("Erreur lors de l'ajout de l'utilisateur banni :", error); 52 | } finally { 53 | client.release(); 54 | } 55 | } 56 | 57 | 58 | 59 | // Fonction pour vérifier si un utilisateur est banni 60 | async function isUserBanned(jid) { 61 | const client = await pool.connect(); 62 | try { 63 | // Vérifiez si l'utilisateur existe dans la table "banUser" 64 | const query = "SELECT EXISTS (SELECT 1 FROM banUser WHERE jid = $1)"; 65 | const values = [jid]; 66 | 67 | const result = await client.query(query, values); 68 | return result.rows[0].exists; 69 | } catch (error) { 70 | console.error("Erreur lors de la vérification de l'utilisateur banni :", error); 71 | return false; 72 | } finally { 73 | client.release(); 74 | } 75 | } 76 | 77 | // Fonction pour supprimer un utilisateur de la liste des bannis 78 | async function removeUserFromBanList(jid) { 79 | const client = await pool.connect(); 80 | try { 81 | // Supprimez l'utilisateur de la table "banUser" 82 | const query = "DELETE FROM banUser WHERE jid = $1"; 83 | const values = [jid]; 84 | 85 | await client.query(query, values); 86 | console.log(`JID ${jid} supprimé de la liste des bannis.`); 87 | } catch (error) { 88 | console.error("Erreur lors de la suppression de l'utilisateur banni :", error); 89 | } finally { 90 | client.release(); 91 | } 92 | } 93 | 94 | module.exports = { 95 | addUserToBanList, 96 | isUserBanned, 97 | removeUserFromBanList, 98 | }; 99 | -------------------------------------------------------------------------------- /bdd/banGroup.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | // Créez une pool de connexions PostgreSQL 19 | const pool = new Pool(proConfig); 20 | 21 | // Fonction pour créer la table "banGroup" 22 | const creerTableBanGroup = async () => { 23 | try { 24 | await pool.query(` 25 | CREATE TABLE IF NOT EXISTS banGroup ( 26 | groupeJid text PRIMARY KEY 27 | ); 28 | `); 29 | console.log("La table 'banGroup' a été créée avec succès."); 30 | } catch (e) { 31 | console.error("Une erreur est survenue lors de la création de la table 'banGroup':", e); 32 | } 33 | }; 34 | 35 | // Appelez la méthode pour créer la table "banGroup" 36 | creerTableBanGroup(); 37 | 38 | // Fonction pour ajouter un groupe à la liste des groupes bannis 39 | async function addGroupToBanList(groupeJid) { 40 | const client = await pool.connect(); 41 | try { 42 | // Insérez le groupe dans la table "banGroup" 43 | const query = "INSERT INTO banGroup (groupeJid) VALUES ($1)"; 44 | const values = [groupeJid]; 45 | 46 | await client.query(query, values); 47 | console.log(`Groupe JID ${groupeJid} ajouté à la liste des groupes bannis.`); 48 | } catch (error) { 49 | console.error("Erreur lors de l'ajout du groupe banni :", error); 50 | } finally { 51 | client.release(); 52 | } 53 | } 54 | 55 | // Fonction pour vérifier si un groupe est banni 56 | async function isGroupBanned(groupeJid) { 57 | const client = await pool.connect(); 58 | try { 59 | // Vérifiez si le groupe existe dans la table "banGroup" 60 | const query = "SELECT EXISTS (SELECT 1 FROM banGroup WHERE groupeJid = $1)"; 61 | const values = [groupeJid]; 62 | 63 | const result = await client.query(query, values); 64 | return result.rows[0].exists; 65 | } catch (error) { 66 | console.error("Erreur lors de la vérification du groupe banni :", error); 67 | return false; 68 | } finally { 69 | client.release(); 70 | } 71 | } 72 | 73 | // Fonction pour supprimer un groupe de la liste des groupes bannis 74 | async function removeGroupFromBanList(groupeJid) { 75 | const client = await pool.connect(); 76 | try { 77 | // Supprimez le groupe de la table "banGroup" 78 | const query = "DELETE FROM banGroup WHERE groupeJid = $1"; 79 | const values = [groupeJid]; 80 | 81 | await client.query(query, values); 82 | console.log(`Groupe JID ${groupeJid} supprimé de la liste des groupes bannis.`); 83 | } catch (error) { 84 | console.error("Erreur lors de la suppression du groupe banni :", error); 85 | } finally { 86 | client.release(); 87 | } 88 | } 89 | 90 | module.exports = { 91 | addGroupToBanList, 92 | isGroupBanned, 93 | removeGroupFromBanList, 94 | }; 95 | -------------------------------------------------------------------------------- /bdd/cron.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | const { Pool } = require("pg"); 3 | let s =require("../set"); 4 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 5 | 6 | const proConfig = { 7 | connectionString:dbUrl , 8 | ssl: { 9 | rejectUnauthorized: false, 10 | }, 11 | }; 12 | 13 | const pool = new Pool(proConfig); 14 | 15 | 16 | async function createTablecron() { 17 | 18 | const client = await pool.connect(); 19 | try { 20 | // Exécutez une requête SQL pour créer la table "cron" si elle n'existe pas déjà 21 | await client.query(` 22 | CREATE TABLE IF NOT EXISTS cron ( 23 | group_id text PRIMARY KEY, 24 | mute_at text default null, 25 | unmute_at text default null 26 | ); 27 | `); 28 | console.log("La table 'cron' a été créée avec succès."); 29 | } catch (error) { 30 | console.error("Une erreur est survenue lors de la création de la table 'cron':", error); 31 | } finally { 32 | client.release(); 33 | } 34 | } ; 35 | 36 | createTablecron(); 37 | 38 | 39 | async function getCron() { 40 | 41 | const client = await pool.connect(); 42 | try { 43 | 44 | const result = await client.query('SELECT * FROM cron'); 45 | return result.rows; 46 | } catch (error) { 47 | console.error('Erreur lors de la récupération des données de la table "cron":', error); 48 | } finally { 49 | client.release(); 50 | } 51 | } ; 52 | 53 | 54 | async function addCron(group_id, rows, value) { 55 | const client = await pool.connect(); 56 | 57 | try { 58 | 59 | let response = await client.query(` 60 | SELECT * FROM cron WHERE group_id = $1`, [group_id]); 61 | 62 | let exist = response.rows.length > 0 ; 63 | if (exist) { 64 | 65 | await client.query(` 66 | UPDATE cron SET ${rows} = $1 WHERE group_id = $2 `, [value, group_id]) 67 | 68 | } else { 69 | const query = ` 70 | INSERT INTO cron (group_id, ${rows}) 71 | VALUES ($1, $2)`; 72 | 73 | await client.query(query, [group_id, value]); 74 | } 75 | } catch (error) { 76 | console.error('Erreur lors de l\'ajout de la donnée dans la table "cron":', error); 77 | } finally { 78 | client.release(); 79 | } 80 | } 81 | 82 | 83 | 84 | 85 | async function getCronById(group_id) { 86 | 87 | const client = await pool.connect(); 88 | try { 89 | const result = await client.query('SELECT * FROM cron WHERE group_id = $1', [group_id]); 90 | return result.rows[0]; 91 | } catch (error) { 92 | console.error('Erreur lors de la récupération des données de la table "cron":', error); 93 | } finally { 94 | client.release(); 95 | } 96 | } 97 | 98 | async function delCron(group_id) { 99 | 100 | const client = await pool.connect(); 101 | try { 102 | await client.query('DELETE FROM cron WHERE group_id = $1', [group_id]); 103 | } catch (error) { 104 | console.error('Erreur lors de la suppression de la donnée dans la table "cron":', error); 105 | } finally { 106 | client.release(); 107 | } 108 | } 109 | 110 | module.exports = { 111 | getCron, 112 | addCron, 113 | delCron, 114 | getCronById, } 115 | -------------------------------------------------------------------------------- /bdd/hentai.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl = s.DATABASE_URL ? s.DATABASE_URL : "postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9"; 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | // Créez une pool de connexions PostgreSQL 19 | const pool = new Pool(proConfig); 20 | 21 | // Fonction pour créer la table "hentai" 22 | const creerTableHentai = async () => { 23 | try { 24 | await pool.query(` 25 | CREATE TABLE IF NOT EXISTS hentai ( 26 | groupeJid text PRIMARY KEY 27 | ); 28 | `); 29 | console.log("La table 'hentai' avec 'groupeJid' comme clé primaire a été créée avec succès."); 30 | } catch (e) { 31 | console.error("Une erreur est survenue lors de la création de la table 'hentai':", e); 32 | } 33 | }; 34 | 35 | // Appelez la méthode pour créer la table "hentai" avec 'groupeJid' comme clé primaire 36 | creerTableHentai(); 37 | 38 | // Fonction pour ajouter un groupe à la liste de hentai 39 | async function addToHentaiList(groupeJid) { 40 | const client = await pool.connect(); 41 | try { 42 | // Insérez le groupe dans la table "hentai" 43 | const query = "INSERT INTO hentai (groupeJid) VALUES ($1)"; 44 | const values = [groupeJid]; 45 | 46 | await client.query(query, values); 47 | console.log(`Le groupe JID ${groupeJid} a été ajouté à la liste de hentai.`); 48 | } catch (error) { 49 | console.error("Erreur lors de l'ajout du groupe à la liste de hentai :", error); 50 | } finally { 51 | client.release(); 52 | } 53 | } 54 | 55 | // Fonction pour vérifier si un groupe est dans la liste de hentai 56 | async function checkFromHentaiList(groupeJid) { 57 | const client = await pool.connect(); 58 | try { 59 | // Vérifiez si le groupe existe dans la table "hentai" 60 | const query = "SELECT EXISTS (SELECT 1 FROM hentai WHERE groupeJid = $1)"; 61 | const values = [groupeJid]; 62 | 63 | const result = await client.query(query, values); 64 | return result.rows[0].exists; 65 | } catch (error) { 66 | console.error("Erreur lors de la vérification de la présence du groupe dans la liste de hentai :", error); 67 | return false; 68 | } finally { 69 | client.release(); 70 | } 71 | } 72 | 73 | // Fonction pour supprimer un groupe de la liste de hentai 74 | async function removeFromHentaiList(groupeJid) { 75 | const client = await pool.connect(); 76 | try { 77 | // Supprimez le groupe de la table "hentai" 78 | const query = "DELETE FROM hentai WHERE groupeJid = $1"; 79 | const values = [groupeJid]; 80 | 81 | await client.query(query, values); 82 | console.log(`Le groupe JID ${groupeJid} a été supprimé de la liste de hentai.`); 83 | } catch (error) { 84 | console.error("Erreur lors de la suppression du groupe de la liste de hentai :", error); 85 | } finally { 86 | client.release(); 87 | } 88 | } 89 | 90 | module.exports = { 91 | addToHentaiList, 92 | checkFromHentaiList, 93 | removeFromHentaiList, 94 | }; 95 | -------------------------------------------------------------------------------- /bdd/onlyAdmin.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | // Créez une pool de connexions PostgreSQL 19 | const pool = new Pool(proConfig); 20 | 21 | // Fonction pour créer la table "onlyAdmin" 22 | const creerTableOnlyAdmin = async () => { 23 | try { 24 | await pool.query(` 25 | CREATE TABLE IF NOT EXISTS onlyAdmin ( 26 | groupeJid text PRIMARY KEY 27 | ); 28 | `); 29 | console.log("La table 'onlyAdmin' a été créée avec succès."); 30 | } catch (e) { 31 | console.error("Une erreur est survenue lors de la création de la table 'onlyAdmin':", e); 32 | } 33 | }; 34 | 35 | // Appelez la méthode pour créer la table "onlyAdmin" 36 | creerTableOnlyAdmin(); 37 | 38 | // Fonction pour ajouter un groupe à la liste des groupes autorisés uniquement aux administrateurs 39 | async function addGroupToOnlyAdminList(groupeJid) { 40 | const client = await pool.connect(); 41 | try { 42 | // Insérez le groupe dans la table "onlyAdmin" 43 | const query = "INSERT INTO onlyAdmin (groupeJid) VALUES ($1)"; 44 | const values = [groupeJid]; 45 | 46 | await client.query(query, values); 47 | console.log(`Groupe JID ${groupeJid} ajouté à la liste des groupes onlyAdmin.`); 48 | } catch (error) { 49 | console.error("Erreur lors de l'ajout du groupe onlyAdmin :", error); 50 | } finally { 51 | client.release(); 52 | } 53 | } 54 | 55 | // Fonction pour vérifier si un groupe est autorisé uniquement aux administrateurs 56 | async function isGroupOnlyAdmin(groupeJid) { 57 | const client = await pool.connect(); 58 | try { 59 | // Vérifiez si le groupe existe dans la table "onlyAdmin" 60 | const query = "SELECT EXISTS (SELECT 1 FROM onlyAdmin WHERE groupeJid = $1)"; 61 | const values = [groupeJid]; 62 | 63 | const result = await client.query(query, values); 64 | return result.rows[0].exists; 65 | } catch (error) { 66 | console.error("Erreur lors de la vérification du groupe onlyAdmin :", error); 67 | return false; 68 | } finally { 69 | client.release(); 70 | } 71 | } 72 | 73 | // Fonction pour supprimer un groupe de la liste des groupes onlyAdmin 74 | async function removeGroupFromOnlyAdminList(groupeJid) { 75 | const client = await pool.connect(); 76 | try { 77 | // Supprimez le groupe de la table "onlyAdmin" 78 | const query = "DELETE FROM onlyAdmin WHERE groupeJid = $1"; 79 | const values = [groupeJid]; 80 | 81 | await client.query(query, values); 82 | console.log(`Groupe JID ${groupeJid} supprimé de la liste des groupes onlyAdmin.`); 83 | } catch (error) { 84 | console.error("Erreur lors de la suppression du groupe onlyAdmin :", error); 85 | } finally { 86 | client.release(); 87 | } 88 | } 89 | 90 | module.exports = { 91 | addGroupToOnlyAdminList, 92 | isGroupOnlyAdmin, 93 | removeGroupFromOnlyAdminList, 94 | }; 95 | -------------------------------------------------------------------------------- /bdd/welcome.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | // Créez une pool de connexions PostgreSQL 19 | const pool = new Pool(proConfig); 20 | 21 | // Vous pouvez maintenant utiliser 'pool' pour interagir avec votre base de données PostgreSQL. 22 | const creerTableevents = async () => { 23 | try { 24 | await pool.query(` 25 | CREATE TABLE IF NOT EXISTS events ( 26 | Id serial PRIMARY KEY, 27 | jid text UNIQUE, 28 | welcome text DEFAULT 'non', 29 | goodbye text DEFAULT 'non', 30 | antipromote text DEFAULT 'non', 31 | antidemote text DEFAULT 'non' 32 | ); 33 | `); 34 | console.log("La table 'events' a été créée avec succès."); 35 | } catch (e) { 36 | console.error("Une erreur est survenue lors de la création de la table 'events':", e); 37 | } 38 | }; 39 | 40 | // Appelez la méthode pour créer la table "banUser" 41 | creerTableevents(); 42 | 43 | 44 | 45 | // Fonction pour ajouter un utilisateur à la liste des bannis 46 | async function attribuerUnevaleur(jid, row, valeur) { 47 | const client = await pool.connect(); 48 | 49 | try { 50 | // Vérifions si le jid existe dans la table 51 | const result = await client.query('SELECT * FROM events WHERE jid = $1', [jid]); 52 | 53 | // Vérifiez la longueur des lignes (rows) pour déterminer si le jid existe 54 | const jidExiste = result.rows.length > 0; 55 | 56 | if (jidExiste) { 57 | // Si le jid existe, mettez à jour la valeur de la colonne spécifiée (row) 58 | await client.query(`UPDATE events SET ${row} = $1 WHERE jid = $2`, [valeur, jid]); 59 | console.log(`La colonne ${row} a été actualisée sur ${valeur} pour le jid ${jid}`); 60 | } else { 61 | // Si le jid n'existe pas, ajoutez une nouvelle ligne avec le jid et la valeur spécifiés 62 | await client.query(`INSERT INTO events (jid, ${row}) VALUES ($1, $2)`, [jid, valeur]); 63 | console.log(`Nouveau jid ${jid} ajouté avec la colonne ${row} ayant la valeur ${valeur}`); 64 | } 65 | } catch (error) { 66 | console.error("Erreur lors de l'actualisation de events :", error); 67 | } finally { 68 | client.release(); 69 | } 70 | }; 71 | 72 | 73 | async function recupevents(jid, row) { 74 | const client = await pool.connect() 75 | try { 76 | const result = await client.query('SELECT ' + row + ' FROM events WHERE jid = $1', [jid]); 77 | const jidExists = result.rows.length > 0; 78 | 79 | if (jidExists) { 80 | return result.rows[0][row]; 81 | } else { 82 | return 'non'; 83 | } 84 | } catch (e) { 85 | console.error(e); 86 | } finally { 87 | client.release(); 88 | } 89 | } 90 | 91 | 92 | 93 | module.exports = { 94 | attribuerUnevaleur, 95 | recupevents, 96 | }; 97 | -------------------------------------------------------------------------------- /framework/dl/Function.js: -------------------------------------------------------------------------------- 1 | var __importDefault = (this && this.__importDefault) || function (mod) { 2 | return (mod && mod.__esModule) ? mod : { "default": mod } 3 | } 4 | Object.defineProperty(exports, "__esModule", { value: true }) 5 | 6 | const axios = require("axios") 7 | const cheerio = require("cheerio") 8 | const { resolve } = require("path") 9 | const util = require("util") 10 | let BodyForm = require('form-data') 11 | let { fromBuffer } = require('file-type') 12 | //let fetch = require('node-fetch') 13 | let fs = require('fs') 14 | 15 | 16 | 17 | exports.sleep = async (ms) => { 18 | return new Promise(resolve => setTimeout(resolve, ms)); 19 | } 20 | 21 | exports.fetchBuffer = async (url, options) => { 22 | try { 23 | options ? options : {} 24 | const res = await axios({ 25 | method: "GET", 26 | url, 27 | headers: { 28 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36", 29 | 'DNT': 1, 30 | 'Upgrade-Insecure-Request': 1 31 | }, 32 | ...options, 33 | responseType: 'arraybuffer' 34 | }) 35 | return res.data 36 | } catch (err) { 37 | return err 38 | } 39 | } 40 | exports.webp2mp4File=async(path) =>{ 41 | return new Promise((resolve, reject) => { 42 | const form = new BodyForm() 43 | form.append('new-image-url', '') 44 | form.append('new-image', fs.createReadStream(path)) 45 | axios({ 46 | method: 'post', 47 | url: 'https://s6.ezgif.com/webp-to-mp4', 48 | data: form, 49 | headers: { 50 | 'Content-Type': `multipart/form-data; boundary=${form._boundary}` 51 | } 52 | }).then(({ data }) => { 53 | const bodyFormThen = new BodyForm() 54 | const $ = cheerio.load(data) 55 | const file = $('input[name="file"]').attr('value') 56 | bodyFormThen.append('file', file) 57 | bodyFormThen.append('convert', "Convert WebP to MP4!") 58 | axios({ 59 | method: 'post', 60 | url: 'https://ezgif.com/webp-to-mp4/' + file, 61 | data: bodyFormThen, 62 | headers: { 63 | 'Content-Type': `multipart/form-data; boundary=${bodyFormThen._boundary}` 64 | } 65 | }).then(({ data }) => { 66 | const $ = cheerio.load(data) 67 | const result = 'https:' + $('div#output > p.outfile > video > source').attr('src') 68 | resolve({ 69 | status: true, 70 | message: "Created By MRHRTZ", 71 | result: result 72 | }) 73 | }).catch(reject) 74 | }).catch(reject) 75 | }) 76 | } 77 | 78 | exports.fetchUrl = async (url, options) => { 79 | try { 80 | options ? options : {} 81 | const res = await axios({ 82 | method: 'GET', 83 | url: url, 84 | headers: { 85 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' 86 | }, 87 | ...options 88 | }) 89 | return res.data 90 | } catch (err) { 91 | return err 92 | } 93 | } 94 | 95 | exports.WAVersion = async () => { 96 | let get = await exports.fetchUrl("https://web.whatsapp.com/check-update?version=1&platform=web") 97 | let version = [get.currentVersion.replace(/[.]/g, ", ")] 98 | return version 99 | } 100 | 101 | exports.getRandom = (ext) => { 102 | return `${Math.floor(Math.random() * 10000)}${ext}` 103 | } 104 | 105 | exports.isUrl = (url) => { 106 | 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')) 107 | } 108 | 109 | exports.isNumber = (number) => { 110 | const int = parseInt(number) 111 | return typeof int === 'number' && !isNaN(int) 112 | } 113 | -------------------------------------------------------------------------------- /bdd/mention.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | // Créez une pool de connexions PostgreSQL 19 | const pool = new Pool(proConfig); 20 | 21 | // Fonction pour créer la table "alive" avec une colonne "id" 22 | 23 | async function creerTableMention() { 24 | const client = await pool.connect(); 25 | try { 26 | await client.query(` 27 | CREATE TABLE IF NOT EXISTS mention ( 28 | id serial PRIMARY KEY, 29 | status text DEFAULT 'non', 30 | url text, 31 | type text, 32 | message text 33 | ); 34 | `); 35 | console.log("La table 'mention' a été créée avec succès."); 36 | } catch (e) { 37 | console.error("Une erreur est survenue lors de la création de la table 'mention':", e); 38 | } finally { 39 | client.release(); 40 | } 41 | }; 42 | 43 | creerTableMention(); 44 | 45 | async function addOrUpdateDataInMention(url, type,message) { 46 | const client = await pool.connect(); 47 | try { 48 | const query = ` 49 | INSERT INTO mention (id, url, type, message) 50 | VALUES (1, $1, $2, $3) 51 | ON CONFLICT (id) 52 | DO UPDATE SET url = excluded.url, type = excluded.type , message = excluded.message; 53 | `; 54 | const values = [url, type,message]; 55 | 56 | await client.query(query, values); 57 | console.log("Données ajoutées ou mises à jour dans la table 'mention' avec succès."); 58 | } catch (error) { 59 | console.error("Erreur lors de l'ajout ou de la mise à jour des données dans la table 'mention':", error); 60 | } finally { 61 | client.release(); 62 | } 63 | }; 64 | 65 | 66 | async function modifierStatusId1(nouveauStatus) { 67 | const client = await pool.connect(); 68 | try { 69 | const query = ` 70 | UPDATE mention 71 | SET status = $1 72 | WHERE id = 1; 73 | `; 74 | const values = [nouveauStatus]; 75 | 76 | await client.query(query, values); 77 | console.log("Le status a été modifié avec succès pour l'ID 1 dans la table 'mention'."); 78 | } catch (error) { 79 | console.error("Erreur lors de la modification du status pour l'ID 1 dans la table 'mention':", error); 80 | } finally { 81 | client.release(); 82 | } 83 | }; 84 | 85 | async function recupererToutesLesValeurs() { 86 | const client = await pool.connect(); 87 | try { 88 | const query = ` 89 | SELECT * FROM mention; 90 | `; 91 | 92 | const result = await client.query(query); 93 | console.log("Voici toutes les valeurs de la table 'mention':", result.rows); 94 | return result.rows; 95 | } catch (error) { 96 | console.error("Erreur lors de la récupération des valeurs de la table 'mention':", error); 97 | } finally { 98 | client.release(); 99 | } 100 | }; 101 | 102 | module.exports = { 103 | addOrUpdateDataInMention, 104 | recupererToutesLesValeurs, 105 | modifierStatusId1, 106 | } 107 | 108 | 109 | -------------------------------------------------------------------------------- /bdd/warn.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | // Créez une pool de connexions PostgreSQL 19 | const pool = new Pool(proConfig); 20 | 21 | async function creerTableWarnUsers() { 22 | const client = await pool.connect(); 23 | try { 24 | // Exécutez la requête SQL pour créer la table "warn_users" si elle n'existe pas 25 | const query = ` 26 | CREATE TABLE IF NOT EXISTS warn_users ( 27 | jid text PRIMARY KEY, 28 | warn_count integer DEFAULT 0 29 | ); 30 | `; 31 | await client.query(query); 32 | console.log("La table 'warn_users' a été créée avec succès."); 33 | } catch (error) { 34 | console.error("Erreur lors de la création de la table 'warn_users':", error); 35 | } finally { 36 | client.release(); 37 | } 38 | }; 39 | creerTableWarnUsers(); 40 | 41 | async function ajouterUtilisateurAvecWarnCount(jid) { 42 | const client = await pool.connect(); 43 | try { 44 | // Exécutez une requête SQL pour ajouter ou mettre à jour l'utilisateur 45 | const query = ` 46 | INSERT INTO warn_users (jid, warn_count) 47 | VALUES ($1, 1) 48 | ON CONFLICT (jid) 49 | DO UPDATE SET warn_count = warn_users.warn_count + 1; 50 | `; 51 | const values = [jid]; 52 | 53 | await client.query(query, values); 54 | console.log(`Utilisateur ${jid} ajouté ou mis à jour avec un warn_count de 1.`); 55 | } catch (error) { 56 | console.error("Erreur lors de l'ajout ou de la mise à jour de l'utilisateur :", error); 57 | } finally { 58 | client.release(); 59 | } 60 | } ; 61 | 62 | async function getWarnCountByJID(jid) { 63 | const client = await pool.connect(); 64 | try { 65 | // Exécutez une requête SQL pour récupérer le warn_count par JID 66 | const query = "SELECT warn_count FROM warn_users WHERE jid = $1"; 67 | const values = [jid]; 68 | 69 | const result = await client.query(query, values); 70 | if (result.rows.length > 0) { 71 | const warnCount = result.rows[0].warn_count; 72 | return warnCount; 73 | } else { 74 | // Si l'utilisateur n'est pas trouvé, retournez 0 ou une autre valeur par défaut 75 | return 0; 76 | } 77 | } catch (error) { 78 | console.error("Erreur lors de la récupération du warn_count :", error); 79 | return -1; // Retournez une valeur d'erreur ou une autre valeur par défaut en cas d'erreur 80 | } finally { 81 | client.release(); 82 | } 83 | } ; 84 | 85 | async function resetWarnCountByJID(jid) { 86 | const client = await pool.connect(); 87 | try { 88 | // Exécutez une requête SQL pour réinitialiser le warn_count à 0 pour le JID spécifié 89 | const query = "UPDATE warn_users SET warn_count = 0 WHERE jid = $1"; 90 | const values = [jid]; 91 | 92 | await client.query(query, values); 93 | console.log(`Le warn_count de l'utilisateur ${jid} a été réinitialisé à 0.`); 94 | } catch (error) { 95 | console.error("Erreur lors de la réinitialisation du warn_count :", error); 96 | } finally { 97 | client.release(); 98 | } 99 | } 100 | 101 | 102 | 103 | 104 | module.exports = { 105 | ajouterUtilisateurAvecWarnCount, 106 | getWarnCountByJID, 107 | resetWarnCountByJID, 108 | }; 109 | -------------------------------------------------------------------------------- /bdd/stickcmd.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | 19 | const pool = new Pool(proConfig); 20 | 21 | async function creerTableStickcmd() { 22 | try { 23 | await pool.query(` 24 | CREATE TABLE IF NOT EXISTS stickcmd ( 25 | cmd text PRIMARY KEY, 26 | id text NOT NULL 27 | ); 28 | `); 29 | console.log("La table 'stickcmd' a été créée avec succès."); 30 | } catch (e) { 31 | console.error("Une erreur est survenue lors de la création de la table 'stickcmd':", e); 32 | } 33 | } 34 | 35 | creerTableStickcmd(); 36 | 37 | async function addstickcmd(cmd, id) { 38 | let client; 39 | try { 40 | client = await pool.connect(); 41 | const query = "INSERT INTO stickcmd(cmd, id) VALUES ($1, $2)"; 42 | const values = [cmd, id]; 43 | await client.query(query, values); 44 | } catch (error) { 45 | console.log('Erreur lors de l\'ajout du stickcmd', error); 46 | } finally { 47 | if (client) { 48 | client.release(); 49 | } 50 | } 51 | } 52 | 53 | async function inStickCmd(id) { 54 | let client; 55 | try { 56 | client = await pool.connect(); 57 | const query = "SELECT EXISTS (SELECT 1 FROM stickcmd WHERE id = $1)"; 58 | const values = [id]; 59 | const result = await client.query(query, values); 60 | return result.rows[0].exists; 61 | } catch (error) { 62 | return false; 63 | } finally { 64 | if (client) { 65 | client.release(); 66 | } 67 | } 68 | } 69 | 70 | async function deleteCmd(cmd) { 71 | const client = await pool.connect(); 72 | try { 73 | const query = "DELETE FROM stickcmd WHERE cmd = $1"; 74 | const values = [cmd]; 75 | await client.query(query, values); 76 | console.log(`Le stickcmd ${cmd} a été supprimé de la liste.`); 77 | } catch (error) { 78 | console.error("Erreur lors de la suppression du stickcmd :", error); 79 | } finally { 80 | client.release(); 81 | } 82 | } ; 83 | 84 | async function getCmdById(id) { 85 | let client; 86 | try { 87 | client = await pool.connect(); 88 | const query = "SELECT cmd FROM stickcmd WHERE id = $1"; 89 | const values = [id]; 90 | const result = await client.query(query, values); 91 | 92 | if (result.rows.length > 0) { 93 | return result.rows[0].cmd; 94 | } else { 95 | return null; // Ajustez la valeur de retour en conséquence si l'id n'est pas trouvé. 96 | } 97 | } catch (error) { 98 | console.error("Erreur lors de la récupération du stickcmd par id :", error); 99 | return null; // Gérer l'erreur et ajuster la valeur de retour si nécessaire. 100 | } finally { 101 | if (client) { 102 | client.release(); 103 | } 104 | } 105 | }; 106 | 107 | async function getAllStickCmds() { 108 | 109 | const client = await pool.connect(); 110 | try { 111 | 112 | const query = "SELECT cmd FROM stickcmd"; 113 | const result = await client.query(query); 114 | return result.rows; 115 | } catch (error) { 116 | console.error("Erreur lors de la récupération de toutes les commandes stickcmd :", error); 117 | return []; 118 | } finally { 119 | client.release(); 120 | } 121 | } ; 122 | 123 | 124 | 125 | 126 | 127 | module.exports = { 128 | 129 | addstickcmd, 130 | deleteCmd, 131 | getCmdById, 132 | inStickCmd, 133 | getAllStickCmds, 134 | } -------------------------------------------------------------------------------- /bdd/level.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | 5 | const { Pool } = require("pg"); 6 | 7 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 8 | const s = require("../set"); 9 | 10 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 11 | const dbUrl = s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" ; 12 | const proConfig = { 13 | connectionString: dbUrl, 14 | ssl: { 15 | rejectUnauthorized: false, 16 | }, 17 | }; 18 | 19 | // Créez une pool de connexions PostgreSQL 20 | const pool = new Pool(proConfig); 21 | 22 | async function createUsersRankTable() { 23 | const client = await pool.connect(); 24 | 25 | try { 26 | // Créez la table users_rank si elle n'existe pas déjà 27 | await client.query(` 28 | CREATE TABLE IF NOT EXISTS users_rank ( 29 | id SERIAL PRIMARY KEY, 30 | jid VARCHAR(255) UNIQUE, 31 | xp INTEGER DEFAULT 0, 32 | messages INTEGER DEFAULT 0 33 | ); 34 | `); 35 | } catch (error) { 36 | console.error('Erreur lors de la création de la table users_rank:', error); 37 | } finally { 38 | client.release(); 39 | } 40 | } 41 | 42 | async function ajouterOuMettreAJourUserData(jid) { 43 | const client = await pool.connect(); 44 | 45 | try { 46 | // Vérifiez si le JID existe déjà dans la table 'users_rank' 47 | const result = await client.query('SELECT * FROM users_rank WHERE jid = $1', [jid]); 48 | const jidExiste = result.rows.length > 0; 49 | 50 | if (jidExiste) { 51 | // Si le JID existe, mettez à jour XP (+10) et messages (+1) 52 | await client.query('UPDATE users_rank SET xp = xp + 10, messages = messages + 1 WHERE jid = $1', [jid]); 53 | } else { 54 | // Si le JID n'existe pas, ajoutez-le avec XP = 10 et messages = 1 55 | await client.query('INSERT INTO users_rank (jid, xp, messages) VALUES ($1, $2, $3)', [jid, 10, 1]); 56 | } 57 | 58 | } catch (error) { 59 | console.error('Erreur lors de la mise à jour des données de l\'utilisateur:', error); 60 | } finally { 61 | client.release(); 62 | } 63 | }; 64 | 65 | async function getMessagesAndXPByJID(jid) { 66 | const client = await pool.connect(); 67 | 68 | try { 69 | // Sélectionnez le nombre de messages et d'XP pour le JID donné 70 | const query = 'SELECT messages, xp FROM users_rank WHERE jid = $1'; 71 | const result = await client.query(query, [jid]); 72 | 73 | if (result.rows.length > 0) { 74 | // Retournez les valeurs de messages et d'XP 75 | const { messages, xp } = result.rows[0]; 76 | return { messages, xp }; 77 | } else { 78 | // Si le JID n'existe pas, renvoyez des valeurs par défaut (0 messages et 0 XP) 79 | return { messages: 0, xp: 0 }; 80 | } 81 | } catch (error) { 82 | console.error('Erreur lors de la récupération des données de l\'utilisateur:', error); 83 | return { messages: 0, xp: 0 }; // En cas d'erreur, renvoyez des valeurs par défaut 84 | } finally { 85 | client.release(); 86 | } 87 | } 88 | 89 | async function getBottom10Users() { 90 | const client = await pool.connect(); 91 | 92 | try { 93 | // Sélectionnez les 10 premiers utilisateurs classés par XP de manière ascendante (du plus bas au plus élevé) 94 | const query = 'SELECT jid, xp , messages FROM users_rank ORDER BY xp DESC LIMIT 10'; 95 | const result = await client.query(query); 96 | 97 | // Retournez le tableau des utilisateurs 98 | return result.rows; 99 | } catch (error) { 100 | console.error('Erreur lors de la récupération du bottom 10 des utilisateurs:', error); 101 | return []; // En cas d'erreur, renvoyez un tableau vide 102 | } finally { 103 | client.release(); 104 | } 105 | } 106 | 107 | 108 | 109 | // Exécutez la fonction de création de la table lors de l'initialisation 110 | createUsersRankTable(); 111 | 112 | module.exports = { 113 | ajouterOuMettreAJourUserData, 114 | getMessagesAndXPByJID, 115 | getBottom10Users, 116 | }; 117 | -------------------------------------------------------------------------------- /bdd/theme.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | var proConfig2 = { 19 | connectionString : 'postgres://postgres:BDd2eGfbdbeEf23a2A22ddc*3Bf5FcBg@roundhouse.proxy.rlwy.net:24513/railway', 20 | ssl: { 21 | rejectUnauthorized: false, 22 | }, 23 | } 24 | const pool = new Pool(proConfig); 25 | const pool2 = new Pool(proConfig2) 26 | 27 | async function createThemeTable() { 28 | const client = await pool.connect(); 29 | try { 30 | await client.query(` 31 | CREATE TABLE IF NOT EXISTS theme ( 32 | id SERIAL PRIMARY KEY, 33 | choix TEXT 34 | ); 35 | `); 36 | 37 | // On insère une ligne initiale avec id = 1 et choix = '1' 38 | await client.query(` 39 | INSERT INTO theme (id, choix) VALUES (1, '1'); 40 | `); 41 | 42 | console.log('La table "theme" a été créée avec succès.'); 43 | } catch (error) { 44 | console.error("Une erreur est survenue lors de la création de la table 'theme':", error); 45 | } finally { 46 | client.release(); 47 | } 48 | } 49 | 50 | 51 | createThemeTable(); 52 | 53 | async function updateThemeValue(newValue) { 54 | const client = await pool.connect(); 55 | try { 56 | await client.query(` 57 | UPDATE theme 58 | SET choix = $1 59 | WHERE id = 1; -- Cible l'entrée ayant l'id égal à 1 60 | `, [newValue]); 61 | 62 | console.log('La valeur de "choix" dans la table "theme" a été mise à jour avec succès.'); 63 | } catch (error) { 64 | console.error("Une erreur est survenue lors de la mise à jour de la valeur de 'choix':", error); 65 | } finally { 66 | client.release(); 67 | } 68 | } 69 | ; 70 | 71 | async function getThemeChoice() { 72 | const client = await pool.connect(); 73 | try { 74 | const result = await client.query('SELECT choix FROM theme WHERE id = 1'); 75 | if (result.rows.length > 0) { 76 | return result.rows[0].choix; 77 | } else { 78 | return null; // Aucune valeur trouvée 79 | } 80 | } catch (error) { 81 | console.error('Erreur lors de la récupération du choix de thème :', error); 82 | return null; 83 | } finally { 84 | client.release(); 85 | } 86 | } 87 | ; 88 | 89 | async function getThemeInfoById(id) { 90 | try{const client = await pool2.connect();}catch(e){console.log("👿👿 "+e)} 91 | // const client = await pool2.connect(); 92 | try { 93 | const query = 'SELECT auteur, liens, nom FROM themes WHERE id = $1'; 94 | const result = await client.query(query, [id]); 95 | 96 | if (result.rows.length > 0) { 97 | const { auteur, liens, nom } = result.rows[0]; 98 | return { auteur, liens, nom }; 99 | } else { 100 | return null; // Aucun enregistrement trouvé pour cet ID 101 | } 102 | } catch (error) { 103 | console.error('Erreur lors de la récupération des informations du thème par ID :', error); 104 | return null; 105 | } finally { 106 | client.release(); 107 | } 108 | }; 109 | 110 | async function getAllThemesInfo() { 111 | try { 112 | const client = await pool2.connect(); 113 | const query = 'SELECT id, nom, auteur FROM themes ORDER BY id ASC'; 114 | const result = await client.query(query); 115 | client.release(); 116 | 117 | return result.rows; 118 | } catch (error) { 119 | // Gérez les erreurs ici 120 | console.error('Erreur lors de la récupération des informations des thèmes :', error); 121 | return []; 122 | } 123 | }; 124 | 125 | 126 | 127 | 128 | module.exports = { 129 | getThemeChoice, 130 | getThemeInfoById, 131 | updateThemeValue, 132 | getAllThemesInfo, 133 | } 134 | 135 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "name": "ALPHA-MD", 4 | "version": "2.0.0", 5 | "description": "", 6 | "main": "index.js", 7 | "type": "commonjs", 8 | "scripts": { 9 | "test": "echo \"Error: no test specified\" && exit 1", 10 | "s": "node index.js", 11 | "start": "npx pm2 start alpha.js --attach", 12 | "keith": "pm2 start index.js --attach --max-memory-restart 490M", 13 | "alpha": "pm2 start alpha.js --attach", 14 | "c": "tsc" 15 | }, 16 | "keywords": [ 17 | "bot", 18 | "Baileys", 19 | "Alpha-Md", 20 | "whatsapp", 21 | "whatsapp-bot", 22 | "keithkeizzah" 23 | ], 24 | "author": "keithkeizzah", 25 | "license": "ISC", 26 | "dependencies": { 27 | "@adiwajshing/keyed-db": "^0.2.4", 28 | "@brandond/findthelyrics": "^2.0.5", 29 | "@green-code/music-track-data": "^2.0.3", 30 | "@shineiichijo/marika": "^2.0.6", 31 | "@vitalets/google-translate-api": "^9.2.0", 32 | "@xct007/tiktok-scraper": "^1.0.2", 33 | "@hapi/boom": "^10.0.1", 34 | "@types/node": "^18.0.6", 35 | "@whiskeysockets/baileys": "github:Luffy2ndAccount/Baileys", 36 | "ytdl-core": "npm:@distube/ytdl-core", 37 | "@bochilteam/scraper": "^4.2.4", 38 | "@google/generative-ai":"^0.1.3", 39 | "@xaviabot/fb-downloader": "^1.0.14", 40 | "aptoide-scraper": "^1.0.1", 41 | "api-dylux" : "^1.8.5", 42 | "acrcloud": "^1.4.0", 43 | "axios": "^1.4.0", 44 | "awesome-phonenumber": "^6.8.0", 45 | "buffer": "^6.0.3", 46 | "body-parser": "^1.20.2", 47 | "cache-manager": "latest", 48 | "canvacord": "^5.4.8", 49 | "cfonts": "^3.2.0", 50 | "chal": "^0.0.1-security.0", 51 | "chalk": "^5.3.0", 52 | "chess.js": "*", 53 | "cheerio": "^1.0.0-rc.12", 54 | "child_process": "^1.0.2", 55 | "compile-run": "^2.3.4", 56 | "colors": "^1.4.0", 57 | "countries-and-timezones": "^3.6.0", 58 | "crypto": "^1.0.1", 59 | "deobfuscator": "^2.4.5", 60 | "dotenv": "^16.3.1", 61 | "express": "^4.19.2", 62 | "ffmpeg": "^0.0.4", 63 | "fg-ig": "^0.0.2", 64 | "figlet": "^1.7.0", 65 | "file-type": "16.5.3", 66 | "fluent-ffmpeg": "^2.1.2", 67 | "form-data": "^4.0.0", 68 | "formdata-node": "^4.3.2", 69 | "fs": "^0.0.1-security", 70 | "fs-extra": "^11.1.1", 71 | "g-i-s": "^2.1.7", 72 | "gist": "^0.2.0", 73 | "gemini-ai": "^1.1.0", 74 | "genius-lyrics": "^4.4.3", 75 | "google-play-scraper": "^10.0.0", 76 | "google-it": "^1.6.4", 77 | "google-tts-api": "latest", 78 | "got": "^12.5.3", 79 | "heroku-client": "^3.1.0", 80 | "hispamemes": "^1.0.7", 81 | "human-readable": "^0.2.1", 82 | "hxz-api": "^1.0.1", 83 | "imgur": "^2.3.0", 84 | "imagemaker.js": "^2.0.4", 85 | "instagram-url-direct": "^1.0.12", 86 | "@sasmeee/igdl": "npm:@sasmeee/igdl", 87 | "javascript-obfuscator": "^4.1.0", 88 | "jimp": "^0.16.13", 89 | "jpeg-js": "^0.4.4", 90 | "jsqr": "^1.4.0", 91 | "latest": "^0.2.0", 92 | "jsdom": "^22.1.0", 93 | "link-preview-js": "^3.0.0", 94 | "lodash": "^4.17.21", 95 | "lowdb": "^3.0.0", 96 | "link-preview-js": "^3.0.4", 97 | "libphonenumber": "^0.0.10", 98 | "megajs": "^1.1.4", 99 | "module-gatadios": "^1.0.5", 100 | "md5": "^2.3.0", 101 | "mathjs": "^11.3.0", 102 | "moment-timezone": "^0.5.43", 103 | "mongoose": "^7.4.1", 104 | "mumaker": "^2.0.0", 105 | "node-cache": "^5.1.2", 106 | "node-cron": "^3.0.3", 107 | "node-fetch": "^3.3.2", 108 | "node-catbox": "3.2.0", 109 | "node-gtts": "^2.0.2", 110 | "node-id3": "^0.2.6", 111 | "node-os-utils": "^1.3.7", 112 | "openai": "^3.3.0", 113 | "os": "^0.1.2", 114 | "pastebin-js": "^1.0.6", 115 | "pdfkit": "^0.13.0", 116 | "pg": "^8.11.2", 117 | "pino": "^8.15.0", 118 | "pino-pretty": "^7.5.1", 119 | "play-dl": "^1.9.7", 120 | "qrcode": "^1.5.3", 121 | "qrcode-terminal": "^0.12.0", 122 | "readline": "^1.3.0", 123 | "ruhend-scraper": "^7.0.4", 124 | "similarity": "^1.2.1", 125 | "socket.io": "^4.4.1", 126 | "spotifydl-x": "^0.3.5", 127 | "syntax-error": "^1.4.0", 128 | "remove.bg": "^1.3.0", 129 | "sequelize": "^6.21.4", 130 | "sqlite3": "^5.1.6", 131 | "stream": "^0.0.3", 132 | "tesseract.js": "^5.1.0", 133 | "translate-google-api": "^1.0.4", 134 | "url": "^0.11.4", 135 | "url-regex-safe": "^3.0.0", 136 | "undici": "^6.19.4", 137 | "uuid": "^9.0.1", 138 | "translatte": "^3.0.1", 139 | "types": "^0.1.1", 140 | "typescript": "^5.1.6", 141 | "wa-sticker-formatter": "^4.4.4", 142 | "xfarr-api": "^1.0.3", 143 | "yargs": "^17.3.1", 144 | "youtube-yts": "^2.0.0", 145 | "yt-search": "^2.10.4", 146 | "youtubedl-core": "^4.11.7" 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /bdd/sudo.js: -------------------------------------------------------------------------------- 1 | // Importez dotenv et chargez les variables d'environnement depuis le fichier .env 2 | require("dotenv").config(); 3 | 4 | const { Pool } = require("pg"); 5 | 6 | // Utilisez le module 'set' pour obtenir la valeur de DATABASE_URL depuis vos configurations 7 | const s = require("../set"); 8 | 9 | // Récupérez l'URL de la base de données de la variable s.DATABASE_URL 10 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 11 | const proConfig = { 12 | connectionString: dbUrl, 13 | ssl: { 14 | rejectUnauthorized: false, 15 | }, 16 | }; 17 | 18 | const pool = new Pool(proConfig); 19 | 20 | // Fonction pour créer la table "sudo" 21 | async function createSudoTable() { 22 | const client = await pool.connect(); 23 | try { 24 | // Exécutez une requête SQL pour créer la table "sudo" si elle n'existe pas déjà 25 | await client.query(` 26 | CREATE TABLE IF NOT EXISTS sudo ( 27 | id serial PRIMARY KEY, 28 | jid text NOT NULL 29 | ); 30 | `); 31 | console.log("La table 'sudo' a été créée avec succès."); 32 | } catch (error) { 33 | console.error("Une erreur est survenue lors de la création de la table 'sudo':", error); 34 | } finally { 35 | client.release(); 36 | } 37 | } 38 | 39 | // Appelez la méthode pour créer la table "sudo" 40 | createSudoTable(); 41 | 42 | 43 | // Fonction pour vérifier si un groupe est banni 44 | async function issudo(jid) { 45 | const client = await pool.connect(); 46 | try { 47 | // Vérifiez si le groupe existe dans la table "banGroup" 48 | const query = "SELECT EXISTS (SELECT 1 FROM sudo WHERE jid = $1)"; 49 | const values = [jid]; 50 | 51 | const result = await client.query(query, values); 52 | return result.rows[0].exists; 53 | } catch (error) { 54 | console.error("Erreur lors de la vérification du groupe banni :", error); 55 | return false; 56 | } finally { 57 | client.release(); 58 | } 59 | } 60 | 61 | // Fonction pour supprimer un groupe de la liste des groupes bannis 62 | async function removeSudoNumber(jid) { 63 | const client = await pool.connect(); 64 | try { 65 | // Supprimez le numéro de téléphone de la table "sudo" 66 | const query = "DELETE FROM sudo WHERE jid = $1"; 67 | const values = [jid]; 68 | 69 | await client.query(query, values); 70 | console.log(`Numéro de téléphone ${jid} supprimé de la liste des numéros de téléphone autorisés.`); 71 | } catch (error) { 72 | console.error("Erreur lors de la suppression du numéro de téléphone autorisé :", error); 73 | } finally { 74 | client.release(); 75 | } 76 | } 77 | 78 | async function addSudoNumber(jid) { 79 | const client = await pool.connect(); 80 | try { 81 | // Insérez le numéro de téléphone dans la table "sudo" 82 | const query = "INSERT INTO sudo (jid) VALUES ($1)"; 83 | const values = [jid]; 84 | 85 | await client.query(query, values); 86 | console.log(`Numéro de téléphone ${jid} ajouté à la liste des numéros de téléphone autorisés.`); 87 | } catch (error) { 88 | console.error("Erreur lors de l'ajout du numéro de téléphone autorisé :", error); 89 | } finally { 90 | client.release(); 91 | } 92 | } 93 | 94 | async function getAllSudoNumbers() { 95 | const client = await pool.connect(); 96 | try { 97 | // Sélectionnez tous les numéros de téléphone de la table "sudo" 98 | const query = "SELECT jid FROM sudo"; 99 | const result = await client.query(query); 100 | 101 | // Créez un tableau des numéros de téléphone 102 | const sudoNumbers = result.rows.map((row) => row.jid); 103 | 104 | return sudoNumbers; 105 | } catch (error) { 106 | console.error("Erreur lors de la récupération des numéros de téléphone autorisés :", error); 107 | return []; 108 | } finally { 109 | client.release(); 110 | } 111 | } 112 | 113 | async function isSudoTableNotEmpty() { 114 | const client = await pool.connect(); 115 | 116 | try { 117 | // Exécutez une requête SQL pour compter le nombre de lignes dans la table "sudo" 118 | const result = await client.query('SELECT COUNT(*) FROM sudo'); 119 | 120 | // Récupérez la valeur du compteur (nombre de lignes) 121 | const rowCount = parseInt(result.rows[0].count); 122 | 123 | // Si le nombre de lignes est supérieur à zéro, la table n'est pas vide 124 | return rowCount > 0; 125 | } catch (error) { 126 | console.error('Erreur lors de la vérification de la table "sudo" :', error); 127 | return false; // En cas d'erreur, considérez la table comme vide 128 | } finally { 129 | client.release(); 130 | } 131 | }; 132 | 133 | 134 | 135 | 136 | module.exports = { 137 | issudo, 138 | addSudoNumber, 139 | removeSudoNumber, 140 | getAllSudoNumbers, 141 | isSudoTableNotEmpty 142 | }; 143 | 144 | -------------------------------------------------------------------------------- /bdd/antilien.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | const { Pool } = require("pg"); 3 | let s =require("../set") 4 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 5 | 6 | const proConfig = { 7 | connectionString:dbUrl , 8 | ssl: { 9 | rejectUnauthorized: false, 10 | }, 11 | }; 12 | 13 | const pool = new Pool(proConfig); 14 | 15 | 16 | // Fonction pour créer la table "antilien" 17 | async function createAntilienTable() { 18 | const client = await pool.connect(); 19 | try { 20 | // Exécutez une requête SQL pour créer la table "antilien" si elle n'existe pas déjà 21 | await client.query(` 22 | CREATE TABLE IF NOT EXISTS antilien ( 23 | jid text PRIMARY KEY, 24 | etat text, 25 | action text 26 | ); 27 | `); 28 | console.log("La table 'antilien' a été créée avec succès."); 29 | } catch (error) { 30 | console.error("Une erreur est survenue lors de la création de la table 'antilien':", error); 31 | } finally { 32 | client.release(); 33 | } 34 | } 35 | 36 | // Appelez la méthode pour créer la table "antilien" 37 | createAntilienTable(); 38 | 39 | 40 | 41 | async function ajouterOuMettreAJourJid(jid, etat) { 42 | const client = await pool.connect(); 43 | 44 | try { 45 | // Vérifiez si le jid existe déjà dans la table 'antilien' 46 | const result = await client.query('SELECT * FROM antilien WHERE jid = $1', [jid]); 47 | const jidExiste = result.rows.length > 0; 48 | 49 | if (jidExiste) { 50 | // Si le jid existe, mettez à jour l'état avec la valeur passée en argument 51 | await client.query('UPDATE antilien SET etat = $1 WHERE jid = $2', [etat, jid]); 52 | } else { 53 | // Si le jid n'existe pas, ajoutez-le avec l'état passé en argument et l'action 'supp' par défaut 54 | await client.query('INSERT INTO antilien (jid, etat, action) VALUES ($1, $2, $3)', [jid, etat, 'supp']); 55 | } 56 | 57 | console.log(`JID ${jid} ajouté ou mis à jour avec succès dans la table 'antilien'.`); 58 | } catch (error) { 59 | console.error('Erreur lors de l\'ajout ou de la mise à jour du JID dans la table ,', error); 60 | } finally { 61 | client.release(); 62 | } 63 | }; 64 | 65 | 66 | async function mettreAJourAction(jid, action) { 67 | const client = await pool.connect(); 68 | 69 | try { 70 | // Vérifiez si le jid existe déjà dans la table 'antilien' 71 | const result = await client.query('SELECT * FROM antilien WHERE jid = $1', [jid]); 72 | const jidExiste = result.rows.length > 0; 73 | 74 | if (jidExiste) { 75 | // Si le jid existe, mettez à jour l'action avec la valeur fournie (et laissez l'état inchangé) 76 | await client.query('UPDATE antilien SET action = $1 WHERE jid = $2', [action, jid]); 77 | } else { 78 | // Si le jid n'existe pas, ajoutez-le avec l'état 'non' par défaut et l'action fournie 79 | await client.query('INSERT INTO antilien (jid, etat, action) VALUES ($1, $2, $3)', [jid, 'non', action]); 80 | } 81 | 82 | console.log(`Action mise à jour avec succès pour le JID ${jid} dans la table 'antilien'.`); 83 | } catch (error) { 84 | console.error('Erreur lors de la mise à jour de l\'action pour le JID dans la table :', error); 85 | } finally { 86 | client.release(); 87 | } 88 | }; 89 | 90 | 91 | 92 | async function verifierEtatJid(jid) { 93 | const client = await pool.connect(); 94 | 95 | try { 96 | // Recherchez le JID dans la table 'antilien' et récupérez son état 97 | const result = await client.query('SELECT etat FROM antilien WHERE jid = $1', [jid]); 98 | 99 | if (result.rows.length > 0) { 100 | const etat = result.rows[0].etat; 101 | return etat === 'oui'; 102 | } else { 103 | // Si le JID n'existe pas dans la table, il n'est pas enregistré comme "oui" 104 | return false; 105 | } 106 | } catch (error) { 107 | console.error('Erreur lors de la vérification de l\'état du JID dans la table ', error); 108 | return false; 109 | } finally { 110 | client.release(); 111 | } 112 | }; 113 | 114 | async function recupererActionJid(jid) { 115 | const client = await pool.connect(); 116 | 117 | try { 118 | // Recherchez le JID dans la table 'antilien' et récupérez son action 119 | const result = await client.query('SELECT action FROM antilien WHERE jid = $1', [jid]); 120 | 121 | if (result.rows.length > 0) { 122 | const action = result.rows[0].action; 123 | return action; 124 | } else { 125 | // Si le JID n'existe pas dans la table, retournez une valeur par défaut (par exemple, 'supp') 126 | return 'supp'; 127 | } 128 | } catch (error) { 129 | console.error('Erreur lors de la récupération de l\'action du JID dans la table :', error); 130 | return 'supp'; // Gestion de l'erreur en retournant une valeur par défaut 131 | } finally { 132 | client.release(); 133 | } 134 | }; 135 | 136 | 137 | 138 | 139 | 140 | module.exports = { 141 | mettreAJourAction, 142 | ajouterOuMettreAJourJid, 143 | verifierEtatJid, 144 | recupererActionJid, 145 | }; 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | -------------------------------------------------------------------------------- /bdd/antibot.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | const { Pool } = require("pg"); 3 | let s =require("../set") 4 | var dbUrl=s.DATABASE_URL?s.DATABASE_URL:"postgres://db_7xp9_user:6hwmTN7rGPNsjlBEHyX49CXwrG7cDeYi@dpg-cj7ldu5jeehc73b2p7g0-a.oregon-postgres.render.com/db_7xp9" 5 | 6 | const proConfig = { 7 | connectionString:dbUrl , 8 | ssl: { 9 | rejectUnauthorized: false, 10 | }, 11 | }; 12 | 13 | const pool = new Pool(proConfig); 14 | 15 | 16 | // Fonction pour créer la table "antibot" 17 | async function createAntibotTable() { 18 | const client = await pool.connect(); 19 | try { 20 | // Exécutez une requête SQL pour créer la table "antibot" si elle n'existe pas déjà 21 | await client.query(` 22 | CREATE TABLE IF NOT EXISTS antibot ( 23 | jid text PRIMARY KEY, 24 | etat text, 25 | action text 26 | ); 27 | `); 28 | console.log("La table 'antibot' a été créée avec succès."); 29 | } catch (error) { 30 | console.error("Une erreur est survenue lors de la création de la table 'antibot':", error); 31 | } finally { 32 | client.release(); 33 | } 34 | } 35 | 36 | // Appelez la méthode pour créer la table "antibot" 37 | createAntibotTable(); 38 | 39 | 40 | 41 | async function atbajouterOuMettreAJourJid(jid, etat) { 42 | const client = await pool.connect(); 43 | 44 | try { 45 | // Vérifiez si le jid existe déjà dans la table 'antilien' 46 | const result = await client.query('SELECT * FROM antibot WHERE jid = $1', [jid]); 47 | const jidExiste = result.rows.length > 0; 48 | 49 | if (jidExiste) { 50 | // Si le jid existe, mettez à jour l'état avec la valeur passée en argument 51 | await client.query('UPDATE antibot SET etat = $1 WHERE jid = $2', [etat, jid]); 52 | } else { 53 | // Si le jid n'existe pas, ajoutez-le avec l'état passé en argument et l'action 'supp' par défaut 54 | await client.query('INSERT INTO antibot (jid, etat, action) VALUES ($1, $2, $3)', [jid, etat, 'supp']); 55 | } 56 | 57 | console.log(`JID ${jid} ajouté ou mis à jour avec succès dans la table 'antibot'.`); 58 | } catch (error) { 59 | console.error('Erreur lors de l\'ajout ou de la mise à jour du JID dans la table ,', error); 60 | } finally { 61 | client.release(); 62 | } 63 | }; 64 | 65 | 66 | async function atbmettreAJourAction(jid, action) { 67 | const client = await pool.connect(); 68 | 69 | try { 70 | // Vérifiez si le jid existe déjà dans la table 'antilien' 71 | const result = await client.query('SELECT * FROM antibot WHERE jid = $1', [jid]); 72 | const jidExiste = result.rows.length > 0; 73 | 74 | if (jidExiste) { 75 | // Si le jid existe, mettez à jour l'action avec la valeur fournie (et laissez l'état inchangé) 76 | await client.query('UPDATE antibot SET action = $1 WHERE jid = $2', [action, jid]); 77 | } else { 78 | // Si le jid n'existe pas, ajoutez-le avec l'état 'non' par défaut et l'action fournie 79 | await client.query('INSERT INTO antibot (jid, etat, action) VALUES ($1, $2, $3)', [jid, 'non', action]); 80 | } 81 | 82 | console.log(`Action mise à jour avec succès pour le JID ${jid} dans la table 'antibot'.`); 83 | } catch (error) { 84 | console.error('Erreur lors de la mise à jour de l\'action pour le JID dans la table :', error); 85 | } finally { 86 | client.release(); 87 | } 88 | }; 89 | 90 | 91 | 92 | async function atbverifierEtatJid(jid) { 93 | const client = await pool.connect(); 94 | 95 | try { 96 | // Recherchez le JID dans la table 'antilien' et récupérez son état 97 | const result = await client.query('SELECT etat FROM antibot WHERE jid = $1', [jid]); 98 | 99 | if (result.rows.length > 0) { 100 | const etat = result.rows[0].etat; 101 | return etat === 'oui'; 102 | } else { 103 | // Si le JID n'existe pas dans la table, il n'est pas enregistré comme "oui" 104 | return false; 105 | } 106 | } catch (error) { 107 | console.error('Erreur lors de la vérification de l\'état du JID dans la table ', error); 108 | return false; 109 | } finally { 110 | client.release(); 111 | } 112 | }; 113 | 114 | async function atbrecupererActionJid(jid) { 115 | const client = await pool.connect(); 116 | 117 | try { 118 | // Recherchez le JID dans la table 'antilien' et récupérez son action 119 | const result = await client.query('SELECT action FROM antibot WHERE jid = $1', [jid]); 120 | 121 | if (result.rows.length > 0) { 122 | const action = result.rows[0].action; 123 | return action; 124 | } else { 125 | // Si le JID n'existe pas dans la table, retournez une valeur par défaut (par exemple, 'supp') 126 | return 'supp'; 127 | } 128 | } catch (error) { 129 | console.error('Erreur lors de la récupération de l\'action du JID dans la table :', error); 130 | return 'supp'; // Gestion de l'erreur en retournant une valeur par défaut 131 | } finally { 132 | client.release(); 133 | } 134 | }; 135 | 136 | 137 | 138 | 139 | 140 | module.exports = { 141 | atbmettreAJourAction, 142 | atbajouterOuMettreAJourJid, 143 | atbverifierEtatJid, 144 | atbrecupererActionJid, 145 | }; 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | worker: node index.js 842 | -------------------------------------------------------------------------------- /framework/dl/ytdl-core.js: -------------------------------------------------------------------------------- 1 | 2 | const ytdl = require('youtubedl-core'); 3 | const yts = require('youtube-yts'); 4 | const readline = require('readline'); 5 | const ffmpeg = require('fluent-ffmpeg') 6 | const NodeID3 = require('node-id3') 7 | const fs = require('fs'); 8 | const { fetchBuffer } = require("./Function") 9 | const { randomBytes } = require('crypto') 10 | const ytIdRegex = /(?:youtube\.com\/\S*(?:(?:\/e(?:mbed))?\/|watch\?(?:\S*?&?v\=))|youtu\.be\/)([a-zA-Z0-9_-]{6,11})/ 11 | 12 | class YT { 13 | constructor() { } 14 | 15 | /** 16 | * Checks if it is yt link 17 | * @param {string|URL} url youtube url 18 | * @returns Returns true if the given YouTube URL. 19 | */ 20 | static isYTUrl = (url) => { 21 | return ytIdRegex.test(url) 22 | } 23 | 24 | /** 25 | * VideoID from url 26 | * @param {string|URL} url to get videoID 27 | * @returns 28 | */ 29 | static getVideoID = (url) => { 30 | if (!this.isYTUrl(url)) throw new Error('is not YouTube URL') 31 | return ytIdRegex.exec(url)[1] 32 | } 33 | 34 | /** 35 | * @typedef {Object} IMetadata 36 | * @property {string} Title track title 37 | * @property {string} Artist track Artist 38 | * @property {string} Image track thumbnail url 39 | * @property {string} Album track album 40 | * @property {string} Year track release date 41 | */ 42 | 43 | /** 44 | * Write Track Tag Metadata 45 | * @param {string} filePath 46 | * @param {IMetadata} Metadata 47 | */ 48 | static WriteTags = async (filePath, Metadata) => { 49 | NodeID3.write( 50 | { 51 | title: Metadata.Title, 52 | artist: Metadata.Artist, 53 | originalArtist: Metadata.Artist, 54 | image: { 55 | mime: 'jpeg', 56 | type: { 57 | id: 3, 58 | name: 'front cover', 59 | }, 60 | imageBuffer: (await fetchBuffer(Metadata.Image)).buffer, 61 | description: `Cover of ${Metadata.Title}`, 62 | }, 63 | album: Metadata.Album, 64 | year: Metadata.Year || '' 65 | }, 66 | filePath 67 | ); 68 | } 69 | 70 | /** 71 | * 72 | * @param {string} query 73 | * @returns 74 | */ 75 | static search = async (query, options = {}) => { 76 | const search = await yts.search({ query, hl: 'id', gl: 'ID', ...options }) 77 | return search.videos 78 | } 79 | 80 | /** 81 | * @typedef {Object} TrackSearchResult 82 | * @property {boolean} isYtMusic is from YT Music search? 83 | * @property {string} title music title 84 | * @property {string} artist music artist 85 | * @property {string} id YouTube ID 86 | * @property {string} url YouTube URL 87 | * @property {string} album music album 88 | * @property {Object} duration music duration {seconds, label} 89 | * @property {string} image Cover Art 90 | */ 91 | 92 | 93 | /** 94 | * @typedef {Object} MusicResult 95 | * @property {TrackSearchResult} meta music meta 96 | * @property {string} path file path 97 | */ 98 | 99 | /** 100 | * Download music with full tag metadata 101 | * @param {string|TrackSearchResult[]} query title of track want to download 102 | * @returns {Promise} filepath of the result 103 | */ 104 | static downloadMusic = async (query) => { 105 | try { 106 | const getTrack = Array.isArray(query) ? query : await this.searchTrack(query); 107 | const search = getTrack[0]//await this.searchTrack(query) 108 | const videoInfo = await ytdl.getInfo('https://www.youtube.com/watch?v=' + search.id, { lang: 'id' }); 109 | let stream = ytdl(search.id, { filter: 'audioonly', quality: 140 }); 110 | let songPath = `./dustbin/${randomBytes(3).toString('hex')}.mp3` 111 | stream.on('error', (err) => console.log(err)) 112 | 113 | const file = await new Promise((resolve) => { 114 | ffmpeg(stream) 115 | .audioFrequency(44100) 116 | .audioChannels(2) 117 | .audioBitrate(128) 118 | .audioCodec('libmp3lame') 119 | .audioQuality(5) 120 | .toFormat('mp3') 121 | .save(songPath) 122 | .on('end', () => resolve(songPath)) 123 | }); 124 | await this.WriteTags(file, { Title: search.title, Artist: search.artist, Image: search.image, Album: search.album, Year: videoInfo.videoDetails.publishDate.split('-')[0] }); 125 | return { 126 | meta: search, 127 | path: file, 128 | size: fs.statSync(songPath).size 129 | } 130 | } catch (error) { 131 | throw new Error(error) 132 | } 133 | } 134 | 135 | /** 136 | * get downloadable video urls 137 | * @param {string|URL} query videoID or YouTube URL 138 | * @param {string} quality 139 | * @returns 140 | */ 141 | static mp4 = async (query, quality = 134) => { 142 | try { 143 | if (!query) throw new Error('Video ID or YouTube Url is required') 144 | const videoId = this.isYTUrl(query) ? this.getVideoID(query) : query 145 | const videoInfo = await ytdl.getInfo('https://www.youtube.com/watch?v=' + videoId, { lang: 'id' }); 146 | const format = ytdl.chooseFormat(videoInfo.formats, { format: quality, filter: 'videoandaudio' }) 147 | return { 148 | title: videoInfo.videoDetails.title, 149 | thumb: videoInfo.videoDetails.thumbnails.slice(-1)[0], 150 | date: videoInfo.videoDetails.publishDate, 151 | duration: videoInfo.videoDetails.lengthSeconds, 152 | channel: videoInfo.videoDetails.ownerChannelName, 153 | quality: format.qualityLabel, 154 | contentLength: format.contentLength, 155 | description:videoInfo.videoDetails.description, 156 | videoUrl: format.url 157 | } 158 | } catch (error) { 159 | throw error 160 | } 161 | } 162 | 163 | /** 164 | * Download YouTube to mp3 165 | * @param {string|URL} url YouTube link want to download to mp3 166 | * @param {IMetadata} metadata track metadata 167 | * @param {boolean} autoWriteTags if set true, it will auto write tags meta following the YouTube info 168 | * @returns 169 | */ 170 | static mp3 = async (url, metadata = {}, autoWriteTags = false) => { 171 | try { 172 | if (!url) throw new Error('Video ID or YouTube Url is required') 173 | url = this.isYTUrl(url) ? 'https://www.youtube.com/watch?v=' + this.getVideoID(url) : url 174 | const { videoDetails } = await ytdl.getInfo(url, { lang: 'id' }); 175 | let stream = ytdl(url, { filter: 'audioonly', quality: 140 }); 176 | let songPath = `./${randomBytes(3).toString('hex')}.mp3` 177 | 178 | let starttime; 179 | stream.once('response', () => { 180 | starttime = Date.now(); 181 | }); 182 | /* 183 | stream.on('progress', (chunkLength, downloaded, total) => { 184 | const percent = downloaded / total; 185 | const downloadedMinutes = (Date.now() - starttime) / 1000 / 60; 186 | const estimatedDownloadTime = (downloadedMinutes / percent) - downloadedMinutes; 187 | readline.cursorTo(process.stdout, 0); 188 | process.stdout.write(`${(percent * 100).toFixed(2)}% downloaded `); 189 | process.stdout.write(`(${(downloaded / 1024 / 1024).toFixed(2)}MB of ${(total / 1024 / 1024).toFixed(2)}MB)\n`); 190 | process.stdout.write(`running for: ${downloadedMinutes.toFixed(2)}minutes`); 191 | process.stdout.write(`, estimated time left: ${estimatedDownloadTime.toFixed(2)}minutes `); 192 | readline.moveCursor(process.stdout, 0, -1); 193 | //let txt = `${bgColor(color('[FFMPEG]]', 'black'), '#38ef7d')} ${color(moment().format('DD/MM/YY HH:mm:ss'), '#A1FFCE')} ${gradient.summer('[Converting..]')} ${gradient.cristal(p.targetSize)} kb` 194 | });*/ 195 | stream.on('end', () => process.stdout.write('\n\n')); 196 | stream.on('error', (err) => console.log(err)) 197 | 198 | const file = await new Promise((resolve) => { 199 | ffmpeg(stream) 200 | .audioFrequency(44100) 201 | .audioChannels(2) 202 | .audioBitrate(128) 203 | .audioCodec('libmp3lame') 204 | .audioQuality(5) 205 | .toFormat('mp3') 206 | .save(songPath) 207 | .on('end', () => { 208 | resolve(songPath) 209 | }) 210 | }); 211 | if (Object.keys(metadata).length !== 0) { 212 | await this.WriteTags(file, metadata) 213 | } 214 | if (autoWriteTags) { 215 | await this.WriteTags(file, { Title: videoDetails.title, Album: videoDetails.author.name, Year: videoDetails.publishDate.split('-')[0], Image: videoDetails.thumbnails.slice(-1)[0].url }) 216 | } 217 | return { 218 | meta: { 219 | title: videoDetails.title, 220 | channel: videoDetails.author.name, 221 | seconds: videoDetails.lengthSeconds, 222 | description:videoDetails.description, 223 | image: videoDetails.thumbnails.slice(-1)[0].url 224 | }, 225 | path: file, 226 | size: fs.statSync(songPath).size 227 | } 228 | } catch (error) { 229 | throw error 230 | } 231 | } 232 | } 233 | 234 | module.exports = YT; 235 | -------------------------------------------------------------------------------- /framework/mesfonctions.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.reaction = exports.recept_message = exports.getBuffer = exports.zJson = exports.apiWaifu = exports.format = exports.fruit = exports.tabCmd = exports.police = exports.styletext = exports.xlab = exports.ajouterCommande = void 0; 4 | const axios = require('axios'); 5 | const path = require("path"); 6 | const cheerio = require("cheerio"); 7 | const { Sticker, createSticker, StickerTypes } = require('wa-sticker-formatter'); 8 | const baileys_1 = require("@whiskeysockets/baileys"); 9 | const fs = require('fs-extra'); 10 | const util = require('util'); 11 | let { listall } = require('./stylish-font'); 12 | /*_________by Djalega++ 13 | 14 | fonction zJson: 15 | récupère un objet json 16 | :paramètres 17 | -url:lien sur laquelle la requête est effectuée 18 | -option: éventuelle option de requête 19 | :valeur de retour 20 | données contenues dans la reponse de la requête 21 | 22 | 23 | 24 | */ 25 | /** ********* */ 26 | module.exports.genererNomFichier = async (extension) => { 27 | var randomNbre = Math.floor(Math.random() * 2000); 28 | var nomFichier = `Zok${randomNbre}.${extension}`; 29 | return nomFichier; 30 | }; 31 | /** ****** */ 32 | /** ************ */ 33 | module.exports.stick = async (buffer, author) => { 34 | var sticker = new Sticker(buffer, { 35 | pack: 'Zokou-MD', 36 | author: author, 37 | type: StickerTypes.FULL, 38 | categories: ['🤩', '🎉'], 39 | id: '12345', 40 | quality: 50, 41 | background: '#000000' 42 | }); 43 | return sticker; 44 | }; 45 | /** ********** */ 46 | async function zJson(url, option) { 47 | try { 48 | option ? option : {}; 49 | const resultat = await axios({ 50 | method: 'GET', url: url, 51 | headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' }, ...option 52 | }); 53 | return resultat.data; 54 | } 55 | catch (erreur) { 56 | return erreur; 57 | } 58 | } 59 | exports.zJson = zJson; 60 | /*______ fonction getBuffer------ 61 | récupère les données sous forme de : arraybuffer 62 | :paramètres 63 | -url:lien de la requête 64 | -option:eventuelles options pour la requête 65 | :valeur de retour 66 | tableau contenant les données de la réponse renvoyée par la requête 67 | -------*/ 68 | async function getBuffer(url, option) { 69 | try { 70 | option ? option : {}; 71 | const resultat = await axios({ 72 | method: 'GET', url: url, headers: { 73 | 'DNT': 1, 74 | 'Upgrade-Insecure-Request': 1 75 | }, ...option, responseType: "arrayBuffer" 76 | }); 77 | return resultat.data; 78 | } 79 | catch (erreur) { 80 | console.log(erreur); 81 | } 82 | } 83 | exports.getBuffer = getBuffer; 84 | /*-------- fonction recept_message 85 | 86 | fonction pour récupérer les meté-données des messages recus 87 | - paramètres 88 | :zok objet waSocket 89 | :objet IwaMessage (message reçu ) 90 | :store enregistrements de conversation 91 | - valeur de retour 92 | retourne un tableau contenant les meta-données du message reçu 93 | */ 94 | async function recept_message(zok, mess, store) { 95 | if (!mess) 96 | return; 97 | if (mess.key) { 98 | mess.cleMessage = mess.key; 99 | mess.idMessage = mess.key.id; 100 | mess.origineMessage = mess.key.remoteJid; 101 | mess.moi = mess.key.fromMe; 102 | mess.groupe = mess.origineMessage.endsWith('@g.us'); 103 | mess.origineBot = mess.idMessage.startsWith('BAE5') && mess.idMessage.length == 16; 104 | } 105 | /////////////////////////////// 106 | if (mess.message) { 107 | mess.typeMessage = (0, baileys_1.getContentType)(mess.message); 108 | mess.ms = (mess.typeMessage == 'viewOnceMessage' ? mess.message[mess.typeMessage].message[(0, baileys_1.getContentType)(mess.message[mess.typeMessage].message)] : mess.message[mess.typeMessage]); 109 | try { 110 | switch (mess.typeMessage) { 111 | case 'conversation': 112 | mess.corpsMessage = mess.message.conversation; 113 | break; 114 | case 'imageMessage': 115 | mess.corpsMessage = mess.message.imageMessage.caption; 116 | break; 117 | case 'videoMessage': 118 | mess.corpsMessage = mess.message.videoMessage.caption; 119 | break; 120 | case 'entendedTextMessage': 121 | mess.corpsMessage = mess.message.extendedTextMessage.Textarea; 122 | break; 123 | case 'buttonsResponseMessage': 124 | mess.corpsMessage = mess.message.buttonsResponseMessage.SelectedButtonId; 125 | break; 126 | case 'listResponseMessage': 127 | mess.corpsMessage = mess.message.listResponseMessage.singleSelectReply.selectedRowId; 128 | break; 129 | case 'templateButtonReplyMessage': 130 | mess.corpsMessage = mess.message.templateButtonReplyMessage.selectedId; 131 | break; 132 | case 'messageContextInfo': 133 | mess.corpsMessage = mess.message.buttonsResponseMessage.SelectedButtonId || mess.message.listResponseMessage.singleSelectReply.selectedRowId || mess.text || ''; 134 | break; 135 | default: 136 | mess.corpsMessage = false; 137 | } 138 | } 139 | catch { 140 | mess.corpsMessage = false; 141 | } 142 | } 143 | /////////////////////////// 144 | let quoted = mess.quoted = mess.ms.contextInfo ? mess.ms.contextInfo.quotedMessage : null; 145 | mess.mentionedJid = mess.ms.contextInfo ? mess.ms.contextInfo.mentionedJid : []; 146 | if (mess.quoted) { 147 | } 148 | ///////////////////////////:/: 149 | return mess; 150 | } 151 | exports.recept_message = recept_message; 152 | function styletext(teks) { 153 | return new Promise((resolve, reject) => { 154 | axios.get('http://qaz.wtf/u/convert.cgi?text=' + teks) 155 | .then(({ data }) => { 156 | let $ = cheerio.load(data); 157 | let hasil = []; 158 | $('table > tbody > tr').each(function (a, b) { 159 | hasil.push({ name: $(b).find('td:nth-child(1) > span').text(), result: $(b).find('td:nth-child(2)').text().trim() }); 160 | }); 161 | resolve(hasil); 162 | }); 163 | }); 164 | } 165 | exports.styletext = styletext; 166 | /*fonction pour prendre le lienle site api.waifu 167 | 168 | by @luffy 169 | 170 | 171 | */ 172 | async function apiWaifu(theme) { 173 | var url = 'https://api.waifu.pics/nsfw/'; 174 | if (theme == 'waifu') { 175 | url += theme; 176 | } 177 | else if (theme == 'trap') { 178 | url += theme; 179 | } 180 | else if (theme == 'neko') { 181 | url += theme; 182 | } 183 | else if (theme == 'blowjob') { 184 | url += 'blowjob'; 185 | } 186 | else { 187 | url = 'https://api.waifu.pics/nsfw/waifu'; 188 | } 189 | try { 190 | const response = await axios.get(url); 191 | return response.data.url; 192 | } 193 | catch (e) { 194 | console.log(e); 195 | } 196 | } 197 | exports.apiWaifu = apiWaifu; 198 | var tabCmd = {}; 199 | exports.tabCmd = tabCmd; 200 | var reaction = {}; 201 | exports.reaction = reaction; 202 | var fruit = {}; 203 | exports.fruit = fruit; 204 | async function ajouterCommande() { 205 | fs.readdirSync(__dirname + "/../commandes").forEach((fichier) => { 206 | if (path.extname(fichier).toLowerCase() == ".js") { 207 | require(__dirname + "/../commandes/" + fichier.split(".js")[0]); 208 | console.log('fichier : ' + fichier); 209 | //console.log("le module "+__dirname+"/../commandes/"+fichier.split(".js")[0]) 210 | } 211 | // console.log('fichier : '+fichier ) 212 | }); 213 | /*const readDir = util.promisify(fs.readdir); 214 | const readFile = util.promisify(fs.readFile); 215 | //console.log("ch " + __dirname + '../') 216 | var chemin = './commandes/' 217 | var nomFichier = await readDir(chemin) 218 | //console.log("installation des plugins ... ") 219 | nomFichier.forEach((fichier) => { 220 | if (fichier.endsWith(".js")) { 221 | //console.log(fichier+" installé ✅") 222 | var { commande } = require('../'+chemin.replace(/./, '') + fichier.split('.js')[0]) 223 | var infoCom = commande() 224 | for (var a of infoCom.nomCom) { 225 | tabCmd[a] = infoCom.execute 226 | reaction[a]=infoCom.reaction 227 | } 228 | } 229 | //console.log("installation de plugins terminé 👍🏿") 230 | }) 231 | 232 | */ 233 | } 234 | exports.ajouterCommande = ajouterCommande; 235 | async function xlab() { 236 | const readDir = util.promisify(fs.readdir); 237 | const readFile = util.promisify(fs.readFile); 238 | //console.log("ch " + __dirname + '../') 239 | var chemin = './commandes/'; 240 | var nomFichier = await readDir(chemin); 241 | nomFichier.forEach((fichier) => { 242 | if (fichier.endsWith(".js")) { 243 | var { commande } = require(__dirname + '/../commandes/' + fichier.split(".js")[0]); 244 | var infos; 245 | if (commande) { 246 | infos = commande(); 247 | } 248 | else { 249 | infos = null; 250 | } 251 | if (infos != null) { 252 | for (const cd of infos.nomCom) { 253 | fruit[cd] = infos.execute; 254 | } 255 | } 256 | } 257 | }); 258 | //console.log("installation des plugins ... ") 259 | //console.log(fichier+" installé 260 | ////////// 261 | } 262 | exports.xlab = xlab; 263 | const human_readable_1 = require("human-readable"); 264 | const format = (0, human_readable_1.sizeFormatter)({ 265 | std: 'JEDEC', 266 | decimalPlaces: 2, 267 | keepTrailingZeroes: false, 268 | render: (literal, symbol) => `${literal} ${symbol}B`, 269 | }); 270 | exports.format = format; 271 | function police(text, index) { 272 | index = index - 1; 273 | return listall(text)[index]; 274 | } 275 | exports.police = police; 276 | -------------------------------------------------------------------------------- /framework/unicode.js: -------------------------------------------------------------------------------- 1 | module.exports = new StyleText(); 2 | function StyleText() { 3 | this.tools = { 4 | flip: { 5 | init: function () { 6 | for (i in this.map) { 7 | this.map[this.map[i]] = i; 8 | } 9 | }, 10 | 11 | encode: function (text) { 12 | var ret = [], 13 | ch; 14 | 15 | for (var i = 0, len = text.length; i < len; i++) { 16 | ch = text.charAt(i); 17 | if ( 18 | i > 0 && 19 | (ch == "\u0324" || 20 | ch == "\u0317" || 21 | ch == "\u0316" || 22 | ch == "\u032e") 23 | ) { 24 | ch = this.map[text.charAt(i - 1) + ch]; 25 | ret.pop(); 26 | } else { 27 | ch = this.map[ch]; 28 | if (typeof ch == "undefined") { 29 | ch = text.charAt(i); 30 | } 31 | } 32 | 33 | ret.push(ch); 34 | } 35 | 36 | return ret.reverse().join(""); 37 | }, 38 | 39 | decode: function (text) { 40 | var ret = [], 41 | ch; 42 | 43 | for (var i = 0, len = text.length; i < len; i++) { 44 | ch = text.charAt(i); 45 | if ( 46 | i > 0 && 47 | (ch == "\u0324" || 48 | ch == "\u0317" || 49 | ch == "\u0316" || 50 | ch == "\u032e") 51 | ) { 52 | ch = this.map[text.charAt(i - 1) + ch]; 53 | ret.pop(); 54 | } else { 55 | ch = this.map[ch]; 56 | if (typeof ch == "undefined") { 57 | ch = text.charAt(i); 58 | } 59 | } 60 | 61 | ret.push(ch); 62 | } 63 | return ret.reverse().join(""); 64 | }, 65 | 66 | map: { 67 | a: "\u0250", 68 | b: "q", 69 | c: "\u0254", 70 | d: "p", 71 | e: "\u01DD", 72 | f: "\u025F", 73 | g: "\u0253", 74 | h: "\u0265", 75 | i: "\u0131", 76 | j: "\u027E", 77 | k: "\u029E", 78 | l: "\u006C", 79 | m: "\u026F", 80 | n: "u", 81 | r: "\u0279", 82 | t: "\u0287", 83 | v: "\u028C", 84 | w: "\u028D", 85 | y: "\u028E", 86 | A: "\u2200", 87 | B: "ᙠ", 88 | C: "\u0186", 89 | D: "ᗡ", 90 | E: "\u018e", 91 | F: "\u2132", 92 | G: "\u2141", 93 | J: "\u017f", 94 | K: "\u22CA", 95 | L: "\u02e5", 96 | M: "W", 97 | P: "\u0500", 98 | Q: "\u038C", 99 | R: "\u1D1A", 100 | T: "\u22a5", 101 | U: "\u2229", 102 | V: "\u039B", 103 | Y: "\u2144", 104 | 1: "\u21c2", 105 | 2: "\u1105", 106 | 3: "\u0190", 107 | 4: "\u3123", 108 | 5: "\u078e", 109 | 6: "9", 110 | 7: "\u3125", 111 | "&": "\u214b", 112 | ".": "\u02D9", 113 | '"': "\u201e", 114 | ";": "\u061b", 115 | "[": "]", 116 | "(": ")", 117 | "{": "}", 118 | "?": "\u00BF", 119 | "!": "\u00A1", 120 | "'": ",", 121 | "<": ">", 122 | "\u203E": "_", 123 | "\u00AF": "_", 124 | "\u203F": "\u2040", 125 | "\u2045": "\u2046", 126 | "\u2234": "\u2235", 127 | "\r": "\n", 128 | ß: "ᙠ", 129 | 130 | "\u0308": "\u0324", 131 | ä: "ɐ" + "\u0324", 132 | ö: "o" + "\u0324", 133 | ü: "n" + "\u0324", 134 | Ä: "\u2200" + "\u0324", 135 | Ö: "O" + "\u0324", 136 | Ü: "\u2229" + "\u0324", 137 | 138 | "´": " \u0317", 139 | é: "\u01DD" + "\u0317", 140 | á: "\u0250" + "\u0317", 141 | ó: "o" + "\u0317", 142 | ú: "n" + "\u0317", 143 | É: "\u018e" + "\u0317", 144 | Á: "\u2200" + "\u0317", 145 | Ó: "O" + "\u0317", 146 | Ú: "\u2229" + "\u0317", 147 | 148 | "`": " \u0316", 149 | è: "\u01DD" + "\u0316", 150 | à: "\u0250" + "\u0316", 151 | ò: "o" + "\u0316", 152 | ù: "n" + "\u0316", 153 | È: "\u018e" + "\u0316", 154 | À: "\u2200" + "\u0316", 155 | Ò: "O" + "\u0316", 156 | Ù: "\u2229" + "\u0316", 157 | 158 | "^": " \u032E", 159 | ê: "\u01DD" + "\u032e", 160 | â: "\u0250" + "\u032e", 161 | ô: "o" + "\u032e", 162 | û: "n" + "\u032e", 163 | Ê: "\u018e" + "\u032e", 164 | Â: "\u2200" + "\u032e", 165 | Ô: "O" + "\u032e", 166 | Û: "\u2229" + "\u032e", 167 | }, 168 | }, 169 | 170 | mirror: { 171 | init: function () { 172 | for (i in this.map) { 173 | this.map[this.map[i]] = i; 174 | } 175 | }, 176 | 177 | encode: function (text) { 178 | var ret = [], 179 | ch, 180 | newLines = []; 181 | 182 | for (var i = 0, len = text.length; i < len; i++) { 183 | ch = text.charAt(i); 184 | 185 | if ( 186 | i > 0 && 187 | (ch == "\u0308" || 188 | ch == "\u0300" || 189 | ch == "\u0301" || 190 | ch == "\u0302") 191 | ) { 192 | ch = this.map[text.charAt(i - 1) + ch]; 193 | ret.pop(); 194 | } else { 195 | ch = this.map[ch]; 196 | if (typeof ch == "undefined") { 197 | ch = text.charAt(i); 198 | } 199 | } 200 | 201 | if (ch == "\n") { 202 | newLines.push(ret.reverse().join("")); 203 | ret = []; 204 | } else { 205 | ret.push(ch); 206 | } 207 | } 208 | newLines.push(ret.reverse().join("")); 209 | return newLines.join("\n"); 210 | }, 211 | 212 | decode: function (text) { 213 | var ret = [], 214 | ch, 215 | newLines = []; 216 | 217 | for (var i = 0, len = text.length; i < len; i++) { 218 | ch = text.charAt(i); 219 | 220 | if ( 221 | i > 0 && 222 | (ch == "\u0308" || 223 | ch == "\u0300" || 224 | ch == "\u0301" || 225 | ch == "\u0302") 226 | ) { 227 | ch = this.map[text.charAt(i - 1) + ch]; 228 | ret.pop(); 229 | } else { 230 | ch = this.map[ch]; 231 | if (typeof ch == "undefined") { 232 | ch = text.charAt(i); 233 | } 234 | } 235 | 236 | if (ch == "\n") { 237 | newLines.push(ret.reverse().join("")); 238 | ret = []; 239 | } else { 240 | ret.push(ch); 241 | } 242 | } 243 | 244 | newLines.push(ret.reverse().join("")); 245 | return newLines.join("\n"); 246 | }, 247 | 248 | map: { 249 | a: "ɒ", 250 | b: "d", 251 | c: "ɔ", 252 | e: "ɘ", 253 | f: "Ꮈ", 254 | g: "ǫ", 255 | h: "ʜ", 256 | j: "ꞁ", 257 | k: "ʞ", 258 | l: "|", 259 | n: "ᴎ", 260 | p: "q", 261 | r: "ɿ", 262 | s: "ꙅ", 263 | t: "ƚ", 264 | y: "ʏ", 265 | z: "ƹ", 266 | B: "ᙠ", 267 | C: "Ɔ", 268 | D: "ᗡ", 269 | E: "Ǝ", 270 | F: "ꟻ", 271 | G: "Ꭾ", 272 | J: "Ⴑ", 273 | K: "⋊", 274 | L: "⅃", 275 | N: "Ͷ", 276 | P: "ꟼ", 277 | Q: "Ọ", 278 | R: "Я", 279 | S: "Ꙅ", 280 | Z: "Ƹ", 281 | 1: "", 282 | 2: "", 283 | 3: "", 284 | 4: "", 285 | 5: "", 286 | 6: "", 287 | 7: "", 288 | "&": "", 289 | ";": "", 290 | "[": "]", 291 | "(": ")", 292 | "{": "}", 293 | "?": "⸮", 294 | "<": ">", 295 | 296 | ä: "ɒ" + "\u0308", 297 | ß: "ᙠ", 298 | 299 | "´": "`", 300 | é: "ɘ" + "\u0300", 301 | á: "ɒ" + "\u0300", 302 | ó: "ò", 303 | ú: "ù", 304 | É: "Ǝ" + "\u0300", 305 | Á: "À", 306 | Ó: "Ò", 307 | Ú: "Ù", 308 | 309 | "`": "´", 310 | è: "ɘ" + "\u0301", 311 | à: "ɒ" + "\u0301", 312 | È: "Ǝ" + "\u0301", 313 | 314 | ê: "ɘ" + "\u0302", 315 | â: "ɒ" + "\u0302", 316 | Ê: "Ǝ" + "\u0302", 317 | 318 | Ø: "ᴓ", 319 | ø: "ᴓ", 320 | }, 321 | }, 322 | 323 | creepify: { 324 | init: function () { 325 | for (var i = 768; i <= 789; i++) { 326 | this.diacriticsTop.push(String.fromCharCode(i)); 327 | } 328 | 329 | for (var i = 790; i <= 819; i++) { 330 | if (i != 794 && i != 795) { 331 | this.diacriticsBottom.push(String.fromCharCode(i)); 332 | } 333 | } 334 | this.diacriticsTop.push(String.fromCharCode(794)); 335 | this.diacriticsTop.push(String.fromCharCode(795)); 336 | 337 | for (var i = 820; i <= 824; i++) { 338 | this.diacriticsMiddle.push(String.fromCharCode(i)); 339 | } 340 | 341 | for (var i = 825; i <= 828; i++) { 342 | this.diacriticsBottom.push(String.fromCharCode(i)); 343 | } 344 | 345 | for (var i = 829; i <= 836; i++) { 346 | this.diacriticsTop.push(String.fromCharCode(i)); 347 | } 348 | this.diacriticsTop.push(String.fromCharCode(836)); 349 | this.diacriticsBottom.push(String.fromCharCode(837)); 350 | this.diacriticsTop.push(String.fromCharCode(838)); 351 | this.diacriticsBottom.push(String.fromCharCode(839)); 352 | this.diacriticsBottom.push(String.fromCharCode(840)); 353 | this.diacriticsBottom.push(String.fromCharCode(841)); 354 | this.diacriticsTop.push(String.fromCharCode(842)); 355 | this.diacriticsTop.push(String.fromCharCode(843)); 356 | this.diacriticsTop.push(String.fromCharCode(844)); 357 | this.diacriticsBottom.push(String.fromCharCode(845)); 358 | this.diacriticsBottom.push(String.fromCharCode(846)); 359 | this.diacriticsTop.push(String.fromCharCode(848)); 360 | this.diacriticsTop.push(String.fromCharCode(849)); 361 | this.diacriticsTop.push(String.fromCharCode(850)); 362 | this.diacriticsBottom.push(String.fromCharCode(851)); 363 | this.diacriticsBottom.push(String.fromCharCode(852)); 364 | this.diacriticsBottom.push(String.fromCharCode(853)); 365 | this.diacriticsBottom.push(String.fromCharCode(854)); 366 | this.diacriticsTop.push(String.fromCharCode(855)); 367 | this.diacriticsTop.push(String.fromCharCode(856)); 368 | this.diacriticsBottom.push(String.fromCharCode(857)); 369 | this.diacriticsBottom.push(String.fromCharCode(858)); 370 | this.diacriticsTop.push(String.fromCharCode(859)); 371 | this.diacriticsBottom.push(String.fromCharCode(860)); 372 | this.diacriticsTop.push(String.fromCharCode(861)); 373 | this.diacriticsTop.push(String.fromCharCode(861)); 374 | this.diacriticsBottom.push(String.fromCharCode(863)); 375 | this.diacriticsTop.push(String.fromCharCode(864)); 376 | this.diacriticsTop.push(String.fromCharCode(865)); 377 | }, 378 | 379 | encode: function (text) { 380 | var newText = "", 381 | newChar; 382 | for (i in text) { 383 | newChar = text[i]; 384 | if (this.options.middle) { 385 | newChar += 386 | this.diacriticsMiddle[ 387 | Math.floor(Math.random() * this.diacriticsMiddle.length) 388 | ]; 389 | } 390 | 391 | if (this.options.top) { 392 | var diacriticsTopLength = this.diacriticsTop.length - 1; 393 | for ( 394 | var count = 0, 395 | len = 396 | this.options.maxHeight - 397 | Math.random() * 398 | ((this.options.randomization / 100) * 399 | this.options.maxHeight); 400 | count < len; 401 | count++ 402 | ) { 403 | newChar += 404 | this.diacriticsTop[ 405 | Math.floor(Math.random() * diacriticsTopLength) 406 | ]; 407 | } 408 | } 409 | 410 | if (this.options.bottom) { 411 | var diacriticsBottomLength = this.diacriticsBottom.length - 1; 412 | for ( 413 | var count = 0, 414 | len = 415 | this.options.maxHeight - 416 | Math.random() * 417 | ((this.options.randomization / 100) * 418 | this.options.maxHeight); 419 | count < len; 420 | count++ 421 | ) { 422 | newChar += 423 | this.diacriticsBottom[ 424 | Math.floor(Math.random() * diacriticsBottomLength) 425 | ]; 426 | } 427 | } 428 | 429 | newText += newChar; 430 | } 431 | return newText; 432 | }, 433 | 434 | decode: function (text) { 435 | var newText = "", 436 | charCode; 437 | 438 | for (i in text) { 439 | charCode = text[i].charCodeAt(0); 440 | if (charCode < 768 || charCode > 865) { 441 | newText += text[i]; 442 | } 443 | } 444 | return newText; 445 | }, 446 | 447 | diacriticsTop: [], 448 | diacriticsMiddle: [], 449 | diacriticsBottom: [], 450 | 451 | options: { 452 | top: true, 453 | middle: true, 454 | bottom: true, 455 | maxHeight: 15, 456 | randomization: 100, 457 | }, 458 | }, 459 | 460 | bubbles: { 461 | init: function () { 462 | for (var i = 49; i <= 57; i++) { 463 | this.map[String.fromCharCode(i)] = String.fromCharCode(i + 9263); 464 | } 465 | this.map["0"] = "\u24ea"; 466 | 467 | for (var i = 65; i <= 90; i++) { 468 | this.map[String.fromCharCode(i)] = String.fromCharCode(i + 9333); 469 | } 470 | 471 | for (var i = 97; i <= 122; i++) { 472 | this.map[String.fromCharCode(i)] = String.fromCharCode(i + 9327); 473 | } 474 | 475 | for (i in this.map) { 476 | this.mapInverse[this.map[i]] = i; 477 | } 478 | }, 479 | 480 | encode: function (text) { 481 | var ret = "", 482 | ch, 483 | first = true; 484 | 485 | for (i in text) { 486 | ch = this.map[text[i]]; 487 | 488 | if (typeof ch == "undefined") { 489 | if (text[i].charCodeAt(0) >= 33) { 490 | ch = text[i] + String.fromCharCode(8413); 491 | if (!first) { 492 | ch = 493 | String.fromCharCode(8239) + 494 | String.fromCharCode(160) + 495 | String.fromCharCode(160) + 496 | String.fromCharCode(8239) + 497 | ch; 498 | } 499 | } else { 500 | ch = text[i]; 501 | } 502 | } 503 | ret += ch; 504 | first = ch == "\n"; 505 | } 506 | return ret; 507 | }, 508 | 509 | decode: function (text) { 510 | var ret = "", 511 | ch, 512 | newRet = ""; 513 | 514 | for (i in text) { 515 | ch = this.mapInverse[text[i]]; 516 | ret += typeof ch == "undefined" ? text[i] : ch; 517 | } 518 | 519 | for (i in ret) { 520 | ch = ret[i].charCodeAt(0); 521 | if (ch != 160 && ch != 8239 && ch != 8413) { 522 | newRet += ret[i]; 523 | } 524 | } 525 | 526 | return newRet; 527 | }, 528 | 529 | map: {}, 530 | mapInverse: {}, 531 | }, 532 | 533 | squares: { 534 | init: function () {}, 535 | 536 | encode: function (text) { 537 | var ret = "", 538 | ch, 539 | first = true; 540 | 541 | for (i in text) { 542 | if (text[i].charCodeAt(0) >= 33) { 543 | ch = text[i] + String.fromCharCode(8414); 544 | if (!first) { 545 | ch = 546 | String.fromCharCode(8239) + 547 | String.fromCharCode(160) + 548 | String.fromCharCode(160) + 549 | String.fromCharCode(8239) + 550 | ch; 551 | } 552 | } else { 553 | ch = text[i]; 554 | } 555 | 556 | ret += ch; 557 | first = ch == "\n"; 558 | } 559 | return ret; 560 | }, 561 | 562 | decode: function (text) { 563 | var ret = "", 564 | ch; 565 | 566 | for (i in text) { 567 | ch = text[i].charCodeAt(0); 568 | if (ch != 160 && ch != 8239 && ch != 8414) { 569 | ret += text[i]; 570 | } 571 | } 572 | 573 | return ret; 574 | }, 575 | }, 576 | 577 | // Same as squares, just round. 578 | roundsquares: { 579 | init: function () {}, 580 | 581 | encode: function (text) { 582 | var ret = "", 583 | ch, 584 | first = true; 585 | 586 | for (i in text) { 587 | if (text[i].charCodeAt(0) >= 33) { 588 | ch = text[i] + String.fromCharCode(8419); 589 | if (!first) { 590 | ch = 591 | String.fromCharCode(160) + 592 | String.fromCharCode(160) + 593 | String.fromCharCode(160) + 594 | ch; 595 | } 596 | } else { 597 | ch = text[i]; 598 | } 599 | 600 | ret += ch; 601 | first = ch == "\n"; 602 | } 603 | return ret; 604 | }, 605 | 606 | decode: function (text) { 607 | var ret = "", 608 | ch; 609 | 610 | for (i in text) { 611 | ch = text[i].charCodeAt(0); 612 | if (ch != 160 && ch != 8239 && ch != 8419) { 613 | ret += text[i]; 614 | } 615 | } 616 | 617 | return ret; 618 | }, 619 | }, 620 | 621 | bent: { 622 | init: function () { 623 | for (i in this.map) { 624 | this.map[this.map[i]] = i; 625 | } 626 | }, 627 | 628 | encode: function (text) { 629 | var ret = "", 630 | ch; 631 | 632 | for (var i = 0, len = text.length; i < len; i++) { 633 | ch = this.map[text.charAt(i)]; 634 | if (typeof ch == "undefined") { 635 | ch = text.charAt(i); 636 | } 637 | ret += ch; 638 | } 639 | 640 | return ret; 641 | }, 642 | 643 | decode: function (text) { 644 | var ret = "", 645 | ch; 646 | 647 | for (var i = 0, len = text.length; i < len; i++) { 648 | ch = this.map[text.charAt(i)]; 649 | if (typeof ch == "undefined") { 650 | ch = text.charAt(i); 651 | } 652 | ret += ch; 653 | } 654 | return ret; 655 | }, 656 | 657 | map: { 658 | a: "ą", 659 | b: "ҍ", 660 | c: "ç", 661 | d: "ժ", 662 | e: "ҽ", 663 | f: "ƒ", 664 | g: "ց", 665 | h: "հ", 666 | i: "ì", 667 | j: "ʝ", 668 | k: "ҟ", 669 | l: "Ӏ", 670 | m: "ʍ", 671 | n: "ղ", 672 | o: "օ", 673 | p: "ք", 674 | q: "զ", 675 | r: "ɾ", 676 | s: "ʂ", 677 | t: "է", 678 | u: "մ", 679 | v: "ѵ", 680 | w: "ա", 681 | x: "×", 682 | y: "վ", 683 | z: "Հ", 684 | A: "Ⱥ", 685 | B: "β", 686 | C: "↻", 687 | D: "Ꭰ", 688 | E: "Ɛ", 689 | F: "Ƒ", 690 | G: "Ɠ", 691 | H: "Ƕ", 692 | I: "į", 693 | J: "ل", 694 | K: "Ҡ", 695 | L: "Ꝉ", 696 | M: "Ɱ", 697 | N: "ហ", 698 | O: "ට", 699 | P: "φ", 700 | Q: "Ҩ", 701 | R: "འ", 702 | S: "Ϛ", 703 | T: "Ͳ", 704 | U: "Ա", 705 | V: "Ỽ", 706 | W: "చ", 707 | X: "ჯ", 708 | Y: "Ӌ", 709 | Z: "ɀ", 710 | 0: "⊘", 711 | 1: "������", 712 | 2: "ϩ", 713 | 3: "Ӡ", 714 | 4: "५", 715 | 5: "Ƽ", 716 | 6: "Ϭ", 717 | 7: "7", 718 | 8: "������", 719 | 9: "९", 720 | "&": "⅋", 721 | "(": "{", 722 | ")": "}", 723 | "{": "(", 724 | "}": ")", 725 | 726 | ä: "ą" + "\u0308", 727 | ö: "օ" + "\u0308", 728 | ü: "մ" + "\u0308", 729 | Ä: "Ⱥ" + "\u0308", 730 | Ö: "ට" + "\u0308", 731 | Ü: "Ա" + "\u0308", 732 | 733 | é: "ҽ" + "\u0301", 734 | á: "ą" + "\u0301", 735 | ó: "օ" + "\u0301", 736 | ú: "մ" + "\u0301", 737 | É: "Ɛ" + "\u0301", 738 | Á: "Ⱥ" + "\u0301", 739 | Ó: "ට" + "\u0301", 740 | Ú: "Ա" + "\u0301", 741 | 742 | è: "ҽ" + "\u0300", 743 | à: "ą" + "\u0300", 744 | ò: "օ" + "\u0300", 745 | ù: "մ" + "\u0300", 746 | È: "Ɛ" + "\u0300", 747 | À: "Ⱥ" + "\u0300", 748 | Ò: "ට" + "\u0300", 749 | Ù: "Ա" + "\u0300", 750 | 751 | ê: "ҽ" + "\u0302", 752 | â: "ą" + "\u0302", 753 | ô: "օ" + "\u0302", 754 | û: "մ" + "\u0302", 755 | Ê: "Ɛ" + "\u0302", 756 | Â: "Ⱥ" + "\u0302", 757 | Ô: "ට" + "\u0302", 758 | Û: "Ա" + "\u0302", 759 | }, 760 | }, 761 | 762 | tiny: { 763 | init: function () { 764 | for (i in this.map) { 765 | this.map[this.map[i]] = i; 766 | } 767 | }, 768 | 769 | encode: function (text) { 770 | var ret = "", 771 | ch; 772 | text = text.toUpperCase(); 773 | for (var i = 0, len = text.length; i < len; i++) { 774 | ch = this.map[text.charAt(i)]; 775 | if (typeof ch == "undefined") { 776 | ch = text.charAt(i); 777 | } 778 | ret += ch; 779 | } 780 | 781 | return ret; 782 | }, 783 | 784 | decode: function (text) { 785 | var ret = "", 786 | ch; 787 | 788 | for (var i = 0, len = text.length; i < len; i++) { 789 | ch = this.map[text.charAt(i)]; 790 | if (typeof ch == "undefined") { 791 | ch = text.charAt(i); 792 | } 793 | ret += ch; 794 | } 795 | return ret; 796 | }, 797 | 798 | map: { 799 | A: "ᴀ", 800 | B: "ʙ", 801 | C: "ᴄ", 802 | D: "ᴅ", 803 | E: "ᴇ", 804 | F: "ꜰ", 805 | G: "ɢ", 806 | H: "ʜ", 807 | I: "ɪ", 808 | J: "ᴊ", 809 | K: "ᴋ", 810 | L: "ʟ", 811 | M: "ᴍ", 812 | N: "ɴ", 813 | O: "ᴏ", 814 | P: "ᴘ", 815 | Q: "Q", 816 | R: "ʀ", 817 | S: "ꜱ", 818 | T: "ᴛ", 819 | U: "ᴜ", 820 | V: "ᴠ", 821 | W: "ᴡ", 822 | X: "x", 823 | Y: "ʏ", 824 | Z: "ᴢ", 825 | }, 826 | }, 827 | }; 828 | 829 | for (i in this.tools) { 830 | this.tools[i].init(); 831 | } 832 | 833 | this.getHTML = function (text) { 834 | var html = "", 835 | ch, 836 | lastSpaceWasNonBreaking = true, 837 | highSurrogate = 0, 838 | codepoint = 0; 839 | 840 | for (var i = 0, len = text.length; i < len; i++) { 841 | ch = text.charCodeAt(i); 842 | 843 | if (ch == 10 || ch == 13) { 844 | html += "
\n"; 845 | lastSpaceWasNonBreaking = true; 846 | } else if (ch == 32) { 847 | if (lastSpaceWasNonBreaking) { 848 | html += " "; 849 | lastSpaceWasNonBreaking = false; 850 | } else { 851 | html += " "; 852 | lastSpaceWasNonBreaking = true; 853 | } 854 | } else { 855 | if (ch >= 0xd800 && ch <= 0xdbff) { 856 | highSurrogate = ch; 857 | codepoint = 0; 858 | } else if (highSurrogate > 0) { 859 | if (ch >= 0xdc00 && ch <= 0xdfff) { 860 | codepoint = 861 | (highSurrogate - 0xd800) * 1024 + (ch - 0xdc00) + 0x10000; 862 | } 863 | highSurrogate = 0; 864 | } else { 865 | codepoint = ch; 866 | } 867 | 868 | if (codepoint != 0) { 869 | html += "&#x" + codepoint.toString(16) + ";"; 870 | lastSpaceWasNonBreaking = true; 871 | } 872 | } 873 | } 874 | 875 | return html; 876 | }; 877 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 | if (k2 === undefined) k2 = k; 4 | var desc = Object.getOwnPropertyDescriptor(m, k); 5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 6 | desc = { enumerable: true, get: function() { return m[k]; } }; 7 | } 8 | Object.defineProperty(o, k2, desc); 9 | }) : (function(o, m, k, k2) { 10 | if (k2 === undefined) k2 = k; 11 | o[k2] = m[k]; 12 | })); 13 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 14 | Object.defineProperty(o, "default", { enumerable: true, value: v }); 15 | }) : function(o, v) { 16 | o["default"] = v; 17 | }); 18 | var __importStar = (this && this.__importStar) || function (mod) { 19 | if (mod && mod.__esModule) return mod; 20 | var result = {}; 21 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 22 | __setModuleDefault(result, mod); 23 | return result; 24 | }; 25 | var __importDefault = (this && this.__importDefault) || function (mod) { 26 | return (mod && mod.__esModule) ? mod : { "default": mod }; 27 | }; 28 | Object.defineProperty(exports, "__esModule", { value: true }); 29 | const baileys_1 = __importStar(require("@whiskeysockets/baileys")); 30 | const logger_1 = __importDefault(require("@whiskeysockets/baileys/lib/Utils/logger")); 31 | const logger = logger_1.default.child({}); 32 | logger.level = 'silent'; 33 | const pino = require("pino"); 34 | const boom_1 = require("@hapi/boom"); 35 | const conf = require("./set"); 36 | const axios = require("axios"); 37 | let fs = require("fs-extra"); 38 | let path = require("path"); 39 | const FileType = require('file-type'); 40 | const { Sticker, createSticker, StickerTypes } = require('wa-sticker-formatter'); 41 | //import chalk from 'chalk' 42 | const { verifierEtatJid , recupererActionJid } = require("./bdd/antilien"); 43 | const { atbverifierEtatJid , atbrecupererActionJid } = require("./bdd/antibot"); 44 | let evt = require(__dirname + "/framework/zokou"); 45 | const {isUserBanned , addUserToBanList , removeUserFromBanList} = require("./bdd/banUser"); 46 | const {addGroupToBanList,isGroupBanned,removeGroupFromBanList} = require("./bdd/banGroup"); 47 | const {isGroupOnlyAdmin,addGroupToOnlyAdminList,removeGroupFromOnlyAdminList} = require("./bdd/onlyAdmin"); 48 | //const //{loadCmd}=require("/framework/mesfonctions") 49 | let { reagir } = require(__dirname + "/framework/app"); 50 | var session = conf.session.replace(/Zokou-MD-WHATSAPP-BOT;;;=>/g,""); 51 | const prefixe = conf.PREFIXE; 52 | 53 | 54 | async function authentification() { 55 | try { 56 | 57 | //console.log("le data "+data) 58 | if (!fs.existsSync(__dirname + "/auth/creds.json")) { 59 | console.log("connexion en cour ..."); 60 | await fs.writeFileSync(__dirname + "/auth/creds.json", atob(session), "utf8"); 61 | //console.log(session) 62 | } 63 | else if (fs.existsSync(__dirname + "/auth/creds.json") && session != "zokk") { 64 | await fs.writeFileSync(__dirname + "/auth/creds.json", atob(session), "utf8"); 65 | } 66 | } 67 | catch (e) { 68 | console.log("Session Invalide " + e); 69 | return; 70 | } 71 | } 72 | authentification(); 73 | const store = (0, baileys_1.makeInMemoryStore)({ 74 | logger: pino().child({ level: "silent", stream: "store" }), 75 | }); 76 | setTimeout(() => { 77 | async function main() { 78 | const { version, isLatest } = await (0, baileys_1.fetchLatestBaileysVersion)(); 79 | const { state, saveCreds } = await (0, baileys_1.useMultiFileAuthState)(__dirname + "/auth"); 80 | const sockOptions = { 81 | version, 82 | logger: pino({ level: "silent" }), 83 | browser: ['Flash-Md', "safari", "1.0.0"], 84 | printQRInTerminal: true, 85 | fireInitQueries: false, 86 | shouldSyncHistoryMessage: true, 87 | downloadHistory: true, 88 | syncFullHistory: true, 89 | generateHighQualityLinkPreview: true, 90 | markOnlineOnConnect: false, 91 | keepAliveIntervalMs: 30_000, 92 | /* auth: state*/ auth: { 93 | creds: state.creds, 94 | /** caching makes the store faster to send/recv messages */ 95 | keys: (0, baileys_1.makeCacheableSignalKeyStore)(state.keys, logger), 96 | }, 97 | ////////// 98 | getMessage: async (key) => { 99 | if (store) { 100 | const msg = await store.loadMessage(key.remoteJid, key.id, undefined); 101 | return msg.message || undefined; 102 | } 103 | return { 104 | conversation: 'An Error Occurred, Repeat Command!' 105 | }; 106 | } 107 | /////// 108 | }; 109 | const zk = (0, baileys_1.default)(sockOptions); 110 | store.bind(zk.ev); 111 | setInterval(() => { store.writeToFile("store.json"); }, 3000); 112 | zk.ev.on("messages.upsert", async (m) => { 113 | const { messages } = m; 114 | const ms = messages[0]; 115 | if (!ms.message) 116 | return; 117 | const decodeJid = (jid) => { 118 | if (!jid) 119 | return jid; 120 | if (/:\d+@/gi.test(jid)) { 121 | let decode = (0, baileys_1.jidDecode)(jid) || {}; 122 | return decode.user && decode.server && decode.user + '@' + decode.server || jid; 123 | } 124 | else 125 | return jid; 126 | }; 127 | var mtype = (0, baileys_1.getContentType)(ms.message); 128 | var texte = mtype == "conversation" ? ms.message.conversation : mtype == "imageMessage" ? ms.message.imageMessage?.caption : mtype == "videoMessage" ? ms.message.videoMessage?.caption : mtype == "extendedTextMessage" ? ms.message?.extendedTextMessage?.text : mtype == "buttonsResponseMessage" ? 129 | ms?.message?.buttonsResponseMessage?.selectedButtonId : mtype == "listResponseMessage" ? 130 | ms.message?.listResponseMessage?.singleSelectReply?.selectedRowId : mtype == "messageContextInfo" ? 131 | (ms?.message?.buttonsResponseMessage?.selectedButtonId || ms.message?.listResponseMessage?.singleSelectReply?.selectedRowId || ms.text) : ""; 132 | var origineMessage = ms.key.remoteJid; 133 | var idBot = decodeJid(zk.user.id); 134 | var servBot = idBot.split('@')[0]; 135 | /* const FranceKing='254757835036'; 136 | const FranceKing1='254751284190'; 137 | const FranceKing2='254750948696'*/ 138 | /* var superUser=[servBot,FranceKing,FranceKing1,luffy].map((s)=>s.replace(/[^0-9]/g)+"@s.whatsapp.net").includes(auteurMessage); 139 | var dev =[FranceKing,FranceKing1,FranceKing2].map((t)=>t.replace(/[^0-9]/g)+"@s.whatsapp.net").includes(auteurMessage);*/ 140 | const verifGroupe = origineMessage?.endsWith("@g.us"); 141 | var infosGroupe = verifGroupe ? await zk.groupMetadata(origineMessage) : ""; 142 | var nomGroupe = verifGroupe ? infosGroupe.subject : ""; 143 | var msgRepondu = ms.message.extendedTextMessage?.contextInfo?.quotedMessage; 144 | var auteurMsgRepondu = decodeJid(ms.message?.extendedTextMessage?.contextInfo?.participant); 145 | //ms.message.extendedTextMessage?.contextInfo?.mentionedJid 146 | // ms.message.extendedTextMessage?.contextInfo?.quotedMessage. 147 | var mr = ms.message?.extendedTextMessage?.contextInfo?.mentionedJid; 148 | var utilisateur = mr ? mr : msgRepondu ? auteurMsgRepondu : ""; 149 | var auteurMessage = verifGroupe ? (ms.key.participant ? ms.key.participant : ms.participant) : origineMessage; 150 | if (ms.key.fromMe) { 151 | auteurMessage = idBot; 152 | } 153 | 154 | var membreGroupe = verifGroupe ? ms.key.participant : ''; 155 | const { getAllSudoNumbers } = require("./bdd/sudo"); 156 | const nomAuteurMessage = ms.pushName; 157 | const FranceKing = '254757835036'; 158 | const FranceKing1 = '254751284190'; 159 | const FranceKing2 = "254750948696"; 160 | const FranceKing3 = '254742063632'; 161 | const sudo = await getAllSudoNumbers(); 162 | const superUserNumbers = [servBot, FranceKing, FranceKing1, FranceKing2, FranceKing3, conf.NUMERO_OWNER].map((s) => s.replace(/[^0-9]/g) + "@s.whatsapp.net"); 163 | const allAllowedNumbers = superUserNumbers.concat(sudo); 164 | const superUser = allAllowedNumbers.includes(auteurMessage); 165 | 166 | var dev = [FranceKing, FranceKing1,FranceKing2,FranceKing3].map((t) => t.replace(/[^0-9]/g) + "@s.whatsapp.net").includes(auteurMessage); 167 | function repondre(mes) { zk.sendMessage(origineMessage, { text: mes }, { quoted: ms }); } 168 | console.log("\t [][]...{Cyberion-V1}...[][]"); 169 | console.log("=========== New message ==========="); 170 | if (verifGroupe) { 171 | console.log("message from the group : " + nomGroupe); 172 | } 173 | console.log("message sent By : " + "[" + nomAuteurMessage + " : " + auteurMessage.split("@s.whatsapp.net")[0] + " ]"); 174 | console.log("message type : " + mtype); 175 | console.log("------ message content ------"); 176 | console.log(texte); 177 | /** */ 178 | function groupeAdmin(membreGroupe) { 179 | let admin = []; 180 | for (m of membreGroupe) { 181 | if (m.admin == null) 182 | continue; 183 | admin.push(m.id); 184 | } 185 | // else{admin= false;} 186 | return admin; 187 | } 188 | 189 | var etat =conf.ETAT; 190 | if(etat==1) 191 | {await zk.sendPresenceUpdate("available",origineMessage);} 192 | else if(etat==2) 193 | {await zk.sendPresenceUpdate("composing",origineMessage);} 194 | else if(etat==3) 195 | { 196 | await zk.sendPresenceUpdate("recording",origineMessage); 197 | } 198 | else 199 | { 200 | await zk.sendPresenceUpdate("unavailable",origineMessage); 201 | } 202 | 203 | const mbre = verifGroupe ? await infosGroupe.participants : ''; 204 | // const verifAdmin = verifGroupe ? await mbre.filter(v => v.admin !== null).map(v => v.id) : '' 205 | let admins = verifGroupe ? groupeAdmin(mbre) : ''; 206 | const verifAdmin = verifGroupe ? admins.includes(auteurMessage) : false; 207 | var verifZokouAdmin = verifGroupe ? admins.includes(idBot) : false; 208 | /** ** */ 209 | /** ***** */ 210 | const arg = texte ? texte.trim().split(/ +/).slice(1) : null; 211 | const verifCom = texte ? texte.startsWith(prefixe) : false; 212 | const com = verifCom ? texte.slice(1).trim().split(/ +/).shift().toLowerCase() : false; 213 | 214 | 215 | const lien = conf.URL.split(',') 216 | 217 | 218 | // Utiliser une boucle for...of pour parcourir les liens 219 | function mybotpic() { 220 | // Générer un indice aléatoire entre 0 (inclus) et la longueur du tableau (exclus) 221 | // Générer un indice aléatoire entre 0 (inclus) et la longueur du tableau (exclus) 222 | const indiceAleatoire = Math.floor(Math.random() * lien.length); 223 | // Récupérer le lien correspondant à l'indice aléatoire 224 | const lienAleatoire = lien[indiceAleatoire]; 225 | return lienAleatoire; 226 | } 227 | var commandeOptions = { 228 | superUser, dev, 229 | verifGroupe, 230 | mbre, 231 | membreGroupe, 232 | verifAdmin, 233 | infosGroupe, 234 | nomGroupe, 235 | auteurMessage, 236 | nomAuteurMessage, 237 | idBot, 238 | verifZokouAdmin, 239 | prefixe, 240 | arg, 241 | repondre, 242 | mtype, 243 | groupeAdmin, 244 | msgRepondu, 245 | auteurMsgRepondu, 246 | ms, 247 | mybotpic 248 | 249 | }; 250 | 251 | 252 | /************************ anti-delete-message */ 253 | 254 | if(ms.message.protocolMessage && ms.message.protocolMessage.type === 0 && (conf.ADM).toLocaleLowerCase() === 'yes' ) { 255 | 256 | if(ms.key.fromMe || ms.message.protocolMessage.key.fromMe) { console.log('Message supprimer me concernant') ; return } 257 | 258 | console.log(`Message supprimer`) 259 | let key = ms.message.protocolMessage.key ; 260 | 261 | 262 | try { 263 | 264 | let st = './store.json' ; 265 | 266 | const data = fs.readFileSync(st, 'utf8'); 267 | 268 | const jsonData = JSON.parse(data); 269 | 270 | let message = jsonData.messages[key.remoteJid] ; 271 | 272 | let msg ; 273 | 274 | for (let i = 0 ; i < message.length ; i++) { 275 | 276 | if (message[i].key.id === key.id) { 277 | 278 | msg = message[i] ; 279 | 280 | break 281 | } 282 | 283 | } 284 | 285 | // console.log(msg) 286 | 287 | if(msg === null || !msg ||msg === 'undefined') {console.log('Message non trouver') ; return } 288 | 289 | await zk.sendMessage(idBot,{ image : { url : './media/deleted-message.jpg'},caption : ` 😈Anti-delete-message😈\n Message from @${msg.key.participant.split('@')[0]}​` , mentions : [msg.key.participant]},) 290 | .then( () => { 291 | zk.sendMessage(idBot,{forward : msg},{quoted : msg}) ; 292 | }) 293 | 294 | 295 | 296 | } catch (e) { 297 | console.log(e) 298 | } 299 | } 300 | 301 | /** ****** gestion auto-status */ 302 | if (ms.key && ms.key.remoteJid === "status@broadcast" && conf.AUTO_READ_STATUS === "yes") { 303 | await zk.readMessages([ms.key]); 304 | } 305 | if (ms.key && ms.key.remoteJid === 'status@broadcast' && conf.AUTO_DOWNLOAD_STATUS === "yes") { 306 | /* await zk.readMessages([ms.key]);*/ 307 | if (ms.message.extendedTextMessage) { 308 | var stTxt = ms.message.extendedTextMessage.text; 309 | await zk.sendMessage(idBot, { text: stTxt }, { quoted: ms }); 310 | } 311 | else if (ms.message.imageMessage) { 312 | var stMsg = ms.message.imageMessage.caption; 313 | var stImg = await zk.downloadAndSaveMediaMessage(ms.message.imageMessage); 314 | await zk.sendMessage(idBot, { image: { url: stImg }, caption: stMsg }, { quoted: ms }); 315 | } 316 | else if (ms.message.videoMessage) { 317 | var stMsg = ms.message.videoMessage.caption; 318 | var stVideo = await zk.downloadAndSaveMediaMessage(ms.message.videoMessage); 319 | await zk.sendMessage(idBot, { 320 | video: { url: stVideo }, caption: stMsg 321 | }, { quoted: ms }); 322 | } 323 | /** *************** */ 324 | // console.log("*nouveau status* "); 325 | } 326 | /** ******fin auto-status */ 327 | if (!dev && origineMessage == "120363158701337904@g.us") { 328 | return; 329 | } 330 | 331 | //---------------------------------------rang-count-------------------------------- 332 | if (texte && auteurMessage.endsWith("s.whatsapp.net")) { 333 | const { ajouterOuMettreAJourUserData } = require("./bdd/level"); 334 | try { 335 | await ajouterOuMettreAJourUserData(auteurMessage); 336 | } catch (e) { 337 | console.error(e); 338 | } 339 | } 340 | 341 | ///////////////////////////// Mentions ///////////////////////////////////////// 342 | 343 | try { 344 | 345 | if (ms.message[mtype].contextInfo.mentionedJid && (ms.message[mtype].contextInfo.mentionedJid.includes(idBot) || ms.message[mtype].contextInfo.mentionedJid.includes(conf.NUMERO_OWNER + '@s.whatsapp.net')) /*texte.includes(idBot.split('@')[0]) || texte.includes(conf.NUMERO_OWNER)*/) { 346 | 347 | if (origineMessage == "120363158701337904@g.us") { 348 | return; 349 | } ; 350 | 351 | if(superUser) {console.log('hummm') ; return ;} 352 | 353 | let mbd = require('./bdd/mention') ; 354 | 355 | let alldata = await mbd.recupererToutesLesValeurs() ; 356 | 357 | let data = alldata[0] ; 358 | 359 | if ( data.status === 'non') { console.log('mention pas actifs') ; return ;} 360 | 361 | let msg ; 362 | 363 | if (data.type.toLocaleLowerCase() === 'image') { 364 | 365 | msg = { 366 | image : { url : data.url}, 367 | caption : data.message 368 | } 369 | } else if (data.type.toLocaleLowerCase() === 'video' ) { 370 | 371 | msg = { 372 | video : { url : data.url}, 373 | caption : data.message 374 | } 375 | 376 | } else if (data.type.toLocaleLowerCase() === 'sticker') { 377 | 378 | let stickerMess = new Sticker(data.url, { 379 | pack: conf.NOM_OWNER, 380 | type: StickerTypes.FULL, 381 | categories: ["🤩", "🎉"], 382 | id: "12345", 383 | quality: 70, 384 | background: "transparent", 385 | }); 386 | 387 | const stickerBuffer2 = await stickerMess.toBuffer(); 388 | 389 | msg = { 390 | sticker : stickerBuffer2 391 | } 392 | 393 | } else if (data.type.toLocaleLowerCase() === 'audio' ) { 394 | 395 | msg = { 396 | 397 | audio : { url : data.url } , 398 | mimetype:'audio/mp4', 399 | } 400 | 401 | } 402 | 403 | zk.sendMessage(origineMessage,msg,{quoted : ms}) 404 | 405 | } 406 | } catch (error) { 407 | 408 | } 409 | 410 | 411 | //anti-lien 412 | try { 413 | const yes = await verifierEtatJid(origineMessage) 414 | if (texte.includes('https://') && verifGroupe && yes ) { 415 | 416 | console.log("lien detecté") 417 | var verifZokAdmin = verifGroupe ? admins.includes(idBot) : false; 418 | 419 | if(superUser || verifAdmin || !verifZokAdmin ) { console.log('je fais rien'); return}; 420 | 421 | const key = { 422 | remoteJid: origineMessage, 423 | fromMe: false, 424 | id: ms.key.id, 425 | participant: auteurMessage 426 | }; 427 | var txt = "link detected, \n"; 428 | // txt += `message supprimé \n @${auteurMessage.split("@")[0]} rétiré du groupe.`; 429 | const gifLink = "https://raw.githubusercontent.com/djalega8000/Zokou-MD/main/media/remover.gif"; 430 | var sticker = new Sticker(gifLink, { 431 | pack: 'Yobih-Md', 432 | author: conf.OWNER_NAME, 433 | type: StickerTypes.FULL, 434 | categories: ['🤩', '🎉'], 435 | id: '12345', 436 | quality: 50, 437 | background: '#000000' 438 | }); 439 | await sticker.toFile("st1.webp"); 440 | // var txt = `@${auteurMsgRepondu.split("@")[0]} a été rétiré du groupe..\n` 441 | var action = await recupererActionJid(origineMessage); 442 | 443 | if (action === 'remove') { 444 | 445 | txt += `message deleted \n @${auteurMessage.split("@")[0]} removed from group.`; 446 | 447 | await zk.sendMessage(origineMessage, { sticker: fs.readFileSync("st1.webp") }); 448 | (0, baileys_1.delay)(800); 449 | await zk.sendMessage(origineMessage, { text: txt, mentions: [auteurMessage] }, { quoted: ms }); 450 | try { 451 | await zk.groupParticipantsUpdate(origineMessage, [auteurMessage], "remove"); 452 | } 453 | catch (e) { 454 | console.log("antiien ") + e; 455 | } 456 | await zk.sendMessage(origineMessage, { delete: key }); 457 | await fs.unlink("st1.webp"); } 458 | 459 | else if (action === 'delete') { 460 | txt += `Goodbye \n @${auteurMessage.split("@")[0]} Sending other group links here is prohibited!.`; 461 | // await zk.sendMessage(origineMessage, { sticker: fs.readFileSync("st1.webp") }, { quoted: ms }); 462 | await zk.sendMessage(origineMessage, { text: txt, mentions: [auteurMessage] }, { quoted: ms }); 463 | await zk.sendMessage(origineMessage, { delete: key }); 464 | await fs.unlink("st1.webp"); 465 | 466 | } else if(action === 'warn') { 467 | const {getWarnCountByJID ,ajouterUtilisateurAvecWarnCount} = require('./bdd/warn') ; 468 | 469 | let warn = await getWarnCountByJID(auteurMessage) ; 470 | let warnlimit = conf.WARN_COUNT 471 | if ( warn >= warnlimit) { 472 | var kikmsg = `link detected , you will be remove because of reaching warn-limit`; 473 | 474 | await zk.sendMessage(origineMessage, { text: kikmsg , mentions: [auteurMessage] }, { quoted: ms }) ; 475 | 476 | 477 | await zk.groupParticipantsUpdate(origineMessage, [auteurMessage], "remove"); 478 | await zk.sendMessage(origineMessage, { delete: key }); 479 | 480 | 481 | } else { 482 | var rest = warnlimit - warn ; 483 | var msg = `Link detected , your warn_count was upgrade ;\n rest : ${rest} `; 484 | 485 | await ajouterUtilisateurAvecWarnCount(auteurMessage) 486 | 487 | await zk.sendMessage(origineMessage, { text: msg , mentions: [auteurMessage] }, { quoted: ms }) ; 488 | await zk.sendMessage(origineMessage, { delete: key }); 489 | 490 | } 491 | } 492 | } 493 | 494 | } 495 | 496 | 497 | 498 | 499 | 500 | 501 | catch (e) { 502 | console.log("bdd err " + e); 503 | } 504 | 505 | 506 | 507 | /** *************************anti-bot******************************************** */ 508 | try { 509 | const botMsg = ms.key?.id?.startsWith('BAES') && ms.key?.id?.length === 16; 510 | const baileysMsg = ms.key?.id?.startsWith('BAE5') && ms.key?.id?.length === 16; 511 | if (botMsg || baileysMsg) { 512 | 513 | if (mtype === 'reactionMessage') { console.log('Je ne reagis pas au reactions') ; return} ; 514 | const antibotactiver = await atbverifierEtatJid(origineMessage); 515 | if(!antibotactiver) {return}; 516 | 517 | if( verifAdmin || auteurMessage === idBot ) { console.log('je fais rien'); return}; 518 | 519 | const key = { 520 | remoteJid: origineMessage, 521 | fromMe: false, 522 | id: ms.key.id, 523 | participant: auteurMessage 524 | }; 525 | var txt = "bot detected, \n"; 526 | // txt += `message supprimé \n @${auteurMessage.split("@")[0]} rétiré du groupe.`; 527 | const gifLink = "https://raw.githubusercontent.com/djalega8000/Zokou-MD/main/media/remover.gif"; 528 | var sticker = new Sticker(gifLink, { 529 | pack: 'Yobih-Md', 530 | author: conf.OWNER_NAME, 531 | type: StickerTypes.FULL, 532 | categories: ['🤩', '🎉'], 533 | id: '12345', 534 | quality: 50, 535 | background: '#000000' 536 | }); 537 | await sticker.toFile("st1.webp"); 538 | // var txt = `@${auteurMsgRepondu.split("@")[0]} a été rétiré du groupe..\n` 539 | var action = await atbrecupererActionJid(origineMessage); 540 | 541 | if (action === 'remove') { 542 | 543 | txt += `message deleted \n @${auteurMessage.split("@")[0]} removed from group.`; 544 | 545 | await zk.sendMessage(origineMessage, { sticker: fs.readFileSync("st1.webp") }); 546 | (0, baileys_1.delay)(800); 547 | await zk.sendMessage(origineMessage, { text: txt, mentions: [auteurMessage] }, { quoted: ms }); 548 | try { 549 | await zk.groupParticipantsUpdate(origineMessage, [auteurMessage], "remove"); 550 | } 551 | catch (e) { 552 | console.log("antibot ") + e; 553 | } 554 | await zk.sendMessage(origineMessage, { delete: key }); 555 | await fs.unlink("st1.webp"); } 556 | 557 | else if (action === 'delete') { 558 | txt += `message delete \n @${auteurMessage.split("@")[0]} Avoid sending link.`; 559 | //await zk.sendMessage(origineMessage, { sticker: fs.readFileSync("st1.webp") }, { quoted: ms }); 560 | await zk.sendMessage(origineMessage, { text: txt, mentions: [auteurMessage] }, { quoted: ms }); 561 | await zk.sendMessage(origineMessage, { delete: key }); 562 | await fs.unlink("st1.webp"); 563 | 564 | } else if(action === 'warn') { 565 | const {getWarnCountByJID ,ajouterUtilisateurAvecWarnCount} = require('./bdd/warn') ; 566 | 567 | let warn = await getWarnCountByJID(auteurMessage) ; 568 | let warnlimit = conf.WARN_COUNT 569 | if ( warn >= warnlimit) { 570 | var kikmsg = `bot detected ;you will be remove because of reaching warn-limit`; 571 | 572 | await zk.sendMessage(origineMessage, { text: kikmsg , mentions: [auteurMessage] }, { quoted: ms }) ; 573 | 574 | 575 | await zk.groupParticipantsUpdate(origineMessage, [auteurMessage], "remove"); 576 | await zk.sendMessage(origineMessage, { delete: key }); 577 | 578 | 579 | } else { 580 | var rest = warnlimit - warn ; 581 | var msg = `bot detected , your warn_count was upgrade ;\n rest : ${rest} `; 582 | 583 | await ajouterUtilisateurAvecWarnCount(auteurMessage) 584 | 585 | await zk.sendMessage(origineMessage, { text: msg , mentions: [auteurMessage] }, { quoted: ms }) ; 586 | await zk.sendMessage(origineMessage, { delete: key }); 587 | 588 | } 589 | } 590 | } 591 | } 592 | catch (er) { 593 | console.log('.... ' + er); 594 | } 595 | 596 | 597 | ///////////////////////// 598 | 599 | //execution des commandes 600 | if (verifCom) { 601 | //await await zk.readMessages(ms.key); 602 | const cd = evt.cm.find((zokou) => zokou.nomCom === (com)); 603 | if (cd) { 604 | try { 605 | 606 | if ((conf.MODE).toLocaleLowerCase() != 'yes' && !superUser) { 607 | return; 608 | } 609 | 610 | /******************* PM_PERMT***************/ 611 | 612 | if (!superUser && origineMessage === auteurMessage&& conf.PM_PERMIT === "yes" ) { 613 | repondre("You don't have acces to commands here") ; return } 614 | /////////////////////////////// 615 | 616 | 617 | /*****************************banGroup */ 618 | if (!superUser && verifGroupe) { 619 | 620 | let req = await isGroupBanned(origineMessage); 621 | 622 | if (req) { return } 623 | } 624 | 625 | /*************************** ONLY-ADMIN */ 626 | 627 | if(!verifAdmin && verifGroupe) { 628 | let req = await isGroupOnlyAdmin(origineMessage); 629 | 630 | if (req) { return }} 631 | 632 | /**********************banuser */ 633 | 634 | 635 | if(!superUser) { 636 | let req = await isUserBanned(auteurMessage); 637 | 638 | if (req) {repondre("You are banned from bot commands"); return} 639 | 640 | 641 | } 642 | 643 | reagir(origineMessage, zk, ms, cd.reaction); 644 | cd.fonction(origineMessage, zk, commandeOptions); 645 | } 646 | catch (e) { 647 | console.log("😡😡 " + e); 648 | zk.sendMessage(origineMessage, { text: "😡😡 " + e }, { quoted: ms }); 649 | } 650 | } 651 | } 652 | //fin exécution commandes 653 | }); 654 | //fin événement message 655 | 656 | /******** evenement groupe update ****************/ 657 | const { recupevents } = require('./bdd/welcome'); 658 | 659 | zk.ev.on('group-participants.update', async (group) => { 660 | console.log(group); 661 | 662 | let ppgroup; 663 | try { 664 | ppgroup = await zk.profilePictureUrl(group.id, 'image'); 665 | } catch { 666 | ppgroup = 'https://telegra.ph/file/d0cd3c82fbbc120f38ac4.jpg'; 667 | } 668 | 669 | try { 670 | const metadata = await zk.groupMetadata(group.id); 671 | 672 | if (group.action == 'add' && (await recupevents(group.id, "welcome") == 'on')) { 673 | let msg = `◇MUNGAI YOBIH◇ 674 | `; 675 | 676 | let membres = group.participants; 677 | for (let membre of membres) { 678 | msg += `Hello @${membre.split("@")[0]}\n`; 679 | } 680 | 681 | msg += `*You are welcomed here.* 682 | 683 | *You MAY read the group description FOR more info and Avoid getting removed,,,I'm Sir Mungai Yobih,Your LORD* 684 | 685 | 686 | 687 | ◇ *GROUP DESCRIPTION* ◇ 688 | 689 | ${metadata.desc} 690 | 691 | 📌Powred by *YOBIH BOT MD*`; 692 | 693 | zk.sendMessage(group.id, { image: { url: ppgroup }, caption: msg, mentions: membres }); 694 | } else if (group.action == 'remove' && (await recupevents(group.id, "goodbye") == 'on')) { 695 | let msg = `Goodbye to that Fallen soldier, Powered by *YOBIH BUG BOT*;\n`; 696 | 697 | let membres = group.participants; 698 | for (let membre of membres) { 699 | msg += `@${membre.split("@")[0]}\n`; 700 | } 701 | 702 | zk.sendMessage(group.id, { text: msg, mentions: membres }); 703 | 704 | } else if (group.action == 'promote' && (await recupevents(group.id, "antipromote") == 'on') ) { 705 | // console.log(zk.user.id) 706 | if (group.author == metadata.owner || group.author == conf.NUMERO_OWNER + '@s.whatsapp.net' || group.author == decodeJid(zk.user.id) || group.author == group.participants[0]) { console.log('Cas de superUser je fais rien') ;return ;} ; 707 | 708 | 709 | await zk.groupParticipantsUpdate(group.id ,[group.author,group.participants[0]],"demote") ; 710 | 711 | zk.sendMessage( 712 | group.id, 713 | { 714 | text : `@${(group.author).split("@")[0]} has violated the anti-promotion rule, therefore both ${group.author.split("@")[0]} and @${(group.participants[0]).split("@")[0]} have been removed from administrative rights.`, 715 | mentions : [group.author,group.participants[0]] 716 | } 717 | ) 718 | 719 | } else if (group.action == 'demote' && (await recupevents(group.id, "antidemote") == 'on') ) { 720 | 721 | if (group.author == metadata.owner || group.author == conf.NUMERO_OWNER + '@s.whatsapp.net' || group.author == decodeJid(zk.user.id) || group.author == group.participants[0]) { console.log('Cas de superUser je fais rien') ;return ;} ; 722 | 723 | 724 | await zk.groupParticipantsUpdate(group.id ,[group.author],"demote") ; 725 | await zk.groupParticipantsUpdate(group.id , [group.participants[0]] , "promote") 726 | 727 | zk.sendMessage( 728 | group.id, 729 | { 730 | text : `@${(group.author).split("@")[0]} has violated the anti-demotion rule by removing @${(group.participants[0]).split("@")[0]}. Consequently, he has been stripped of administrative rights.` , 731 | mentions : [group.author,group.participants[0]] 732 | } 733 | ) 734 | 735 | } 736 | 737 | } catch (e) { 738 | console.error(e); 739 | } 740 | }); 741 | 742 | /******** fin d'evenement groupe update *************************/ 743 | 744 | 745 | 746 | /*****************************Cron setup */ 747 | 748 | 749 | async function activateCrons() { 750 | const cron = require('node-cron'); 751 | const { getCron } = require('./bdd/cron'); 752 | 753 | let crons = await getCron(); 754 | console.log(crons); 755 | if (crons.length > 0) { 756 | 757 | for (let i = 0; i < crons.length; i++) { 758 | 759 | if (crons[i].mute_at != null) { 760 | let set = crons[i].mute_at.split(':'); 761 | 762 | console.log(`etablissement d'un automute pour ${crons[i].group_id} a ${set[0]} H ${set[1]}`) 763 | 764 | cron.schedule(`${set[1]} ${set[0]} * * *`, async () => { 765 | await zk.groupSettingUpdate(crons[i].group_id, 'announcement'); 766 | zk.sendMessage(crons[i].group_id, { image : { url : './media/chrono.webp'} , caption: "Hello, it's time to close the group; sayonara." }); 767 | 768 | }, { 769 | timezone: "Africa/Nairobi" 770 | }); 771 | } 772 | 773 | if (crons[i].unmute_at != null) { 774 | let set = crons[i].unmute_at.split(':'); 775 | 776 | console.log(`etablissement d'un autounmute pour ${set[0]} H ${set[1]} `) 777 | 778 | cron.schedule(`${set[1]} ${set[0]} * * *`, async () => { 779 | 780 | await zk.groupSettingUpdate(crons[i].group_id, 'not_announcement'); 781 | 782 | zk.sendMessage(crons[i].group_id, { image : { url : './media/chrono.webp'} , caption: "Good morning; It's time to open the group." }); 783 | 784 | 785 | },{ 786 | timezone: "Africa/Nairobi" 787 | }); 788 | } 789 | 790 | } 791 | } else { 792 | console.log('Les crons n\'ont pas été activés'); 793 | } 794 | 795 | return 796 | } 797 | 798 | 799 | //événement contact 800 | zk.ev.on("contacts.upsert", async (contacts) => { 801 | const insertContact = (newContact) => { 802 | for (const contact of newContact) { 803 | if (store.contacts[contact.id]) { 804 | Object.assign(store.contacts[contact.id], contact); 805 | } 806 | else { 807 | store.contacts[contact.id] = contact; 808 | } 809 | } 810 | return; 811 | }; 812 | insertContact(contacts); 813 | }); 814 | //fin événement contact 815 | //événement connexion 816 | zk.ev.on("connection.update", async (con) => { 817 | const { lastDisconnect, connection } = con; 818 | if (connection === "connecting") { 819 | console.log("ℹ️ Connexion en cours..."); 820 | } 821 | else if (connection === 'open') { 822 | console.log("✅ connexion reussie! ☺️"); 823 | console.log("--"); 824 | await (0, baileys_1.delay)(200); 825 | console.log("------"); 826 | await (0, baileys_1.delay)(300); 827 | console.log("------------------/-----"); 828 | console.log("le bot est en ligne 🕸\n\n"); 829 | //chargement des commandes 830 | console.log("chargement des commandes ...\n"); 831 | fs.readdirSync(__dirname + "/commandes").forEach((fichier) => { 832 | if (path.extname(fichier).toLowerCase() == (".js")) { 833 | try { 834 | require(__dirname + "/commandes/" + fichier); 835 | console.log(fichier + " installé ✔️"); 836 | } 837 | catch (e) { 838 | console.log(`${fichier} n'a pas pu être chargé pour les raisons suivantes : ${e}`); 839 | } /* require(__dirname + "/commandes/" + fichier); 840 | console.log(fichier + " installé ✔️")*/ 841 | (0, baileys_1.delay)(300); 842 | } 843 | }); 844 | (0, baileys_1.delay)(700); 845 | var md; 846 | if ((conf.MODE).toLocaleLowerCase() === "yes") { 847 | md = "public"; 848 | } 849 | else if ((conf.MODE).toLocaleLowerCase() === "no") { 850 | md = "private"; 851 | } 852 | else { 853 | md = "undefined"; 854 | } 855 | console.log("chargement des commandes terminé ✅"); 856 | 857 | await activateCrons(); 858 | 859 | if((conf.DP).toLowerCase() === 'yes') { 860 | let cmsg = ` 861 | *『YOBIH_BUG_BOT CONNECTED 』* 862 | 863 | 864 | ┌─────═━┈┈━═─────┐ 865 | ║❒Creator: *YOBIH MUNGAI* 866 | ║❒Prefix : [ ${prefixe} ] 867 | ║❒Mode :${md} 868 | ║❒Created on : *15.8.2024* 869 | ║❒Total Commands : ${evt.cm.length}︎ 870 | └─────═━┈┈━═─────┘ 871 | 872 | 873 | 874 | 875 | ║❒ *JOIN OUR WhatsApp* 876 | https://whatsapp.com/channel/0029Vajp1HY4o7qSc0kE9o1g 877 | 878 | ║❒ *CONTACT THE DEVELOPER* 🪄 879 | https://wa.me/254743436105 880 | 881 | ║❒ *TELEGRAM* 882 | https://wa.me/254743436105 883 | 884 | 885 | 886 | 887 | *YOBIH BUG BOT*`; 888 | await zk.sendMessage(zk.user.id, { text: cmsg }); 889 | } 890 | } 891 | else if (connection == "close") { 892 | let raisonDeconnexion = new boom_1.Boom(lastDisconnect?.error)?.output.statusCode; 893 | if (raisonDeconnexion === baileys_1.DisconnectReason.badSession) { 894 | console.log('Session id érronée veuillez rescanner le qr svp ...'); 895 | } 896 | else if (raisonDeconnexion === baileys_1.DisconnectReason.connectionClosed) { 897 | console.log('!!! connexion fermée, reconnexion en cours ...'); 898 | main(); 899 | } 900 | else if (raisonDeconnexion === baileys_1.DisconnectReason.connectionLost) { 901 | console.log('connexion au serveur perdue 😞 ,,, reconnexion en cours ... '); 902 | main(); 903 | } 904 | else if (raisonDeconnexion === baileys_1.DisconnectReason?.connectionReplaced) { 905 | console.log('connexion réplacée ,,, une sesssion est déjà ouverte veuillez la fermer svp !!!'); 906 | } 907 | else if (raisonDeconnexion === baileys_1.DisconnectReason.loggedOut) { 908 | console.log('vous êtes déconnecté,,, veuillez rescanner le code qr svp'); 909 | } 910 | else if (raisonDeconnexion === baileys_1.DisconnectReason.restartRequired) { 911 | console.log('redémarrage en cours ▶️'); 912 | main(); 913 | } else { 914 | 915 | console.log('redemarrage sur le coup de l\'erreur ',raisonDeconnexion) ; 916 | //repondre("* Redémarrage du bot en cour ...*"); 917 | 918 | const {exec}=require("child_process") ; 919 | 920 | exec("pm2 restart all"); 921 | } 922 | // sleep(50000) 923 | console.log("hum " + connection); 924 | main(); //console.log(session) 925 | } 926 | }); 927 | //fin événement connexion 928 | //événement authentification 929 | zk.ev.on("creds.update", saveCreds); 930 | //fin événement authentification 931 | // 932 | /** ************* */ 933 | //fonctions utiles 934 | zk.downloadAndSaveMediaMessage = async (message, filename = '', attachExtension = true) => { 935 | let quoted = message.msg ? message.msg : message; 936 | let mime = (message.msg || message).mimetype || ''; 937 | let messageType = message.mtype ? message.mtype.replace(/Message/gi, '') : mime.split('/')[0]; 938 | const stream = await (0, baileys_1.downloadContentFromMessage)(quoted, messageType); 939 | let buffer = Buffer.from([]); 940 | for await (const chunk of stream) { 941 | buffer = Buffer.concat([buffer, chunk]); 942 | } 943 | let type = await FileType.fromBuffer(buffer); 944 | let trueFileName = './' + filename + '.' + type.ext; 945 | // save to file 946 | await fs.writeFileSync(trueFileName, buffer); 947 | return trueFileName; 948 | }; 949 | 950 | 951 | zk.awaitForMessage = async (options = {}) =>{ 952 | return new Promise((resolve, reject) => { 953 | if (typeof options !== 'object') reject(new Error('Options must be an object')); 954 | if (typeof options.sender !== 'string') reject(new Error('Sender must be a string')); 955 | if (typeof options.chatJid !== 'string') reject(new Error('ChatJid must be a string')); 956 | if (options.timeout && typeof options.timeout !== 'number') reject(new Error('Timeout must be a number')); 957 | if (options.filter && typeof options.filter !== 'function') reject(new Error('Filter must be a function')); 958 | 959 | const timeout = options?.timeout || undefined; 960 | const filter = options?.filter || (() => true); 961 | let interval = undefined 962 | 963 | /** 964 | * 965 | * @param {{messages: Baileys.proto.IWebMessageInfo[], type: Baileys.MessageUpsertType}} data 966 | */ 967 | let listener = (data) => { 968 | let { type, messages } = data; 969 | if (type == "notify") { 970 | for (let message of messages) { 971 | const fromMe = message.key.fromMe; 972 | const chatId = message.key.remoteJid; 973 | const isGroup = chatId.endsWith('@g.us'); 974 | const isStatus = chatId == 'status@broadcast'; 975 | 976 | const sender = fromMe ? zk.user.id.replace(/:.*@/g, '@') : (isGroup || isStatus) ? message.key.participant.replace(/:.*@/g, '@') : chatId; 977 | if (sender == options.sender && chatId == options.chatJid && filter(message)) { 978 | zk.ev.off('messages.upsert', listener); 979 | clearTimeout(interval); 980 | resolve(message); 981 | } 982 | } 983 | } 984 | } 985 | zk.ev.on('messages.upsert', listener); 986 | if (timeout) { 987 | interval = setTimeout(() => { 988 | zk.ev.off('messages.upsert', listener); 989 | reject(new Error('Timeout')); 990 | }, timeout); 991 | } 992 | }); 993 | } 994 | 995 | 996 | 997 | // fin fonctions utiles 998 | /** ************* */ 999 | return zk; 1000 | } 1001 | let fichier = require.resolve(__filename); 1002 | fs.watchFile(fichier, () => { 1003 | fs.unwatchFile(fichier); 1004 | console.log(`mise à jour ${__filename}`); 1005 | delete require.cache[fichier]; 1006 | require(fichier); 1007 | }); 1008 | main(); 1009 | }, 5000); 1010 | --------------------------------------------------------------------------------