Automatisation du TOing online avec A.T.O.S.

Le confinement a propulsé l'intérêt des smasheurs pour les tournois online. Les plus récalcitrants au online de Super Smash Bros. Ultimate, le dernier titre en date de la série célèbre du jeu de combat Nintendo, ont au moins entrouvert leur esprit à la possibilité de participer à un tournoi online.

Automatisation du TOing online avec A.T.O.S.

Background

Le but de cette page n'est ni de dresser une critique technique des bien trop nombreux défauts du mode online d'Ultimate, ni de juger qui que ce soit pour juger si ce mode est bénéfique ou non à son entraînement personnel. Je m'adresse aux curieux, mais surtout aux TOs (Tournament Organizer) qui passent du temps à organiser ces évènements. Me concernant, j'ai décidé de revêtir le costume de TO online après quelques petites expériences offlines ci et là.

Je respecte énormément le travail de TO, leur travail apporté à la communauté ; je ne cherche pas moi-même à l'être ayant eu des objectifs en tant que simple joueur, mais j'ai décidé de le faire car je pense d'une part pouvoir bien le faire, et d'autre part contribuer à l'enjeu de santé publique actuel, contribution qui consiste en proposant des activités maintenant interdites aux joueurs qui avaient l'habitude de se réunir plusieurs fois par semaine pour jouer, partager. Rien ne peut recréer cette expérience, mais ça ne coûte rien d'essayer, et surtout ça ne fait aucun mal.

Objectif

Ayant un background de techy qui manipule des ordinateurs en profondeur depuis l'enfance, je me suis tout simplement posé la question suivante :

Comment automatiser toutes les tâches automatisables d'un TO online ?

Le but ne sera jamais de remplacer un TO : mais de déléguer toutes les tâches ingrates à la machine, pour que le TO se concentre sur l'aspect humain du TOing qui consiste en la résolution de différends, l'animation, et j'en passe. Bref, ça soulève aussi la question sociale de la place de l'IA, mais on n'est pas dans cette grandeur non plus...

Donc, avant d'écrire ne serait-ce qu'une seule ligne de code, il faut se demander qu'est-ce que ce programme doit faire. Et pour savoir ce que le programme doit faire, il faut prendre du recul et découper toutes les activités d'un TO online (je précise online car offline, c'est légèrement différent sur certains aspects, assez pour que ces principes ne s'appliquent pas forcément).

Selon moi, le TOing online se passe en 3 temps clé avec des activités intrinsèquement liées :

  • La période pré-tournoi

    • Annonce du tournoi
    • Gestion des inscriptions
    • Check-in
    • Seeding
  • Le tournoi proprement dit

    • Lancement des sets
    • Gestion des scores
    • Surveillance du bracket
    • Gestion du stream
  • Fin du tournoi

    • Annonce des résultats

Toutes ces tâches sont plus ou moins automatisables, mais j'ai choisi de mettre le seeding de côté car il demande des implications plus importantes que je ne le pensais. J'y reviendrai peut-être un jour.

Établir les choses à faire, c'est simple, mais la partie pratique, ça va l'être un peu moins ! Il faudra mettre les mains à la pâte...

C'est ainsi qu'est né le projet A.T.O.S. qui peut signifier :

  • Automated Tournament Organizer for Smash.
  • Automation Tools for Organizing Smash.

Choix des services

Quand je dis "service", je pense à une prestation rendue par une application Web. Car il va en falloir en trouver deux à moins de les faire soi-même (mais évitons de réinventer la roue, OK?) :

  • Un service de communication avec/entre les joueurs : Discord.
  • Un service de gestion du bracket : Challonge.

Discord étant le choix populaire ces dernières années, en particulier pour son interface propre et séduisante, sa facilité d'accès, je pense qu'on peut dire que 95% des tournois Smash online se déroulent sur cette plateforme. Un choix très simple.

