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"}