Améliore la communication moderation

This commit is contained in:
skylanix
2025-10-30 01:38:43 +01:00
parent db03c382cd
commit eb9bf0e67e
3 changed files with 66 additions and 62 deletions

View File

@@ -1,14 +1,14 @@
services: services:
mamiehenriette: mamiehenriette:
container_name: MamieHenriette # Nom du conteneur container_name: MamieHenriette # Nom du conteneur
image: ghcr.io/skylanix/mamiehenriette:latest # Image hébergée sur GitHub Container Registry # image: ghcr.io/skylanix/mamiehenriette:latest # Image hébergée sur GitHub Container Registry
restart: unless-stopped # Redémarre automatiquement sauf si arrêté manuellement restart: unless-stopped # Redémarre automatiquement sauf si arrêté manuellement
# build: . # Build du conteneur à partir d'un Dockerfile local (décommentez si nécessaire) build: . # Build du conteneur à partir d'un Dockerfile local (décommentez si nécessaire)
# image: mamiehenriette # Build du conteneur à partir d'un Dockerfile local (décommentez si nécessaire) image: mamiehenriette # Build du conteneur à partir d'un Dockerfile local (décommentez si nécessaire)
environment: environment:
TZ: Europe/Paris # Fuseau horaire TZ: Europe/Zurich # Fuseau horaire
volumes: volumes:
- ./instance:/app/instance # Base de données et configuration persistante - ./instance:/app/instance # Base de données et configuration persistante
- ./logs:/app/logs # Logs de l'application - ./logs:/app/logs # Logs de l'application
@@ -16,33 +16,12 @@ services:
ports: ports:
- 5000:5000 # Interface web sur http://localhost:5000 - 5000:5000 # Interface web sur http://localhost:5000
watchtower: # Permet de mettre à jours automatiquement sqlite-web: # Interface web pour visualiser et éditer la base de données SQLite
image: containrrr/watchtower:latest image: ghcr.io/coleifer/sqlite-web:latest # Image officielle sqlite-web
container_name: watchtower # Nom du conteneur container_name: sqlite_web2 # Nom du conteneur
restart: unless-stopped # Redémarre automatiquement sauf si arrêté manuellement ports:
environment: - "5001:8080" # Accès web via localhost:8080
TZ: Europe/Paris # Fuseau horaire
# Liste des conteneurs à surveiller (séparés par des espaces)
WATCHTOWER_INCLUDE: "MamieHenriette"
WATCHTOWER_SCHEDULE: "0 */30 * * * *" # Vérification toutes les 30 minutes
WATCHTOWER_MONITOR_ONLY: "false" # Mode surveillance uniquement : détecte les mises à jour mais ne les applique pas
WATCHTOWER_CLEANUP: "true" # Supprime automatiquement les anciennes images après mise à jour
WATCHTOWER_INCLUDE_RESTARTING: "true" # Inclut les conteneurs en cours de redémarrage dans la surveillance
# URL de notification Discord (webhook), (décommentez si nécessaire)
# WATCHTOWER_NOTIFICATION_URL: "discord://token@id"
# Format personnalisé des messages de notification (décommentez si nécessaire)
# WATCHTOWER_NOTIFICATION_TEMPLATE: |-
# {{range .}}{{.Time.Format "01-02-2006 15:04:05"}} ({{.Level}})':' {{.Message}}{{println}}{{end}}
# WATCHTOWER_NOTIFICATIONS: shoutrrr # Service de notification utilisé pour Discord (décommentez si nécessaire)
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock # Monte le socket Docker pour permettre à Watchtower de surveiller les conteneurs - ./instance/database.db:/data/database.db # Monte la base de données locale dans le conteneur
environment:
# sqlite-web: # Interface web pour visualiser et éditer la base de données SQLite - SQLITE_DATABASE=/data/database.db # Chemin vers la base de données dans le conteneur
# image: ghcr.io/coleifer/sqlite-web:latest # Image officielle sqlite-web
# container_name: sqlite_web # Nom du conteneur
# ports:
# - "5001:8080" # Accès web via localhost:8080
# volumes:
# - ./instance/database.db:/data/database.db # Monte la base de données locale dans le conteneur
# environment:
# - SQLITE_DATABASE=/data/database.db # Chemin vers la base de données dans le conteneur

View File