Quant à la gestion du bracket, il y a 2 ténors que les smasheurs connaissent assez bien : smash.gg et Challonge. Le premier est, il me semble, bien plus utilisé sur la scène offline grâce à ses outils d'automatisation notamment. Le second, moins utilisé, est préféré en online pour quelques raisons que je ne vais pas traiter car ce n'est pas le sujet. Mais par exemple, smash.gg a tendance à enfermer les tournois online dans un écosystème, et si l'on veut en sortir, ce sera très difficile. Challonge fait IMO ce qu'il sait faire : la gestion de bracket, ni plus ni moins.

Le bot que l'on va créer va être une passerelle entre Discord et Challonge :

  • Le bot interagit avec les joueurs, et vice versa, sur Discord.
  • Le bot utilise Challonge pour stocker les données de bracket.
  • Les joueurs/TOs peuvent consulter Challonge pour vérifier.
  • Les TOs utilisent Challonge pour le seeding.

Choix des technologies

Je peux concevoir que ça n'a pas l'air très accessible pour les néophytes, mais croyez-moi quand je vous dis qu'il est très simple de créer un bot Discord. Il va s'agir d'utiliser une API, c'est-à-dire une interface de communication prévue par Discord pour que mon code puisse communiquer directement avec Discord. Mais je ne vais même pas utiliser l'API directement : je vais plutôt utiliser un wrapper, c'est-à-dire une bibliothèque de code qui simplifiera le travail. C'est valable aussi pour Challonge qui dispose aussi d'une API.

Je fais le choix d'écrire mon bot en Python (un langage de programmation) :

  • Je connais bien Python, pour commencer.
  • Je trouve le Python très facile à relire, même pour un néophyte.
  • Il y a des bibliothèques pour Discord et Challonge.

Pour Discord, je vais utiliser l'excellent module discord.py, et pour Challonge je vais utiliser le module pychal.

Une autre alternative étant d'utiliser node.js mais je suis plus à l'aise encore avec du Python. Oui Python n'est pas très bien pensé pour des bots à la base, mais je trouve que discord.py permet de faire facilement du code asynchrone.

De la création du tournoi à la gestion des inscriptions

Je vais vous épargner davantage de technique. Maintenant on s'attaque à du concret, ce que fait le bot !

  1. Le TO crée le tournoi dans Challonge, et pense à bien renseigner la date, le nom du jeu, le nombre maximum de participants. Aussi veiller à ce que le bracket soit bien en double-élimination.
  2. Le TO communique l'URL du tournoi au bot via Discord avec la commande !setup URL.
  3. À partir de cette URL, le bot récupère les informations du tournoi dans sa mémoire : date, nom du jeu, nombre de participants, ID du tournoi (utile pour communiquer avec l'API Challonge).
  4. Le bot annonce ensuite les inscriptions dans le channel #annonces et bien entendu #inscriptions :

Les inscriptions se font simplement par l'ajout d'une réaction au message, de même que les désinscriptions. Au départ j'ai utilisé des commandes, mais un élément graphique est toujours mieux en termes d'accessibilité universelle.

Le bot enregistre dans sa mémoire chaque participant, et se faisant va ajouter le participant dans le bracket Challonge, tout seul ! Il fera l'association en conservant d'un côté l'ID Discord (identifiant unique Discord qui ne change pas même si vous changez de pseudonyme), et de l'autre l'ID Challonge (identifiant créé à l'occasion pour ce tournoi particulier).

Que se passe-t-il si la limite est atteinte ?

Depuis une mise à jour récente, le bot gère une liste d'attente qui est postée dès que nécessaire. Le bot prévient également par DM la personne quand une place se libère et que son inscription est prise en compte.

Comment les TOs peuvent-ils supprimer/ajouter quelqu'un manuellement ?

Les commandes !add et !rm sont là pour ça, il suffit de mentionner le joueur concerné avec la commande voulue. Ces commandes sont récursives et peuvent prendre une liste de joueurs.

Par ailleurs, il est possible de se désinscrire soi-même avec !dq. Tout comme !rm, cette commande fonctionne aussi bien avant que pendant le tournoi. Avant, elle vous supprimera du tournoi ; et pendant, ce sera une disqualification.

Check-in

Prendre les inscriptions, c'est cool, mais c'est pas si terrible à gérer. Au fond, chacun pouvait s'inscrire directement sur Challonge. Mais il fallait passer par Discord pour établir la passerelle. Car maintenant tout se corse !

Le check-in est une étape cruciale pendant laquelle les joueurs vont confirmer ou non leur présence.

Pour le coup, ça peut paraître très simple. Mais je peux vous garantir que c'est un soulagement en tant que TO de ne plus devoir le faire. Car un message est si vite loupé, et qu'il faut penser à DQ les personnes qui n'ont pas check-in à temps, et les contacter en DM avant même de le faire idéalement. Tout ça, le bot le fait.

Pour le côté technique, j'utilise apscheduler et son module asynchrone pour executer du code (asynchrone) à un moment souhaité.

  • Pour le moment, le check-in est fixé à 1 heure avant le début du tournoi.
  • Il se termine 10 minutes avant le début du tournoi.
  • Des rappels sont émis toutes les 10 minutes sur le channel.
  • Une dizaine de minutes avant la fin du check-in, contact par DM.

Début du tournoi (finalisation > stream)

Il y a un intervalle de 10 minutes entre la fin du check-in et le début du tournoi. J'estime que c'est idéal pour finaliser le bracket et déterminer qui passe on stream.

Comme je l'ai précisé avant le seeding est une étape qui reste manuelle et se fait tout le long des inscriptions ("pré-seeding") jusqu'à la finalisation du bracket pour éviter, entre autres, des conflits. Ce n'est d'ailleurs pas mon fort, mais passons.

Voici l'image d'une portion de bracket Challonge.

Comment communiquer simplement avec le bot pour lui dire que tel set doit passer on stream ?

Pour cela on utilise les suggested play order de Challonge, ce sont les numéros tout à gauche d'un set. Il se trouve que l'on s'en servira comme identifiant. Sur le screen, on voit que le set 19 sera composé des gagnants des sets 5 et 6. Imaginons que j'ai envie d'avoir le set 5 on stream, puis le set 19, et ce même avant que le tournoi ne commence, je peux faire : !addstream 5 19.

La commande !stream permet, elle, d'avoir une vue de toutes les informations.

Mais en fait, pourquoi à la base veux-tu que le bot sache ce qui va passer on stream ?

J'aurais dû aborder la question plus tôt ! En fait, c'est assez pénible de contacter chaque joueur en DM pour lui dire qu'il va passer on stream, et quand c'est son tour. Pourquoi le faire si le bot peut le faire ? Et il le fait... très bien !

