Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
394 changes: 373 additions & 21 deletions LICENSE

Large diffs are not rendered by default.

149 changes: 99 additions & 50 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,71 +1,120 @@
<h2 align="center">
🔑 ward
🔑 PristisVerify
</h2>
<h3 align="center">
A Discord verification bot using reCAPTCHA v2.
Un bot de vérification Discord utilisant reCAPTCHA v2.
Complètement en français !
</h3>

## Requirements
## Fonctionnalités du bot PristisVerify

- [Node.js v16.9.0 or higher](https://nodejs.org/en/)
- [Google reCaptcha Key](https://www.google.com/recaptcha/admin/create)
<p align="center">🟢 Traduction en français <b>100%</b><br /><b>La version originale de Nates a été reprise par xb3n6e, modifiée et publiée par OxiWan.</b></p>

## Setup
### 1. **Vérification des utilisateurs via reCAPTCHA**
- Le bot utilise Google reCAPTCHA v2 pour vérifier que les nouveaux utilisateurs ne sont pas des robots. Lorsqu'un utilisateur rejoint le serveur, il reçoit un lien vers un formulaire reCAPTCHA à compléter.
- Une fois la vérification réussie, le bot attribue automatiquement un rôle "vérifié" à l'utilisateur.

- Rename your `config-example.js` file to `config.js`
### 2. **Gestion des rôles**
- **Attribution automatique du rôle vérifié** : Après avoir complété la vérification via reCAPTCHA, le bot attribue un rôle spécifique (défini dans la configuration) à l'utilisateur.
- **Suppression automatique d'un rôle** : Si activé dans la configuration (`removeRole: true`), le bot peut également retirer un rôle spécifique une fois que l'utilisateur est vérifié.
- **Rôle administrateur** : Un rôle administrateur peut être défini pour accorder des privilèges spéciaux aux administrateurs lors de certaines interactions avec le bot.

- 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`.
### 3. **Présence personnalisée du bot**
- Le bot peut afficher un statut personnalisé sur Discord, tel que "regarde les utilisateurs non vérifiés", "écoute", ou "en compétition". Le type de statut et le message peuvent être configurés dans le fichier `config.js`.
- **Types de statuts disponibles** :
- Jouer (PLAYING)
- Diffuser (STREAMING)
- Écouter (LISTENING)
- Regarder (WATCHING)
- Compétition (COMPETING)

- 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.
### 4. **Affichage des règles du serveur**
- Si activé (`rulesEnabled: true`), le bot peut envoyer un message contenant les règles du serveur aux nouveaux membres lorsqu'ils rejoignent. Ces règles sont présentées sous forme d'intégration (*embed*) avec un titre et une couleur personnalisables.
- Les utilisateurs doivent accepter ces règles avant de pouvoir continuer avec la vérification.

### 5. **Système de gestion des liens d'invitation**
- Le bot peut fournir un lien d'invitation Discord personnalisé pour rejoindre le serveur, ce qui permet aux nouveaux utilisateurs d'accéder facilement au serveur pour commencer la vérification.

### 6. **Serveur web intégré pour la vérification**
- Le bot inclut un petit serveur web qui gère les requêtes HTTP pour la vérification via reCAPTCHA.
- **HTTPS supporté** : Si activé, le serveur peut fonctionner en HTTPS avec des certificats SSL fournis par l'utilisateur (`certificate.pem` et `private.pem`).
- Les utilisateurs peuvent accéder à une page web où ils complètent le reCAPTCHA pour prouver qu'ils ne sont pas des robots.

### 7. **Commandes slash personnalisées**
- Le bot utilise les commandes slash de Discord pour permettre aux administrateurs et aux utilisateurs d'interagir avec lui directement depuis l'interface Discord.
- **/verify** : Commande permettant aux utilisateurs de demander leur vérification manuellement.
- **/unverify** : Commande permettant aux utilisateurs de se dévérifier eux-mêmes si nécessaire.
- **/verifyembed** : Envoie une intégration avec un bouton de réaction ; lorsque l'utilisateur clique dessus, il reçoit automatiquement le rôle vérifié.

### 8. **Journalisation avancée avec Signale**
- Le bot utilise la bibliothèque `Signale` pour journaliser les événements importants, comme :
- Les erreurs lors de l'attribution ou suppression des rôles.
- Les tentatives échouées d'envoi de messages privés (par exemple, si les DMs sont désactivés).
- Les actions réussies comme l'attribution du rôle vérifié ou la suppression d'un rôle.
- Chaque action critique est enregistrée dans la console avec différents niveaux de gravité (info, warning, error).

### 9. **Anti-crash et gestion des erreurs**
- Le bot est équipé d'un système anti-crash pour capturer les erreurs non gérées et éviter qu'il ne plante :
- Gestion des exceptions non gérées (`uncaughtException`).
- Gestion des promesses rejetées non gérées (`unhandledRejection`).
- Cela garantit que le bot reste opérationnel même en cas d'erreurs inattendues.


## Prérequis

- [Node.js v16.9.0 ou supérieur](https://nodejs.org/en/)
- [Clé Google reCaptcha](https://www.google.com/recaptcha/admin/create)

## Configuration

- Renommez votre fichier `config-example.js` en `config.js`.

- 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`.

- 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 :

- Here is what the configuration file looks like and the things that are required for the bot to run.
```js
// Renommez-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", // Remplacez par votre domaine réel
"https": false, // Activez-le si vous utilisez HTTPS
"httpPort": 00000 // Remplacez par le port que vous souhaitez utiliser
},
"Discord": {
"token": "", // Le token de votre bot Discord
"botId": "", // L'ID du bot
"guildId": "", // L'ID du serveur où les commandes seront déployées
"verifiedRole": "", // Le rôle qui sera attribué à l'utilisateur une fois vérifié
"discordinvite": "", // Lien d'invitation pour rejoindre le serveur Discord
"removeRole": true, // Si défini à true, un rôle sera retiré après vérification
"removeRoleId": "", // L'ID du rôle à retirer lors de la vérification
"adminRoleId": "", // L'ID du rôle administrateur (si nécessaire)
"statusType": 3, // Type de statut du bot (1: STREAMING, 2: LISTENING, 3: WATCHING, 5: COMPETING)
"statusMsg": "", // Message de statut personnalisé affiché par le bot
"status": "dnd", // Statut du bot (online, idle, dnd, invisible)
"rulesEnabled": true, // Active l'affichage des règles si défini à true
"rulestitle": "", // Titre des règles affichées dans un embed
"rulescolor": "#0099ff", // Couleur de l'encadré des règles (en hexadécimal)
"rules": "" // Texte des règles (utilisez \n pour les sauts de ligne)
},
"reCAPTCHA": {
"secretKey": "", // Clé secrète reCAPTCHA obtenue via Google reCAPTCHA
"publicKey": "" // Clé publique reCAPTCHA utilisée pour afficher le widget sur le site
}
}
```

- Finished editing the files and ready to turn on your bot? run `npm start` in the bot folder.

## Issues
- 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.

**Not receiving a DM when joining my server**
## Problèmes

- 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.
**Je ne reçois pas de message privé lorsque je rejoins mon serveur**

**Bot failing to login**
- 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.

- 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.
**Le bot échoue lors de la connexion**

## Preview
![Embed](https://i.imgur.com/zomEnpw.png)
![Website](https://i.imgur.com/tmrcyjF.png)
- 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.
11 changes: 9 additions & 2 deletions assets/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,15 @@ body {
transform: translate(-50%, -50%);
}

span {
p {
padding-top: 10%;
font-size: 28px;
font-weight: 400;
color: white;
}
}

span {
font-size: 18px;
font-weight: 200;
color: gray;
}
5 changes: 5 additions & 0 deletions assets/js/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
window.onload = function() {
setTimeout(function() {
console.log("https://discord.gg/pristis");
}, 4000);
};
59 changes: 28 additions & 31 deletions config-example.js
Original file line number Diff line number Diff line change
@@ -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": ""
},
};
87 changes: 49 additions & 38 deletions events/guildMemberAdd.js
Original file line number Diff line number Diff line change
@@ -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 ?)`);
});
}
},
};
28 changes: 0 additions & 28 deletions events/interactionCreate.js

This file was deleted.

Loading