From 6d364f28f1d0a5cce983cc95454716988e113179 Mon Sep 17 00:00:00 2001 From: Mow910 Date: Tue, 10 Mar 2026 18:25:55 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20boutons=20de=20mod=C3=A9ration=20d?= =?UTF-8?q?ans=20la=20shoutbox=20pour=20les=20mod=C3=A9rateurs=20Twitch,?= =?UTF-8?q?=20permettant=20de=20supprimer=20des=20messages,=20de=20mettre?= =?UTF-8?q?=20en=20timeout=20ou=20de=20bannir=20des=20utilisateurs=20direc?= =?UTF-8?q?tement=20depuis=20l'interface.=20Mise=20=C3=A0=20jour=20de=20la?= =?UTF-8?q?=20logique=20de=20journalisation=20pour=20inclure=20le=20nom=20?= =?UTF-8?q?de=20l'administrateur=20au=20lieu=20de=20"WebApp".=20Am=C3=A9li?= =?UTF-8?q?oration=20de=20l'exp=C3=A9rience=20utilisateur=20avec=20des=20p?= =?UTF-8?q?rompts=20pour=20la=20dur=C3=A9e=20et=20la=20raison=20des=20acti?= =?UTF-8?q?ons=20de=20mod=C3=A9ration.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/templates/twitch-moderation.html | 37 +++++++++++++++++++++++-- webapp/twitch_moderation.py | 18 ++++++------ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/webapp/templates/twitch-moderation.html b/webapp/templates/twitch-moderation.html index 53d08ba..c5c9f15 100644 --- a/webapp/templates/twitch-moderation.html +++ b/webapp/templates/twitch-moderation.html @@ -676,10 +676,23 @@ function addMessageToDisplay(username, message, timestamp, badges, userColor) { if (badges && badges.is_vip) badgeIcons += 'VIP'; if (badges && badges.is_subscriber) badgeIcons += 'SUB'; + var safeUser = escapeHtml(username); + var modButtons = '
' + + '' + + '' + + '' + + '
'; + var messageDiv = document.createElement('div'); - messageDiv.className = 'bg-white dark:bg-gray-800 rounded-lg p-3 text-sm animate-fade-in border-l-2'; + messageDiv.className = 'group bg-white dark:bg-gray-800 rounded-lg p-3 text-sm animate-fade-in border-l-2'; messageDiv.style.borderLeftColor = userColor || '#9146FF'; - messageDiv.innerHTML = '
' + escapeHtml(username) + '' + badgeIcons + '' + timeStr + '
' + escapeHtml(message) + '
'; + messageDiv.innerHTML = '
' + safeUser + '' + badgeIcons + '' + timeStr + '' + modButtons + '
' + escapeHtml(message) + '
'; messagesContainer.appendChild(messageDiv); while (messagesContainer.children.length > 100) messagesContainer.removeChild(messagesContainer.firstChild); @@ -806,6 +819,26 @@ function executeQuickAction(action) { } } +function promptTimeout(username) { + var duration = prompt('Durée du timeout en secondes pour ' + username + ' :', '600'); + if (duration !== null) { + duration = parseInt(duration); + if (duration > 0) { + var reason = prompt('Raison (optionnel) :', 'Timeout via chat') || 'Timeout via chat'; + executeModerationAction('timeout', { username: username, duration: duration, reason: reason }); + } else { + showNotification('Durée invalide', 'error'); + } + } +} + +function promptBan(username) { + if (confirm('Êtes-vous sûr de vouloir ban ' + username + ' ?')) { + var reason = prompt('Raison (optionnel) :', 'Ban via chat') || 'Ban via chat'; + executeModerationAction('ban', { username: username, reason: reason }); + } +} + function executeModerationAction(action, params) { fetch('{{ url_for("execute_moderation_action") }}', { method: 'POST', diff --git a/webapp/twitch_moderation.py b/webapp/twitch_moderation.py index 388790e..513066b 100644 --- a/webapp/twitch_moderation.py +++ b/webapp/twitch_moderation.py @@ -393,6 +393,8 @@ def execute_moderation_action(): from twitchAPI.chat import ChatMessage from types import SimpleNamespace + admin_name = f"WebApp ({current_user.username})" + # Exécuter l'action de manière asynchrone try: async def execute_action(): @@ -409,7 +411,7 @@ def execute_moderation_action(): if user_id: await twitchBot.twitch.ban_user(broadcaster_id, moderator_id, user_id, reason=reason, duration=duration) - _log_action("timeout", "WebApp", username, f"{duration}s - {reason}") + _log_action("timeout", admin_name, username, f"{duration}s - {reason}") return {"success": True, "message": f"Timeout de {username} pour {duration}s"} return {"success": False, "error": f"Utilisateur {username} introuvable"} @@ -424,7 +426,7 @@ def execute_moderation_action(): if user_id: await twitchBot.twitch.ban_user(broadcaster_id, moderator_id, user_id, reason=reason) - _log_action("ban", "WebApp", username, reason) + _log_action("ban", admin_name, username, reason) return {"success": True, "message": f"Ban de {username}"} return {"success": False, "error": f"Utilisateur {username} introuvable"} @@ -439,12 +441,12 @@ def execute_moderation_action(): user_id = await _get_user_id(twitchBot.twitch, username) if user_id: await twitchBot.twitch.delete_chat_messages(broadcaster_id, moderator_id, user_id=user_id) - _log_action("clean", "WebApp", username) + _log_action("clean", admin_name, username) return {"success": True, "message": f"Messages de {username} supprimés"} return {"success": False, "error": f"Utilisateur {username} introuvable"} else: await twitchBot.twitch.delete_chat_messages(broadcaster_id, moderator_id) - _log_action("clean", "WebApp", None, "Chat complet") + _log_action("clean", admin_name, None, "Chat complet") return {"success": True, "message": "Chat nettoyé"} elif action == 'permit': @@ -473,19 +475,19 @@ def execute_moderation_action(): if action == 'subon': await twitchBot.twitch.update_chat_settings(broadcaster_id, moderator_id, subscriber_mode=True) - _log_action("subon", "WebApp") + _log_action("subon", admin_name) return {"success": True, "message": "Mode abonnés activé"} elif action == 'suboff': await twitchBot.twitch.update_chat_settings(broadcaster_id, moderator_id, subscriber_mode=False) - _log_action("suboff", "WebApp") + _log_action("suboff", admin_name) return {"success": True, "message": "Mode abonnés désactivé"} elif action == 'emoteon': await twitchBot.twitch.update_chat_settings(broadcaster_id, moderator_id, emote_mode=True) - _log_action("emoteon", "WebApp") + _log_action("emoteon", admin_name) return {"success": True, "message": "Mode emote activé"} elif action == 'emoteoff': await twitchBot.twitch.update_chat_settings(broadcaster_id, moderator_id, emote_mode=False) - _log_action("emoteoff", "WebApp") + _log_action("emoteoff", admin_name) return {"success": True, "message": "Mode emote désactivé"} return {"success": False, "error": f"Action '{action}' non reconnue"}