Discord Bot Template

Yo !

Aujourd’hui, j’ai envie de vous parler d’un projet personnel que j’ai développé pour me simplifier la vie. En parcourant Codeur.com, j’ai remarqué que beaucoup de clients cherchaient des bots pour mieux gérer leurs salons Discord à mesure que leurs communautés grandissaient. De mon côté, j’ai déjà créé quelques assistants Discord, que ce soit pour recevoir des notifications sur des événements spécifiques ou pour contrôler certains outils directement via Discord. Ce genre d’automatisation peut être très utile au quotidien.

L’API de Discord est accessible avec de nombreuses technologies, et plusieurs bibliothèques facilitent son utilisation. En général, les développeurs de bots Discord travaillent avec JavaScript ou Python. Mais vous me connaissez, je suis bien plus à l’aise avec PHP, et j’aime pousser son utilisation tant que cela ne nuit ni à la maintenabilité ni à l’évolutivité de l’application. Or, la plupart des projets de bots Discord, sauf exception, n’évoluent pas réellement. J’ai donc décidé de partir sur PHP avec Symfony et de créer un template de projet pour simplifier le développement de bots Discord pour ceux qui maîtrisent déjà Symfony.

Le code source est disponible ici. Ce projet repose sur Symfony 6.4 et utilise la librairie team-reflex/discord-php. À terme, il pourrait être intéressant de le transformer en bundle plutôt qu’en simple template, afin de l’intégrer facilement dans des projets existants. Je vais donc vous expliquer comment l’utiliser et comment il fonctionne.

Comprendre comment fonctionne Discord

Avant de plonger dans le code, il est important de comprendre comment fonctionne un bot Discord.

Un bot Discord est un programme qui tourne en continu, écoute des événements et réagit en conséquence. Il peut :

  • Répondre à des messages,
  • Gérer des rôles et permissions,
  • Envoyer des notifications,
  • Interagir avec des API externes,
  • Exécuter des commandes spécifiques.

L’API de Discord

Discord met à disposition une API WebSocket, qui permet aux bots d’être en permanence connectés aux serveurs Discord pour écouter les événements (nouveau message, utilisateur qui rejoint un serveur, réaction à un message, etc.).

Les bots utilisent également les endpoints REST de l’API Discord pour effectuer des actions comme envoyer des messages, modifier des rôles ou récupérer des informations sur un serveur.

Comment fonctionne un bot en pratique ?

  1. Connexion au WebSocket : Le bot se connecte à l’API de Discord via une WebSocket et s’identifie avec un token.
  2. Écoute des événements : Une fois connecté, il écoute des événements (messages envoyés, réactions, nouveaux membres, etc.).
  3. Réaction aux événements : Selon les événements détectés, le bot peut exécuter des actions spécifiques (répondre, bannir un utilisateur, envoyer une alerte, etc.).
  4. Interaction avec des API externes : Il peut aussi se connecter à des services externes (bases de données, API tierces) pour enrichir ses fonctionnalités.

Utilisation du Template Discord

Ce template permet d’ajouter facilement des commandes et d’écouter des événements Discord sans complexité.

Ajouter une commande personnalisée

Une commande doit étendre AbstractDiscordCommand et implémenter au minimum deux méthodes : getName() et execute().

use App\Discord\Command\AbstractDiscordCommand;
use Discord\Builders\MessageBuilder;
use React\Promise\PromiseInterface;
use Discord\Parts\Interactions\Interaction;

class PingCommand extends AbstractDiscordCommand
{
    public function getName(): string
    {
        return 'ping';
    }

    public function execute(Interaction $interaction): ?PromiseInterface
    {
        return $interaction->respondWithMessage(MessageBuilder::new()->setContent('Pong!'));
    }
}

Aucune configuration supplémentaire n’est requise. Il suffit d’ajouter la classe et de relancer le bot.

Gérer les événements

Un listener étend AbstractDiscordListener et réagit à un événement spécifique.

use App\Discord\EventListener\AbstractDiscordListener;
use Discord\WebSockets\Event;
use Discord\Parts\User\Member;

class WelcomeListener extends AbstractDiscordListener
{
    public function getDiscordEvent(): string
    {
        return Event::GUILD_MEMBER_ADD;
    }

    public function __invoke(Member $member): void
    {
        $member->sendMessage('Bienvenue sur le serveur!');
    }
}

Intégration avec Symfony et Docker

Ce template utilise Doctrine pour gérer une base de données et Messenger pour exécuter des tâches en arrière-plan. De plus, une configuration Docker est disponible pour déployer facilement le bot.

Lancer le bot avec Docker :

docker build -f .docker/build/Dockerfile .

Vous aurez donc créer une image Docker qui, une fois utilisé pour un container, se connectera a l’API Discord avec votre token et commencera à interagir avec votre communauté.

Ce template offre une solution simple et efficace pour développer un bot Discord avec PHP et Symfony tout en profitant de l’écosystème du framework.

Conclusion

Grâce à ce template, j’ai pu développer plusieurs bots Discord qui m’aident au quotidien :

  • Un bot qui me prévient des nouvelles offres sur Codeur.com, m’évitant ainsi de devoir actualiser la page en permanence, avec un système de filtrage par catégorie.
  • Un bot pour gérer mes tâches quotidiennes, permettant de définir une date et une périodicité, puis me notifiant chaque matin des actions à effectuer.
  • Deux bots développés pour mes clients : l’un pour traquer les erreurs de prix sur Amazon, et l’autre pour aider un professeur de soutien scolaire à gérer son salon Discord, ses cours, ses évaluations et le suivi de ses élèves.

Ce projet m’a permis d’automatiser certaines tâches tout en explorant les possibilités offertes par l’API de Discord avec Symfony. Si vous souhaitez tester ou adapter ce template à vos propres besoins, il est disponible en open source et facilement extensible.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut