155 lines
5.1 KiB
JavaScript
155 lines
5.1 KiB
JavaScript
const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js');
|
|
const db = require('../../functions/database/db.js');
|
|
const { isChannelExcluded } = require('../../functions/xp/xp.js');
|
|
const { colors } = require('../../utils/constants');
|
|
|
|
module.exports = {
|
|
category: 'xp',
|
|
data: new SlashCommandBuilder()
|
|
.setName('xpexclude')
|
|
.setDescription('Gérer les salons exclus de l\'XP (Admin uniquement)')
|
|
.addSubcommand(subcommand =>
|
|
subcommand
|
|
.setName('add')
|
|
.setDescription('Exclure un salon de l\'XP')
|
|
.addChannelOption(option =>
|
|
option.setName('channel')
|
|
.setDescription('Le salon à exclure')
|
|
.setRequired(true))
|
|
.addStringOption(option =>
|
|
option.setName('reason')
|
|
.setDescription('Raison de l\'exclusion')
|
|
.setRequired(false)))
|
|
.addSubcommand(subcommand =>
|
|
subcommand
|
|
.setName('remove')
|
|
.setDescription('Retirer un salon de l\'exclusion')
|
|
.addChannelOption(option =>
|
|
option.setName('channel')
|
|
.setDescription('Le salon à retirer')
|
|
.setRequired(true)))
|
|
.addSubcommand(subcommand =>
|
|
subcommand
|
|
.setName('list')
|
|
.setDescription('Liste des salons exclus')),
|
|
async execute(interaction) {
|
|
await interaction.deferReply({ ephemeral: true });
|
|
|
|
// Vérifier les permissions (Admin uniquement)
|
|
if (!interaction.member.permissions.has(PermissionFlagsBits.Administrator)) {
|
|
return interaction.editReply({
|
|
content: '❌ Tu n\'as pas la permission d\'utiliser cette commande. (Administrateur requis)'
|
|
});
|
|
}
|
|
|
|
const subcommand = interaction.options.getSubcommand();
|
|
|
|
try {
|
|
if (subcommand === 'add') {
|
|
const channel = interaction.options.getChannel('channel');
|
|
const reason = interaction.options.getString('reason') || 'Aucune raison fournie';
|
|
|
|
if (!channel.isTextBased()) {
|
|
return interaction.editReply({
|
|
content: '❌ Le salon doit être un canal texte.'
|
|
});
|
|
}
|
|
|
|
// Vérifier si déjà exclus
|
|
const excluded = await isChannelExcluded(channel.id, interaction.guild.id);
|
|
if (excluded) {
|
|
return interaction.editReply({
|
|
content: `❌ Le salon ${channel.toString()} est déjà exclu de l'XP.`
|
|
});
|
|
}
|
|
|
|
// Ajouter l'exclusion
|
|
await db.query(
|
|
'INSERT INTO xp_excluded_channels (channelId, guildId, reason, addedBy, addedAt) VALUES (?, ?, ?, ?, ?)',
|
|
[channel.id, interaction.guild.id, reason, interaction.user.id, Date.now()]
|
|
);
|
|
|
|
const { emojis } = require('../../utils/constants');
|
|
|
|
const embed = new EmbedBuilder()
|
|
.setTitle(`${emojis.success} Salon Exclu`)
|
|
.setColor(colors.success)
|
|
.setDescription(`Le salon ${channel.toString()} a été exclu de l'XP.`)
|
|
.addFields(
|
|
{ name: '📝 Raison', value: reason, inline: false }
|
|
)
|
|
.setFooter({ text: `${interaction.guild.name} • Système XP` })
|
|
.setTimestamp();
|
|
|
|
await interaction.editReply({ embeds: [embed] });
|
|
|
|
} else if (subcommand === 'remove') {
|
|
const channel = interaction.options.getChannel('channel');
|
|
|
|
// Vérifier si exclu
|
|
const excluded = await isChannelExcluded(channel.id, interaction.guild.id);
|
|
if (!excluded) {
|
|
return interaction.editReply({
|
|
content: `❌ Le salon ${channel.toString()} n'est pas exclu de l'XP.`
|
|
});
|
|
}
|
|
|
|
// Retirer l'exclusion
|
|
await db.query(
|
|
'DELETE FROM xp_excluded_channels WHERE channelId = ? AND guildId = ?',
|
|
[channel.id, interaction.guild.id]
|
|
);
|
|
|
|
const { emojis } = require('../../utils/constants');
|
|
|
|
const embed = new EmbedBuilder()
|
|
.setTitle(`${emojis.success} Exclusion Retirée`)
|
|
.setColor(colors.success)
|
|
.setDescription(`Le salon ${channel.toString()} n'est plus exclu de l'XP.`)
|
|
.setFooter({ text: `${interaction.guild.name} • Système XP` })
|
|
.setTimestamp();
|
|
|
|
await interaction.editReply({ embeds: [embed] });
|
|
|
|
} else if (subcommand === 'list') {
|
|
const [excludedChannels] = await db.query(
|
|
'SELECT * FROM xp_excluded_channels WHERE guildId = ?',
|
|
[interaction.guild.id]
|
|
);
|
|
|
|
if (excludedChannels.length === 0) {
|
|
return interaction.editReply({
|
|
content: '✅ Aucun salon n\'est exclu de l\'XP.'
|
|
});
|
|
}
|
|
|
|
const description = excludedChannels.map(ch => {
|
|
const channel = interaction.guild.channels.cache.get(ch.channelId);
|
|
return `• ${channel ? channel.toString() : `ID: ${ch.channelId}`} - ${ch.reason || 'Aucune raison'}`;
|
|
}).join('\n');
|
|
|
|
const { emojis } = require('../../utils/constants');
|
|
|
|
const embed = new EmbedBuilder()
|
|
.setAuthor({
|
|
name: `${interaction.guild.name}`,
|
|
iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined
|
|
})
|
|
.setTitle('📋 Salons Exclus de l\'XP')
|
|
.setColor(colors.xp)
|
|
.setDescription(description || 'Aucun salon exclu')
|
|
.setFooter({ text: `${excludedChannels.length} salon(s) exclu(s)` })
|
|
.setTimestamp();
|
|
|
|
await interaction.editReply({ embeds: [embed] });
|
|
}
|
|
} catch (err) {
|
|
console.error('Erreur lors de la gestion des exclusions XP:', err);
|
|
await interaction.editReply({
|
|
content: `❌ Erreur: ${err.message}`
|
|
});
|
|
}
|
|
},
|
|
};
|
|
|