Ajout de la possibilités de communiquer une information aux partenaires Omega Kube
This commit is contained in:
parent
8bcc40f217
commit
b0535af75c
3 changed files with 287 additions and 72 deletions
|
|
@ -368,7 +368,7 @@ class ReportsFilterView(disnake.ui.View):
|
|||
val = inter.values[0]
|
||||
self.selected_status = None if val == "all" else val
|
||||
self.update_components()
|
||||
await inter.response.edit_message(components=self.get_components_v2())
|
||||
await inter.response.edit_message(embed=self.get_filter_embed(), view=self)
|
||||
status_select.callback = status_callback
|
||||
self.add_item(status_select)
|
||||
|
||||
|
|
@ -392,7 +392,7 @@ class ReportsFilterView(disnake.ui.View):
|
|||
val = inter.values[0]
|
||||
self.selected_subject = None if val == "all" else val
|
||||
self.update_components()
|
||||
await inter.response.edit_message(components=self.get_components_v2())
|
||||
await inter.response.edit_message(embed=self.get_filter_embed(), view=self)
|
||||
subject_select.callback = subject_callback
|
||||
self.add_item(subject_select)
|
||||
|
||||
|
|
@ -417,7 +417,7 @@ class ReportsFilterView(disnake.ui.View):
|
|||
else:
|
||||
self.selected_user = None
|
||||
self.update_components()
|
||||
await inter.response.edit_message(components=self.get_components_v2())
|
||||
await inter.response.edit_message(embed=self.get_filter_embed(), view=self)
|
||||
user_select.callback = user_callback
|
||||
self.add_item(user_select)
|
||||
current_row += 1
|
||||
|
|
@ -439,7 +439,7 @@ class ReportsFilterView(disnake.ui.View):
|
|||
else:
|
||||
self.selected_role = None
|
||||
self.update_components()
|
||||
await inter.response.edit_message(components=self.get_components_v2())
|
||||
await inter.response.edit_message(embed=self.get_filter_embed(), view=self)
|
||||
role_select.callback = role_callback
|
||||
self.add_item(role_select)
|
||||
current_row += 1
|
||||
|
|
@ -453,8 +453,6 @@ class ReportsFilterView(disnake.ui.View):
|
|||
row=current_row
|
||||
)
|
||||
async def search_callback(inter: disnake.MessageInteraction):
|
||||
await inter.response.defer(ephemeral=True)
|
||||
|
||||
author_filter = None
|
||||
if not self.has_global_access:
|
||||
author_filter = self.viewer_id
|
||||
|
|
@ -474,11 +472,11 @@ class ReportsFilterView(disnake.ui.View):
|
|||
)
|
||||
|
||||
if not reports:
|
||||
await inter.followup.send("❌ Aucun rapport ne correspond à votre recherche.", ephemeral=True)
|
||||
await inter.response.send_message("❌ Aucun rapport ne correspond à votre recherche.", ephemeral=True)
|
||||
return
|
||||
|
||||
browser = ReportsBrowserView(self.cog, self.interaction, reports, filter_view=self)
|
||||
await inter.edit_original_message(content=None, embed=browser.get_embed(), view=browser)
|
||||
await inter.response.edit_message(embed=browser.get_embed(), view=browser)
|
||||
|
||||
search_btn.callback = search_callback
|
||||
self.add_item(search_btn)
|
||||
|
|
@ -496,49 +494,40 @@ class ReportsFilterView(disnake.ui.View):
|
|||
self.selected_status = None
|
||||
self.selected_subject = None
|
||||
self.update_components()
|
||||
await inter.response.edit_message(components=self.get_components_v2())
|
||||
await inter.response.edit_message(embed=self.get_filter_embed(), view=self)
|
||||
reset_btn.callback = reset_callback
|
||||
self.add_item(reset_btn)
|
||||
|
||||
def get_components_v2(self):
|
||||
sections = [
|
||||
disnake.ui.Section(
|
||||
"# 🔍 Recherche & Filtres de Rapports",
|
||||
accessory=disnake.ui.Thumbnail(self.interaction.author.display_avatar.url)
|
||||
),
|
||||
disnake.ui.Separator(divider=True)
|
||||
]
|
||||
|
||||
filters_desc = []
|
||||
if self.selected_status:
|
||||
filters_desc.append(f"🚦 **Statut** : {self.selected_status}")
|
||||
else:
|
||||
filters_desc.append("🚦 **Statut** : Tous")
|
||||
|
||||
def get_filter_embed(self) -> disnake.Embed:
|
||||
"""Génère l'embed résumant les filtres actifs."""
|
||||
author = self.interaction.author
|
||||
lines = []
|
||||
lines.append(f"🚦 **Statut** : {self.selected_status or 'Tous'}")
|
||||
if self.has_global_access:
|
||||
if self.selected_user:
|
||||
mention = self.selected_user.mention if hasattr(self.selected_user, "mention") else f"<@{self.selected_user}>"
|
||||
filters_desc.append(f"👤 **Auteur** : {mention}")
|
||||
mention = self.selected_user.mention if hasattr(self.selected_user, 'mention') else f'<@{self.selected_user}>'
|
||||
lines.append(f"👤 **Auteur** : {mention}")
|
||||
else:
|
||||
filters_desc.append("👤 **Auteur** : Tous")
|
||||
|
||||
lines.append("👤 **Auteur** : Tous")
|
||||
if self.selected_role:
|
||||
mention = self.selected_role.mention if hasattr(self.selected_role, "mention") else f"<@&{self.selected_role}>"
|
||||
filters_desc.append(f"🛡️ **Rôle Auteur** : {mention}")
|
||||
mention = self.selected_role.mention if hasattr(self.selected_role, 'mention') else f'<@&{self.selected_role}>'
|
||||
lines.append(f"🛡️ **Rôle Auteur** : {mention}")
|
||||
else:
|
||||
filters_desc.append("🛡️ **Rôle Auteur** : Tous")
|
||||
lines.append("🛡️ **Rôle Auteur** : Tous")
|
||||
else:
|
||||
filters_desc.append(f"👤 **Auteur** : {self.interaction.author.mention} *(Accès restreint à vos propres rapports)*")
|
||||
|
||||
if self.selected_subject:
|
||||
filters_desc.append(f"📁 **Objet / Catégorie** : `{self.selected_subject}`")
|
||||
else:
|
||||
filters_desc.append("📁 **Objet / Catégorie** : Tous")
|
||||
|
||||
sections.append(disnake.ui.TextDisplay(content="\n".join(filters_desc)))
|
||||
sections.append(disnake.ui.Separator(divider=True))
|
||||
|
||||
return [disnake.ui.Container(*sections)] + self.children
|
||||
lines.append(f"👤 **Auteur** : {author.mention} *(accès limité à vos rapports)*")
|
||||
lines.append(f"📁 **Objet / Catégorie** : {self.selected_subject or 'Tous'}")
|
||||
embed = disnake.Embed(
|
||||
title="🔍 Recherche & Filtres de Rapports",
|
||||
description="\n".join(lines),
|
||||
color=disnake.Color.blurple()
|
||||
)
|
||||
embed.set_thumbnail(url=author.display_avatar.url)
|
||||
return embed
|
||||
|
||||
def get_components_v2(self):
|
||||
"""Kept for backward compatibility — returns view children only."""
|
||||
return self.children
|
||||
|
||||
async def interaction_check(self, interaction: disnake.MessageInteraction) -> bool:
|
||||
if interaction.author.id != self.viewer_id:
|
||||
|
|
@ -701,9 +690,14 @@ class ReportsBrowserView(disnake.ui.View):
|
|||
if not self.reports:
|
||||
if self.filter_view:
|
||||
self.filter_view.update_components()
|
||||
await inter.response.edit_message(content=None, embed=None, components=self.filter_view.get_components_v2())
|
||||
await inter.response.edit_message(
|
||||
embed=self.filter_view.get_filter_embed(), view=self.filter_view
|
||||
)
|
||||
else:
|
||||
await inter.response.edit_message(content="✅ Le rapport a été supprimé. Plus aucun rapport dans cette recherche.", embed=None, view=None)
|
||||
await inter.response.edit_message(
|
||||
content="✅ Le rapport a été supprimé. Plus aucun rapport dans cette recherche.",
|
||||
embed=None, view=None
|
||||
)
|
||||
return
|
||||
|
||||
if self.current_index >= len(self.reports):
|
||||
|
|
@ -717,10 +711,14 @@ class ReportsBrowserView(disnake.ui.View):
|
|||
async def back_callback(inter: disnake.MessageInteraction):
|
||||
if self.filter_view:
|
||||
self.filter_view.update_components()
|
||||
await inter.response.edit_message(embed=None, components=self.filter_view.get_components_v2())
|
||||
await inter.response.edit_message(
|
||||
embed=self.filter_view.get_filter_embed(), view=self.filter_view
|
||||
)
|
||||
else:
|
||||
new_filter_view = ReportsFilterView(self.cog, self.interaction)
|
||||
await inter.response.edit_message(embed=None, components=new_filter_view.get_components_v2())
|
||||
await inter.response.edit_message(
|
||||
embed=new_filter_view.get_filter_embed(), view=new_filter_view
|
||||
)
|
||||
|
||||
edit_btn.callback = edit_callback
|
||||
delete_btn.callback = delete_callback
|
||||
|
|
@ -732,9 +730,9 @@ class ReportsBrowserView(disnake.ui.View):
|
|||
# Row 3: Menu Déroulant "Changer l'état" (Admin uniquement)
|
||||
if self.is_admin:
|
||||
status_options = [
|
||||
disnake.SelectOption(label="En attente", emoji="🟡", value="En attente", default=(report['status'] == "En attente")),
|
||||
disnake.SelectOption(label="Traité", emoji="🟢", value="Traité", default=(report['status'] == "Traité")),
|
||||
disnake.SelectOption(label="Classé", emoji="🔴", value="Classé", default=(report['status'] == "Classé"))
|
||||
disnake.SelectOption(label="En attente", emoji="🟡", value="En attente"),
|
||||
disnake.SelectOption(label="Traité", emoji="🟢", value="Traité"),
|
||||
disnake.SelectOption(label="Classé", emoji="🔴", value="Classé")
|
||||
]
|
||||
status_menu = disnake.ui.StringSelect(
|
||||
placeholder="Changer le statut...",
|
||||
|
|
@ -746,16 +744,81 @@ class ReportsBrowserView(disnake.ui.View):
|
|||
async def status_callback(inter: disnake.MessageInteraction):
|
||||
if not inter.author.guild_permissions.administrator:
|
||||
return await inter.response.send_message("❌ Seuls les administrateurs peuvent modifier le statut.", ephemeral=True)
|
||||
|
||||
|
||||
old_status = report['status']
|
||||
new_status = inter.values[0]
|
||||
|
||||
if old_status == new_status:
|
||||
return await inter.response.send_message(f"ℹ️ Le rapport est déjà en statut **{new_status}**.", ephemeral=True)
|
||||
|
||||
self.cog.db.update_report_status(report['id'], new_status)
|
||||
|
||||
updated_rep = self.cog.db.get_report(report['id'])
|
||||
self.reports[self.current_index] = updated_rep
|
||||
|
||||
|
||||
self.update_components()
|
||||
await inter.response.edit_message(embed=self.get_embed(), view=self)
|
||||
await inter.followup.send(f"✅ Statut du rapport #{report['id']} mis à jour vers : **{new_status}**.", ephemeral=True)
|
||||
await inter.followup.send(
|
||||
f"✅ Statut du rapport **#{report['id']}** mis à jour : **{old_status}** → **{new_status}**.",
|
||||
ephemeral=True
|
||||
)
|
||||
|
||||
# === Notification DM à l'auteur ===
|
||||
status_colors = {
|
||||
"En attente": disnake.Color.yellow(),
|
||||
"Traité": disnake.Color.green(),
|
||||
"Classé": disnake.Color.greyple(),
|
||||
}
|
||||
status_emojis = {"En attente": "🟡", "Traité": "🟢", "Classé": "🔴"}
|
||||
dm_sent = False
|
||||
try:
|
||||
author_member = inter.guild.get_member(report['author_id'])
|
||||
if not author_member:
|
||||
author_member = await inter.guild.fetch_member(report['author_id'])
|
||||
|
||||
if author_member:
|
||||
dm_embed = disnake.Embed(
|
||||
title="📋 Mise à jour de votre rapport",
|
||||
description=(
|
||||
f"Le statut de votre rapport **#{report['id']} — {report['title']}** "
|
||||
f"vient d'être modifié."
|
||||
),
|
||||
color=status_colors.get(new_status, disnake.Color.blurple()),
|
||||
timestamp=datetime.now(PARIS_TZ)
|
||||
)
|
||||
dm_embed.add_field(
|
||||
name="Ancien statut",
|
||||
value=f"{status_emojis.get(old_status, '⚪')} {old_status}",
|
||||
inline=True
|
||||
)
|
||||
dm_embed.add_field(
|
||||
name="Nouveau statut",
|
||||
value=f"{status_emojis.get(new_status, '⚪')} {new_status}",
|
||||
inline=True
|
||||
)
|
||||
dm_embed.add_field(name="Modifié par", value=inter.author.mention, inline=False)
|
||||
dm_embed.add_field(name="Serveur", value=inter.guild.name, inline=False)
|
||||
dm_embed.set_footer(text=f"Rapport #{report['id']} • {inter.guild.name}")
|
||||
if inter.guild.icon:
|
||||
dm_embed.set_thumbnail(url=inter.guild.icon.url)
|
||||
try:
|
||||
await author_member.send(embed=dm_embed)
|
||||
dm_sent = True
|
||||
except disnake.Forbidden:
|
||||
kuby_logger.info(
|
||||
f"[Rapports] DM impossible pour {author_member} (DMs fermés) — rapport #{report['id']}"
|
||||
)
|
||||
except Exception as e:
|
||||
kuby_logger.error(f"[Rapports] Erreur DM notification: {e}", exc_info=True)
|
||||
except disnake.NotFound:
|
||||
pass
|
||||
except Exception as e:
|
||||
kuby_logger.error(f"[Rapports] Erreur récupération membre pour DM: {e}", exc_info=True)
|
||||
|
||||
dm_note = " • 📬 Auteur notifié par DM." if dm_sent else " • ⚠️ DM non envoyé (DMs fermés ou membre introuvable)."
|
||||
await inter.followup.send(
|
||||
f"ℹ️{dm_note}",
|
||||
ephemeral=True
|
||||
)
|
||||
|
||||
status_menu.callback = status_callback
|
||||
self.add_item(status_menu)
|
||||
|
|
@ -898,7 +961,20 @@ class Rapports(commands.Cog):
|
|||
filter_view.selected_role = role
|
||||
|
||||
filter_view.update_components()
|
||||
await interaction.response.send_message(components=filter_view.get_components_v2(), ephemeral=True)
|
||||
await interaction.response.send_message(
|
||||
embed=disnake.Embed(
|
||||
title="🔍 Recherche & Filtres de Rapports",
|
||||
description=(
|
||||
f"🚦 **Statut** : {filter_view.selected_status or 'Tous'}\n"
|
||||
f"📁 **Objet / Catégorie** : {filter_view.selected_subject or 'Tous'}\n"
|
||||
+ (f"👤 **Auteur** : {filter_view.selected_user.mention if hasattr(filter_view.selected_user, 'mention') else 'Tous'}\n" if filter_view.has_global_access else f"👤 **Auteur** : {interaction.author.mention} *(accès limité à vos rapports)*\n")
|
||||
+ (f"🛡️ **Rôle Auteur** : {filter_view.selected_role.mention if hasattr(filter_view.selected_role, 'mention') else 'Tous'}" if filter_view.has_global_access else "")
|
||||
),
|
||||
color=disnake.Color.blurple()
|
||||
),
|
||||
view=filter_view,
|
||||
ephemeral=True
|
||||
)
|
||||
|
||||
def setup(bot):
|
||||
bot.add_cog(Rapports(bot))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue