Guide

Commandes

Créez et organisez des commandes slash, menus contextuels utilisateur et menus contextuels de message avec GlyriaCommand.

Vue d'ensemble

Les commandes dans glyria.js sont basées sur des fichiers. Chaque fichier présent dans src/commands/ est automatiquement chargé et enregistré sur Discord au démarrage — aucune inscription manuelle n'est nécessaire.

Chaque fichier de commande exporte une instance de commande par défaut :

// src/commands/ping.ts

export default new GlyriaCommand()
  .setName("ping")
  .setDescription("Pong !")
  .execute(async (ctx) => {
    await ctx.reply({ content: "Pong !" })
  })
GlyriaCommand, GlyriaUserCommand et GlyriaMessageCommand sont disponibles globalement — aucun import n'est nécessaire.

Commandes slash

Options

Ajoutez des options typées à votre commande avec les méthodes add*Option :

export default new GlyriaCommand()
  .setName("hello")
  .setDescription("Dire bonjour à quelqu'un")
  .addUserOption((option) =>
    option
      .setName("user")
      .setDescription("L'utilisateur à saluer")
      .setRequired(true)
  )
  .addStringOption((option) =>
    option
      .setName("message")
      .setDescription("Un message personnalisé")
      .setRequired(false)
  )
  .execute(async (ctx) => {
    await ctx.reply({ content: "Bonjour !" })
  })

Types d'options disponibles

MéthodeType
addStringOptionTexte
addIntegerOptionNombre entier
addNumberOptionNombre décimal
addBooleanOptionVrai / Faux
addUserOptionUtilisateur Discord
addRoleOptionRôle Discord

Chaque option expose :

MéthodeDescription
.setName(name)Nom de l'option (minuscules, sans espaces)
.setDescription(desc)Description de l'option
.setRequired(bool)Définit si l'option est obligatoire

Sous-commandes

Regroupez des actions liées sous une même commande avec .addSubCommand() :

export default new GlyriaCommand()
  .setName("moderation")
  .setDescription("Commandes de modération")
  .addSubCommand((cmd) =>
    cmd
      .setName("ban")
      .setDescription("Bannir un utilisateur")
      .addUserOption((option) =>
        option
          .setName("user")
          .setDescription("Utilisateur à bannir")
          .setRequired(true)
      )
      .addStringOption((option) =>
        option
          .setName("reason")
          .setDescription("Raison du bannissement")
          .setRequired(false)
      )
      .execute(async (ctx) => {
        // gérer le bannissement
      })
  )
  .execute(async (ctx) => {
    // gérer la commande principale
  })

Groupes de sous-commandes

Pour une organisation plus poussée, regroupez les sous-commandes avec .addSubCommandGroup() :

export default new GlyriaCommand()
  .setName("moderation")
  .setDescription("Commandes de modération")
  .addSubCommand((cmd) =>
    cmd
      .setName("ban")
      .setDescription("Bannir un utilisateur")
      .addUserOption((option) =>
        option
          .setName("user")
          .setDescription("Utilisateur à bannir")
          .setRequired(true)
      )
      .addStringOption((option) =>
        option
          .setName("reason")
          .setDescription("Raison du bannissement")
          .setRequired(false)
      )
      .execute((ctx) => {
        console.log("commande ban")
      })
  )
  .addSubCommandGroup((group) =>
    group
      .setName("config")
      .setDescription("Commandes de configuration")
      .addSubCommand((cmd) =>
        cmd
          .setName("logs")
          .setDescription("Configurer les logs")
          .addBooleanOption((option) =>
            option
              .setName("enabled")
              .setDescription("Activer les logs")
              .setRequired(true)
          )
          .execute(async (ctx) => {
            // gérer la configuration des logs
          })
      )
  )
  .execute((ctx) => {
    ctx.reply({ content: "Commande de modération exécutée !" })
  })

Cette structure génère les commandes Discord suivantes :

/moderation ban <user> [reason]
/moderation config logs <enabled>

