fix: resolve merge conflicts in ticket_whitelist, add retry logic for port 5001 in bug_report, and implement live GitLab issue deduplication in logger

This commit is contained in:
Mathis 2026-03-28 21:58:44 +01:00
parent c40c3f1f12
commit 16263d88bc
6 changed files with 525 additions and 54 deletions

View file

@ -3,7 +3,9 @@ from discord.ext import commands
from discord import app_commands, ui
import json
import os
import asyncio
from typing import Optional
from src.logger import kuby_logger
TICKET_WHITELIST_SETTINGS_FILE = "data/ticket_whitelist_settings.json"
@ -43,12 +45,6 @@ class TicketWhitelistConfigView(ui.View):
def check(m):
return m.author == interaction.user and m.channel == interaction.channel
try:
# We use an explicit import here to avoid clashing if __import__ syntax is weird, but using standard asyncio module is fine if we import it at top. Let's add import asyncio at the top instead!
pass
except __import__("asyncio").TimeoutError:
pass
try:
msg = await interaction.client.wait_for('message', check=check, timeout=30)
target = None
@ -322,6 +318,23 @@ class TicketManagementView(discord.ui.View):
def __init__(self):
super().__init__(timeout=None)
self.claimed_by = None # Stocke le staff qui claim le ticket
async def get_ticket_owner(self, interaction: discord.Interaction):
"""Récupère le propriétaire du ticket via le topic du salon"""
if interaction.channel.topic and interaction.channel.topic.startswith("Ticket de "):
try:
owner_id = int(interaction.channel.topic.split("Ticket de ")[1])
member = interaction.guild.get_member(owner_id)
if not member:
try:
member = await interaction.guild.fetch_member(owner_id)
except discord.NotFound:
return None
return member
except (ValueError, IndexError):
return None
return None
@discord.ui.button(label="🔒 Fermer le Ticket", style=discord.ButtonStyle.red, custom_id="close_ticket")
async def close_ticket(self, interaction: discord.Interaction, button: discord.ui.Button):
@ -332,19 +345,11 @@ class TicketManagementView(discord.ui.View):
if not discord.utils.get(interaction.user.roles, id=int(staff_role_id) if staff_role_id else 0) and not interaction.user.guild_permissions.administrator:
return await interaction.response.send_message("❌ Seuls les staffs peuvent fermer un ticket.", ephemeral=True)
topic = interaction.channel.topic or ""
if not topic.startswith("Ticket de "):
owner = await self.get_ticket_owner(interaction)
if not owner:
return await interaction.response.send_message("❌ Impossible de trouver le propriétaire du ticket à fermer.", ephemeral=True)
try:
owner_id = int(topic.split("Ticket de ")[1])
ticket_owner = interaction.guild.get_member(owner_id)
if not ticket_owner:
ticket_owner = await interaction.guild.fetch_member(owner_id)
except (IndexError, ValueError, discord.NotFound):
return await interaction.response.send_message("❌ Membre introuvable.", ephemeral=True)
await interaction.channel.set_permissions(ticket_owner, read_messages=False, send_messages=False)
await interaction.channel.set_permissions(owner, read_messages=False, send_messages=False)
await interaction.channel.edit(name="ticket-fermé")
await interaction.response.send_message("🔒 Le ticket a été fermé. Vous ne pouvez plus le voir.", ephemeral=True)
@ -376,6 +381,22 @@ class ClosedTicketView(discord.ui.View):
def __init__(self):
super().__init__(timeout=None)
async def get_ticket_owner(self, interaction: discord.Interaction):
"""Récupère le propriétaire du ticket via le topic du salon"""
if interaction.channel.topic and interaction.channel.topic.startswith("Ticket de "):
try:
owner_id = int(interaction.channel.topic.split("Ticket de ")[1])
member = interaction.guild.get_member(owner_id)
if not member:
try:
member = await interaction.guild.fetch_member(owner_id)
except discord.NotFound:
return None
return member
except (ValueError, IndexError):
return None
return None
@discord.ui.button(label="♻ Réouvrir le Ticket", style=discord.ButtonStyle.green, custom_id="reopen_ticket")
async def reopen_ticket(self, interaction: discord.Interaction, button: discord.ui.Button):
"""Réouvre le ticket pour le membre"""
@ -385,19 +406,11 @@ class ClosedTicketView(discord.ui.View):
if not discord.utils.get(interaction.user.roles, id=int(staff_role_id) if staff_role_id else 0) and not interaction.user.guild_permissions.administrator:
return await interaction.response.send_message("❌ Seuls les staffs peuvent réouvrir un ticket.", ephemeral=True)
topic = interaction.channel.topic or ""
if not topic.startswith("Ticket de "):
owner = await self.get_ticket_owner(interaction)
if not owner:
return await interaction.response.send_message("❌ Impossible de trouver le propriétaire du ticket à réouvrir.", ephemeral=True)
try:
owner_id = int(topic.split("Ticket de ")[1])
ticket_owner = interaction.guild.get_member(owner_id)
if not ticket_owner:
ticket_owner = await interaction.guild.fetch_member(owner_id)
except (IndexError, ValueError, discord.NotFound):
return await interaction.response.send_message("❌ Membre introuvable.", ephemeral=True)
await interaction.channel.set_permissions(ticket_owner, read_messages=True, send_messages=True)
await interaction.channel.set_permissions(owner, read_messages=True, send_messages=True)
await interaction.response.send_message("✅ Le ticket a été réouvert.", ephemeral=True)
# Mettre à jour la vue pour afficher tous les boutons
@ -433,6 +446,12 @@ class Ticket(commands.Cog):
def __init__(self, bot):
self.bot = bot
async def cog_load(self):
"""Enregistre les vues persistantes"""
self.bot.add_view(TicketView())
self.bot.add_view(TicketManagementView())
self.bot.add_view(ClosedTicketView())
@app_commands.command(name="ticket_whitelist", description="Envoie l'embed pour ouvrir un ticket de whitelist.")
@app_commands.checks.has_permissions(administrator=True)
async def ticket_whitelist(self, interaction: discord.Interaction):