Guide discord.js
Sujets populaires

Permissions (étendu)

Système de permission de Discord

Les permissions de Discord sont stockées dans un entier 53 bits et calculées à l'aide d'opérations au niveau des bits. Si vous voulez approfondir ce qui se passe en coulisse, consultez les articles Wikipedia et MDN sur le sujet.

Dans discord.js, les champs de bits de permission sont représentés soit par la valeur décimale dudit champ de bits, soit par ses drapeaux référencés. Chaque position dans un champ de bits de permission représente l'un de ces drapeaux et son état (soit référencé 1 ou non référencé 0).

Avant d'entrer dans l'assignation réelle des permissions, passons rapidement en revue la méthode que Discord utilise pour déterminer les permissions finales d'un membre de la guilde :

  1. Prenez toutes les permissions pour tous les rôles que le membre de la guilde a et additionnez-les.
  2. Appliquez tous les refus pour le rôle par défaut (@everyone).
  3. Appliquez toutes les autorisations pour le rôle par défaut (@everyone).
  4. Appliquez tous les refus pour tous les rôles supplémentaires que le membre de la guilde a en une seule fois.
  5. Appliquez toutes les autorisations pour tous les rôles supplémentaires que le membre de la guilde a en une seule fois.
  6. Appliquez tous les refus pour le membre de la guilde spécifique s'ils existent.
  7. Appliquez toutes les autorisations pour le membre de la guilde spécifique s'ils existent.

En raison de ce système, vous ne pouvez pas refuser les permissions de base. Si vous accordez SendMessages à @everyone et ne l'accordez pas pour un rôle de membres réduits au silence, les membres réduits au silence pourront toujours envoyer des messages à moins de spécifier des overwrites basés sur les canaux.

Toutes les autorisations des rôles supplémentaires sont appliquées après tous les refus des rôles supplémentaires ! Si l'un des rôles d'un membre a un overwrite pour autoriser explicitement une permission, le membre peut exécuter les actions associées dans ce canal indépendamment de la hiérarchie des rôles.

Le placement d'un overwrite pour autoriser SendMessages sur un rôle entraînera que les membres ayant ce rôle ne seront pas muselables via l'assignation de rôles dans ce canal.

Permissions élevées

Si le propriétaire de la guilde active l'option d'authentification à deux facteurs du serveur, tous ceux qui exécutent un sous-ensemble spécifique d'actions devront avoir l'authentification à deux facteurs activée sur leur compte. Comme les bots n'ont pas eux-mêmes l'authentification à deux facteurs, vous, en tant que propriétaire de l'application, devrez l'activer sur votre compte pour que votre bot fonctionne sur ces serveurs. Consultez l'article d'aide de Discord si vous avez besoin d'aide pour cela.

Les permissions attribuées à ces actions s'appellent "permissions élevées" et sont : KickMembers, BanMembers, Administrator, ManageChannels, ManageGuild, ManageMessages, ManageRoles, ManageWebhooks, ManageThreads, et ManageGuildExpressions.

Permissions implicites

Certaines permissions Discord s'appliquent implicitement en fonction de l'utilisation logique, ce qui peut causer un comportement indésirable si vous n'êtee pas conscient de ce fait.

L'exemple principal des permissions implicites est ViewChannel. Si ce drapeau manque dans les permissions finales, vous ne pouvez rien faire sur ce canal. C'est logique, non ? Si vous ne pouvez pas voir le canal, vous ne pouvez pas lire ou envoyer de messages, définir le sujet ou modifier son nom. La bibliothèque n'a pas géré les permissions implicites pour vous, donc comprendre le fonctionnement du système est vital pour vous en tant que développeur de bot.