Les menus contextuels apparaissent lorsqu'un utilisateur fait un clic droit sur un utilisateur ou un message, dans la section Applications. Ils ne possèdent ni description, ni options, ni sous-commandes.

Déclenché lors d'un clic droit sur un utilisateur. Le gestionnaire reçoit une UserContextMenuCommandInteraction — l'utilisateur ciblé est accessible via ctx.targetUser.

// src/commands/profile.ts

export default new GlyriaUserCommand()
  .setName("Voir le profil")
  .execute(async (ctx) => {
    const user = ctx.targetUser

    await ctx.reply({
      content: `Profil de ${user.username}`,
      flags: djs.MessageFlags.Ephemeral,
    })
  })

Déclenché lors d'un clic droit sur un message. Le gestionnaire reçoit une MessageContextMenuCommandInteraction — le message ciblé est accessible via ctx.targetMessage.

// src/commands/translate.ts

export default new GlyriaMessageCommand()
  .setName("Traduire")
  .execute(async (ctx) => {
    const message = ctx.targetMessage

    await ctx.reply({
      content: `Traduction de : "${message.content}"`,
      flags: djs.MessageFlags.Ephemeral,
    })
  })

Permissions

Restreignez une commande aux membres possédant des permissions Discord spécifiques avec .setPermissions(). Fonctionne sur GlyriaCommand, GlyriaUserCommand et GlyriaMessageCommand :

export default new GlyriaCommand()
  .setName("ban")
  .setDescription("Bannir un utilisateur")
  .setPermissions(djs.PermissionsBitField.Flags.BanMembers)
  .execute(async (ctx) => {
    // seuls les membres ayant la permission BanMembers peuvent utiliser ceci
  })
PermissionsBitField et MessageFlags sont disponibles via l'espace de noms djs — aucun import n'est nécessaire.

Métadonnées

Attachez des données personnalisées à une commande avec .setMetaData(). Fonctionne sur GlyriaCommand, GlyriaUserCommand et GlyriaMessageCommand. Glyria les stocke telles quelles et ne les interprète jamais — leur utilisation dépend entièrement de vous.

export default new GlyriaCommand()
  .setName("ban")
  .setDescription("Bannir un utilisateur")
  .setMetaData({
    category: "moderation",
    cooldown: 5000,
    premium: false,
    guildOnly: true,
  })
  .execute(async (ctx) => {
    // votre logique ici
  })

useCommands()

useCommands() retourne la liste complète des commandes chargées avec leurs métadonnées. Cette fonction est disponible globalement et reflète toujours l'état actuel du bot.

const commands = useCommands()

// [
//   { name: "ban", description: "Bannir un utilisateur", meta: { category: "moderation", cooldown: 5000 } },
//   { name: "ping", description: "Pong !", meta: {} },
//   { name: "Voir le profil", description: "", meta: {} },
// ]

Un cas d'utilisation courant consiste à créer une commande /help organisée par catégorie :

export default new GlyriaCommand()
  .setName("help")
  .setDescription("Lister toutes les commandes")
  .execute(async (ctx) => {
    const commands = useCommands()

    const byCategory = commands.reduce((acc, cmd) => {
      const cat = (cmd.meta.category as string) ?? "general"

      acc[cat] ??= []
      acc[cat].push(cmd)

      return acc
    }, {} as Record<string, typeof commands>)

    // construire votre embed à partir de byCategory
  })

Organisation des fichiers

Les sous-dossiers dans src/commands/ servent uniquement à l'organisation — chaque fichier, quelle que soit sa profondeur, est chargé automatiquement.

src/commands/
  ping.ts

  moderation/
    ban.ts
    kick.ts

  config/
    advanced/
      logs.ts

  context-menus/
    profile.ts
    translate.ts
Conservez une seule instance de commande par fichier. Utilisez les sous-commandes et groupes de sous-commandes pour regrouper des actions liées à l'intérieur d'un GlyriaCommand.
Copyright © 2026