/discord_bot_firewall

Bot discord pour l'enseignement à distance à l'université : amphis virtuels, gestion automatique des rôles et des salons discord, authentification, ...

Primary LanguageJavaScript

Bot discord

But

Lors du Coronavirus 2019, création d'un Bot discord rassemblant les 3 000 étudiants de mon université / école d'ingé publique. Nécessité de gérer les rôles des membres sur le discord, via une connexion extérieure. Ce bot dispose d'une interface web où les étudiants et profs se connectent via OAuth2 et se voient affectés les droits de lecture et d'écriture correspondant.

Egalement, gestion (création/suppression) des rôles et channels correspondant aux cours des étudiants, ainsi que création de salons vocaux à la volée (par une commande) et suppression quand plus personne n'est dedans.

Ce bot permet également d'exporter en hors ligne tout le contenu d'un channel en html, via https://github.com/Tyrrrz/DiscordChatExporter qui génère le html et wget/zip génèrent la version offline.

Fonctionnalités

  • Connexion par le site Etu via OAuth2 puis on indique son id discord (utilisateur#discriminant)
  • Attribue le rôle enseignant / étudiant
  • LoadBalancing (possibilité d'avoir un processus en écoute des messages discord, et trois autres en écoute web avec 4 tokens API différents de Discord)
  • Renomme les gens Prénom NOM (+ " - Branche NIVEAU" pour les étudiants) avec possibilité de définir un nom custom par tag discord pour les noms trop longs
  • Permet de bannir une liste d'utilisateurs depuis la source d'identité (peu importe leur pseudo discord)
  • Deux routes avec secret pour les crons (/cron/secret/action) pour nettoyer les exports et lancer la synchronisation des utilisateurs
  • Pour les étudiants : attribution des UEs + rôle selon la branche
  • Permet d'envoyer des messages anonymes (avec formatage et emojis) en MP au bot diffusés sur des channels, tout en enregistrant l'identité réelle des users dans un fichier log
  • Gestion des anciens étudiants (marqués comme étudiants mais n'ayant pas de formation) avec pseudo et role dédiés
  • Alerte lors de la connexion/déconnexion de certains membres désignés (comptes admin partagés, ...)
  • Création des rôles inexistants, signalement de la création sur un channel (si le rôle n'existe pas, il est créé et l'utilisateur recommence la manip)
  • Envoie un message automatique aux nouveaux qui rejoignent le serveur en leur disant d'aller sur le site
  • Sur le site, une petite notice qui explique aux gens comment installer le logiciel
  • Génération dynamique de channels vocaux et texte. L'utilisateur se place sur un channel vocal précis, et il est transporté dans un channel vocal créé (utile pour créer des salles de cours à la volée). Les channels texte seront supprimés quand la denrière personne aura quitté le vocal.
  • Commandes :
    • PREFIX addUE @role <categoryID> texte | vocal | lesDeux qui crée un chan texte et vocal avec les permissions qui vont bien et dans la catégorie indiquée, la commande ne peut être exécutée que depuis un channel précis
    • PREFIX addUEs <branche> texte | vocal | lesDeux qui, s'ils n'existent pas déjà, crée un chan texte et vocal pour toutes les UEs ayant un rôle existant pour la branche indiquée selon les informations fournies dans UES_PER_BRANCH et BRANCH_CATEGORIES_AND_ELECTED_ROLE, et leur affectera les bonnes permissions (rôle de l'UE et éventuellement élus étudiants)
    • PREFIX delUE #channelTexteUE vocal | tout qui supprime les deux channels d'une UE, ainsi que son rôle, la commande ne peut être exécutée que depuis un channel précis.
    • PREFIX delUEs <categoryID> vocal | tout idem que delUE mais pour tous les channels d'une catégorie.
    • PREFIX getNb @ROLE|role_id qui affiche le nombre de personnes dans le role correspondant.
    • PREFIX getRoles NombrePersonne qui affiche la liste des rôle ne contenant que le nombre de personnes demandé
    • PREFIX getZeroOne qui affiche la liste des rôle ne contenant que 0 ou 1 personne.
    • PREFIX assignLireEcrireBasiques channelID|categoryID @role oui|non|null Permet d'assigner/supprimer/réinitialiser les permissions basiques de lecture écriture sur tous les channels d'une catégorie pour un rôle spécifique. Utile quand les permissions des channels ne sont pas synchro avec la catégorie, pour l'assignation de rôle de modération.
    • PREFIX removeAllFromRole @role Retire toutes les personnes d'un rôle. Permet de s'assurer que plus personne n'a le rôle. Le rôle existe toujours après.
    • PREFIX getUrl Affiche les url du serveur web du bot, le lien d'invitation discord
    • PREFIX export Exporte tout le channel dans lequel la commande est tapée, dans un html lisible offline. Tout ceux ayant un rôle >= Enseignant peuvent taper cette commande n'importe où.
    • PREFIX joinVocal Pour les étudiants, crée ou rejoint le channel vocal de l'UE correspondant au channel texte, auquel seuls les étudiants de l'UE ont accès. Pour les enseignants, crée un amphi que tout le monde peut rejoindre. Si vous rajoutez @NOM_UE à la fin de la commande, crée un amphi visible seulement par vous, les étudiants de l'UE et les personnes de votre choix. Les channels créés par cette commandes sont effacés lorsque plus personne n'est dans le vocal créé.
    • PREFIX listDynVoc. Affiche tous les channels textes dans lesquels des vocaux ont été lancés, ainsi que leur catégorie. Utile pour savoir quand lancer une mise à jour du bot.
    • PREFIX kickall Expulse tous les membres du serveur. Commande réservée aux administrateurs. Expulse toute personne qui tape la commande sans être admin.
    • PREFIX pin messageID. Permet d'ajouter un message à la liste des messages pin (sans donner la permission MANAGE_MESSAGES).
    • PREFIX unpin messageID. Permet de supprimer un message de la liste des messages pin (sans donner la permission MANAGE_MESSAGES).
    • PREFIX checkSameRoles. Permet de lister tous les rôles présents plusieurs fois (même nom sans tenir compte de la casse).
    • PREFIX delSameRoles. Supprime tous les rôles présents plusieurs fois (même nom sans tenir compte de la casse) pour n'en laisser qu'un seul.
    • Pour les serveurs de plus de 1 000 personnes, Discord n'affiche pas les utilisateurs déconnectés dans la liste des utilisateurs, ce qui est très embétant pour gérer les rôles. En revanche, on peut toujours tagger l'utilisateur :
      • PREFIX getMemberRoles @membre Affiche la liste des rôles d'un membre, même si ce dernier n'est pas connecté (utile pour les serveurs > 1 000 membres)
      • PREFIX assignRole @membre @role ajouter|supprimer Ajoute ou supprime un rôle pour un membre, même si ce dernier n'est pas connecté (utile pour les serveurs > 1 000 membres). Commande réservée aux administrateurs.
      • PREFIX setRoles @membre @role1 @role2 ... Efface tous les précédents rôles de l'utilisateur et lui affecte ceux indiqués, même si ce dernier n'est pas connecté (utile pour les serveurs > 1 000 membres). Si aucun rôle n'est précisé, efface tous les rôles de l'utilisateur. Commande réservée aux administrateurs.
    • PREFIX author Affiche des informations sur l'auteur
    • En MP au bot
      • PREFIX listAnon pour lister les canaux dans lesquels vous pouvez écrire en anonyme
      • PREFIX sendAnon channel message Envoie un message anonyme (avec formatage et emojis) sur le channel listé avec listAnon. Les administrateurs pourront à tout moment lever l'anonymat grâce à des fichiers logs.

Installation

  • Via docker
  • Manuellement
    • git clone https://github.com/larueli/discord_bot_firewall
    • cd discord_bot_firewall
    • Télécharger l'outil d'export
    • cp .env.dist .env et éditez-le
    • npm install
    • node bin/www

Auteur

Je suis Ivann LARUELLE, étudiant-ingénieur en Réseaux et Télécommunications à l'Université de Technologie de Troyes, école publique d'ingénieurs.

N'hésitez pas à me contacter pour me signaler tout bug ou remarque. Je suis joignable à ivann.laruelle@gmail.com.

L'auteur du design/graphisme de la page web de connexion est un autre contributeur anonyme.