diff --git a/tickets/cog.py b/tickets/cog.py index 7c62960..2884f2a 100644 --- a/tickets/cog.py +++ b/tickets/cog.py @@ -13,16 +13,6 @@ from tickets.ui import PanelCreateButton logger = logging.getLogger("vision") -class TicketSystem(commands.Cog): - def __init__(self, bot: commands.Bot): - self.bot = bot - self.bot.add_view(PanelView()) - - @commands.Cog.listener() - async def on_ready(self): - logger.info("TicketSystem cog charge") - - class PanelView(discord.ui.LayoutView): def __init__(self): super().__init__(timeout=None) @@ -39,121 +29,6 @@ class PanelView(discord.ui.LayoutView): self.add_item(container) -ticket_group = app_commands.Group(name="ticket", description="Systeme de tickets") - - -@ticket_group.command(name="setup", description="Envoyer le panneau de tickets") -@app_commands.describe(channel="Canal pour le panneau") -@app_commands.checks.has_permissions(manage_guild=True) -async def ticket_setup(interaction: discord.Interaction, channel: discord.TextChannel): - config = storage.get_config(interaction.guild_id) - config.enabled = True - config.panel_channel_id = channel.id - storage.save_config(config) - - view = PanelView() - msg = await channel.send(view=view) - config.panel_message_id = msg.id - storage.save_config(config) - - container = discord.ui.Container() - container.add_item(discord.ui.TextDisplay(f"## Panneau envoye\nCanal : {channel.mention}\nStatut : Actif")) - resp_view = discord.ui.LayoutView() - resp_view.add_item(container) - await interaction.response.send_message(view=resp_view, ephemeral=True) - - -@ticket_group.command(name="config", description="Configuration du systeme de tickets") -@app_commands.checks.has_permissions(manage_guild=True) -async def ticket_config(interaction: discord.Interaction): - config = storage.get_config(interaction.guild_id) - cats = "\n".join(f"- {c.emoji} **{c.name}**" for c in config.categories) or "*Aucune*" - - container = discord.ui.Container() - container.add_item( - discord.ui.TextDisplay( - f"## Configuration Tickets\n" - f"**Statut :** {'🟢 Actif' if config.enabled else '🔴 Inactif'}\n" - f"**Role staff :** <@&{config.staff_role_id}>\n" - if config.staff_role_id - else f"**Canal de logs :** <#{config.log_channel_id}>\n" - if config.log_channel_id - else f"### Categories\n{cats}" - ) - ) - container.add_item(discord.ui.Separator()) - container.add_item( - discord.ui.ActionRow( - ConfigToggleButton(config.enabled), - ConfigAddCatButton(), - ConfigSetStaffButton(), - ConfigSetLogButton(), - ) - ) - view = discord.ui.LayoutView() - view.add_item(container) - await interaction.response.send_message(view=view, ephemeral=True) - - -class ConfigToggleButton(discord.ui.Button): - def __init__(self, enabled: bool): - super().__init__( - label="Desactiver" if enabled else "Activer", - style=discord.ButtonStyle.danger if enabled else discord.ButtonStyle.success, - custom_id="ticket_cfg_toggle", - ) - - async def callback(self, interaction: discord.Interaction): - config = storage.get_config(interaction.guild_id) - config.enabled = not config.enabled - storage.save_config(config) - await interaction.response.edit_message(view=ConfigView()) - - -class ConfigAddCatButton(discord.ui.Button): - def __init__(self): - super().__init__( - label="Ajouter categorie", - style=discord.ButtonStyle.primary, - custom_id="ticket_cfg_addcat", - ) - - async def callback(self, interaction: discord.Interaction): - await interaction.response.send_modal(AddCategoryModal()) - - -class ConfigSetStaffButton(discord.ui.Button): - def __init__(self): - super().__init__( - label="Role staff", - style=discord.ButtonStyle.secondary, - custom_id="ticket_cfg_staff", - ) - - async def callback(self, interaction: discord.Interaction): - await interaction.response.send_message( - "Selectionnez le role staff :", - view=StaffRoleSelectView(), - ephemeral=True, - ) - - -class ConfigSetLogButton(discord.ui.Button): - def __init__(self): - super().__init__( - label="Canal logs", - style=discord.ButtonStyle.secondary, - custom_id="ticket_cfg_log", - ) - - async def callback(self, interaction: discord.Interaction): - await interaction.response.send_message( - "Selectionnez le canal de logs :", - view=LogChannelSelectView(), - ephemeral=True, - ) - - class ConfigView(discord.ui.LayoutView): def __init__(self): super().__init__(timeout=None) @@ -186,55 +61,131 @@ class AddCategoryModal(discord.ui.Modal, title="Ajouter une categorie"): await interaction.response.send_message(f"Categorie **{cat.name}** ajoutee.", ephemeral=True) -class StaffRoleSelect(discord.ui.RoleSelect): - def __init__(self): +class ConfigToggleButton(discord.ui.Button): + def __init__(self, enabled: bool): super().__init__( - placeholder="Role staff...", - custom_id="ticket_staff_role_select", - min_values=1, - max_values=1, + label="Desactiver" if enabled else "Activer", + style=discord.ButtonStyle.danger if enabled else discord.ButtonStyle.success, + custom_id="ticket_cfg_toggle", ) async def callback(self, interaction: discord.Interaction): config = storage.get_config(interaction.guild_id) - config.staff_role_id = self.values[0].id + config.enabled = not config.enabled storage.save_config(config) - await interaction.response.edit_message( - content=f"Role staff defini : {self.values[0].mention}", - view=None, + await interaction.response.edit_message(view=ConfigView()) + + +class ConfigAddCatButton(discord.ui.Button): + def __init__(self): + super().__init__(label="Ajouter categorie", style=discord.ButtonStyle.primary, custom_id="ticket_cfg_addcat") + + async def callback(self, interaction: discord.Interaction): + await interaction.response.send_modal(AddCategoryModal()) + + +class ConfigSetStaffButton(discord.ui.Button): + def __init__(self): + super().__init__(label="Role staff", style=discord.ButtonStyle.secondary, custom_id="ticket_cfg_staff") + + async def callback(self, interaction: discord.Interaction): + view = discord.ui.View(timeout=300) + sel = discord.ui.RoleSelect( + placeholder="Role staff...", custom_id="ticket_staff_role_select", min_values=1, max_values=1 ) + async def _cb(interaction: discord.Interaction): + config = storage.get_config(interaction.guild_id) + config.staff_role_id = sel.values[0].id + storage.save_config(config) + await interaction.response.edit_message(content=f"Role staff : {sel.values[0].mention}", view=None) -class StaffRoleSelectView(discord.ui.View): + sel.callback = _cb + view.add_item(sel) + await interaction.response.send_message("Selectionnez le role staff :", view=view, ephemeral=True) + + +class ConfigSetLogButton(discord.ui.Button): def __init__(self): - super().__init__(timeout=300) - self.add_item(StaffRoleSelect()) + super().__init__(label="Canal logs", style=discord.ButtonStyle.secondary, custom_id="ticket_cfg_log") - -class LogChannelSelect(discord.ui.ChannelSelect): - def __init__(self): - super().__init__( + async def callback(self, interaction: discord.Interaction): + view = discord.ui.View(timeout=300) + sel = discord.ui.ChannelSelect( placeholder="Canal de logs...", custom_id="ticket_log_channel_select", - channel_types=[discord.ChannelType.text, discord.ChannelType.public_thread], + channel_types=[discord.ChannelType.text], min_values=1, max_values=1, ) - async def callback(self, interaction: discord.Interaction): + async def _cb(interaction: discord.Interaction): + config = storage.get_config(interaction.guild_id) + config.log_channel_id = sel.values[0].id + storage.save_config(config) + await interaction.response.edit_message(content=f"Canal de logs : {sel.values[0].mention}", view=None) + + sel.callback = _cb + view.add_item(sel) + await interaction.response.send_message("Selectionnez le canal de logs :", view=view, ephemeral=True) + + +class TicketSystem(commands.Cog): + ticket = app_commands.Group(name="ticket", description="Systeme de tickets") + + def __init__(self, bot: commands.Bot): + self.bot = bot + self.bot.add_view(PanelView()) + + @commands.Cog.listener() + async def on_ready(self): + logger.info("TicketSystem cog charge") + + @ticket.command(name="setup", description="Envoyer le panneau de tickets") + @app_commands.describe(channel="Canal pour le panneau") + @app_commands.checks.has_permissions(manage_guild=True) + async def ticket_setup(self, interaction: discord.Interaction, channel: discord.TextChannel): config = storage.get_config(interaction.guild_id) - config.log_channel_id = self.values[0].id + config.enabled = True + config.panel_channel_id = channel.id storage.save_config(config) - await interaction.response.edit_message( - content=f"Canal de logs defini : {self.values[0].mention}", - view=None, + view = PanelView() + msg = await channel.send(view=view) + config.panel_message_id = msg.id + storage.save_config(config) + container = discord.ui.Container() + container.add_item(discord.ui.TextDisplay(f"## Panneau envoye\nCanal : {channel.mention}\nStatut : Actif")) + resp_view = discord.ui.LayoutView() + resp_view.add_item(container) + await interaction.response.send_message(view=resp_view, ephemeral=True) + + @ticket.command(name="config", description="Configuration du systeme de tickets") + @app_commands.checks.has_permissions(manage_guild=True) + async def ticket_config(self, interaction: discord.Interaction): + config = storage.get_config(interaction.guild_id) + cats = "\n".join(f"- {c.emoji} **{c.name}**" for c in config.categories) or "*Aucune*" + staff_line = f"**Role staff :** <@&{config.staff_role_id}>\n" if config.staff_role_id else "" + log_line = f"**Canal de logs :** <#{config.log_channel_id}>\n" if config.log_channel_id else "" + container = discord.ui.Container() + container.add_item( + discord.ui.TextDisplay( + f"## Configuration Tickets\n" + f"**Statut :** {'Actif' if config.enabled else 'Inactif'}\n" + f"{staff_line}{log_line}### Categories\n{cats}" + ) ) - - -class LogChannelSelectView(discord.ui.View): - def __init__(self): - super().__init__(timeout=300) - self.add_item(LogChannelSelect()) + container.add_item(discord.ui.Separator()) + container.add_item( + discord.ui.ActionRow( + ConfigToggleButton(config.enabled), + ConfigAddCatButton(), + ConfigSetStaffButton(), + ConfigSetLogButton(), + ) + ) + view = discord.ui.LayoutView() + view.add_item(container) + await interaction.response.send_message(view=view, ephemeral=True) async def setup(bot: commands.Bot):