@@ -6,7 +6,13 @@ from database.models import ModerationEvent
@webapp.route("/moderation") @webapp.route("/moderation")
def moderation(): def moderation():
events = ModerationEvent.query.order_by(ModerationEvent.created_at.desc()).all() events = ModerationEvent.query.order_by(ModerationEvent.created_at.desc()).all()
return render_template("moderation.html", events=events) return render_template("moderation.html", events=events, event=None)
@webapp.route("/moderation/edit/<int:event_id>")
def open_edit_moderation_event(event_id):
event = ModerationEvent.query.get_or_404(event_id)
events = ModerationEvent.query.order_by(ModerationEvent.created_at.desc()).all()
return render_template("moderation.html", events=events, event=event)
@webapp.route("/moderation/update/<int:event_id>", methods=['POST']) @webapp.route("/moderation/update/<int:event_id>", methods=['POST'])
def update_moderation_event(event_id): def update_moderation_event(event_id):

View File

@@ -2,50 +2,69 @@
{% block content %} {% block content %}
<h1>Modération Discord</h1> <h1>Modération Discord</h1>
<p>Les commandes de modération sont :</p>
<ul> <p>
<li>!kick @utilisateur [raison]</li> Historique des actions de modération effectuées sur le serveur Discord.
<li>!ban @utilisateur [raison]</li>
<li>!warn @utilisateur [raison]</li> Le bot enregistre automatiquement les avertissements, exclusions et bannissements.
<li>!unwarn @utilisateur</li> Exemples de commandes :
</ul> <ul>
<p>Historique des actions de modération sur le serveur Discord.</p> <li><strong>!kick @utilisateur raison</strong> - !kick @Jean Spam de liens</li>
<table> <li><strong>!ban @utilisateur raison</strong> - !ban @Marie Comportement toxique répété</li>
<li><strong>!warn @utilisateur raison</strong> - !warn @Paul Langage inapproprié</li>
<li><strong>!unwarn @utilisateur</strong> - !unwarn @Paul</li>
</ul>
</p>
{% if not event %}
<h2>Événements de modération</h2>
<table class="moderation">
<thead> <thead>
<tr> <tr>
<th>ID</th>
<th>Type</th> <th>Type</th>
<th>Utilisateur</th> <th>Utilisateur</th>
<th>Discord ID</th> <th>Discord ID</th>
<th>Date & Heure</th> <th>Date & Heure</th>
<th>Raison</th> <th>Raison</th>
<th>Staff</th> <th>Staff</th>
<th>Actions</th> <th>#</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for event in events %} {% for mod_event in events %}
<tr> <tr>
<td>{{ event.id }}</td> <td>{{ mod_event.type }}</td>
<td>{{ event.type }}</td> <td>{{ mod_event.username }}</td>
<td>{{ event.username }}</td> <td>{{ mod_event.discord_id }}</td>
<td>{{ event.discord_id }}</td> <td>{{ mod_event.created_at.strftime('%d/%m/%Y %H:%M') if mod_event.created_at else 'N/A' }}</td>
<td>{{ event.created_at.strftime('%d/%m/%Y %H:%M') if event.created_at else 'N/A' }}</td> <td>{{ mod_event.reason }}</td>
<td>{{ mod_event.staff_name }}</td>
<td> <td>
<form action="{{ url_for('update_moderation_event', event_id = event.id) }}" method="POST" style="margin: 0;"> <a href="{{ url_for('open_edit_moderation_event', event_id = mod_event.id) }}" class="icon"></a>
<input name="reason" type="text" value="{{ event.reason }}" style="width: 100%;" /> <a href="{{ url_for('delete_moderation_event', event_id = mod_event.id) }}" onclick="return confirm('Êtes-vous sûr de vouloir supprimer cet événement ?')" class="icon">🗑</a>
</form>
</td>
<td>{{ event.staff_name }}</td>
<td>
<a href="javascript:void(0)" onclick="this.parentElement.parentElement.querySelector('form').submit()">Modifier</a>
|
<a href="{{ url_for('delete_moderation_event', event_id = event.id) }}" onclick="return confirm('Êtes-vous sûr de vouloir supprimer cet événement ?')">🗑️ Supprimer</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% endif %}
{% if event %}
<h2>Editer un événement</h2>
<form action="{{ url_for('update_moderation_event', event_id = event.id) }}" method="POST">
<label for="type">Type</label>
<input name="type" type="text" value="{{ event.type }}" disabled />
<label for="username">Utilisateur</label>
<input name="username" type="text" value="{{ event.username }}" disabled />
<label for="discord_id">Discord ID</label>
<input name="discord_id" type="text" value="{{ event.discord_id }}" disabled />
<label for="reason">Raison</label>
<input name="reason" type="text" value="{{ event.reason }}" required="required" />
<label for="staff_name">Staff</label>
<input name="staff_name" type="text" value="{{ event.staff_name }}" disabled />
<input type="Submit" value="Modifier">
<a href="{{ url_for('moderation') }}">Annuler</a>
</form>
{% endif %}
{% endblock %} {% endblock %}