Supposons que vous vouliez envoyer un message à un canal. Pour éviter les appels API inutiles, vous voulez vous assurer que les permissions de votre bot dans ce canal incluent SendMessages (plus d'informations sur comment y parvenir ici). La vérification réussit, mais vous ne pouvez toujours pas envoyer le message et vous êtees accueilli avec DiscordAPIError: Missing Access.

Cette erreur signifie que votre bot n'a pas ViewChannel, et en conséquence, ne peut pas envoyer de messages non plus.

Un scénario possible causant ceci : le canal a des overwrites de permission pour le rôle par défaut @everyone pour accorder SendMessages afin que tous ceux qui peuvent voir le canal puissent aussi écrire dedans, mais en même temps a un overwrite pour refuser ViewChannel pour le rendre accessible seulement à un sous-ensemble de membres.

Comme vous vérifiez seulement pour SendMessages, le bot essaiera d'exécuter l'envoi, mais puisque ViewChannel est manquant, l'API refuse la demande.

Causes de "Missing Access"

  • Les canaux texte nécessitent ViewChannel comme détaillé ci-dessus.
  • Les canaux vocaux nécessitent Connect de la même manière.
  • Réagir à un message nécessite ReadMessageHistory dans le canal où le message a été envoyé.
  • Lors du déploiement de commandes slash : Activez la portée applications.commands (pour plus d'informations, consultez la section ajout de votre bot).
  • Donner un timeout à un membre nécessite ModerateMembers.
  • Éditer des fil (balises, verrouillage, fermeture, renommage, etc.) nécessite SendMessagesInThreads.
  • Ajouter un membre à un fil nécessite ViewChannel dans le canal parent pour le membre à ajouter.

Limitations et bizarreries

  • Votre bot a besoin de ManageRoles dans ses permissions de base pour modifier les permissions de base.
  • Il a besoin de ManageRoles dans ses permissions finales pour modifier les overwrites de permissions.
  • Il ne peut pas éditer les permissions des rôles qui sont supérieurs ou égaux à son rôle le plus élevé.
  • Il ne peut pas accorder des permissions qu'il n'a pas.
  • Il peut gérer les overwrites pour les rôles ou les utilisateurs ayant des rôles plus élevés que son propre rôle le plus élevé.
  • Il peut gérer les overwrites pour les permissions qu'il n'a pas.
  • Les membres ayant la permission Administrator ne sont pas du tout affectés par les overwrites.

Permissions manquantes

Au cours de votre développement, vous rencontrerez probablement DiscordAPIError: Missing Permissions à un moment ou un autre. L'une des causes suivantes peut entraîner cette erreur :

  • Votre bot n'a pas la permission nécessaire pour exécuter cette action dans ses permissions de base ou finales calculées (l'exigence change en fonction du type d'action que vous essayez d'exécuter).
  • Vous avez fourni un numéro de permission invalide en essayant de créer des overwrites. (La calculatrice sur la page des applications retourne des valeurs décimales tandis que la documentation du développeur répertorie les drapeaux en hexadécimal. Assurez-vous que vous ne mélangez pas les deux et n'utilisez pas le préfixe hexadécimal 0x où ce n'est pas applicable).
  • Votre bot est actuellement en timeout.
  • Il essaie d'exécuter une action sur un membre de la guilde avec un rôle supérieur ou égal au rôle le plus élevé de votre bot.
  • Il essaie de modifier ou d'assigner un rôle supérieur ou égal à son rôle le plus élevé.
  • Il essaie d'ajouter un rôle géré à un membre.
  • Il essaie de supprimer un rôle géré d'un membre.
  • Il essaie de donner un timeout à un membre ayant la permission Administrator.
  • Il essaie d'exécuter une action interdite sur le propriétaire du serveur.
  • Il essaie d'exécuter une action basée sur un autre facteur non satisfait (par exemple, réservé aux guildes partenaires).
  • Il essaie d'exécuter une action sur un canal vocal sans la permission ViewChannel.
  • Il essaie de créer un canal ou un overwrite de canal incluant le drapeau ManageRoles mais n'a pas la permission Administrator ou un overwrite explicite ManageRoles sur ce canal (notez que la permission globale ne compte pas).
Accorder la permission Administrator ne contourne pas le contrôle hiérarchique !