feat: mise à jour du code
This commit is contained in:
+30
-23
@@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -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(() => {});
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user