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:
parent
c40c3f1f12
commit
16263d88bc
6 changed files with 525 additions and 54 deletions
|
|
@ -1707,14 +1707,14 @@ class ConfigPanelView(discord.ui.View):
|
|||
self.category_btn.callback = self._category_callback
|
||||
self.add_item(self.category_btn)
|
||||
|
||||
# Ajouter catégorie
|
||||
self.add_cat_btn = discord.ui.Button(
|
||||
# Gérer les catégories
|
||||
self.manage_cat_btn = discord.ui.Button(
|
||||
style=discord.ButtonStyle.blurple,
|
||||
label="Ajouter Catégorie",
|
||||
custom_id="config_add_cat"
|
||||
label="📂 Gérer les catégories",
|
||||
custom_id="config_manage_cat"
|
||||
)
|
||||
self.add_cat_btn.callback = self._add_cat_callback
|
||||
self.add_item(self.add_cat_btn)
|
||||
self.manage_cat_btn.callback = self._manage_cat_callback
|
||||
self.add_item(self.manage_cat_btn)
|
||||
|
||||
# Staff permissions
|
||||
staff_btn = discord.ui.Button(
|
||||
|
|
@ -1756,9 +1756,9 @@ class ConfigPanelView(discord.ui.View):
|
|||
item.style = discord.ButtonStyle.green if self.config.enabled else discord.ButtonStyle.red
|
||||
await interaction.message.edit(view=self)
|
||||
|
||||
async def _add_cat_callback(self, interaction: discord.Interaction):
|
||||
modal = AddCategoryModal(self.bot, self.storage, self.config)
|
||||
await interaction.response.send_modal(modal)
|
||||
async def _manage_cat_callback(self, interaction: discord.Interaction):
|
||||
view = CategoryManagerView(self.bot, self.storage, self.config)
|
||||
await interaction.response.edit_message(embed=view._get_embed(), view=view)
|
||||
|
||||
async def _staff_perms_callback(self, interaction: discord.Interaction):
|
||||
view = PermissionConfigView(self.bot, self.storage, self.config, interaction.guild, "staff")
|
||||
|
|
@ -1849,6 +1849,251 @@ class AddCategoryModal(discord.ui.Modal):
|
|||
await interaction.response.send_message(f"Catégorie **{self.name.value}** créée!", ephemeral=True)
|
||||
|
||||
|
||||
class EditCategoryModal(discord.ui.Modal):
|
||||
"""Modal pour modifier une catégorie existante"""
|
||||
|
||||
def __init__(self, bot, storage, config, category: TicketCategory, parent_view):
|
||||
super().__init__(title=f"Modifier: {category.name}")
|
||||
self.bot = bot
|
||||
self.storage = storage
|
||||
self.config = config
|
||||
self.category = category
|
||||
self.parent_view = parent_view
|
||||
|
||||
self.name = discord.ui.TextInput(
|
||||
label="Nom",
|
||||
default=category.name,
|
||||
placeholder="Ex: Support",
|
||||
required=True
|
||||
)
|
||||
self.add_item(self.name)
|
||||
|
||||
self.description = discord.ui.TextInput(
|
||||
label="Description",
|
||||
default=category.description,
|
||||
placeholder="Description...",
|
||||
required=False,
|
||||
style=discord.TextStyle.paragraph
|
||||
)
|
||||
self.add_item(self.description)
|
||||
|
||||
self.emoji = discord.ui.TextInput(
|
||||
label="Emoji",
|
||||
default=category.emoji,
|
||||
placeholder="🎫",
|
||||
required=False,
|
||||
max_length=5
|
||||
)
|
||||
self.add_item(self.emoji)
|
||||
|
||||
async def on_submit(self, interaction: discord.Interaction):
|
||||
# Update category object
|
||||
self.category.name = self.name.value
|
||||
self.category.description = self.description.value or ""
|
||||
self.category.emoji = self.emoji.value or "🎫"
|
||||
|
||||
# Save config
|
||||
self.storage.save_config(interaction.guild_id, self.config)
|
||||
|
||||
# Refresh the parent view's message
|
||||
await interaction.response.edit_message(embed=self.parent_view._get_embed(), view=self.parent_view)
|
||||
await interaction.followup.send(f"✅ Catégorie **{self.category.name}** mise à jour !", ephemeral=True)
|
||||
|
||||
|
||||
class CategoryManagerView(discord.ui.View):
|
||||
"""Vue pour lister et gérer les catégories"""
|
||||
|
||||
def __init__(self, bot, storage, config: GuildTicketConfig):
|
||||
super().__init__(timeout=None)
|
||||
self.bot = bot
|
||||
self.storage = storage
|
||||
self.config = config
|
||||
self._add_category_select()
|
||||
|
||||
def _add_category_select(self):
|
||||
self.clear_items()
|
||||
|
||||
if self.config.categories:
|
||||
options = []
|
||||
for cat in self.config.categories[:25]: # Limite Select menu
|
||||
options.append(discord.SelectOption(
|
||||
label=cat.name,
|
||||
value=cat.id,
|
||||
description=cat.description[:100] if cat.description else "Aucune description",
|
||||
emoji=cat.emoji
|
||||
))
|
||||
|
||||
select = discord.ui.Select(
|
||||
placeholder="Sélectionnez une catégorie à gérer...",
|
||||
options=options,
|
||||
custom_id="manage_cat_select"
|
||||
)
|
||||
select.callback = self._category_select_callback
|
||||
self.add_item(select)
|
||||
|
||||
# Bouton Ajouter
|
||||
add_btn = discord.ui.Button(
|
||||
style=discord.ButtonStyle.success,
|
||||
label="➕ Ajouter une catégorie",
|
||||
custom_id="manage_cat_add"
|
||||
)
|
||||
add_btn.callback = self._add_cat_callback
|
||||
self.add_item(add_btn)
|
||||
|
||||
# Bouton Retour
|
||||
back_btn = discord.ui.Button(
|
||||
style=discord.ButtonStyle.secondary,
|
||||
label="⬅️ Retour",
|
||||
custom_id="manage_cat_back"
|
||||
)
|
||||
back_btn.callback = self._back_callback
|
||||
self.add_item(back_btn)
|
||||
|
||||
def _get_embed(self):
|
||||
embed = discord.Embed(
|
||||
title="📂 Gestion des Catégories",
|
||||
description=f"Il y a actuellement **{len(self.config.categories)}** catégorie(s) configurée(s).\n\n"
|
||||
"Sélectionnez une catégorie dans le menu pour la modifier ou la supprimer.",
|
||||
color=discord.Color.blue()
|
||||
)
|
||||
|
||||
if not self.config.categories:
|
||||
embed.description += "\n\n⚠️ **Aucune catégorie configurée.** Commencez par en ajouter une !"
|
||||
|
||||
for cat in self.config.categories[:10]:
|
||||
embed.add_field(
|
||||
name=f"{cat.emoji} {cat.name}",
|
||||
value=cat.description or "Pas de description",
|
||||
inline=False
|
||||
)
|
||||
|
||||
return embed
|
||||
|
||||
async def _category_select_callback(self, interaction: discord.Interaction):
|
||||
# En utilisant interaction.data.get('values') pour obtenir la valeur sélectionnée
|
||||
cat_id = interaction.data.get('values', [None])[0]
|
||||
category = self.config.get_category(cat_id)
|
||||
|
||||
if not category:
|
||||
await interaction.response.send_message("Catégorie introuvable.", ephemeral=True)
|
||||
return
|
||||
|
||||
view = CategoryActionView(self.bot, self.storage, self.config, category, self)
|
||||
await interaction.response.edit_message(embed=view._get_embed(), view=view)
|
||||
|
||||
async def _add_cat_callback(self, interaction: discord.Interaction):
|
||||
# Utilisation de la classe AddCategoryModal existante
|
||||
class AddCategoryManagerModal(AddCategoryModal):
|
||||
def __init__(self, bot, storage, config, parent_view):
|
||||
super().__init__(bot, storage, config)
|
||||
self.parent_view = parent_view
|
||||
|
||||
async def on_submit(self, interaction: discord.Interaction):
|
||||
import uuid
|
||||
cat_id = str(uuid.uuid4())[:8]
|
||||
category = TicketCategory(
|
||||
id=cat_id,
|
||||
name=self.name.value,
|
||||
description=self.description.value or "",
|
||||
emoji=self.emoji.value or "🎫"
|
||||
)
|
||||
self.config.categories.append(category)
|
||||
self.storage.save_config(interaction.guild_id, self.config)
|
||||
|
||||
# Refresh parent view
|
||||
self.parent_view._add_category_select()
|
||||
# On doit utiliser edit_message sur l'interaction d'origine ou renvoyer un embed
|
||||
await interaction.response.edit_message(
|
||||
embed=self.parent_view._get_embed(),
|
||||
view=self.parent_view
|
||||
)
|
||||
await interaction.followup.send(f"Catégorie **{self.name.value}** créée!", ephemeral=True)
|
||||
|
||||
modal = AddCategoryManagerModal(self.bot, self.storage, self.config, self)
|
||||
await interaction.response.send_modal(modal)
|
||||
|
||||
async def _back_callback(self, interaction: discord.Interaction):
|
||||
view = ConfigPanelView(self.bot, self.storage, self.config)
|
||||
embed = discord.Embed(
|
||||
title="Configuration des Tickets",
|
||||
description="Gérez la configuration du système de tickets",
|
||||
color=discord.Color.blue()
|
||||
)
|
||||
await interaction.response.edit_message(embed=embed, view=view)
|
||||
|
||||
|
||||
class CategoryActionView(discord.ui.View):
|
||||
"""Actions pour une catégorie spécifique"""
|
||||
|
||||
def __init__(self, bot, storage, config, category, parent_view):
|
||||
super().__init__(timeout=None)
|
||||
self.bot = bot
|
||||
self.storage = storage
|
||||
self.config = config
|
||||
self.category = category
|
||||
self.parent_view = parent_view
|
||||
|
||||
def _get_embed(self):
|
||||
embed = discord.Embed(
|
||||
title=f"Gestion: {self.category.name}",
|
||||
description=f"**ID:** `{self.category.id}`\n"
|
||||
f"**Emoji:** {self.category.emoji}\n"
|
||||
f"**Description:** {self.category.description or 'Aucune'}\n"
|
||||
f"**Couleur:** `{self.category.color}`",
|
||||
color=discord.Color.blue()
|
||||
)
|
||||
return embed
|
||||
|
||||
@discord.ui.button(label="📝 Modifier", style=discord.ButtonStyle.primary)
|
||||
async def edit_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
modal = EditCategoryModal(self.bot, self.storage, self.config, self.category, self)
|
||||
await interaction.response.send_modal(modal)
|
||||
|
||||
@discord.ui.button(label="🗑️ Supprimer", style=discord.ButtonStyle.danger)
|
||||
async def delete_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
view = DeleteCategoryConfirmationView(self.bot, self.storage, self.config, self.category, self.parent_view)
|
||||
embed = discord.Embed(
|
||||
title="⚠️ Confirmer la suppression",
|
||||
description=f"Êtes-vous sûr de vouloir supprimer la catégorie **{self.category.name}** ?\n"
|
||||
"Cette action est irréversible.",
|
||||
color=discord.Color.red()
|
||||
)
|
||||
await interaction.response.edit_message(embed=embed, view=view)
|
||||
|
||||
@discord.ui.button(label="⬅️ Retour", style=discord.ButtonStyle.secondary)
|
||||
async def back_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
self.parent_view._add_category_select()
|
||||
await interaction.response.edit_message(embed=self.parent_view._get_embed(), view=self.parent_view)
|
||||
|
||||
|
||||
class DeleteCategoryConfirmationView(discord.ui.View):
|
||||
def __init__(self, bot, storage, config, category, parent_view):
|
||||
super().__init__(timeout=None)
|
||||
self.bot = bot
|
||||
self.storage = storage
|
||||
self.config = config
|
||||
self.category = category
|
||||
self.parent_view = parent_view
|
||||
|
||||
@discord.ui.button(label="✅ Confirmer", style=discord.ButtonStyle.danger)
|
||||
async def confirm_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
if self.category in self.config.categories:
|
||||
self.config.categories.remove(self.category)
|
||||
self.storage.save_config(interaction.guild_id, self.config)
|
||||
|
||||
self.parent_view._add_category_select()
|
||||
await interaction.response.edit_message(
|
||||
embed=self.parent_view._get_embed(),
|
||||
view=self.parent_view
|
||||
)
|
||||
await interaction.followup.send(f"✅ Catégorie **{self.category.name}** supprimée.", ephemeral=True)
|
||||
|
||||
@discord.ui.button(label="❌ Annuler", style=discord.ButtonStyle.secondary)
|
||||
async def cancel_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
view = CategoryActionView(self.bot, self.storage, self.config, self.category, self.parent_view)
|
||||
await interaction.response.edit_message(embed=view._get_embed(), view=view)
|
||||
|
||||
|
||||
class SetChannelModal(discord.ui.Modal):
|
||||
"""Modal pour définir le canal de logs"""
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue