Jak role způsobují chyby chybějících oprávnění v Discord.js

Pozadí

Pracoval jsem na robotu Discord, který měl způsobit chaos tím, že jsem vytvořil zprávu s tlačítkem s nápisem „Netisknout“ – což po stisknutí způsobí, že uživatel klikne na tlačítko na 30 sekund a zobrazí se zpráva „Řekl jsem ti nestisknout tlačítko“. Poté, co jsem prošel nastavením svého bota jako aplikace a přihlášením k mému serveru, myslel jsem si, že těžká část je za mnou, a začal jsem se zapojovat do připojení mého lomítka a generování tlačítek. Všechno šlo hladce, dokud jsem nakonec přidal GuildMember.timeout() a začal jsem vidět tuto chybu, kdykoli jsem stiskl tlačítko:

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: []
  }
}

Důležitá poznámka o funkci Timeout

Chvíli trvalo najít někde v Discord Developer Docs, které objasnily některá specifika, včetně toho, že administrátorům nelze vypršet časový limit. Zpočátku jsem si myslel, že je to můj problém, protože jsem byl správcem serveru, kde jsem testoval svého robota - tak jsem zavolal zálohu a požádal někoho jiného, ​​aby zkusil tlačítko... a dostal jsem stejnou chybu 🙃

Hierarchie rolí

Jak se ukázalo, existuje další „Úroveň“ oprávnění, která se nezobrazuje na stránce nastavení „Oprávnění“ – Role mají úroveň oprávnění, která je výchozí podle pořadí, ve kterém jsou role přidávány na server.

To znamená, že ve výchozím nastavení bude role vašeho robota začínat s nižšími oprávněními než všichni ostatní, kteří mají přiřazenou roli. Chcete-li to vyřešit, přetáhněte svou roli robota nad role, které se pokoušíte moderovat, v části Nastavení serveru> Role.

Jak zkontrolovat hierarchii rolí pomocí Discord.js

To je skvělé pro nasazení vašeho robota na váš vlastní server, ale pokud chcete ostatním umožnit nasazení instance robota, nemusí to vědět a způsobí to selhání vašeho robota. To lze opravit zabalením GuildMember.function() volání s příkazem if, který kontroluje booleovský GuildMember.moderatable .

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

Další zdroje

  • Discord.js:Dokumenty | Příručka Začínáme
  • Discord Dev Docs
  • Můj robot chaosu