feat: mise à jour du code

This commit is contained in:
UltraLionFr
2025-08-26 01:21:58 +02:00
parent 944845cd11
commit d3d3642ec3
29 changed files with 487 additions and 320 deletions
+15 -12
View File
@@ -1,32 +1,35 @@
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
module.exports = {
data: new SlashCommandBuilder()
.setName("help")
.setDescription("Affiche la liste des commandes disponibles"),
.setName('help')
.setDescription('Affiche la liste des commandes disponibles'),
async execute(interaction, client) {
const globalCommands = await client.application.commands.fetch();
const commandList = globalCommands.map(
cmd => `</${cmd.name}:${cmd.id}> — ${cmd.description || "Pas de description"}`
).join("\n");
const commandList = globalCommands
.map(
(cmd) =>
`</${cmd.name}:${cmd.id}> — ${cmd.description || 'Pas de description'}`
)
.join('\n');
const embed = new EmbedBuilder()
.setTitle("📖 Aide du bot")
.setTitle('📖 Aide du bot')
.setDescription(
commandList.length > 0
? "Voici la liste des commandes disponibles :\n\n" + commandList
: "❌ Aucune commande trouvée."
? 'Voici la liste des commandes disponibles :\n\n' + commandList
: '❌ Aucune commande trouvée.'
)
.setColor(0x5e99ff)
.setThumbnail(client.user.displayAvatarURL())
.setFooter({
text: `QuantumCraft Studios • Demandé par ${interaction.user.tag}`,
iconURL: interaction.user.displayAvatarURL()
iconURL: interaction.user.displayAvatarURL(),
})
.setTimestamp();
await interaction.reply({ embeds: [embed], flags: 64 });
}
};
},
};
+6 -6
View File
@@ -1,11 +1,11 @@
const { SlashCommandBuilder } = require("discord.js");
const { SlashCommandBuilder } = require('discord.js');
module.exports = {
data: new SlashCommandBuilder()
.setName("ping")
.setDescription("Répond avec Pong !"),
.setName('ping')
.setDescription('Répond avec Pong !'),
async execute(interaction) {
await interaction.reply("🏓 Pong !");
}
};
await interaction.reply('🏓 Pong !');
},
};
+30 -23
View File
@@ -1,13 +1,14 @@
const { SlashCommandBuilder, PermissionFlagsBits } = require("discord.js");
const { config, lang } = require("../../handlers/configLoader");
const { getTicketByChannel } = require("../../handlers/database");
const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js');
const { config, lang } = require('../../handlers/configLoader');
const { getTicketByChannel } = require('../../handlers/database');
module.exports = {
data: new SlashCommandBuilder()
.setName("add")
.setName('add')
.setDescription(lang.commands.add.description)
.addUserOption(option =>
option.setName("utilisateur")
.addUserOption((option) =>
option
.setName('utilisateur')
.setDescription("L'utilisateur à ajouter au ticket")
.setRequired(true)
),
@@ -15,13 +16,16 @@ module.exports = {
async execute(interaction) {
const member = interaction.member;
const staffRoles = (Array.isArray(config.staffRoles) ? config.staffRoles : [config.staffRole || config.staffRoles])
.filter(r => r && r.trim() !== "");
const staffRoles = (
Array.isArray(config.staffRoles)
? config.staffRoles
: [config.staffRole || config.staffRoles]
).filter((r) => r && r.trim() !== '');
if (!staffRoles.some(roleId => member.roles.cache.has(roleId))) {
if (!staffRoles.some((roleId) => member.roles.cache.has(roleId))) {
return interaction.reply({
content: lang.permissions.staff_only,
flags: 64
flags: 64,
});
}
@@ -29,17 +33,21 @@ module.exports = {
if (!ticket) {
return interaction.reply({
content: lang.ticket.not_in_ticket,
flags: 64
flags: 64,
});
}
const userToAdd = interaction.options.getUser("utilisateur");
const userToAdd = interaction.options.getUser('utilisateur');
const existingOverwrite = interaction.channel.permissionOverwrites.cache.get(userToAdd.id);
if (existingOverwrite && existingOverwrite.allow.has(PermissionFlagsBits.ViewChannel)) {
const existingOverwrite =
interaction.channel.permissionOverwrites.cache.get(userToAdd.id);
if (
existingOverwrite &&
existingOverwrite.allow.has(PermissionFlagsBits.ViewChannel)
) {
return interaction.reply({
content: lang.commands.add.already_added.replace("{user}", userToAdd),
flags: 64
content: lang.commands.add.already_added.replace('{user}', userToAdd),
flags: 64,
});
}
@@ -51,20 +59,19 @@ module.exports = {
});
await interaction.reply({
content: lang.commands.add.success.replace("{user}", userToAdd),
flags: 64
content: lang.commands.add.success.replace('{user}', userToAdd),
flags: 64,
});
await interaction.channel.send(
lang.commands.add.welcome.replace("{user}", userToAdd)
lang.commands.add.welcome.replace('{user}', userToAdd)
);
} catch (err) {
console.error(err);
await interaction.reply({
content: lang.commands.add.error,
flags: 64
flags: 64,
});
}
}
};
},
};
+37 -25
View File
@@ -3,16 +3,16 @@ const {
EmbedBuilder,
ButtonBuilder,
ButtonStyle,
ActionRowBuilder
} = require("discord.js");
const { config, lang } = require("../../handlers/configLoader");
const { getTicketByChannel, closeTicket } = require("../../handlers/database");
const { scheduleTicketClosure } = require("../../handlers/alertManager");
const ms = require("ms");
ActionRowBuilder,
} = require('discord.js');
const { config, lang } = require('../../handlers/configLoader');
const { getTicketByChannel, closeTicket } = require('../../handlers/database');
const { scheduleTicketClosure } = require('../../handlers/alertManager');
const ms = require('ms');
module.exports = {
data: new SlashCommandBuilder()
.setName("alert")
.setName('alert')
.setDescription(lang.commands.alert.description),
async execute(interaction, client) {
@@ -20,38 +20,42 @@ module.exports = {
if (!ticket) {
return interaction.reply({
content: lang.ticket.not_in_ticket,
flags: 64
flags: 64,
});
}
const member = interaction.member;
const isStaff = config.staffRoles.some(roleId => member.roles.cache.has(roleId));
const isStaff = config.staffRoles.some((roleId) =>
member.roles.cache.has(roleId)
);
if (!isStaff) {
return interaction.reply({
content: lang.permissions.staff_only,
flags: 64
flags: 64,
});
}
const alertDuration = ms(config.TicketAlert.Time || "1h");
const alertDuration = ms(config.TicketAlert.Time || '1h');
const now = Date.now();
const inactiveTime = `<t:${Math.floor(now / 1000)}:R>`;
// === Boutons ===
const closeBtn = new ButtonBuilder()
.setCustomId("closeTicket")
.setLabel(lang.commands.alert.close_now_label || "🔒 Fermer maintenant")
.setCustomId('closeTicket')
.setLabel(lang.commands.alert.close_now_label || '🔒 Fermer maintenant')
.setStyle(ButtonStyle.Danger);
const cancelBtn = new ButtonBuilder()
.setCustomId("cancelClosure")
.setLabel(lang.commands.alert.cancel_label || "🚫 Annuler la fermeture")
.setCustomId('cancelClosure')
.setLabel(lang.commands.alert.cancel_label || '🚫 Annuler la fermeture')
.setStyle(ButtonStyle.Secondary);
const linkBtn = new ButtonBuilder()
.setLabel("🔗 Voir le ticket")
.setLabel('🔗 Voir le ticket')
.setStyle(ButtonStyle.Link)
.setURL(`https://discord.com/channels/${interaction.guild.id}/${interaction.channel.id}`);
.setURL(
`https://discord.com/channels/${interaction.guild.id}/${interaction.channel.id}`
);
const row1 = new ActionRowBuilder().addComponents(closeBtn, cancelBtn);
const row2 = new ActionRowBuilder().addComponents(linkBtn);
@@ -61,8 +65,11 @@ module.exports = {
.setColor(0xe67e22)
.setDescription(
lang.commands.alert.sent
.replace("{time}", `<t:${Math.floor((now + alertDuration) / 1000)}:R>`)
.replace("{inactive-time}", inactiveTime)
.replace(
'{time}',
`<t:${Math.floor((now + alertDuration) / 1000)}:R>`
)
.replace('{inactive-time}', inactiveTime)
)
.setTimestamp();
@@ -70,21 +77,26 @@ module.exports = {
.setColor(0xe67e22)
.setDescription(
lang.commands.alert.sent
.replace("{time}", `<t:${Math.floor((now + alertDuration) / 1000)}:R>`)
.replace("{inactive-time}", inactiveTime)
.replace(
'{time}',
`<t:${Math.floor((now + alertDuration) / 1000)}:R>`
)
.replace('{inactive-time}', inactiveTime)
)
.setTimestamp();
// === Envoi DM si activé ===
if (config.TicketAlert?.DMUser && ticket.userId) {
const ticketCreator = await client.users.fetch(ticket.userId).catch(() => null);
const ticketCreator = await client.users
.fetch(ticket.userId)
.catch(() => null);
if (ticketCreator) {
try {
await ticketCreator.send({ embeds: [dmEmbed], components: [row2] });
} catch {
await interaction.reply({
content: lang.commands.alert.dm_unreachable,
flags: 64
flags: 64,
});
}
}
@@ -94,7 +106,7 @@ module.exports = {
await interaction.reply({
content: ticket.userId ? `<@${ticket.userId}>` : null,
embeds: [alertEmbed],
components: [row1]
components: [row1],
});
// === Planification de la fermeture auto ===
@@ -102,5 +114,5 @@ module.exports = {
closeTicket(interaction.channel.id);
await interaction.channel.delete().catch(() => {});
});
}
},
};
+24 -11
View File
@@ -1,17 +1,24 @@
const { SlashCommandBuilder, EmbedBuilder, MessageFlags } = require("discord.js");
const { getTicketByChannel, closeTicket } = require("../../handlers/database");
const { config, lang } = require("../../handlers/configLoader");
const {
SlashCommandBuilder,
EmbedBuilder,
MessageFlags,
} = require('discord.js');
const { getTicketByChannel, closeTicket } = require('../../handlers/database');
const { config, lang } = require('../../handlers/configLoader');
module.exports = {
data: new SlashCommandBuilder()
.setName("close")
.setDescription("Fermer un ticket"),
.setName('close')
.setDescription('Fermer un ticket'),
async execute(interaction) {
const ticket = getTicketByChannel(interaction.channel.id);
if (!ticket) {
return interaction.reply({ content: lang.ticket.not_in_ticket, flags: MessageFlags.Ephemeral });
return interaction.reply({
content: lang.ticket.not_in_ticket,
flags: MessageFlags.Ephemeral,
});
}
closeTicket(interaction.channel.id);
@@ -19,13 +26,19 @@ module.exports = {
await interaction.reply(lang.ticket.closing);
// Log fermeture
const logChannel = await interaction.client.channels.fetch(config.logsChannel).catch(() => null);
const logChannel = await interaction.client.channels
.fetch(config.logsChannel)
.catch(() => null);
if (logChannel) {
const embed = new EmbedBuilder()
.setTitle("🔒 Ticket fermé")
.setTitle('🔒 Ticket fermé')
.addFields(
{ name: "Salon", value: `${interaction.channel.name}`, inline: true },
{ name: "Fermé par", value: `${interaction.user.tag} (${interaction.user.id})`, inline: true }
{ name: 'Salon', value: `${interaction.channel.name}`, inline: true },
{
name: 'Fermé par',
value: `${interaction.user.tag} (${interaction.user.id})`,
inline: true,
}
)
.setColor(0xe74c3c)
.setTimestamp();
@@ -35,5 +48,5 @@ module.exports = {
setTimeout(() => {
interaction.channel.delete().catch(() => {});
}, 5000);
}
},
};
+33 -23
View File
@@ -1,13 +1,14 @@
const { SlashCommandBuilder, PermissionFlagsBits } = require("discord.js");
const { config, lang } = require("../../handlers/configLoader");
const { getTicketByChannel } = require("../../handlers/database");
const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js');
const { config, lang } = require('../../handlers/configLoader');
const { getTicketByChannel } = require('../../handlers/database');
module.exports = {
data: new SlashCommandBuilder()
.setName("remove")
.setName('remove')
.setDescription(lang.commands.remove.description)
.addUserOption(option =>
option.setName("utilisateur")
.addUserOption((option) =>
option
.setName('utilisateur')
.setDescription("L'utilisateur à retirer du ticket")
.setRequired(true)
),
@@ -15,13 +16,16 @@ module.exports = {
async execute(interaction) {
const member = interaction.member;
const staffRoles = (Array.isArray(config.staffRoles) ? config.staffRoles : [config.staffRole || config.staffRoles])
.filter(r => r && r.trim() !== "");
const staffRoles = (
Array.isArray(config.staffRoles)
? config.staffRoles
: [config.staffRole || config.staffRoles]
).filter((r) => r && r.trim() !== '');
if (!staffRoles.some(roleId => member.roles.cache.has(roleId))) {
if (!staffRoles.some((roleId) => member.roles.cache.has(roleId))) {
return interaction.reply({
content: lang.permissions.staff_only,
flags: 64
flags: 64,
});
}
@@ -29,17 +33,24 @@ module.exports = {
if (!ticket) {
return interaction.reply({
content: lang.ticket.not_in_ticket,
flags: 64
flags: 64,
});
}
const userToRemove = interaction.options.getUser("utilisateur");
const userToRemove = interaction.options.getUser('utilisateur');
const existingOverwrite = interaction.channel.permissionOverwrites.cache.get(userToRemove.id);
if (!existingOverwrite || !existingOverwrite.allow.has(PermissionFlagsBits.ViewChannel)) {
const existingOverwrite =
interaction.channel.permissionOverwrites.cache.get(userToRemove.id);
if (
!existingOverwrite ||
!existingOverwrite.allow.has(PermissionFlagsBits.ViewChannel)
) {
return interaction.reply({
content: lang.commands.remove.not_in_ticket.replace("{user}", userToRemove),
flags: 64
content: lang.commands.remove.not_in_ticket.replace(
'{user}',
userToRemove
),
flags: 64,
});
}
@@ -51,20 +62,19 @@ module.exports = {
});
await interaction.reply({
content: lang.commands.remove.success.replace("{user}", userToRemove),
flags: 64
content: lang.commands.remove.success.replace('{user}', userToRemove),
flags: 64,
});
await interaction.channel.send(
lang.commands.remove.goodbye.replace("{user}", userToRemove)
lang.commands.remove.goodbye.replace('{user}', userToRemove)
);
} catch (err) {
console.error(err);
await interaction.reply({
content: lang.commands.remove.error,
flags: 64
flags: 64,
});
}
}
};
},
};