fix(ticket): boutons en français, accents, retrait priorité/infos,组织 layout
All checks were successful
ci / ci (push) Successful in 45s

- Boutons: Réclamer, Transférer, Verrouiller/Déverrouiller, Ajouter, Fermer
- Accents français partout (catégorie, équipe, configuré, etc.)
- Retiré PriorityButton et StatsButton (trop chargé)
- Layout: Gestion (Réclamer/Transférer/Verrouiller) → Ajouter/Fermer
This commit is contained in:
Mathis 2026-09-26 13:39:03 +02:00
parent a92dcef08e
commit 628e02aea9
2 changed files with 74 additions and 77 deletions

View file

@ -38,7 +38,7 @@ async def _send_log(guild: discord.Guild, config, embed: discord.Embed):
class PanelCreateButton(discord.ui.Button):
def __init__(self):
super().__init__(
label="Creer un ticket",
label="Créer un ticket",
style=discord.ButtonStyle.primary,
custom_id="ticket_panel_create",
)
@ -46,12 +46,12 @@ class PanelCreateButton(discord.ui.Button):
async def callback(self, interaction: discord.Interaction):
config = storage.get_config(interaction.guild_id)
if not config.enabled:
await interaction.response.send_message("Le systeme de tickets est desactive.", ephemeral=True)
await interaction.response.send_message("Le système de tickets est désactivé.", ephemeral=True)
return
categories = config.categories
if not categories:
await interaction.response.send_message("Aucune categorie configuree.", ephemeral=True)
await interaction.response.send_message("Aucune catégorie configurée.", ephemeral=True)
return
if len(categories) == 1:
@ -60,7 +60,7 @@ class PanelCreateButton(discord.ui.Button):
return
await interaction.response.send_message(
"Choisissez une categorie :",
"Choisissez une catégorie :",
view=CategorySelectView(categories),
ephemeral=True,
)
@ -78,7 +78,7 @@ class CategorySelect(discord.ui.Select):
for c in categories[:25]
]
super().__init__(
placeholder="Selectionnez une categorie...",
placeholder="Sélectionnez une catégorie...",
options=options,
custom_id="ticket_category_select",
)
@ -88,7 +88,7 @@ class CategorySelect(discord.ui.Select):
config = storage.get_config(interaction.guild_id)
cat = next((c for c in config.categories if c.id == cat_id), None)
if not cat:
await interaction.response.send_message("Categorie introuvable.", ephemeral=True)
await interaction.response.send_message("Catégorie introuvable.", ephemeral=True)
return
await interaction.response.send_modal(TicketModal(cat.id, cat.name))
@ -101,9 +101,9 @@ class CategorySelectView(discord.ui.View):
class TicketModal(discord.ui.Modal, title="Nouveau Ticket"):
reason = discord.ui.TextInput(
label="Decris ton probleme",
label="Décris ton problème",
style=discord.TextStyle.paragraph,
placeholder="Explique brievement ta demande...",
placeholder="Explique brièvement ta demande...",
required=True,
max_length=2000,
)
@ -120,7 +120,7 @@ class TicketModal(discord.ui.Modal, title="Nouveau Ticket"):
cat = next((c for c in config.categories if c.id == self.category_id), None)
if not cat:
await interaction.followup.send("Categorie introuvable.", ephemeral=True)
await interaction.followup.send("Catégorie introuvable.", ephemeral=True)
return
overwrites = {
@ -189,34 +189,36 @@ class TicketModal(discord.ui.Modal, title="Nouveau Ticket"):
discord.ui.TextDisplay(
f"## Ticket — {cat.name}\n"
f"**Utilisateur :** {interaction.user.mention}\n"
f"**Categorie :** {cat.emoji} {cat.name}\n"
f"**Catégorie :** {cat.emoji} {cat.name}\n"
f"**Raison :**\n{self.reason.value}"
)
)
container.add_item(discord.ui.Separator())
container.add_item(discord.ui.TextDisplay("### Gestion"))
container.add_item(discord.ui.ActionRow(
ClaimButton(), TransferButton(), LockButton(),
))
container.add_item(
discord.ui.ActionRow(
ClaimButton(),
TransferButton(),
LockButton(),
)
)
container.add_item(discord.ui.Separator())
container.add_item(discord.ui.TextDisplay("### Informations"))
container.add_item(discord.ui.ActionRow(
PriorityButton(), AddMemberButton(), StatsButton(),
))
container.add_item(discord.ui.Separator())
container.add_item(discord.ui.ActionRow(
CloseButton(),
))
container.add_item(
discord.ui.ActionRow(
AddMemberButton(),
CloseButton(),
)
)
view = discord.ui.LayoutView()
view.add_item(container)
await channel.send(view=view)
await interaction.followup.send(f"Ticket cree : {channel.mention}", ephemeral=True)
await interaction.followup.send(f"Ticket créé : {channel.mention}", ephemeral=True)
embed = discord.Embed(
title="Ticket cree",
description=f"**Categorie :** {cat.name}\n**Utilisateur :** {interaction.user.mention}\n**Canal :** {channel.mention}",
title="Ticket créé",
description=f"**Catégorie :** {cat.name}\n**Utilisateur :** {interaction.user.mention}\n**Canal :** {channel.mention}",
color=discord.Color.green(),
timestamp=datetime.now(timezone.utc),
)
@ -226,7 +228,7 @@ class TicketModal(discord.ui.Modal, title="Nouveau Ticket"):
class ClaimButton(discord.ui.Button):
def __init__(self):
super().__init__(
label="Claim",
label="Réclamer",
style=discord.ButtonStyle.success,
custom_id="ticket_claim",
)
@ -240,7 +242,7 @@ class ClaimButton(discord.ui.Button):
member = interaction.guild.get_member(interaction.user.id)
if not member or not _is_staff(member, config):
await interaction.response.send_message("Seul le staff peut claim un ticket.", ephemeral=True)
await interaction.response.send_message("Seul le staff peut réclamer un ticket.", ephemeral=True)
return
if ticket.claimed_by:
@ -248,11 +250,11 @@ class ClaimButton(discord.ui.Button):
ticket.claimed_by = None
storage.save_ticket(ticket)
await interaction.response.send_message(
f"{interaction.user.mention} a retire son claim.", ephemeral=True
f"{interaction.user.mention} a retiré son réclamation.", ephemeral=True
)
else:
await interaction.response.send_message(
f"Ce ticket est deja claim par <@{ticket.claimed_by}>.", ephemeral=True
f"Ce ticket est déjà réclamé par <@{ticket.claimed_by}>.", ephemeral=True
)
return
@ -261,14 +263,14 @@ class ClaimButton(discord.ui.Button):
embed = discord.Embed(
title="Ticket claim",
description=f"Claim par {interaction.user.mention}",
description=f"Réclamé par {interaction.user.mention}",
color=discord.Color.green(),
timestamp=datetime.now(timezone.utc),
)
await _send_log(interaction.guild, config, embed)
container = discord.ui.Container()
container.add_item(discord.ui.TextDisplay(f"## Ticket claim\nClaim par {interaction.user.mention}"))
container.add_item(discord.ui.TextDisplay(f"## Ticket réclamé\nRéclamé par {interaction.user.mention}"))
view = discord.ui.LayoutView()
view.add_item(container)
await interaction.response.send_message(view=view)
@ -295,7 +297,7 @@ class AddMemberButton(discord.ui.Button):
return
await interaction.response.send_message(
"Selectionnez le membre a ajouter :",
"Sélectionnez le membre à ajouter :",
view=AddMemberSelectView(),
ephemeral=True,
)
@ -304,7 +306,7 @@ class AddMemberButton(discord.ui.Button):
class AddMemberSelect(discord.ui.UserSelect):
def __init__(self):
super().__init__(
placeholder="Selectionnez un membre...",
placeholder="Sélectionnez un membre...",
custom_id="ticket_add_member_select",
min_values=1,
max_values=1,
@ -319,12 +321,12 @@ class AddMemberSelect(discord.ui.UserSelect):
read_message_history=True,
)
await interaction.response.edit_message(
content=f"{user.mention} a ete ajoute au ticket.",
content=f"{user.mention} a été ajouté au ticket.",
view=None,
)
embed = discord.Embed(
title="Membre ajoute",
description=f"{user.mention} a ete ajoute par {interaction.user.mention}",
title="Membre ajouté",
description=f"{user.mention} a été ajouté par {interaction.user.mention}",
color=discord.Color.blue(),
timestamp=datetime.now(timezone.utc),
)
@ -340,7 +342,7 @@ class AddMemberSelectView(discord.ui.View):
class TransferButton(discord.ui.Button):
def __init__(self):
super().__init__(
label="Transfer",
label="Transférer",
style=discord.ButtonStyle.secondary,
custom_id="ticket_transfer",
)
@ -353,10 +355,10 @@ class TransferButton(discord.ui.Button):
return
member = interaction.guild.get_member(interaction.user.id)
if not member or not _is_staff(member, config):
await interaction.response.send_message("Seul le staff peut transferer.", ephemeral=True)
await interaction.response.send_message("Seul le staff peut transférer.", ephemeral=True)
return
await interaction.response.send_message(
"Selectionnez le staff :",
"Sélectionnez le staff :",
view=TransferSelectView(),
ephemeral=True,
)
@ -365,7 +367,7 @@ class TransferButton(discord.ui.Button):
class TransferSelect(discord.ui.UserSelect):
def __init__(self):
super().__init__(
placeholder="Selectionnez un staff...",
placeholder="Sélectionnez un staff...",
custom_id="ticket_transfer_select",
min_values=1,
max_values=1,
@ -378,12 +380,12 @@ class TransferSelect(discord.ui.UserSelect):
ticket.claimed_by = user.id
storage.save_ticket(ticket)
await interaction.response.edit_message(
content=f"Ticket transfere a {user.mention}.",
content=f"Ticket transféré à {user.mention}.",
view=None,
)
embed = discord.Embed(
title="Ticket transfere",
description=f"Transfere a {user.mention} par {interaction.user.mention}",
title="Ticket transféré",
description=f"Transféré à {user.mention} par {interaction.user.mention}",
color=discord.Color.blue(),
timestamp=datetime.now(timezone.utc),
)
@ -412,10 +414,10 @@ class PriorityButton(discord.ui.Button):
return
member = interaction.guild.get_member(interaction.user.id)
if not member or not _is_staff(member, config):
await interaction.response.send_message("Seul le staff peut changer la priorite.", ephemeral=True)
await interaction.response.send_message("Seul le staff peut changer la priorité.", ephemeral=True)
return
await interaction.response.send_message(
"Selectionnez la priorite :",
"Sélectionnez la priorité :",
view=PrioritySelectView(),
ephemeral=True,
)
@ -424,7 +426,7 @@ class PriorityButton(discord.ui.Button):
class PrioritySelect(discord.ui.Select):
def __init__(self):
super().__init__(
placeholder="Selectionnez la priorite...",
placeholder="Sélectionnez la priorité...",
custom_id="ticket_priority_select",
options=[
discord.SelectOption(label="Basse", value="low", emoji="🟢"),
@ -463,7 +465,7 @@ class PrioritySelectView(discord.ui.View):
class LockButton(discord.ui.Button):
def __init__(self):
super().__init__(
label="Lock",
label="Verrouiller",
style=discord.ButtonStyle.secondary,
custom_id="ticket_lock",
)
@ -476,7 +478,7 @@ class LockButton(discord.ui.Button):
return
member = interaction.guild.get_member(interaction.user.id)
if not member or not _is_staff(member, config):
await interaction.response.send_message("Seul le staff peut lock/unlock.", ephemeral=True)
await interaction.response.send_message("Seul le staff peut verrouiller/déverrouiller.", ephemeral=True)
return
ticket.locked = not ticket.locked
@ -486,14 +488,14 @@ class LockButton(discord.ui.Button):
overwrites.send_messages = not ticket.locked
await interaction.channel.set_permissions(interaction.guild.default_role, overwrite=overwrites)
self.label = "Unlock" if ticket.locked else "Lock"
self.label = "Déverrouiller" if ticket.locked else "Verrouiller"
await interaction.response.send_message(
f"Ticket {'locked' if ticket.locked else 'unlocked'} par {interaction.user.mention}."
f"Ticket {'verrouillé' if ticket.locked else 'déverrouillé'} par {interaction.user.mention}."
)
embed = discord.Embed(
title=f"Ticket {'locked' if ticket.locked else 'unlocked'}",
title=f"Ticket {'verrouillé' if ticket.locked else 'déverrouillé'}",
description=f"Par {interaction.user.mention}",
color=discord.Color.orange() if ticket.locked else discord.Color.green(),
timestamp=datetime.now(timezone.utc),
@ -568,9 +570,9 @@ class CloseButton(discord.ui.Button):
ticket.closed_by = interaction.user.id
if config.transcript_enabled:
html = generate_transcript(ticket, interaction.guild.name)
html_content = generate_transcript(ticket, interaction.guild.name)
transcript_file = discord.File(
fp=__import__("io").BytesIO(html.encode()),
fp=__import__("io").BytesIO(html_content.encode()),
filename=f"ticket_{ticket.channel_id}.html",
)
if config.log_channel_id:
@ -578,7 +580,7 @@ class CloseButton(discord.ui.Button):
if ch:
with contextlib.suppress(discord.HTTPException):
await ch.send(
f"Ticket ferme par {interaction.user.mention}",
f"Ticket fermé par {interaction.user.mention}",
file=transcript_file,
)
@ -588,9 +590,9 @@ class CloseButton(discord.ui.Button):
if user:
with contextlib.suppress(discord.HTTPException):
await user.send(
"Ton ticket a ete ferme.",
"Ton ticket a été fermé.",
file=discord.File(
fp=__import__("io").BytesIO(html.encode()),
fp=__import__("io").BytesIO(html_content.encode()),
filename=f"ticket_{ticket.channel_id}.html",
),
)
@ -599,19 +601,19 @@ class CloseButton(discord.ui.Button):
storage.save_ticket(ticket)
embed = discord.Embed(
title="Ticket ferme",
description=f"**Ferme par :** {interaction.user.mention}\n**Categorie :** {ticket.category_id}",
title="Ticket fermé",
description=f"**Fermé par :** {interaction.user.mention}\n**Catégorie :** {ticket.category_id}",
color=discord.Color.red(),
timestamp=datetime.now(timezone.utc),
)
await _send_log(interaction.guild, config, embed)
container = discord.ui.Container()
container.add_item(discord.ui.TextDisplay("## Ticket ferme\nCe ticket sera supprime dans 5 secondes."))
container.add_item(discord.ui.TextDisplay("## Ticket fermé\nCe ticket sera supprimé dans 5 secondes."))
view = discord.ui.LayoutView()
view.add_item(container)
await interaction.followup.send(view=view)
await asyncio.sleep(5)
with contextlib.suppress(discord.HTTPException):
await interaction.channel.delete(reason=f"Ticket ferme par {interaction.user}")
await interaction.channel.delete(reason=f"Ticket fermé par {interaction.user}")