Dès que le tournoi est lancé par le TO sur Challonge, le bot le reconnaît et passe en "mode tournoi" :

  • Il commence par calculer les rounds de top 8 avec une méthode assez simple que j'ai trouvée et qui s'applique bien aux brackets à double élimination (pour faire simple, c'est "GF-2, LF-3").
  • Il procède à annoncer le début du tournoi, les modalités spécifiques au jeu, le top 8, etc. Pour un petit tournoi :

Enfin, il s'attribue deux tâches qui s'exécuteront chaque minute :

  • Le lancement des sets disponibles pour être lancés.
  • La vérification d'activité d'un set pour éviter des retards de bracket.

Déroulement des sets

Chaque set est annoncé dans un channel #match-queue. Le bot précise le round du set en question, s'il est prévu pour passer on stream, ou encore si c'est un set de top 8.

Comme vous pouvez le voir, il y a une notion assez intéressante : chaque set possède son propre channel. Je pense que c'est une bonne idée dans le sens où les personnes n'ont pas à chercher à se DM, que les discussions restent privées (grâce à une gestion fine des permissions) tout en permettant aux TOs d'intervenir en ayant tout le contexte d'une situation donnée.

Chaque channel "volatile" est ainsi initié par le bot de la façon suivante :

Vous constaterez par ailleurs la disponibilité de commandes pratiques telles que !stages et !lag.

Le bot procède à un tirage au sort dès le début, ce qui économise du temps. De même il précise si le set doit se jouer en BO5 ou non, ce qui est souvent sujet à confusion. Dans le cas d'un set on stream, les joueurs sont prévenus d'attendre. Puis, quand c'est leur tour :

Presque magique (mais ça ne l'est vraiment pas !).

À l'issue d'un set, les scores doivent être entrés dans un channel #scores. Seul le gagnant du set doit poster :

La commande !win permet d'expliciter que le gagnant seulement doit poster son score en plus d'éviter des erreurs humaines. De plus, le bot :

  • Vérifie si le score était sensé être un BO3 ou BO5.
  • Vérifie l'ordre du score, logiquement le gagnant a le score + élevé...
  • Vérifie si le set a duré assez longtemps, sinon rejet du score.

Ce sont quelques petites protections bienvenues pour éviter des dérives possibles. Bien entendu, c'est là où le TO reste "utile" : il peut corriger les scores directement sur Challonge, il n'y a aucun soucis pour ça. Mais 99% du temps, le bot prend note et ajoute les scores tout seul.

Si le set était on stream, alors le bot execute directement la fonction pour passer au set suivant on stream (s'il y en a un de prévu).

Enfin, comme je l'ai dit ci-dessus, chaque minute le bot va lancer les sets qui sont disponibles, jusqu'à la fin du tournoi.

Par ailleurs, voici une image du workflow Discord pour résumer :

DQ pour inactivité : c'est une fonction qui permet d'éviter des retards de bracket. Un temps est calculé selon le jeu, et selon le type de BO. Si ce temps est dépassé (toujours aucun score pour un set, disons plus de 40 minutes), le bot peut prendre l'initiative de DQ s'il y a un écart d'activité conséquent entre deux joueurs (ceci grâce aux channels volatiles) ; sinon il demandera aux TOs une intervention manuelle.

Fin du tournoi

Une fois le dernier score pour le dernier set rentré, le bracket Challonge doit être validé par un simple bouton. Le bot détecte quand le tournoi est terminé, et procède à annoncer le top 8 sur un channel #résultats :

Avec une petit phrase shonen aléatoire à la fin. En dehors de ça, le bot "nettoie" les traces du précédent tournoi (rôles, channels), les TOs n'ont rien à faire.

Et plus encore...

Le bot est capable de quelques petites choses supplémentaires mais j'ai décidé de m'en arrêter là et d'aborder le sujet peut-être plus en profondeur si je constate de l'intérêt pour mon travail. Entre autres, le bot :

  • Permet une gestion de rôles (utile pour le tournoi, ou le freeplay).
  • Supporte la gestion multi-jeux (par exemple, Ultimate et Project+).
  • Propose d'autres commandes pensées pour simplifier la vie des joueurs et TOs.

Mot de la fin ?

Le bot est actuellement en production sur le serveur Smash Void que vous pouvez joindre à cette adresse : https://discord.gg/PvWT8aU

Après 3 semaines de brainstorming et de développement, j'en suis à un stade où je n'ai pratiquement plus rien à faire pour gérer un tournoi qui se déroule bien. Je pourrais même jouer sans me soucier du reste, c'est dire !

Le Smash Void est une initiative strasbourgeoise pour proposer aux strasbourgeois mais aussi à leurs amis de toute la France de se rassembler quelques fois par semaine pour jouer à Smash. On tourne actuellement sur 3 events par semaine, et streamés en plus : autant vous dire que le bot facilite notre vie de TO, et les joueurs sont ravis pour la plupart de l'expérience.

Je ne suis pas sûr que nous allons continuer post-confinement, même si celui-ci est parti pour durer encore un moment. Je suis donc désormais ouvert à aider d'autres TOs qui souhaitent l'installer sur leur serveur.

D'ici les prochains jours, je ferai une documentation pour l'installer soi-même. Je réfléchis également à une traduction, ayant déjà reçu des messages de TO anglais qui sont étonnamment vite tombés sur mon truc... Je suis d'ailleurs étonné que ce ne soit pas déjà répandu !

J'en profite pour dire que les sources de A.T.O.S. sont ouvertes et toute contribution est la bienvenue, que vous ayez des connaissances techniques, ou non. Je ne me considère pas moi-même comme un grand connaisseur.

Portez-vous bien !