Hoe rollen ontbrekende toestemmingsfouten veroorzaken in Discord.js

Achtergrond

Ik werkte aan een Discord-bot om chaos te veroorzaken door een bericht te maken met een knop met de tekst "Niet indrukken" - wat ertoe zou leiden dat de gebruiker die op de knop drukte 30 seconden lang een time-out had met het bericht "Ik heb je gezegd niet op de knop drukken". Nadat ik mijn bot had ingesteld als een applicatie en had ingelogd op mijn server, dacht ik dat het moeilijkste deel achter me lag en begon ik me in te pluggen om mijn slash-commando verbonden te krijgen en knoppen te genereren. Alles verliep soepel totdat ik eindelijk de GuildMember.timeout() . toevoegde functie en begon deze fout te zien wanneer ik op de knop drukte:

DiscordAPIError: Missing Permissions
    at RequestHandler.execute(path\node_modules\discord.js\src\rest\RequestHandler.js:350:13)
    at processTicksAndRejections (node:internal/process/task_queries:96:5)
    at async RequestHandler.push (path\node_modules\discord.js\src\rest\RequestHandler.js:51:14)
    at async GuildMemberManager.edit (path\node_modules\discord.js\src\managers\GuildMemberManager.js:279:15) {
  method: 'patch',
  path: '/guilds/guildId/members/memberId',
  code: '50013', 
  httpStatus: 403,
  requestData: {
    json: {
      communicationDisabledUntil: 1642004181808,
      communication_disabled_until: '2022-01-12T16:16:21.808Z'
    },
    files: []
  }
}

Belangrijke opmerking over de time-outfunctionaliteit

Het heeft even geduurd om ergens in de Discord Developer Docs te vinden dat enkele van de details verduidelijkt, inclusief dat beheerders geen time-out kunnen krijgen. Aanvankelijk dacht ik dat dit mijn probleem was omdat ik een beheerder was op de server waar ik mijn bot aan het testen was - dus belde ik de back-up en liet iemand anders de knop proberen... en kreeg dezelfde foutmelding 🙃

Rollenhiërarchie

Het blijkt dat er nog een ander "machtigingsniveau" is dat niet verschijnt op de instellingenpagina "Toestemmingen" - Rollen hebben een machtigingsniveau, standaard ingesteld op de volgorde waarin rollen aan een server worden toegevoegd.

Dit betekent dat de rol van uw bot standaard begint met lagere machtigingen dan alle anderen met een aan hen toegewezen rol. Om dit op te lossen, sleept u uw botsrol boven de rollen die u probeert te beheren in Serverinstellingen> Rollen.

Rolhiërarchie controleren met Discord.js

Dit is geweldig voor het implementeren van uw bot op uw eigen server, maar als u anderen wilt toestaan ​​een exemplaar van de bot te implementeren, weten ze dit misschien niet en zal uw bot crashen. Dit kan worden opgelost door uw GuildMember.function() . in te pakken aanroepen met een if-statement dat controleert op de Booleaanse GuildMember.moderatable .

if (interaction.member.moderatable) {
    interaction.member.timeout(30000, "I told you not to push the button 😜");
}

Aanvullende bronnen

  • Discord.js:Documenten | Handleiding Aan de slag
  • Discord Dev Docs
  • Mijn chaosbot