client.on("guildMemberAdd", async (member) => {
if(!member.user.bot) {
const code = require("randomstring").generate({
length: 5,
charset: "alphanumeric",
capitalization: "uppercase"
})
/*
Ce code permet de générer le code du Captcha, par le biai d'un module, tout simple d'utilisation
*/
const canvas = createCanvas(400, 250); // Instanciation du Canvas
const ctx = canvas.getContext('2d');
const background = await loadImage("https://www.metal-service13.fr/wp-content/uploads/2014/04/FOND-GRIS.jpg"); // Récupération du fond pour le captcha (arrière-plan)
ctx.drawImage(background, 0, 0, canvas.width, canvas.height); // On ajoute l'arrière plan au canvas
ctx.font = '60px Karmatic Arcade'; // Ceci permet de récupérer la police (voir le README pour voir comment l'obtenir)
ctx.fillStyle = '#ffffff'; // Couleur du texte
ctx.fillText(code, canvas.width / 7, canvas.height / 1.8); // Ajout du code sur le canvas, avec la couleur et la police défnie
const attachment = new MessageAttachment(canvas.toBuffer(), 'canvas.png'); // Création de l'image, qui sera ajoutée sur l'embed
/*
Je vous explique pas les champs de l'EMBED ci-dessous !
Si vous ne connaissez pas :
--> Documentation : https://discord.js.org/#/docs/main/stable/class/MessageEmbed
*/
let embed = new Discord.MessageEmbed()
.setTitle("Vérification")
.setDescription(`${member} ! Pour avoir accès à l'**entièreté** du serveur, vous devez passer la vérification ci-dessous ! \n\n__Comment ?__ \n> Il suffit simplement d'envoyer dans **ce salon** le code que vous voyez sur l'image ci-dessous ! \n\n:warning: Vous avez **5 Minutes** pour répondre! \n\nSi vous répondez mal vous serez exclu! `)
.attachFiles(attachment)
.setImage("attachment://canvas.png")
.setColor("RANDOM")
.setFooter("Le code doit être renvoyé en MAJUSCULES !")
await member.guild.channels.cache.get(settings.channel_verification).send({embed: embed}).then(async (captcha) => {
captcha.delete({ timeout: 300000 }) // Suppression de l'embed au bout de 30 secondes, puisque le membre aura 30 secondes pour passer la vérification, une fois le message envoyé !
const filter = m => m.author.id === member.id && m.channel.id === member.guild.channels.cache.get(settings.channel_verification).id
/*
Ce filtre permet de "bloquer" la réponse
--> m.author.id === message.author.id : le code doit être envoyé par le membre ayant envoyé le message
--> m.channel.id === message.channel.id ! le code doit être envoyé par le membre dans le même channel que celui du message
*/
member.guild.channels.cache.get(settings.channel_verification).awaitMessages(filter, { max: 1, time: 300000, errors: [ 'time' ] }) // Création du collecteur, c'est qui fera office de récépteur du captcha une fois envoyé
.then((collected) => {
if(collected.first().content === code) { // Si le contenu du message envoyé par le membre correspond au code, alors on continue :
collected.first().delete({timeout: 3000}) // Suppression du message (3 secondes)
captcha.delete({ timeout: 3000 })
member.guild.channels.cache.get(settings.channel_verification).send(settings.emoji_true + " ┊ Félicitations ! **Vous avez entrer le bon code !**").then((m) => m.delete({ timeout: 5000 })) // Envoie d'un message dans le channel afin d'afficher que le membre à réussi le captcha, puis suppression du message (5 secondes)
member.roles.add(member.guild.roles.cache.get(settings.role)) // Ajout du rôle définit dans les 'settings' au membre
let embed_valide = new Discord.MessageEmbed()
.setAuthor(member.user.username, member.user.displayAvatarURL({dynamic: true}))
.setDescription(`${member} à réussi le Captcha !`)
.addField("__Rôle ajouté :__", guild.roles.cache.get(settings.role), true)
.addField("__Code du Captcha :__", code, true)
.setColor("#4EF20C")
client.channels.cache.get(settings.log_channel).send({embed: embed_valide }) // Envoie de l'embed final dans le channel de LOG
// Pareil je ne vous explique pas les champs de l'embed ci-dessus, voir les lignes précédentes pour obtenir le lien de la documentation
} else {
collected.first().delete({timeout: 3000})
captcha.delete({ timeout: 3000 })
member.guild.channels.cache.get(settings.channel_verification).send(settings.emoji_false + " ┊ Nope ! **Vous n'avez pas entrer le bon code !** \nVous allez être expulsé dans 5 secondes !").then((m) => m.delete({ timeout: 4750 })) // Si le membre n'envoie pas le bon code, alors on envoie un message, qui sera supprimé, puis le BOT essaie d'expulser l'utilisation
// Création de l'embed :
let embed_false = new Discord.MessageEmbed()
.setAuthor(member.user.username, member.user.displayAvatarURL({dynamic: true}))
.setDescription(`${member} n'a pas réussi le Captcha !`)
.addField("__Code du Captcha :__", code, true)
.addField("__Code envoyé :__", collected.first().content, true)
.setColor("#FA0000")
// On lance le compte à rebours
setTimeout(function() {
if(member.kickable) { // Vérification si le membre peut être expulsé
member.kick() // Si le BOT peut, alors il l'expulse
embed_false.addField("__Expulsé :__", "**OUI**", true) // On ajoute un champ à l'embed
} else {
channel.send(`Impossible d'expulser cet utilisateur \nMerci de vérifier que la position de **mon rôle** est à la plus haute position dans la hiérarchie !`).then((m) => m.delete({ timeout: 5000}))
embed_false.addField("__Expulsé :__", "**NON**", true)
// Le cas échéant (le membre ne peut être expulsé), le bot envoie un message, le supprime, et ajoute un champ à l'embed
}
client.channels.cache.get(settings.log_channel).send({embed: embed_false }) // Envoie de l'embed final dans le channel de LOG
}, 5000)
}
})
.catch((collected) => {
member.guild.channels.cache.get(settings.channel_verification).send(`${settings.emoji_false} ┊ Le temps **est écoulé** !`).then((m) => m.delete({ timeout: 4700 })) // Si le membre n'envoie pas le code dans le temps donné (ici, 30 secondes), alors le BOT envoie ce message, puis le supprime
// Création de l'embed :
let embed_false = new Discord.MessageEmbed()
.setAuthor(member.user.username, member.user.displayAvatarURL({dynamic: true}))
.setDescription(`${member} **n'a pas réussi le Captcha à temps !**`)
.setColor("#FA0000")
// Véfication si le membre peut être expulsé, et ajouts des champs à l'Embed
if(member.kickable) {
member.kick()
embed_false.addField("__Expulsé :__", "**OUI**", true)
} else {
member.guild.channels.cache.get(settings.channel_verification).send(`Impossible d'expulser cet utilisateur \nMerci de vérifier que la position de **mon rôle** est à la plus haute position dans la hiérarchie !`).then((m) => m.delete({ timeout: 5000}))
embed_false.addField("__Expulsé :__", "**NON**", true)
}
client.channels.cache.get(settings.log_channel).send({embed: embed_false })
})
})
}
/*
Ce rapide code permet d'envoyer dans le channel demandé le message ci-dessus afin de lui demandé de se vérifier !
--> Libre à vous d'ajouter différentes 'méthodes' après l'envoie, comme une suppresion automatique du message au bout d'un certain temps !
*/
})