const { EmbedBuilder, StringSelectMenuBuilder, ActionRowBuilder } = require("discord.js")
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('myDatabase.db');
module.exports = {
name: 'help',
aliases: ['aide'],
description: 'Affiche la liste des commandes',
category: 'utils',
emote: '📚',
utilisation: 'help [commande]',
async execute(message, args, client) {
const botId = client.user.id;
const guildId = message.guild.id;
if (args[0] === 'msg' ) {
const embed = new EmbedBuilder()
.setTitle("Arguments de messages")
.addFields(
{ name: '{MemberMention}', value: `Mentionne le membre concerné (\`exemple\`: **<@${message.author.id}>**)`, inline: true },
{ name: '{MemberName}', value: `Le nom du membre concerné (\`exemple\`: **${message.author.username}**)`, inline: true },
{ name: '{MemberDisplayName}', value: `Le pseudo de serveur du membre concerné (\`exemple\`: **${message.member.displayName}**)`, inline: true },
{ name: '{MemberJoinedAt}', value: `La date à laquelle le membre concerné a rejoint le serveur (\`exemple\`: **${new Date(message.member.joinedAt).toLocaleDateString('fr-FR')}**)`, inline: true },
{ name: '{MemberID}', value: `L\'ID du membre concerné (\`exemple\`: **${message.author.id}**)`, inline: true },
{ name: '{MemberPic}', value: `La photo de profil du membre concerné (\`exemple\`: **${message.author.displayAvatarURL({dynamic: true})}**)`, inline: true },
{ name: '{MemberCreatedAt}', value: `La date de création du compte du membre concerné (\`exemple\`: **${new Date(message.author.createdAt).toLocaleDateString('fr-FR')}**)`, inline: true },
{ name: '{ServerName}', value: `Le nom du serveur concerné (\`exemple\`: **${message.guild.name}**)`, inline: true },
{ name: '{ServerMembersCount}', value: `Le nombre total de membres sur le serveur (\`exemple\`: **${message.guild.memberCount}**)`, inline: true }
)
return message.reply({ embeds: [embed] });
} else if (args[0] === 'antiraid' ) {
const embed = new EmbedBuilder()
.setTitle("Help AntiRaid")
.setDescription(`
**AntiRaid Configuration**
La commande \`antiraid\` permet de configurer la protection anti-raid pour votre serveur. Voici comment vous pouvez la configurer :
**Syntaxe :**
\`\`\`
+antiraid [type] [action]
\`\`\`
**Types disponibles :**
- \`whitelist\` : Permet de limiter l'accès aux actions anti-raid uniquement au whitelist du serveur et aux owners et buyer du bot.
- \`owner\` : Permet de limiter l'accès aux actions anti-raid uniquement au owners et buyer du bot.
- \`buyer\` : Permet de limiter l'accès aux actions anti-raid uniquement aux buyer du bot.
- \`off\` : Désactive la protection anti-raid.
**Actions disponibles :**
- \`derank\` : Retire les rôles dangereux des utilisateurs qui tentent de déclencher un raid.
- \`kick\` : Expulse les utilisateurs qui tentent de déclencher un raid.
- \`ban\` : Bannit les utilisateurs qui tentent de déclencher un raid.
- \`nothing\` : Ne fait rien en réponse à un raid.
**Exemples d'utilisation :**
- Pour activer la protection anti-raid avec une liste blanche : \`+antiraid whitelist derank\`
- Pour désactiver la protection anti-raid : \`+antiraid off\`
Note : Assurez-vous d'avoir les permissions nécessaires pour exécuter cette commande.
`)
return message.reply({ embeds: [embed] });
} else if (args[0] === 'backup') {
const embed = new EmbedBuilder()
.setTitle("Aide pour la commande Backup")
.setDescription(`
**Gestion des sauvegardes**
La commande \`backup\` permet de créer, lister, charger ou supprimer des sauvegardes du serveur. Voici comment vous pouvez l'utiliser :
**Syntaxe :**
\`\`\`
+backup
\`\`\`
**Paramètres disponibles :**
- \`create\` : Crée une sauvegarde du serveur actuel.
- \`list\` : Affiche la liste de toutes les sauvegardes disponibles.
- \`load\` : Charge une sauvegarde sur le serveur. Vous devez spécifier l'ID de la sauvegarde à charger.
- \`delete\` : Supprime une sauvegarde. Vous devez spécifier l'ID de la sauvegarde à supprimer.
**Exemples d'utilisation :**
* Pour créer une sauvegarde : \`+backup create\`
* Pour afficher la liste des sauvegardes : \`+backup list\`
* Pour charger une sauvegarde (remplacez \`\` par l'ID de la sauvegarde) : \`+backup load \`
* Pour supprimer une sauvegarde (remplacez \`\` par l'ID de la sauvegarde) : \`+backup delete \`
Note : Assurez-vous d'avoir les permissions nécessaires pour exécuter cette commande.
`)
return message.reply({ embeds: [embed] });
} else if (args[0] === 'rolelimit') {
const embed = new EmbedBuilder()
.setTitle("Aide pour la commande RoleLimit")
.setDescription(`
**Gestion des limites de rĂ´les**
La commande \`rolelimit\` permet de gérer les limites de rôles pour les utilisateurs. Voici comment vous pouvez l'utiliser :
**Syntaxe :**
\`\`\`
+rolelimit
\`\`\`
**Fonctionnalités :**
- **Ajouter une limite de rôle :** Utilisez le bouton "Add" pour ajouter une limite à un rôle spécifique. Vous devrez mentionner le rôle ou fournir son ID et spécifier la limite.
- **Supprimer une limite de rĂ´le :** Utilisez le bouton "Remove" pour supprimer une limite de rĂ´le. Vous devrez mentionner le rĂ´le ou fournir son ID.
**Exemples d'utilisation :**
- Pour ajouter une limite de rôle : Sélectionnez le bouton "Add", mentionnez le rôle et spécifiez la limite.
- Pour supprimer une limite de rôle : Sélectionnez le bouton "Remove", mentionnez le rôle.
Note : Assurez-vous d'avoir les permissions nécessaires pour exécuter cette commande.
`)
return message.reply({ embeds: [embed] });
} else if (args[0] === 'confession') {
const embed = new EmbedBuilder()
.setTitle("Aide pour le système de confession")
.setDescription(`
**Configuration du système de confession**
Le système de confession permet aux utilisateurs de partager leurs confessions de manière anonyme. Voici comment vous pouvez le configurer :
**Syntaxe :**
\`\`\`
+setconfession [channel|send] [channelID|#channel]
\`\`\`
**Paramètres disponibles :**
- \`channel\` : Définit le salon de confession pour le serveur. Vous devez spécifier l'ID du salon ou mentionner le salon.
- \`send\` : Envoie un embed avec un bouton pour ajouter une confession dans le salon spécifié. Vous devez spécifier l'ID du salon ou mentionner le salon.
**Exemples d'utilisation :**
- Pour définir le salon de confession : \`+setconfession channel \`
- Pour envoyer un embed de confession : \`+setconfession send \`
**Note : **Assurez-vous d'avoir les permissions nécessaires pour exécuter cette commande.
`)
return message.reply({ embeds: [embed] });
} else {
let data = await new Promise((resolve, reject) => {
db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => {
if (err) {
console.error(err.message);
reject(err);
}
resolve(row ? JSON.parse(row.value) : {});
});
});
const permissions = data.permissions || {};
const defaultPrefix = "+";
let mainPrefix = data.prefixes && data.prefixes.main ? data.prefixes.main : defaultPrefix;
let serverPrefix = data.prefixes && data.prefixes[guildId];
const prefix = serverPrefix !== undefined ? serverPrefix : mainPrefix;
if (args[0] && client.commands.has(args[0])) {
const command = client.commands.get(args[0]);
if (!command) {
return message.reply(`Je n'ai pas trouvé de commande nommée "${args[0]}".`);
}
const commandPerm = await permissions[command.name];
let customAliases = [];
if (data.alias && data.alias[command.name]) {
customAliases = Object.keys(data.alias[command.name]);
}
const allAliases = [...(command.aliases || []), ...customAliases];
let aliasesField = { name: 'Alias', value: 'Aucun', inline: true };
if (allAliases.length > 0) {
aliasesField.value = allAliases.map(alias => `\`${alias}\``).join(', ');
}
const embed_command = new EmbedBuilder()
.setColor('#0099ff')
.setTitle(`Aide pour la commande ${command.emote ? ` ${command.emote}` : 'đź”§'} ${command.name}`)
.setDescription(command.description)
.addFields(
{ name: 'Utilisation', value: `\`${prefix}${command.utilisation ? `${command.utilisation}` : ''}\``, inline: true },
{ name: 'Catégorie', value: command.category || 'Non spécifiée', inline: true },
aliasesField,
{ name: 'Permissions', value: commandPerm === 11 ? 'buyer' : commandPerm === 10 ? 'owner' : `Perm level: ${commandPerm}`, inline: true },
)
.setTimestamp()
.setFooter({text: `By Valou336 and tuturp33`, iconURL: client.user.displayAvatarURL({dynamic: true})})
return message.reply({ embeds: [embed_command] });
}
const categories = {
antiraid: [],
botcontrol: [],
moderation: [],
buyer: [],
game: [],
gestion: [],
utils: [],
invitation: [],
other: [],
};
const categoryEmojis = {
antiraid: '🛡️',
botcontrol: '🛠️',
moderation: '⚖️',
buyer: 'đź’°',
game: '🎮',
gestion: '📝',
utils: '⚙️',
invitation: 'đź“©',
other: 'âť“',
};
let liste = [];
for (const command of client.commands.values()) {
const existingCommand = liste.find(cmd => cmd.name === command.name);
if (!existingCommand) {
liste.push(command);
}
}
for (const command of liste) {
if (command.category && categories[command.category]) {
categories[command.category].push({ name: command.name, description: command.description, emote: command.emote, utilisation: command.utilisation});
} else {
categories['other'].push({ name: command.name, description: command.description, emote: command.emote, utilisation: command.utilisation});
}
}
let totalCommands = liste.length
let description = `Sélectionnez une catégorie parmi les options ci-dessous pour obtenir de l'aide sur les commandes correspondantes.\n Il y a ${totalCommands} commandes disponibles\n\n`;
for (const [category, commands] of Object.entries(categories)) {
description += `**Catégorie ${category}** (${commands.length})\n`;
description += commands.length > 0 ? '> ' + commands.map(command => `\`${command.name}\``).join(', ') : '> Aucune commande dans cette catégorie';
description += '\n\n';
}
const embeds = {
home: new EmbedBuilder()
.setColor('#0099ff')
.setTitle('📚 Information')
.setDescription(description)
.setThumbnail(message.guild.iconURL())
.setTimestamp()
.setFooter({text: `${client.user.tag} © 2024`, iconURL: client.user.displayAvatarURL({dynamic: true})})
};
for (const [category, commands] of Object.entries(categories)) {
let description;
if (commands.length > 0) {
description = commands.map(command => `${command.emote ? ` ${command.emote}` : 'đź”§'} **${prefix}${command.utilisation ? ` ${command.utilisation}` : ''}**\n \`${command.description}\``).join('\n');
} else {
description = 'Aucune commande dans cette catégorie.';
}
embeds[category] = new EmbedBuilder()
.setColor('#0099ff')
.setTitle(`Catégorie ${category}`)
.setDescription(description)
.setTimestamp()
.setFooter({text: `${client.user.tag} © 2024`, iconURL: client.user.displayAvatarURL({dynamic: true})})
}
const menu = new StringSelectMenuBuilder()
.setCustomId('help_menu')
.setPlaceholder('Sélectionnez une catégorie')
.addOptions([
{ label: 'Accueil', value: 'home' },
...Object.keys(categories).map(category => ({ label: `${categoryEmojis[category]} ${category}`, value: category })),
]);
const row = new ActionRowBuilder()
.addComponents(menu);
const sentMessage = await message.reply({ embeds: [embeds[args[0]] || embeds.home], components: [row] });
const filter = i => i.customId === 'help_menu' && i.user.id === message.author.id;
const collector = sentMessage.createMessageComponentCollector({ filter, time: 60000 });
collector.on('collect', async (interaction) => {
await interaction.update({ embeds: [embeds[interaction.values[0]]] });
});
collector.on('end', () => {
sentMessage.edit({ components: [] });
});
}
},
};