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:
mamiehenriette:
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
# 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)
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)
environment:
TZ: Europe/Paris # Fuseau horaire
TZ: Europe/Zurich # Fuseau horaire
volumes:
- ./instance:/app/instance # Base de données et configuration persistante
- ./logs:/app/logs # Logs de l'application
@@ -16,33 +16,12 @@ services:
ports:
- 5000:5000 # Interface web sur http://localhost:5000
watchtower: # Permet de mettre à jours automatiquement
image: containrrr/watchtower:latest
container_name: watchtower # Nom du conteneur
restart: unless-stopped # Redémarre automatiquement sauf si arrêté manuellement
environment:
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)
sqlite-web: # Interface web pour visualiser et éditer la base de données SQLite
image: ghcr.io/coleifer/sqlite-web:latest # Image officielle sqlite-web
container_name: sqlite_web2 # Nom du conteneur
ports:
- "5001:8080" # Accès web via localhost:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock # Monte le socket Docker pour permettre à Watchtower de surveiller les conteneurs
# sqlite-web: # Interface web pour visualiser et éditer la base de données SQLite
# 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
- ./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")
def moderation():
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'])
def update_moderation_event(event_id):

View File

@@ -2,50 +2,69 @@
{% block content %}
<h1>Modération Discord</h1>
<p>Les commandes de modération sont :</p>
<ul>
<li>!kick @utilisateur [raison]</li>
<li>!ban @utilisateur [raison]</li>
<li>!warn @utilisateur [raison]</li>
<li>!unwarn @utilisateur</li>
</ul>
<p>Historique des actions de modération sur le serveur Discord.</p>
<table>
<p>
Historique des actions de modération effectuées sur le serveur Discord.
Le bot enregistre automatiquement les avertissements, exclusions et bannissements.
Exemples de commandes :
<ul>
<li><strong>!kick @utilisateur raison</strong> - !kick @Jean Spam de liens</li>
<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>
<tr>
<th>ID</th>
<th>Type</th>
<th>Utilisateur</th>
<th>Discord ID</th>
<th>Date & Heure</th>
<th>Raison</th>
<th>Staff</th>
<th>Actions</th>
<th>#</th>
</tr>
</thead>
<tbody>
{% for event in events %}
{% for mod_event in events %}
<tr>
<td>{{ event.id }}</td>
<td>{{ event.type }}</td>
<td>{{ event.username }}</td>
<td>{{ event.discord_id }}</td>
<td>{{ event.created_at.strftime('%d/%m/%Y %H:%M') if event.created_at else 'N/A' }}</td>
<td>{{ mod_event.type }}</td>
<td>{{ mod_event.username }}</td>
<td>{{ mod_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>{{ mod_event.reason }}</td>
<td>{{ mod_event.staff_name }}</td>
<td>
<form action="{{ url_for('update_moderation_event', event_id = event.id) }}" method="POST" style="margin: 0;">
<input name="reason" type="text" value="{{ event.reason }}" style="width: 100%;" />
</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>
<a href="{{ url_for('open_edit_moderation_event', event_id = mod_event.id) }}" class="icon"></a>
<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>
</td>
</tr>
{% endfor %}
</tbody>
</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 %}