diff --git a/commandes/bug_report.py b/commandes/bug_report.py index cf4626c..92d335f 100644 --- a/commandes/bug_report.py +++ b/commandes/bug_report.py @@ -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}")