From bbb6c4f6abf1bf880c398025e4614a12c6c66f95 Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 11:59:53 +0100 Subject: [PATCH 01/21] Update pool.js --- pool.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pool.js b/pool.js index 2c59b0f..da7b146 100644 --- a/pool.js +++ b/pool.js @@ -1,10 +1,7 @@ - -// —— Requiring the packages that we need for this file. const { Signale } = require('signale'); const createCode = require('./public/util.js').createCode; const logger = new Signale({ scope: 'Pool' }); -// —— Making the functions!! let linkPool = []; function createLink(discordID) { @@ -16,7 +13,7 @@ function createLink(discordID) { setTimeout(function() { if (isValidLink(linkID)) removeLink(linkID); }, 900000); - logger.info('Created new link ID:', linkID); + logger.info('Nouveau lien ID créé:', linkID); return linkID; } From 67d3316be9c035ea292e8703feacbb9b2feb150b Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:00:04 +0100 Subject: [PATCH 02/21] Update package.json --- package.json | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 8b80016..8b713d3 100644 --- a/package.json +++ b/package.json @@ -1,27 +1,22 @@ { - "name": "ward", - "version": "4.0.0", - "description": "A Discord verification bot using reCAPTCHA v2.", + "name": "PristisVerify", + "version": "1.0.6", + "description": "Un robot de vérification Discord utilisant reCAPTCHA v2 pour le serveur Discord de PristisHEBERG.", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "start": "node --no-warnings ./index.js" + "start": "node --no-warnings ./index.js", + "run": "node index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/nates/ward.git" - }, - "author": "nates", + "author": "xb3n6e", "license": "MIT", - "bugs": { - "url": "https://github.com/nates/ward/issues" - }, - "homepage": "https://github.com/nates/ward#readme", + "homepage": "https://github.com/xb3n6e", "dependencies": { + "@discordjs/builders": "^1.6.5", "@discordjs/rest": "^1.0.1", "axios": "^0.21.1", "body-parser": "^1.19.0", - "discord.js": "^14.0.3", + "discord.js": "^14.13.0", "ejs": "^3.1.8", "express": "^4.18.1", "https": "^1.0.0", From 82908a86ae37683b4cf646c83f595563d9c76ec6 Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:00:23 +0100 Subject: [PATCH 03/21] Update index.js --- index.js | 178 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 118 insertions(+), 60 deletions(-) diff --git a/index.js b/index.js index a6e5d65..0bc1ef0 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,3 @@ - -// —— Requiring the packages the we need. const fs = require("fs"); const { Client, Collection, Partials } = require("discord.js"); const { Signale } = require('signale'); @@ -12,60 +10,88 @@ const https = require('https'); const pool = require('./pool'); const config = require("./config.js"); const logger = new Signale({ scope: 'Discord' }); +const licenselogger = new Signale({ scope: 'License' }); + +const APIconfig = { + pluginName: 'PristisVerify' +}; + +const options = { + disabled: false, + interactive: false, + logLevel: 'info', + scope: 'custom', + secrets: [], + stream: process.stdout, + types: { + remind: { + badge: '!', + color: 'yellow', + label: 'rappel', + logLevel: 'info' + }, + warningx: { + badge: '!', + color: 'yellow', + label: 'avis', + logLevel: 'info' + } + } +}; + +const loggerx = new Signale(options); -// —— Initializing the client. const client = new Client({ - intents: [ 131071 ], // Basically for (most?) of the intents. + intents: [ 131071 ], partials: [ Partials.Channel ] }); -// —— All event files of the event handler. - const eventFiles = fs - .readdirSync("./events") - .filter((file) => file.endsWith(".js")); +const eventFiles = fs +.readdirSync("./events") +.filter((file) => file.endsWith(".js")); for (const file of eventFiles) { - const event = require(`./events/${file}`); - if (event.once) { - client.once(event.name, (...args) => event.execute(...args, client)); - } else { - client.on(event.name, async (...args) => await event.execute(...args, client)); - } +const event = require(`./events/${file}`); +if (event.once) { + client.once(event.name, (...args) => event.execute(...args, client)); +} else { + client.on(event.name, async (...args) => await event.execute(...args, client)); +} } client.slashCommands = new Collection(); -// —— Registration of Slash-Command Interactions. const slashCommands = fs.readdirSync("./public/slash"); for (const module of slashCommands) { - const commandFiles = fs - .readdirSync(`./public/slash/${module}`) - .filter((file) => file.endsWith(".js")); + const commandFiles = fs + .readdirSync(`./public/slash/${module}`) + .filter((file) => file.endsWith(".js")) - for (const commandFile of commandFiles) { - const command = require(`./public/slash/${module}/${commandFile}`); - client.slashCommands.set(command.data.name, command); - } + for (const commandFile of commandFiles) { + const command = require(`./public/slash/${module}/${commandFile}`); + client.slashCommands.set(command.data.name, command); + } } -// —— Registration of Slash-Commands in Discord API -const rest = new REST({ version: "9" }).setToken(config.Discord.token); - -const commandJsonData = [ - ...Array.from(client.slashCommands.values()).map((c) => c.data.toJSON()), -]; +const rest = new REST({ 'version': '9'}).setToken(config.Discord.token); +const commandJsonData = Array.from(client.slashCommands.values()).map((c) => c.data.toJSON()); (async () => { - try { - logger.success("Started refreshing application (/) commands."); - await rest.put(Routes.applicationGuildCommands(config.Discord.botId, config.Discord.guildId), { body: commandJsonData }); - logger.success("Successfully reloaded application (/) commands."); - } catch (error) { - console.error(error); - } + try { + console.log(' ') + licenselogger.success(`Bot de OxiWan`); + console.log(' ') + logger.success("Démarrage du rafraîchissement des commandes d'application (/)."); + await rest.put(Routes.applicationCommands(config.Discord.botId), { + 'body': commandJsonData + }); + logger.success("Commandes d'application (/) rechargées avec succès."); + } catch (error) { + console.error(error); + } })(); async function addRole(userID) { @@ -76,15 +102,15 @@ async function addRole(userID) { member.roles.add(role) .catch(() => { - logger.error(`Failed to add role to user ${member.user.tag}! (Maybe verified role is above bot role?)`); + logger.error(`Échec de l'ajout du rôle à l'utilisateur ${member.user.tag} ! (Le rôle vérifié est peut-être au-dessus du rôle du bot ?)`); return; }) .then(() => { - logger.info(`Added verified role to user ${member.user.tag}.`); + logger.info(`Rôle vérifié ajouté à l'utilisateur ${member.user.tag}.`); }) } catch (e) { console.log(e) - logger.error(`Failed to add role to user ${userID}!`); + logger.error(`Échec de l'ajout du rôle à l'utilisateur ${userID} !`); } } @@ -99,48 +125,45 @@ async function removeRole(userID) { member.roles.remove(removeRoleId) .catch(() => { - logger.error(`Failed to remove role from user ${member.user.tag}! (Maybe role is above bot role?)`); + logger.error(`Échec de la suppression du rôle pour l'utilisateur ${member.user.tag} ! (Le rôle est peut-être au-dessus du rôle du bot ?)`); return; }) .then(() => { - logger.info(`Removed role from user ${member.user.tag}.`); + logger.info(`Rôle supprimé pour l'utilisateur ${member.user.tag}.`); }) } catch(e) { - logger.error(`Failed to remove role from user ${userID}!`); + logger.error(`Échec de la suppression du rôle pour l'utilisateur ${userID} !`); } } else { - logger.info(`Remove role is set to false, step skipped.`) + logger.info(`La suppression du rôle est désactivée, étape ignorée.`) } } -// —— Login into your client application with bot's token. client.login(config.Discord.token) .catch(() => { - logger.fatal('Failed to login! Is your intents enabled?'); + logger.fatal('Échec de la connexion ! Vos intentions sont-elles activées ?'); process.exit(0); }) -// —— And another thingy. const app = express(), - port = config.server.https ? 443 : config.server.httpPort; + port = config.server.https ? config.server.httpPort : config.server.httpPort; + +const rootDir = path.join(__dirname, '/'); -// —— Define render engine and assets path app.engine('html', require('ejs').renderFile); -app.use(express.static(path.join(__dirname, '/assets'))); +app.use(express.static(path.join(rootDir, '/assets'))); app.use(express.json()); app.use(express.urlencoded({ extended: true })); -// GET /verify/id app.get('/verify/:verifyId?', (req, res) => { - if (!req.params.verifyId) return res.sendFile(path.join(__dirname, '/html/invalidLink.html')); - if (!pool.isValidLink(req.params.verifyId)) return res.sendFile(path.join(__dirname, '/html/invalidLink.html')); - res.render(path.join(__dirname, '/html/verify.html'), { publicKey: config.reCAPTCHA.publicKey }); + if (!req.params.verifyId) return res.sendFile(path.join(rootDir, '/html/invalidLink.html')); + if (!pool.isValidLink(req.params.verifyId)) return res.sendFile(path.join(rootDir, '/html/invalidLink.html')); + res.render(path.join(rootDir, '/html/verify.html'), { publicKey: config.reCAPTCHA.publicKey }); }); -// POST /verify/id app.post('/verify/:verifyId?', async (req, res) => { - if (!req.body || !req.body['g-recaptcha-response']) return res.sendFile(path.join(__dirname, '/html/invalidLink.html')); + if (!req.body || !req.body['g-recaptcha-response']) return res.sendFile(path.join(rootDir, '/html/invalidLink.html')); const response = await axios({ method: 'post', @@ -150,24 +173,59 @@ app.post('/verify/:verifyId?', async (req, res) => { } }); - if (!response.data.success) return res.sendFile(path.join(__dirname, '/html/invalidCaptcha.html')); - if (!pool.isValidLink(req.params.verifyId)) return res.sendFile(path.join(__dirname, '/html/invalidLink.html')); + if (!response.data.success) return res.sendFile(path.join(rootDir, '/html/invalidCaptcha.html')); + if (!pool.isValidLink(req.params.verifyId)) return res.sendFile(path.join(rootDir, '/html/invalidLink.html')); await addRole(pool.getDiscordId(req.params.verifyId)); await removeRole(pool.getDiscordId(req.params.verifyId)); pool.removeLink(req.params.verifyId); - res.sendFile(path.join(__dirname, '/html/valid.html')); + res.sendFile(path.join(rootDir, '/html/valid.html')); }); const start = () => { + const domain = config.server.domain === 'localhost' ? `${config.server.domain}:${config.server.httpPort}` : `${config.server.domain}`; + logger.info(`URL WebAPI : ${config.server.https ? 'https://' : 'http://'}${domain}/verify/API_ID`); if (config.https) { https.createServer({ key: fs.readFileSync('private.pem'), cert: fs.readFileSync('certificate.pem') - }, app).listen(port, () => logger.info(`Listening on port ${port}.`)); + }, app).listen(port, () => logger.info(`Écoute sur le port ${port}.`)); } else { - app.listen(port, () => logger.info(`Listening on port ${port}.`)); + app.listen(port, () => logger.info(`Écoute sur le port ${port}.`)); } } -// —— Start the server +function reconnect(client, attempts = 1) { + setTimeout(() => { + client.login(config.Discord.token).catch(error => { + logger.error('Échec de la reconnexion :', error.message); + reconnect(client, attempts + 1); + }); + }, Math.min(1000 * 2 ** attempts, 30000)); +} + +client.on('disconnect', () => { + logger.warn('Bot déconnecté. Tentative de reconnexion...'); + reconnect(client); +}); + +process.on('uncaughtException', (error) => { + logger.fatal('Une exception non gérée a été capturée :', error);r +}); + +process.on('unhandledRejection', (reason, promise) => { + logger.fatal('Une promesse non gérée a été rejetée :', reason); +}); + +client.on('shardError', (error) => { + logger.error('Erreur critique sur le shard:', error); +}); + +client.on('rateLimit', (info) => { + logger.warn(`Limite de requêtes atteinte : ${info.timeout}ms`); +}); + +client.on('error', (error) => { + logger.error('Erreur générale du client Discord:', error); +}); + start(); From 04ff86366f0ddffbbe38162d9b9d07a7d2cf983b Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:01:02 +0100 Subject: [PATCH 04/21] Update config-example.js --- config-example.js | 59 ++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/config-example.js b/config-example.js index 3cde51a..2c5bef8 100644 --- a/config-example.js +++ b/config-example.js @@ -1,32 +1,29 @@ +// Renomer le en config.js ! module.exports = { - server: { - domain: "localhost", - https: false, - httpPort: 8080, - }, - - Discord: { - // —— Things that are required for the whole project to work. - token: "", // —— Your bot's token. - botId: "", // —— The bot's ID. - guildId: "", // —— The server ID on where the commands will be deployed. - verifiedRole: "", // —— Role that will be added to the user when they verify their account. - - // —— For users that want to have a role removed upon verification, if you want this, set remove-role to true, and set your remove role ID. - removeRole: false, - removeRoleId: "", - - // —— Set the bot's presence, for statusType see: https://discord-api-types.dev/api/discord-api-types-v10/enum/ActivityType - statusType: 3, // 1 (STREAMING), 2 (LISTENING), 3 (WATCHING), 5 (COMPETING). Default is 0 (PLAYING). - statusMsg: "unverified users!", - - // —— By default, rules are set to disabled, this means rules will be hidden. If you want to use the rules function, change disabled to your rules. Please ensure you use \n for each line break and do not use any symbols that could interfear with JSON. - rulesEnabled: true, - rules: "Type your rules here if rulesEnabled is enabled, ensure to use \n for new lines" - }, - - reCAPTCHA: { - secretKey: "", - publicKey: "" - } -} + "server": { + "domain": "server.example.com:00000", + "https": false, + "httpPort": 00000 + }, + "Discord": { + "token": "", + "botId": "", + "guildId": "", + "verifiedRole": "", + "discordinvite": "", + "removeRole": true, + "removeRoleId": "", + "adminRoleId": "", + "statusType": 3, + "statusMsg": "", + "status": "dnd", + "rulesEnabled": true, + "rulestitle": "", + "rulescolor": "#0099ff", + "rules": "" + }, + "reCAPTCHA": { + "secretKey": "", + "publicKey": "" + }, +}; From 093ec9edee78aa737ccfe66eb403817619df794f Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:05:27 +0100 Subject: [PATCH 05/21] Update README.md --- README.md | 63 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index faa280d..3cc3aaf 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,27 @@
🟢 Traduction en français 100%
-- [Node.js v16.9.0 or higher](https://nodejs.org/en/) -- [Google reCaptcha Key](https://www.google.com/recaptcha/admin/create) +## Prérequis -## Setup +- [Node.js v16.9.0 ou supérieur](https://nodejs.org/en/) +- [Clé Google reCaptcha](https://www.google.com/recaptcha/admin/create) -- Rename your `config-example.js` file to `config.js` +## Configuration -- Register your site with [reCaptcha](https://www.google.com/recaptcha/admin/create) with the domain you are currently using. If running locally, only put localhost on the domain area. ChoosereCAPTCHA v2 "I'm not a robot" for the reCaptcha Type, and copy the secret and public key into the config.js file. If you are using HTTPS, enable it in the config add your certificate and private key file with the names: `certificate.pem` and `private.pem`. +- Renommez votre fichier `config-example.js` en `config.js`. -- To run your own version on Repl.it, create a new project and click the `Import from Github` button and copy this repository url and paste it on the Repl.it site. +- Enregistrez votre site avec [reCaptcha](https://www.google.com/recaptcha/admin/create) en utilisant le domaine que vous utilisez actuellement. Si vous exécutez le bot en local, mettez simplement "localhost" dans la zone de domaine. Choisissez reCAPTCHA v2 "Je ne suis pas un robot" pour le type de reCaptcha, et copiez la clé secrète et la clé publique dans le fichier `config.js`. Si vous utilisez HTTPS, activez-le dans la configuration et ajoutez vos fichiers de certificat et de clé privée sous les noms : `certificate.pem` et `private.pem`. -- Here is what the configuration file looks like and the things that are required for the bot to run. +- Pour exécuter votre propre version sur Repl.it, créez un nouveau projet et cliquez sur le bouton `Importer depuis Github`, puis copiez l'URL de ce dépôt et collez-la sur le site Repl.it. + +- Voici à quoi ressemble le fichier de configuration et les éléments requis pour que le bot fonctionne correctement : ```js module.exports = { server: { @@ -28,23 +31,23 @@ module.exports = { }, Discord: { - // —— Things that are required for the whole project to work. - token: "", // —— Your bot's token. - botId: "", // —— The bot's ID. - guildId: "", // —— The server ID on where the commands will be deployed. - verifiedRole: "", // —— Role that will be added to the user when they verify their account. + // —— Éléments requis pour que l'ensemble du projet fonctionne. + token: "", // —— Le token de votre bot. + botId: "", // —— L'ID du bot. + guildId: "", // —— L'ID du serveur où les commandes seront déployées. + verifiedRole: "", // —— Rôle qui sera ajouté à l'utilisateur lorsqu'il vérifiera son compte. - // —— For users that want to have a role removed upon verification, if you want this, set remove-role to true, and set your remove role ID. + // —— Pour les utilisateurs qui souhaitent qu'un rôle soit supprimé lors de la vérification, si vous voulez cela, réglez removeRole à true et définissez l'ID du rôle à supprimer. removeRole: false, removeRoleId: "", - // —— Set the bot's presence, for statusType see: https://discord-api-types.dev/api/discord-api-types-v10/enum/ActivityType - statusType: 3, // 1 (STREAMING), 2 (LISTENING), 3 (WATCHING), 5 (COMPETING). Default is 0 (PLAYING). - statusMsg: "unverified users!", + // —— Définissez la présence du bot. Pour statusType, voir : https://discord-api-types.dev/api/discord-api-types-v10/enum/ActivityType + statusType: 3, // 1 (STREAMING), 2 (LISTENING), 3 (WATCHING), 5 (COMPETING). Par défaut : 0 (PLAYING). + statusMsg: "utilisateurs non vérifiés !", - // —— By default, rules are set to disabled, this means rules will be hidden. If you want to use the rules function, change disabled to your rules. Please ensure you use \n for each line break and do not use any symbols that could interfear with JSON. + // —— Par défaut, les règles sont désactivées. Cela signifie que les règles seront cachées. Si vous souhaitez utiliser la fonction des règles, changez disabled par vos règles. Assurez-vous d'utiliser \n pour chaque saut de ligne et n'utilisez aucun symbole qui pourrait interférer avec JSON. rulesEnabled: true, - rules: "Type your rules here if rulesEnabled is enabled, ensure to use \n for new lines" + rules: "Tapez vos règles ici si rulesEnabled est activé, assurez-vous d'utiliser \n pour les nouvelles lignes." }, reCAPTCHA: { @@ -54,18 +57,18 @@ module.exports = { } ``` -- Finished editing the files and ready to turn on your bot? run `npm start` in the bot folder. +- Une fois que vous avez terminé d'éditer les fichiers et que vous êtes prêt à lancer votre bot, exécutez `npm start` dans le dossier du bot. -## Issues +## Problèmes -**Not receiving a DM when joining my server** +**Je ne reçois pas de message privé lorsque je rejoins mon serveur** -- If you are not receiving a DM when joining your server, Go to your Discord bot dashboard and enable both intents. Note: If your bot is more than 100 servers, you will have to verify your bot. +- Si vous ne recevez pas de message privé lorsque vous rejoignez votre serveur, allez sur le tableau de bord de votre bot Discord et activez les deux intentions (*intents*). Remarque : Si votre bot est sur plus de 100 serveurs, vous devrez vérifier votre bot. -**Bot failing to login** +**Le bot échoue lors de la connexion** -- You must go to your Discord bot dashboard and enable both intents. Note: If your bot is more than 100 servers, you will have to verify your bot. +- Vous devez aller sur le tableau de bord de votre bot Discord et activer les deux intentions (*intents*). Remarque : Si votre bot est sur plus de 100 serveurs, vous devrez vérifier votre bot. -## Preview - - +## Aperçu +Embed +Website From 3973c835fabc1a41f1927dc84a3c8d0e8e097968 Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:07:38 +0100 Subject: [PATCH 06/21] Add files via upload --- messages.js | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 messages.js diff --git a/messages.js b/messages.js new file mode 100644 index 0000000..7acc73e --- /dev/null +++ b/messages.js @@ -0,0 +1,81 @@ +module.exports = { + config: { + noperm: "Vous n'avez pas la permission d'utiliser cette commande !", + reload: { + success: "Vous avez rechargé le fichier de configuration !", + console: "La configuration a été rechargée par l'utilisateur" + }, + set: { + invalid_format: "Utilisation incorrecte ! Utilisation correcte : /config set (variable de config, exemple : roleid) (nouvelle valeur, exemple : 1234)", + success: "La valeur de {parameter} a été modifiée avec succès : {newvalue}", + }, + get: { + success: "Voici la valeur de {parameter} : {value}" + } + }, + verify: { + onjoin: { + enabled: true, + important: "Bienvenue sur le Discord officiel de X, pour accéder à l'intégralité du serveur, il te faudra accepter le règlement et valider un captcha Google !", + captchaEmbed: { + color: "#0099ff", + title: "Vérification captcha", + description: "Pour accéder à ce serveur, vous devez résoudre un captcha. Le lien expirera dans 15 minutes." + } + }, + dm: { + command: "verify", + description: "Permet de vérifier que tu n'es pas un robot 🤖", + oncommand: { + failedverify: "Oups, vous êtes déjà vérifié !", + button: { + rulesbutton: { + label: "J'accepte le règlement et l'applique sur l'ensemble du Discord", + emoji: "✅", + style: "3" // 1 = Principal, 2 = Secondaire, 3 = Succès, 4 = Danger, 5 = Lien + } + }, + acceptmsg: { + msg: ":wave: Accepte le règlement avant de continuer.", + ephemeral: "true" + }, + timedout: "Vous n'avez pas accepté les règles. Vérification annulée.", + checkdm: "Un lien de vérification vous a été envoyé en privé !", + checkdm_ephemeral: true, + captchaEmbed: { + color: "#0099ff", + title: "Vérification CAPTCHA", + description: "Pour accéder à ce serveur, vous devez résoudre un captcha. Le lien expirera dans 15 minutes." + } + } + }, + embed: { + command: "verifyembed", + description: "Envoie une intégration avec une réaction. Si l'utilisateur réagit, assigne le rôle !", + oncommand: { + embed: { + title: "Vérification", + color: 0x0099ff, + description: "Réagissez à ce message pour vous vérifier !" + }, + reaction: "Confirmer", + timeout: null, + timedout: "Vérification hors délai. Veuillez réessayer.", + success: { + msg: "Cher(e) {usertag} ! Vous avez obtenu le rôle {rolename} ! ", + consolemsg: "{usertag} a été vérifié via l'intégration ! Il/Elle a obtenu {rolename} dans {servername}", + ephemeral: true + } + } + + } + }, + unverify: { + command: "unverify", + description: "Se dévérifier soi-même dans le serveur.", + oncommand: { + failedunverify: "Vous n'êtes pas vérifié !", + success: "Vous avez été dévérifié avec succès !" + } + } +} \ No newline at end of file From 630e2c428e0c31340772c813df301db2f5c5c0d1 Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:08:12 +0100 Subject: [PATCH 07/21] Add files via upload --- public/util.js | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/public/util.js b/public/util.js index e18fa81..ce03845 100644 --- a/public/util.js +++ b/public/util.js @@ -1,15 +1,12 @@ - -// uwu. -function createCode(length) { - let characters = - 'abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - - let result = ''; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * characters.length)); - } - - return result; -} - +function createCode(length) { + const characters = 'abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + let result = ''; + + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + + return result; +} + module.exports = { createCode }; \ No newline at end of file From db908430d697cc3388026832bfd96d97d0688ba2 Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:08:32 +0100 Subject: [PATCH 08/21] Delete public/slash/misc directory --- public/slash/misc/ping.js | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 public/slash/misc/ping.js diff --git a/public/slash/misc/ping.js b/public/slash/misc/ping.js deleted file mode 100644 index 6687d7d..0000000 --- a/public/slash/misc/ping.js +++ /dev/null @@ -1,14 +0,0 @@ - -const { SlashCommandBuilder } = require("discord.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("ping") - .setDescription( - "Test to see if bot is online." - ), - - async execute(interaction) { - interaction.reply("Pong!"); - }, -}; \ No newline at end of file From 65f72e3fefd0a7312629ac5e724e092a216923fe Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:08:40 +0100 Subject: [PATCH 09/21] Delete public/slash/verify directory --- public/slash/verify/verify.js | 69 ----------------------------------- 1 file changed, 69 deletions(-) delete mode 100644 public/slash/verify/verify.js diff --git a/public/slash/verify/verify.js b/public/slash/verify/verify.js deleted file mode 100644 index 72ed59e..0000000 --- a/public/slash/verify/verify.js +++ /dev/null @@ -1,69 +0,0 @@ - -const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, ButtonBuilder } = require("discord.js"); -const config = require("../../../config.js"); -const pool = require("../../../pool.js") - -module.exports = { - data: new SlashCommandBuilder() - .setName("verify") - .setDescription( - "Verify yourself in the server!" - ), - - async execute(interaction) { - const domain = config.server.domain === 'localhost' ? `${config.server.domain}:${config.server.httpPort}` : `${config.server.domain}`; - - if(interaction.member.roles.cache.some(r => r.id === config.Discord.verifiedRole)) { - await interaction.reply("Whoops, you are already verified!"); - return; - } - - const button = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId("rules") - .setLabel('Agree') - .setEmoji('✅') - .setStyle(1) - ) - - const embed = new EmbedBuilder() - .setColor('#0099ff') - .setTitle('Rules') - .setDescription(config.Discord.rules); - - if(config.Discord.rulesEnabled) { - await interaction.reply('Please check your DMS!') - - const linkID = pool.createLink(interaction.user.id); - - const captchaEmbed = new EmbedBuilder() - .setColor('#0099ff') - .setTitle('reCAPTCHA Verification') - .setDescription(`To gain access to this server you must solve a captcha. The link will expire in 15 minutes.\n${config.server.https ? 'https://' : 'http://'}${domain}/verify/${linkID}`) - - await interaction.user.createDM().then(async (dm) => { - await dm.send({ embeds: [captchaEmbed] }).catch(() => { - logger.error(`Failed to send captcha to user! (Maybe they have DMs turned off?)`); - }); - }); - - } else { - await interaction.reply('Please check your DMS!') - - const linkID = pool.createLink(interaction.user.id); - - const captchaEmbed = new EmbedBuilder() - .setColor('#0099ff') - .setTitle('reCAPTCHA Verification') - .setDescription(`To gain access to this server you must solve a captcha. The link will expire in 15 minutes.\n${config.server.https ? 'https://' : 'http://'}${domain}/verify/${linkID}`) - - await interaction.user.createDM().then(async (dm) => { - await dm.send({ embeds: [captchaEmbed] }).catch(() => { - logger.error(`Failed to send captcha to user! (Maybe they have DMs turned off?)`); - }) - - }); - } - }, -}; \ No newline at end of file From 01435a2a702f12da5c9ca59fc7286063d7e55053 Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:09:20 +0100 Subject: [PATCH 10/21] Create verify.js --- public/slash/verify/verify.js | 102 ++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 public/slash/verify/verify.js diff --git a/public/slash/verify/verify.js b/public/slash/verify/verify.js new file mode 100644 index 0000000..506d279 --- /dev/null +++ b/public/slash/verify/verify.js @@ -0,0 +1,102 @@ +const { + SlashCommandBuilder, + EmbedBuilder, + ActionRowBuilder, + ButtonBuilder, +} = require('discord.js'), +config = require('../../../config.js'), +messages = require('../../../messages.js'), +pool = require('../../../pool.js'); + +module.exports = { + data: new SlashCommandBuilder() + .setName(messages.verify.dm.command) + .setDescription(messages.verify.dm.description), + + async execute(interaction) { + const domain = + config.server.domain === 'localhost' + ? `${config.server.domain}:${config.server.httpPort}` + : config.server.domain; + + if ( + interaction.member.roles.cache.some( + (role) => role.id === config.Discord.verifiedRole + ) + ) { + await interaction.reply({ + content: messages.verify.dm.oncommand.failedverify, + ephemeral: true, + }); + return; + } + + if (config.Discord.rulesEnabled) { + const rulesButton = new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setCustomId('accept_rules') + .setLabel(messages.verify.dm.oncommand.button.rulesbutton.label) + .setEmoji(messages.verify.dm.oncommand.button.rulesbutton.emoji) + .setStyle(1) + ); + + const rulesEmbed = new EmbedBuilder() + .setColor(config.Discord.rulescolor) + .setTitle(config.Discord.rulestitle) + .setDescription(config.Discord.rules); + + await interaction.reply({ + embeds: [rulesEmbed], + content: messages.verify.dm.oncommand.acceptmsg.msg, + components: [rulesButton], + ephemeral: true, + }); + + try { + const buttonInteraction = await interaction.channel.awaitMessageComponent({ + filter: (i) => + i.customId === 'accept_rules' && i.user.id === interaction.user.id, + time: 60000, + }); + + if (!buttonInteraction) { + await interaction.followUp({ + content: messages.verify.dm.oncommand.timedout, + ephemeral: true, + }); + return; + } + } catch (error) { + await interaction.followUp({ + content: messages.verify.dm.oncommand.timedout, + ephemeral: true, + }); + return; + } + } + + await interaction.followUp({ + content: messages.verify.dm.oncommand.checkdm, + ephemeral: true, + }); + + const linkID = pool.createLink(interaction.user.id); + const captchaEmbed = new EmbedBuilder() + .setColor(messages.verify.dm.oncommand.captchaEmbed.color) + .setTitle(messages.verify.dm.oncommand.captchaEmbed.title) + .setDescription( + `${messages.verify.dm.oncommand.captchaEmbed.description}\n${ + config.server.https ? 'https://' : 'http://' + }${domain}/verify/${linkID}` + ); + + try { + const dmChannel = await interaction.user.createDM(); + await dmChannel.send({ embeds: [captchaEmbed] }); + } catch (error) { + logger.error( + "Échec de l'envoi du captcha à l'utilisateur ! (Peut-être que ses messages privés sont désactivés ?)" + ); + } + }, +}; From 38b21dbe59e77bd17cc73a15832c2fc969b78c25 Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:09:43 +0100 Subject: [PATCH 11/21] Create unverify.js --- public/slash/unverify/unverify.js | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 public/slash/unverify/unverify.js diff --git a/public/slash/unverify/unverify.js b/public/slash/unverify/unverify.js new file mode 100644 index 0000000..d02f5a9 --- /dev/null +++ b/public/slash/unverify/unverify.js @@ -0,0 +1,40 @@ +const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'), + config = require('../../../config.js'), + messages = require('../../../messages.js'), + pool = require('../../../pool.js') + +module.exports = { + data: new SlashCommandBuilder() + .setName(messages.unverify.command) + .setDescription(messages.unverify.description), + + async execute(interaction) { + const member = interaction.member; + const verifiedRole = member.roles.cache.find( + (role) => role.id === config.Discord.verifiedRole + ); + + if (!verifiedRole) { + await interaction.reply({ + content: messages.unverify.oncommand.failedunverify, + ephemeral: true, + }); + return; + } + + try { + await member.roles.remove(verifiedRole); + await interaction.reply({ + content: messages.unverify.oncommand.success, + ephemeral: true, + }); + } catch (error) { + console.error(error); + + await interaction.reply({ + content: 'Une erreur est survenue lors de la suppression de votre vérification.', + ephemeral: true, + }); + } + }, +}; From 78f35a1984901cef596599c960355f911877884c Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:10:10 +0100 Subject: [PATCH 12/21] Create verifyembed.js --- public/slash/verifyembed/verifyembed.js | 83 +++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 public/slash/verifyembed/verifyembed.js diff --git a/public/slash/verifyembed/verifyembed.js b/public/slash/verifyembed/verifyembed.js new file mode 100644 index 0000000..904f6f8 --- /dev/null +++ b/public/slash/verifyembed/verifyembed.js @@ -0,0 +1,83 @@ +const { + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, + SlashCommandBuilder, +} = require('discord.js'), +config = require('../../../config.js'), +messages = require('../../../messages.js'), +{ Signale } = require('signale'), +logger = new Signale({ scope: 'VerifyEmbed' }); + +module.exports = { + data: new SlashCommandBuilder() + .setName(messages.verify.embed.command) + .setDescription(messages.verify.embed.description), + + async execute(interaction) { + const embedMessage = { + color: messages.verify.embed.oncommand.embed.color, + title: messages.verify.embed.oncommand.embed.title, + description: messages.verify.embed.oncommand.embed.description, + }; + + const confirmButton = new ButtonBuilder() + .setCustomId('confirm') + .setLabel(messages.verify.embed.oncommand.reaction) + .setStyle(ButtonStyle.Success); + + const actionRow = new ActionRowBuilder().addComponents(confirmButton); + + const sentMessage = await interaction.reply({ + embeds: [embedMessage], + components: [actionRow], + fetchReply: true, + }); + + const filter = (buttonInteraction) => { + return buttonInteraction.customId === 'confirm' && !buttonInteraction.user.bot; + }; + + const collector = sentMessage.createMessageComponentCollector({ + filter, + time: messages.verify.embed.oncommand.timeout, + }); + + collector.on('collect', async (buttonInteraction) => { + const member = buttonInteraction.guild.members.cache.get(buttonInteraction.user.id); + const verifiedRole = buttonInteraction.guild.roles.cache.get(config.Discord.verifiedRole); + const removeRole = buttonInteraction.guild.roles.cache.get(config.Discord.removeRoleId); + + if (config.Discord.removeRole === true) { + await member.roles.remove(removeRole); + logger.info(`${member.user.tag} a perdu le rôle id : ${removeRole.id}`); + } + + await member.roles.add(verifiedRole); + const successMessage = messages.verify.embed.oncommand.success.msg + .replace('{usertag}', buttonInteraction.user.tag) + .replace('{rolename}', verifiedRole.name); + + await buttonInteraction.reply({ + content: successMessage, + ephemeral: messages.verify.embed.oncommand.success.ephemeral, + }); + + const consoleMessage = messages.verify.embed.oncommand.success.consolemsg + .replace('{usertag}', buttonInteraction.user.tag) + .replace('{rolename}', verifiedRole.name) + .replace('{servername}', buttonInteraction.guild.name); + + logger.info(consoleMessage); + }); + + collector.on('end', (collected, reason) => { + if (reason === 'time') { + interaction.followUp({ + content: messages.verify.embed.oncommand.timedout, + ephemeral: true, + }); + } + }); + }, +}; From 17b27ffd35f910969cdb1fb7cac8d7f03ed3ffd8 Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:10:57 +0100 Subject: [PATCH 13/21] Add files via upload --- events/guildMemberAdd.js | 87 ++++++++++++++++++++++------------------ events/onReady.js | 36 ++++++++++------- events/slashCreate.js | 46 ++++++++++----------- 3 files changed, 92 insertions(+), 77 deletions(-) diff --git a/events/guildMemberAdd.js b/events/guildMemberAdd.js index 4525eb5..25f0190 100644 --- a/events/guildMemberAdd.js +++ b/events/guildMemberAdd.js @@ -1,38 +1,49 @@ - -// —— dot. -const { Signale } = require('signale'); -const { EmbedBuilder, ActionRowBuilder, ButtonBuilder } = require('discord.js'); -const logger = new Signale({ scope: 'Discord' }); -const config = require('../config.js'); -const pool = require('../pool.js'); - -module.exports = { - name: "guildMemberAdd", - - async execute(member) { - const domain = config.server.domain === 'localhost' ? `${config.server.domain}:${config.server.httpPort}` : `${config.server.domain}`; - if(config.Discord.rulesEnabled) { - const linkID = pool.createLink(member.id); - const captchaEmbed = new EmbedBuilder() - .setColor('#0099ff') - .setTitle('reCAPTCHA Verification') - .setDescription(`To gain access to this server you must solve a captcha. The link will expire in 15 minutes.\n${config.server.https ? 'https://' : 'http://'}${domain}/verify/${linkID}`) - - member.send({ embeds: [captchaEmbed] }).catch(() => { - logger.error(`Failed to send captcha to user! (Maybe they have DMs turned off?)`); - }); - - } else { - const linkID = pool.createLink(member.id); - const captchaEmbed = new EmbedBuilder() - .setColor('#0099ff') - .setTitle('reCAPTCHA Verification') - .setDescription(`To gain access to this server you must solve a captcha. The link will expire in 15 minutes.\n${config.server.https ? 'https://' : 'http://'}${domain}/verify/${linkID}`) - - member.send({ embeds: [captchaEmbed] }).catch(() => { - logger.error(`Failed to send captcha to user! (Maybe they have DMs turned off?)`); - }); - } - - }, -}; +const { Signale } = require('signale'); +const { EmbedBuilder, ActionRowBuilder, ButtonBuilder } = require('discord.js'); +const logger = new Signale({ scope: 'Discord' }); +const config = require('../config.js'); +const messages = require('../messages.js'); +const pool = require('../pool.js'); + +module.exports = { + name: "guildMemberAdd", + + async execute(member) { + const domain = config.server.domain === 'localhost' ? `${config.server.domain}:${config.server.httpPort}` : `${config.server.domain}`; + + if (config.Discord.rulesEnabled) { + const linkID = pool.createLink(member.id); + + const rulesEmbed = new EmbedBuilder() + .setColor(config.Discord.rulescolor) + .setTitle(config.Discord.rulestitle) + .setDescription(config.Discord.rules); + + const captchaEmbed = new EmbedBuilder() + .setColor(messages.verify.onjoin.captchaEmbed.color) + .setTitle(messages.verify.onjoin.captchaEmbed.title) + .setDescription(messages.verify.onjoin.captchaEmbed.description + `\n${config.server.https ? 'https://' : 'http://' }${domain}/verify/${linkID}`); + + member.send({ + content: messages.verify.onjoin.important, + embeds: [rulesEmbed, captchaEmbed] + }).catch(() => { + logger.error(`Échec de l'envoi du captcha à l'utilisateur ! (Peut-être que ses messages privés sont désactivés ?)`); + }); + + } else { + const linkID = pool.createLink(member.id); + const captchaEmbed = new EmbedBuilder() + .setColor(messages.verify.onjoin.captchaEmbed.color) + .setTitle(messages.verify.onjoin.captchaEmbed.title) + .setDescription(messages.verify.onjoin.captchaEmbed.description + `\n${config.server.https ? 'https://' : 'http://' }${domain}/verify/${linkID}`); + + member.send({ + content: messages.verify.onjoin.important, + embeds: [captchaEmbed] + }).catch(() => { + logger.error(`Échec de l'envoi du captcha à l'utilisateur ! (Peut-être que ses messages privés sont désactivés ?)`); + }); + } + }, +}; \ No newline at end of file diff --git a/events/onReady.js b/events/onReady.js index b47897c..941b077 100644 --- a/events/onReady.js +++ b/events/onReady.js @@ -1,16 +1,22 @@ - -// —— dot. -const { Signale } = require('signale'); -const config = require('../config.js'); -const logger = new Signale({ scope: 'Discord' }); - -module.exports = { - name: "ready", - once: true, - - async execute(client) { - logger.success('Bot online!'); - client.user.setPresence({ activities: [{ type: config.Discord.statusType, name: `${config.Discord.statusMsg}` }], status: 'idle' }) - logger.success('Status Set!'); - }, +const { Signale } = require('signale'), +config = require('../config.js'), +logger = new Signale({ scope: 'Discord' }); + +module.exports = { + name: 'ready', + once: true, + async execute(client) { + logger.success(client.user.username + ' est en ligne !'); + + client.user.setPresence({ + activities: [{ + type: config.Discord.statusType, + name: '' + config.Discord.statusMsg, + }], + status: '' + config.Discord.status, + }); + + logger.success("Le statut de " + client.user.username + " a été activé !"); + logger.success("Le statut de " + client.user.username + " est : " + config.Discord.status + ' !'); + } }; \ No newline at end of file diff --git a/events/slashCreate.js b/events/slashCreate.js index cbac7fe..c776528 100644 --- a/events/slashCreate.js +++ b/events/slashCreate.js @@ -1,25 +1,23 @@ - -const { Signale } = require('signale'); -const logger = new Signale({ scope: 'Pool' }); - -module.exports = { - name: "interactionCreate", - - async execute(interaction) { - - const { client } = interaction; - if (!interaction.isChatInputCommand()) return; - - const command = client.slashCommands.get(interaction.commandName); - if (!command) return; - - try { - await command.execute(interaction); - } catch (err) { - logger.error(err); - await interaction.reply({ - content: "There was an issue while executing that command!", ephemeral: true, - }); - } - }, +const { Signale } = require('signale'), +logger = new Signale({ scope: 'slashCreate' }); + +module.exports = { + name: 'interactionCreate', + async execute(interaction) { + const { client } = interaction; + if (!interaction.isChatInputCommand()) return; + + const command = client.slashCommands.get(interaction.commandName); + if (!command) return; + + try { + await command.execute(interaction); + } catch (error) { + logger.error(error); + await interaction.reply({ + content: 'Il y a eu un problème lors de l\'exécution de cette commande !', + ephemeral: true + }); + } + } }; \ No newline at end of file From 96ecf591d6fb1494fc77b31625e1fa965778485d Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:11:12 +0100 Subject: [PATCH 14/21] Delete events/interactionCreate.js --- events/interactionCreate.js | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 events/interactionCreate.js diff --git a/events/interactionCreate.js b/events/interactionCreate.js deleted file mode 100644 index a46ae39..0000000 --- a/events/interactionCreate.js +++ /dev/null @@ -1,28 +0,0 @@ - -const { EmbedBuilder } = require('discord.js'); -const pool = require('../pool.js'); - -module.exports = { - name: "interactionCreate", - - async execute(interaction) { - - if(!interaction.isButton()) return; - if(interaction.customId === 'rules') { - logger.info('User agreed to the rules!'); - interaction.user.createDM().then(dm => { - dm.send("You have sucessfully agreed to rules.").catch(console.error); - const linkID = pool.createLink(interaction.user.id); - - const captchaEmbed = new EmbedBuilder() - .setColor('#0099ff') - .setTitle('reCAPTCHA Verification') - .setDescription(`To gain access to this server you must solve a captcha. The link will expire in 15 minutes.\n${config.https ? 'https://' : 'http://'}${config.domain}/verify/${linkID}`) - - dm.send({ embeds: [captchaEmbed] }).catch(() => { - logger.error(`Failed to send captcha to user! (Maybe they have DMs turned off?)`); - }); - }) - } - }, -}; \ No newline at end of file From 939f992e43878a9e8803a660b8e701a76ed34f3f Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:11:33 +0100 Subject: [PATCH 15/21] Update style.css --- assets/css/style.css | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/assets/css/style.css b/assets/css/style.css index 84bdd4c..d3a883f 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -24,8 +24,15 @@ body { transform: translate(-50%, -50%); } -span { +p { + padding-top: 10%; font-size: 28px; font-weight: 400; color: white; -} \ No newline at end of file +} + +span { + font-size: 18px; + font-weight: 200; + color: gray; +} From 38cd4b96af1a05aff9352f0e91fded13288e75ac Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:11:49 +0100 Subject: [PATCH 16/21] Add files via upload --- assets/js/main.js | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 assets/js/main.js diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..4180c42 --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,5 @@ +window.onload = function() { + setTimeout(function() { + console.log("https://discord.gg/pristis"); + }, 4000); +}; \ No newline at end of file From b5d6f499d217ed081c87be2cbfc5f894bd70f1a8 Mon Sep 17 00:00:00 2001 From: OxiWan <110993984+OxiWanV2@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:12:17 +0100 Subject: [PATCH 17/21] Add files via upload --- html/invalidCaptcha.html | 61 ++++++++++++++++++++++++++++++--- html/invalidLink.html | 61 ++++++++++++++++++++++++++++++--- html/logo.png | Bin 0 -> 3542 bytes html/style.scss | 60 +++++++++++++++++++++++++++++++++ html/valid.html | 71 ++++++++++++++++++++++++++++++++++++--- html/verify.html | 13 +++---- 6 files changed, 243 insertions(+), 23 deletions(-) create mode 100644 html/logo.png create mode 100644 html/style.scss diff --git a/html/invalidCaptcha.html b/html/invalidCaptcha.html index f722368..f1ca32b 100644 --- a/html/invalidCaptcha.html +++ b/html/invalidCaptcha.html @@ -1,18 +1,69 @@ - -Une erreur et survenue (ReCaptcha Error) merci de report cette erreur a X
+Lien invalide
+WLBx@#qiXEwj+zwV8|gEY@eW7^6nCl?d!n9zBYdOS)sU5|
zfM~{_?rAIPCgJuqWDj+fkDP3%*F%th&lT`90vi)W{BI&rE%7HJqWY`_RCy7&xVz}>
zm8Z-yc=YR05O`w8CPOcOUa7Sp^%q!OYvopsE&Zt-F~m98(x+2@G5v-gzr`UF^LOKa
z)9S}^0S+xeAPdD4WHMHy`)wneE!CfNq43O_R~$)ts(=_x7RTy`;%szuW_;9DOY Vérification réussi Vérification: