0% ont trouvé ce document utile (0 vote)
4 vues9 pages

Créer un ticket sur Discord

Ce document décrit le code d'un bot Discord qui gère des tickets. Il définit des commandes et boutons pour ouvrir, fermer et demander des transcripts de tickets. Différents types de tickets sont disponibles selon la sélection dans un menu.

Transféré par

wonday.104947
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
4 vues9 pages

Créer un ticket sur Discord

Ce document décrit le code d'un bot Discord qui gère des tickets. Il définit des commandes et boutons pour ouvrir, fermer et demander des transcripts de tickets. Différents types de tickets sont disponibles selon la sélection dans un menu.

Transféré par

wonday.104947
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

const Discord = require('[Link]')


const transcript = require("discord-html-transcripts")
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder,
ButtonStyle, ChannelType, SelectMenuBuilder } =
require("[Link]")

[Link] = async (bot, interaction) => {

if ([Link] ===
[Link]) {

let command = require(`../Commandes/$


{[Link]}`);
[Link](bot, interaction, [Link]);
}

if([Link]()) {
if([Link] === "close") {
let EmbedPermissionClose = new EmbedBuilder()
.setColor("#7cd87f")
.setDescription(` Vous n'avez pas la permission
requise !`)

if(!
[Link]([Link]
.ManageChannels)) return [Link]({embeds:
[EmbedPermissionClose], ephemeral: true})

let EmbedCloseTicket = new EmbedBuilder()


.setColor("#7cd87f")
.setDescription(`Êtes-vous sûr de vouloir fermer le
ticket ?`)
let Button = new ActionRowBuilder()
.addComponents(new ButtonBuilder()
.setCustomId('oui')
.setLabel("Oui")
.setStyle([Link]),
new ButtonBuilder()
.setCustomId('non')
.setLabel("Non")
.setStyle([Link]),
);
await [Link]({embeds: [EmbedCloseTicket],
components: [Button]});}
else if([Link] === "oui") {
let EmbedPermissionClose = new EmbedBuilder()
.setColor("#7cd87f")
.setDescription(` Vous n'avez pas la permission
requise !`)
if(!
[Link]([Link]
.ManageChannels)) return [Link]({embeds:
[EmbedPermissionClose], ephemeral: true})

[Link]();
}
else if([Link] === "non") {
let EmbedPermissionClose = new EmbedBuilder()
.setColor("#7cd87f")
.setDescription(` Vous n'avez pas la permission
requise !`)

if(!
[Link]([Link]
.ManageChannels)) return [Link]({embeds:
[EmbedPermissionClose], ephemeral: true})

[Link]()
}
else if([Link] === "transcript") {

let EmbedSendTranscript = new EmbedBuilder()


.setColor("#7cd87f")
.setDescription(` Transcript envoyé avec succès !`)
let EmbedTranscript = new EmbedBuilder()
.setColor("#7cd87f")
.setDescription(` Transcript de $
{[Link][0].[Link](" ")[0]}`)
let EmbedPermissionTranscript = new EmbedBuilder()
.setColor("#7cd87f")
.setDescription(` Vous n'avez pas la permission
requise !`)

if(!
[Link]([Link]
.ManageChannels)) return [Link]({embeds:
[EmbedPermissionTranscript], ephemeral: true})

await [Link]({ ephemeral: true })


await
[Link]("1009044411642023997").send( {embeds:
[EmbedTranscript], files: [await
[Link]([Link])]})
await [Link]({embeds:
[EmbedSendTranscript], ephemeral: true})
}
}
if([Link]()) {
if([Link] === 'menuticket') {
if([Link] == 'help') {

const EmbedTicket1 = new EmbedBuilder()


.setColor("#7cd87f")
.setTitle(`Comment créer un ticket ?`)
.setDescription(`Pour créer un ticket, il vous suffit
juste de cliquer sur le menu déroulant ci-dessous et de
sélectionner la catégorie qui convient le mieux à votre
demande !\n\nNe mentionnez personne, sauf si vous n'avez
aucune réponse au bout de 1h30 !\n\nNe spammez pas !\n\nChaque
catégorie a une fonction, merci de les respecter !\n\nTout
abus sera sanctionné !`)
.setTimestamp()
.setFooter({ text: `${[Link]}`, iconURL:
[Link]({dynamic: true}) });

const RowTicket = new ActionRowBuilder()


.addComponents(
new SelectMenuBuilder()
.setCustomId('menuticket')
.setPlaceholder('Sélectionner le type de ticket que
vous voulez !')
.addOptions(
{
label: `Besoin d'aide`,
description: `Ouvrir un ticket pour obtenir de
l'aide`,
emoji: ` `,
value: `help`,
},
{
label: `Candidature staff`,
description: `Ouvrir un ticket pour déposer
votre candidature`,
emoji: ` `,
value: `staff`,
}, {
label: `Problème RP`,
description: `Ouvrir un ticket pour vous
plaindre d'un problème RP`,
emoji: ` `,
value: `problemerp`,
},
),
);
await [Link]();
await [Link]({embeds: [EmbedTicket1],
components: [RowTicket]})

let channel = await


[Link]({
parent: "997277464562778196",
name: `help-${[Link]}`,
type: [Link],
permissionOverwrites: [
{
id: [Link],
deny: [[Link]],
},
{
id: [Link],
allow: [[Link],
[Link]],
},
],
});
let EmbedCreateChannel = new EmbedBuilder()
.setColor("#7cd87f")
.setTitle('Ticket ouvert')
.setDescription("Bonjour / Bonsoir <@" +
[Link] + "> !\n\nUn membre du staff va s'occuper
de vous dans les plus brefs délais.\n\nPendant ce temps,
décrivez nous votre problème, et préparez vos clips vidéos !")
.setTimestamp()
.setFooter({ text: `${[Link]}`, iconURL:
[Link]({dynamic: true}) });
const Row = new ActionRowBuilder()
.addComponents(new ButtonBuilder()
.setCustomId('close')
.setLabel('Fermer le ticket')
.setEmoji(' ')
.setStyle([Link]),
new ButtonBuilder()
.setCustomId('transcript')
.setLabel('Demander le transcript')
.setEmoji(' ')
.setStyle([Link]),
);

await [Link]({embeds: [EmbedCreateChannel],


components: [Row]})

const EmbedSuccessCreateChannel = new EmbedBuilder()


.setColor("#7cd87f")
.setDescription(` Votre salon a été créé avec succès
${channel} !`)

await [Link]({embeds:
[EmbedSuccessCreateChannel], ephemeral: true})
}
else if([Link] == 'staff') {

const EmbedTicket1 = new EmbedBuilder()


.setColor("#7cd87f")
.setTitle(`Comment créer un ticket ?`)
.setDescription(`Pour créer un ticket, il vous suffit
juste de cliquer sur le menu déroulant ci-dessous et de
sélectionner la catégorie qui convient le mieux à votre
demande !\n\nNe mentionnez personne, sauf si vous n'avez
aucune réponse au bout de 1h30 !\n\nNe spammez pas !\n\nChaque
catégorie a une fonction, merci de les respecter !\n\nTout
abus sera sanctionné !`)
.setTimestamp()
.setFooter({ text: `${[Link]}`, iconURL:
[Link]({dynamic: true}) });

const RowTicket = new ActionRowBuilder()


.addComponents(
new SelectMenuBuilder()
.setCustomId('menuticket')
.setPlaceholder('Sélectionner le type de ticket que
vous voulez !')
.addOptions(
{
label: `Besoin d'aide`,
description: `Ouvrir un ticket pour obtenir de
l'aide`,
emoji: ` `,
value: `help`,
},
{
label: `Candidature staff`,
description: `Ouvrir un ticket pour déposer
votre candidature`,
emoji: ` `,
value: `staff`,
}, {
label: `Problème RP`,
description: `Ouvrir un ticket pour vous
plaindre d'un problème RP`,
emoji: ` `,
value: `problemerp`,
},
),
);
await [Link]();
await [Link]({embeds: [EmbedTicket1],
components: [RowTicket]})

let channel = await


[Link]({
parent: "997277464562778196",
name: `staff-${[Link]}`,
type: [Link],
permissionOverwrites: [
{
id: [Link],
deny: [[Link]],
},
{
id: [Link],
allow: [[Link],
[Link]],
},
],
});
let EmbedCreateChannel = new EmbedBuilder()
.setColor("#7cd87f")
.setTitle('Ticket ouvert')
.setDescription("Bonjour / Bonsoir <@" +
[Link] + "> !\n\nPour obtenir le formulaire
staff, veuillez faire la commande `/staff` et de le compléter
avec vos informations !\n\nUn membre de la Direction
s'occupera de votre demande.")
.setTimestamp()
.setFooter({ text: `${[Link]}`, iconURL:
[Link]({dynamic: true}) });
const Row = new ActionRowBuilder()
.addComponents(new ButtonBuilder()
.setCustomId('close')
.setLabel('Fermer le ticket')
.setEmoji(' ')
.setStyle([Link]),
new ButtonBuilder()
.setCustomId('transcript')
.setLabel('Demander le transcript')
.setEmoji(' ')
.setStyle([Link]),
);

await [Link]({embeds: [EmbedCreateChannel],


components: [Row]})
const EmbedSuccessCreateChannel = new EmbedBuilder()
.setColor("#7cd87f")
.setDescription(` Votre salon a été créé avec succès
${channel} !`)

await [Link]({embeds:
[EmbedSuccessCreateChannel], ephemeral: true})
}
else if([Link] == 'problemerp') {

const EmbedTicket1 = new EmbedBuilder()


.setColor("#7cd87f")
.setTitle(`Comment créer un ticket ?`)
.setDescription(`Pour créer un ticket, il vous suffit
juste de cliquer sur le menu déroulant ci-dessous et de
sélectionner la catégorie qui convient le mieux à votre
demande !\n\nNe mentionnez personne, sauf si vous n'avez
aucune réponse au bout de 1h30 !\n\nNe spammez pas !\n\nChaque
catégorie a une fonction, merci de les respecter !\n\nTout
abus sera sanctionné !`)
.setTimestamp()
.setFooter({ text: `${[Link]}`, iconURL:
[Link]({dynamic: true}) });

const RowTicket = new ActionRowBuilder()


.addComponents(
new SelectMenuBuilder()
.setCustomId('menuticket')
.setPlaceholder('Sélectionner le type de ticket que
vous voulez !')
.addOptions(
{
label: `Besoin d'aide`,
description: `Ouvrir un ticket pour obtenir de
l'aide`,
emoji: ` `,
value: `help`,
},
{
label: `Candidature staff`,
description: `Ouvrir un ticket pour déposer
votre candidature`,
emoji: ` `,
value: `staff`,
}, {
label: `Problème RP`,
description: `Ouvrir un ticket pour vous
plaindre d'un problème RP`,
emoji: ` `,
value: `problemerp`,
},
),
);
await [Link]();
await [Link]({embeds: [EmbedTicket1],
components: [RowTicket]})

let channel = await [Link]({


parent: "997277464562778196",
name: `problemerp-${[Link]}`,
type: [Link],
permissionOverwrites: [
{
id: [Link],
deny: [[Link]],
},
{
id: [Link],
allow: [[Link],
[Link]],
},
],
});
let EmbedCreateChannel = new EmbedBuilder()
.setColor("#7cd87f")
.setTitle('Ticket ouvert')
.setDescription("Bonjour / Bonsoir <@" +
[Link] + "> !\n\nUn membre du staff va s'occuper
de vous dans les plus brefs délais.\n\nPendant ce temps,
décrivez nous votre problème, et préparez vos clips vidéos !")
.setTimestamp()
.setFooter({ text: `${[Link]}`, iconURL:
[Link]({dynamic: true}) });
const Row = new ActionRowBuilder()
.addComponents(new ButtonBuilder()
.setCustomId('close')
.setLabel('Fermer le ticket')
.setEmoji(' ')
.setStyle([Link]),
new ButtonBuilder()
.setCustomId('transcript')
.setLabel('Demander le transcript')
.setEmoji(' ')
.setStyle([Link]),
);

await [Link]({embeds: [EmbedCreateChannel],


components: [Row]})
const EmbedSuccessCreateChannel = new EmbedBuilder()
.setColor("#7cd87f")
.setDescription(` Votre salon a été créé avec succès $
{channel} !`)

await [Link]({embeds:
[EmbedSuccessCreateChannel], ephemeral: true})
}
}
}
}

Common questions

Alimenté par l’IA

Feedback is integrated through embed messages and updated interaction replies at various stages, such as confirming ticket creation, permission denials, and successful action completion like transcript generation. This feedback is significant as it keeps users informed, enhances transparency, and ensures they are aware of system actions and outcomes, thereby improving trust and satisfaction in using the bot.

The `EmbedBuilder` enhances user interaction by structuring information in visually appealing and organized ways, such as issuing alerts, confirmations, and instructional guidance (e.g., in ticket closures and transcripts). This makes information more digestible, maintains engagement, and provides a consistent visual language throughout user interactions, thus promoting a clear and user-friendly interface.

The ticket creation process for inquiries like 'Besoin d'aide', 'Candidature staff', and 'Problème RP' involves using a select menu to choose the category. Common steps include updating the interaction to inform users of the ticket creation, channel creation with specific permissions, and sending an embed welcoming the user and detailing instructions or next steps. Although details may cater to specific inquiry types (e.g., different instructions), the foundational interaction logic remains consistent.

Upon selecting a specific ticket option from the select menu, the bot creates a new text channel under a predefined parent category with restricted viewing permissions for everyone except the user and server staff. This setup involves permission overwrites to deny access to `@everyone` and allow specific user access, facilitating private communication between users and staff about the user's issue or request.

The bot sends initial messages to ticket channels encouraging users to describe their problems and stating that staff members will assist them shortly. This ensures the user feels acknowledged and prompts them to prepare necessary details, facilitating efficient issue resolution. Moreover, guidance on actions like requesting transcripts or closing tickets is provided, clarifying user expectations and actions.

Button component styles - such as `ButtonStyle.Success` and `ButtonStyle.Danger` - visually distinguish command functions (e.g., confirming or canceling actions) through color coding and labels. This differentiation aids user interaction by providing clues to button functions at a glance, enhancing decision-making, reducing errors, and improving the overall usability of the bot's interface.

When a user with the necessary permissions interacts with the 'close' button, an Embed is sent asking for confirmation to close the ticket. If the user confirms by pressing the 'oui' button, the system checks permissions again and then deletes the channel associated with the ticket. If the user selects 'non', it deletes the confirmation message only. Permission checks ensure only users with 'ManageChannels' permission can execute these actions.

When a user asks for a transcript by interacting with the transcript button, the bot first checks if the user has the required 'ManageChannels' permission. If so, the system defers the reply ephemerally, creates the transcript using the `discord-html-transcripts` library, and sends it to a designated channel. It then edits the original interaction response to notify the user of the successful transcript send.

The script consistently checks permissions using `interaction.member.permissions.has(Discord.PermissionFlagsBits.ManageChannels)` to ensure that only authorized users can perform actions like closing a ticket or sending a transcript. This is crucial for maintaining server integrity and preventing abuse of administrative functions by unauthorized users, ensuring that sensitive actions are executed safely and by the right individuals.

The script enforces permission checks before executing any action related to ticket management interactions, such as message deletion. For actions like deleting messages, it checks whether the user has the necessary 'ManageChannels' permission. If not, it sends an ephemeral embedded message denying permission, thus preventing unauthorized actions.

Vous aimerez peut-être aussi