Correction des multiples bugs

This commit is contained in:
Mathis 2026-05-01 16:16:33 +02:00
parent 5fe70d754b
commit 07198c20b7
15 changed files with 707 additions and 348 deletions

View file

@ -16,16 +16,20 @@ REPORTS_FILE = os.path.join(BASE_DIR, "data", "gitlab_reports.json")
def save_report(issue_iid, user_id):
os.makedirs(os.path.dirname(REPORTS_FILE), exist_ok=True)
try:
data = {}
if os.path.exists(REPORTS_FILE):
with open(REPORTS_FILE, "r") as f:
data = json.load(f)
else:
data = {}
try:
with open(REPORTS_FILE, "r", encoding="utf-8") as f:
data = json.load(f)
except json.JSONDecodeError:
kuby_logger.warning("REPORTS_FILE corrupted, re-initializing to avoid tracking loss.")
data[str(issue_iid)] = user_id
with open(REPORTS_FILE, "w") as f:
temp_file = f"{REPORTS_FILE}.tmp"
with open(temp_file, "w", encoding="utf-8") as f:
json.dump(data, f, indent=4)
os.replace(temp_file, REPORTS_FILE)
except Exception as e:
kuby_logger.error(f"Error saving report to JSON: {e}")
@ -154,13 +158,9 @@ class BugReport(commands.Cog):
self.bot.loop.create_task(cleanup())
async def handle_bot_event(self, request):
# Vérification de la sécurité (Secret Token GitLab)
webhook_secret = os.getenv("GITLAB_WEBHOOK_SECRET")
if webhook_secret:
provided_token = request.headers.get("X-Gitlab-Token")
if provided_token != webhook_secret:
kuby_logger.warning("Unauthorised webhook attempt detected (invalid X-Gitlab-Token).")
return web.json_response({"status": "unauthorised"}, status=401)
# Sécurité interne désactivée comme demandé (le port 5001 n'est accessible que via localhost)
provided_token = request.headers.get("X-Gitlab-Token")
# On ignore la vérification du token pour faciliter le relais local
try:
# On attend que le bot soit prêt si on vient de rebooter
@ -188,8 +188,12 @@ class BugReport(commands.Cog):
if not os.path.exists(REPORTS_FILE):
return web.json_response({"status": "no reports file"}, status=200)
with open(REPORTS_FILE, "r") as f:
reports = json.load(f)
try:
with open(REPORTS_FILE, "r", encoding="utf-8") as f:
reports = json.load(f)
except json.JSONDecodeError:
kuby_logger.error("REPORTS_FILE corrupted during read!")
return web.json_response({"status": "corrupted file"}, status=500)
user_id = reports.get(str(issue_iid))
if not user_id:
@ -226,6 +230,7 @@ class BugReport(commands.Cog):
current_labels_str = "Mis à jour"
try:
# Création de l'embed pour la mise à jour de statut
embed = discord.Embed(
title="🛠️ Mise à jour de votre signalement !",
description=f"Le statut de votre rapport **{issue_title}** a été mis à jour par l'équipe.",
@ -235,22 +240,24 @@ class BugReport(commands.Cog):
try:
await user.send(embed=embed)
# On logue systématiquement pour que le staff sache si ça a marché (utile en prod)
kuby_logger.info(f"Notification de label envoyée à {user} ({user.id}) pour l'issue #{issue_iid}")
if dev and dev.id != user.id:
await dev.send(f"✅ [FIABLE] L'utilisateur {user} ({user.id}) a bien reçu la notification de statut **{current_labels_str}** pour l'issue #{issue_iid} ({issue_title}).")
await dev.send(f"✅ [SUIVI] L'utilisateur {user} ({user.id}) a bien reçu la notification de statut **{current_labels_str}** pour l'issue #{issue_iid} ({issue_title}).")
except discord.Forbidden:
kuby_logger.warning(f"Unable to DM user {user} ({user.id}) - DMs are disabled or bot is blocked.")
kuby_logger.warning(f"Impossible d'envoyer un MP à {user} ({user.id}) - MPs désactivés.")
if dev and dev.id != user.id:
try:
await dev.send(f"⚠️ [DM BLOQUÉ] Impossible de notifier l'utilisateur {user} ({user.id}) pour l'issue #{issue_iid} (DMs désactivés).")
except discord.Forbidden:
pass
except discord.HTTPException as e:
kuby_logger.error(f"HTTP error sending DM to {user}: {e}")
await dev.send(f"⚠️ [DM BLOQUÉ] {user} ({user.id}) a ses MPs fermés. Impossible de notifier pour l'issue #{issue_iid}.")
except Exception as e:
kuby_logger.error(f"Erreur lors de l'envoi du MP de statut à {user}: {e}")
except Exception as e:
kuby_logger.error(f"Unexpected error in label update notification: {e}")
kuby_logger.error(f"Erreur inattendue dans la notification de label : {e}")
# Check if it was closed
if action == "close" or payload.get("object_attributes", {}).get("state") == "closed":
state = payload.get("object_attributes", {}).get("state")
is_closing_now = action == "close" or (state == "closed" and "state_id" in changes)
if is_closing_now:
try:
embed = discord.Embed(
title="🛠️ Bug / Suggestion Terminé(e) !",
@ -262,19 +269,17 @@ class BugReport(commands.Cog):
try:
await user.send(embed=embed)
kuby_logger.info(f"Notification de clôture envoyée à {user} ({user.id}) pour l'issue #{issue_iid}")
if dev and dev.id != user.id:
await dev.send(f"✅ [FIABLE] L'utilisateur {user} ({user.id}) a bien reçu la notification de CLÔTURE pour l'issue #{issue_iid}.")
await dev.send(f"✅ [SUIVI] L'utilisateur {user} ({user.id}) a bien reçu la notification de CLÔTURE pour l'issue #{issue_iid}.")
except discord.Forbidden:
kuby_logger.warning(f"Unable to DM user {user} ({user.id}) - DMs are disabled or bot is blocked during closure.")
kuby_logger.warning(f"Impossible d'envoyer le MP de clôture à {user} ({user.id}).")
if dev and dev.id != user.id:
try:
await dev.send(f"⚠️ [DM BLOQUÉ] Impossible d'annoncer la clôture à {user} ({user.id}) pour l'issue #{issue_iid} (DMs désactivés).")
except discord.Forbidden:
pass
except discord.HTTPException as e:
kuby_logger.error(f"HTTP error sending closure DM to {user}: {e}")
await dev.send(f"⚠️ [DM BLOQUÉ] Impossible d'annoncer la clôture à {user} ({user.id}) pour l'issue #{issue_iid} (DMs désactivés).")
except Exception as e:
kuby_logger.error(f"Erreur lors de l'envoi du MP de clôture à {user}: {e}")
except Exception as e:
kuby_logger.error(f"Unexpected error in closure notification: {e}")
kuby_logger.error(f"Erreur inattendue dans la notification de clôture : {e}")
elif event_type == "note":
note_attr = payload.get("object_attributes", {})
@ -294,19 +299,17 @@ class BugReport(commands.Cog):
try:
await user.send(embed=embed)
kuby_logger.info(f"Commentaire GitLab envoyé à {user} ({user.id}) pour l'issue #{issue_iid}")
if dev and dev.id != user.id:
await dev.send(f"✅ [FIABLE] L'utilisateur {user} ({user.id}) a bien reçu votre commentaire pour l'issue #{issue_iid}.")
await dev.send(f"✅ [SUIVI] L'utilisateur {user} ({user.id}) a bien reçu votre commentaire pour l'issue #{issue_iid}.")
except discord.Forbidden:
kuby_logger.warning(f"Unable to DM user {user} ({user.id}) - DMs are disabled or bot is blocked during comment notification.")
kuby_logger.warning(f"Impossible d'envoyer le commentaire en MP à {user} ({user.id}).")
if dev and dev.id != user.id:
try:
await dev.send(f"⚠️ [DM BLOQUÉ] Impossible d'envoyer votre commentaire à {user} ({user.id}) pour l'issue #{issue_iid} (DMs désactivés).")
except discord.Forbidden:
pass
except discord.HTTPException as e:
kuby_logger.error(f"HTTP error sending comment DM to {user}: {e}")
await dev.send(f"⚠️ [DM BLOQUÉ] Impossible d'envoyer votre commentaire à {user} ({user.id}) pour l'issue #{issue_iid} (DMs désactivés).")
except Exception as e:
kuby_logger.error(f"Erreur lors de l'envoi du MP de commentaire à {user}: {e}")
except Exception as e:
kuby_logger.error(f"Unexpected error in comment notification: {e}")
kuby_logger.error(f"Erreur inattendue dans la notification de commentaire : {e}")
return web.json_response({"status": "success"}, status=200)