V1.0 de l'amélioration du suivi des issues

This commit is contained in:
Mathis 2026-07-12 18:17:40 +02:00
parent cfcd2fc43b
commit b4d1580600

View file

@ -465,6 +465,10 @@ class BugReport(commands.Cog):
os.makedirs(REPORTS_DIR, exist_ok=True)
await self._start_webhook_server()
pending_count = await self._send_pending_deployment_notifications()
if pending_count:
kuby_logger.info(f"Notifications de déploiement en attente traitées au démarrage: {pending_count}")
# ⚡ Enregistrement des vues persistantes (boutons panel)
# Sans ça, après un redémarrage les boutons "Remplir le formulaire"
# dans les anciens messages de panel ne fonctionnent plus.
@ -497,6 +501,60 @@ class BugReport(commands.Cog):
kuby_logger.error(f"Error during webhook server cleanup: {e}")
self.bot.loop.create_task(cleanup())
async def _send_pending_deployment_notifications(self) -> int:
"""Envoie les notifications de déploiement en attente depuis le tracking."""
notified_count = 0
for issue_iid, issue_data in list(self.issue_data.items()):
if not issue_data.get("pending_deployment_notification"):
kuby_logger.debug(f"No pending deployment notification for issue #{issue_iid}")
continue
requester_id = issue_data.get("requester_id")
if not requester_id:
kuby_logger.warning(f"Missing requester_id for pending deployment notification on issue #{issue_iid}")
continue
kuby_logger.info(f"Processing deployment notification for issue #{issue_iid} to requester_id={requester_id}")
user = self.bot.get_user(requester_id)
if not user:
try:
user = await self.bot.fetch_user(requester_id)
kuby_logger.info(f"Fetched user {user} for issue #{issue_iid}")
except Exception as fetch_error:
kuby_logger.warning(f"Unable to fetch user {requester_id} for issue #{issue_iid}: {fetch_error}")
continue
else:
kuby_logger.info(f"Resolved cached user {user} for issue #{issue_iid}")
try:
embed = disnake.Embed(
title="🚀 Fonctionnalité disponible !",
description=(
"✅ Votre demande est désormais fonctionnelle sur le bot.\n\n"
"Merci encore pour votre contribution et votre patience."
),
color=disnake.Color.blurple()
)
avatar = getattr(self.bot.user, "display_avatar", None)
if avatar:
embed.set_thumbnail(url=avatar.url)
kuby_logger.info(f"Attempting to DM deployment notification to {user} for issue #{issue_iid}")
await user.send(embed=embed)
issue_data["pending_deployment_notification"] = False
notified_count += 1
kuby_logger.info(f"Notification de déploiement envoyée à {user} pour l'issue #{issue_iid}")
except disnake.Forbidden as forbidden_error:
kuby_logger.warning(f"DM forbidden for {user} on issue #{issue_iid}: {forbidden_error}")
except disnake.HTTPException as http_error:
kuby_logger.warning(f"Discord HTTP error while sending deployment notification to {user} on issue #{issue_iid}: {http_error}")
except Exception as e:
kuby_logger.warning(f"Impossible d'envoyer la notification de déploiement à {user} pour l'issue #{issue_iid}: {e}")
save_tracking(self.issue_data)
kuby_logger.info(f"Déploiement terminé: {notified_count} notification(s) envoyée(s)")
return notified_count
async def handle_deployment_complete(self, request):
"""Notifie les demandeurs dont la fonctionnalité a été intégrée et attend le prochain déploiement."""
try:
@ -510,56 +568,7 @@ class BugReport(commands.Cog):
except Exception:
pass
notified_count = 0
for issue_iid, issue_data in list(self.issue_data.items()):
if not issue_data.get("pending_deployment_notification"):
kuby_logger.debug(f"No pending deployment notification for issue #{issue_iid}")
continue
requester_id = issue_data.get("requester_id")
if not requester_id:
kuby_logger.warning(f"Missing requester_id for pending deployment notification on issue #{issue_iid}")
continue
kuby_logger.info(f"Processing deployment notification for issue #{issue_iid} to requester_id={requester_id}")
user = self.bot.get_user(requester_id)
if not user:
try:
user = await self.bot.fetch_user(requester_id)
kuby_logger.info(f"Fetched user {user} for issue #{issue_iid}")
except Exception as fetch_error:
kuby_logger.warning(f"Unable to fetch user {requester_id} for issue #{issue_iid}: {fetch_error}")
continue
else:
kuby_logger.info(f"Resolved cached user {user} for issue #{issue_iid}")
try:
embed = disnake.Embed(
title="🚀 Fonctionnalité disponible !",
description=(
"✅ Votre demande est désormais fonctionnelle sur le bot.\n\n"
"Merci encore pour votre contribution et votre patience."
),
color=disnake.Color.blurple()
)
avatar = getattr(self.bot.user, "display_avatar", None)
if avatar:
embed.set_thumbnail(url=avatar.url)
kuby_logger.info(f"Attempting to DM deployment notification to {user} for issue #{issue_iid}")
await user.send(embed=embed)
issue_data["pending_deployment_notification"] = False
notified_count += 1
kuby_logger.info(f"Notification de déploiement envoyée à {user} pour l'issue #{issue_iid}")
except disnake.Forbidden as forbidden_error:
kuby_logger.warning(f"DM forbidden for {user} on issue #{issue_iid}: {forbidden_error}")
except disnake.HTTPException as http_error:
kuby_logger.warning(f"Discord HTTP error while sending deployment notification to {user} on issue #{issue_iid}: {http_error}")
except Exception as e:
kuby_logger.warning(f"Impossible d'envoyer la notification de déploiement à {user} pour l'issue #{issue_iid}: {e}")
save_tracking(self.issue_data)
kuby_logger.info(f"Déploiement terminé: {notified_count} notification(s) envoyée(s)")
notified_count = await self._send_pending_deployment_notifications()
return web.json_response({"status": "notified", "sent": notified_count}, status=200)
except Exception as e:
kuby_logger.error(f"Error handling deployment complete: {e}")