【问题标题】:A role assigning bot doesn't sometimes remove a role角色分配机器人有时不会删除角色
【发布时间】:2020-06-11 20:43:36
【问题描述】:

我想创建一个机器人来根据用户为双语服务器使用的语言分配角色,但如果我尝试给自己捷克语角色,它会给我角色,但不会删除其余角色:

const Discord = require('discord.js');
const client = new Discord.Client();

client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
});

client.on('message', msg => {
  if (msg.channel.name == 'bot') {
    var sender = msg.guild.members.resolve(msg.author.id);

    if (msg.content == 'english' || msg.content == 'bilingual' || msg.content == 'czech') {
      sender.roles.remove(['719865762453389344', '719865894733479936', '719866013524688926']);
      switch (msg.content) {
        case 'czech':
          sender.roles.add(['719865762453389344']);
          console.log("czech");
          break;
        case 'bilingual':
          sender.roles.add(['719865894733479936']);
          console.log("bilingual");
          break;
        case 'english':
          sender.roles.add(['719866013524688926']);
          console.log("english");
          break;
        default:
      }
    }
    msg.delete();
  }
});

client.login('CENSORED');

一个可怕的错误

(node:16796) UnhandledPromiseRejectionWarning: AbortError: The user aborted a request.
    at RequestHandler.execute (C:\Users\CENSORED\node_modules\discord.js\src\rest\RequestHandler.js:107:21)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:16796) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 6)

我知道到处都有未处理的事情,你当然可以责怪我,甚至指出来,但我打算稍后处理,现在我想把基本结构搞定。

【问题讨论】:

    标签: javascript node.js discord.js


    【解决方案1】:

    将您的代码放入 try-catch 块中:

    try {
      // code
    } catch (e) {
      console.log(e);
    };
    

    用户可能在请求中关闭了 Discord 窗口 (src),在这种情况下,除了适当地处理错误之外,确实没有什么可做的。

    我建议做的另一件事是不要声明sender 变量,只需使用msg.member。当成员只添加一个角色时,不需要传入数组,只需要一个字符串即可。

    【讨论】:

    • 这是一件有用的事情,但并没有解决我的核心问题,错误在于,我后来如何发现,主要是我的错,在现实世界中很少见。我要解决的真正问题是,我不能同时删除某人的角色并给他另一个角色。我不能使用 .set,因为我只想删除某些角色。
    【解决方案2】:

    后来我发现,由于某种原因,延迟添加角色可以解决问题,如下所示:

    sender.roles.remove(['719865762453389344', '719865894733479936', '719866013524688926']);
    setTimeout(function(){
      sender.roles.add(['719865762453389344']);
    }, 500);
    

    不是最理想或可扩展的解决方案,但目前看来可以正常工作。

    【讨论】:

      猜你喜欢
      • 2021-01-06
      • 2021-06-11
      • 2021-05-10
      • 2021-10-19
      • 2018-11-25
      • 2020-11-20
      • 2019-01-22
      • 1970-01-01
      • 2021-04-16
      相关资源
      最近更新 更多