Skip to content

Ajouter un handler

Les handlers ecoutent les evenements du gateway Discord (messages, reactions, voice state, etc.).

Pattern standard

typescript
import type { Client } from 'discord.js';
import { env } from '../../../config/env.js';
import { logger } from '../../../config/logger.js';
import { notifyAdminChannel } from '../../../infrastructure/discord/notifier.js';

const log = logger.child({ module: 'my-handler' });

export function registerMyHandler(client: Client): void {
  client.on('eventName', async (arg1, arg2) => {
    try {
      // 1. Filtrer par guild
      if (!arg1.guild || arg1.guild.id !== env.DISCORD_GUILD_ID) return;

      // 2. Ignorer les bots
      if (arg1.author?.bot || arg1.member?.user.bot) return;

      // 3. Logique du handler
      // ...

      log.debug({ /* context */ }, 'Handler executed');
    } catch (err) {
      const msg = err instanceof Error ? err.message : String(err);
      log.error({ err }, 'Handler error');
      await notifyAdminChannel(`Handler error: ${msg}`, 'error').catch(() => null);
    }
  });
}

Regles importantes

  1. Toujours wrapper dans try/catch : les erreurs non attrapees dans un handler peuvent passer inapercues. Loguer l'erreur et notifier le salon admin.
  2. Filtrer par guild : verifier que l'evenement provient du bon serveur (env.DISCORD_GUILD_ID).
  3. Ignorer les bots : eviter les boucles infinies (le bot reagit a ses propres messages).
  4. Notifier en cas d'erreur : utiliser notifyAdminChannel avec .catch(() => null) pour eviter une erreur dans la notification elle-meme.

Enregistrement

Dans src/app/bootstrap.ts :

typescript
import { registerMyHandler } from '../modules/<module>/handlers/my.handler.js';

// Dans la fonction bootstrap(), section "Register event handlers"
registerMyHandler(client);

Evenements Discord courants

EvenementDescriptionParametres
messageCreateNouveau messageMessage
interactionCreateInteraction (bouton, modal, slash)Interaction
voiceStateUpdateChangement d'etat vocalVoiceState, VoiceState
guildMemberAddNouveau membre rejointGuildMember
guildMemberRemoveMembre quitteGuildMember
messageReactionAddReaction ajouteeMessageReaction, User

Handlers existants

NomEvenementModuleDescription
registerBirthdayHandlerguildMemberAddbirthdaysAccueil nouveau membre
registerRsvpHandlerinteractionCreateeventsGestion boutons/modals RSVP
registerMessageHandlermessageCreategamificationGain d'XP par message
registerVoiceHandlervoiceStateUpdategamificationTracking sessions vocales
registerMemberHandlerguildMemberAdd/RemovemoderationLog arrivees/departs
registerChatHandlermessageCreatechatReponse IA sur mention