如何修复重新启动机器人后无法正常工作的事件

Posted

技术标签:

【中文标题】如何修复重新启动机器人后无法正常工作的事件【英文标题】:how to fix events not working after restarting the bot 【发布时间】:2019-09-16 00:37:53 【问题描述】:

我的消息反应有问题,我让机器人删除在频道名称 appeal 上发送的任何消息并将其发送到另一个频道名称 the appeals 并使用 :white_check_mark: 对消息做出反应,如果有人做出反应对于带有 :white_check_mark: 的消息,机器人会自动删除机器人,

这是可行的,但有一个问题,如果我重新启动机器人并对重新启动之前发送的消息做出反应,机器人不会删除消息

为什么?

client.on('message', async message => 
   if(message.author.bot) return;
  var muted = message.guild.member(message.author).roles.find(j => j.id === "505763004797812766");

    if (muted && message.channel.id === "563944611693854721")
      var muted = message.guild.member(message.author).roles.find(j => j.id === "505763004797812766");
      const args = message.content.split(" ").slice(0).join(" ");
      const appeal = new Discord.RichEmbed()
      .setAuthor(message.author.username, message.author.avatarURL)
      .setTitle(message.author.username + " appeal")
      .setColor("RED")
      .addField("Message", args);
      message.guild.channels.find(ch => ch.id === "563966341980225536").send(appeal).then(msg => 
        msg.react('✅');

        client.on('messageReactionAdd', (reaction, user) => 
          if(reaction.emoji.name === "✅") 
            const whitecheckmark = (reaction, user) => reaction.emoji.name === "✅";

            const done = msg.createReactionCollector(whitecheckmark, time: 60000);

            done.on('collect', r => 
              msg.delete();
              message.guild.channels.find(ch => ch.id === "563966341980225536").send(message.author + " Appeal ended by: " + reaction.users.last())

            )
          
      );


       )



       message.delete();
       message.channel.overwritePermissions(message.author, SEND_MESSAGES: false); 



    
    else if(!muted && message.channel.id === "563944611693854721")
      message.channel.overwritePermissions(message.author, SEND_MESSAGES: true);
    

   );

【问题讨论】:

【参考方案1】:

这是设计的事件。解决此问题的唯一方法是将这些事件排入某种持久队列(如 RabbitMQ 或 NATS)中,假设事件在重新启动之前到达您的侦听器。

【讨论】:

【参考方案2】:

一般来说,“嵌套”事件(即在其他事件中添加侦听器)并不是一个好习惯。如果您将messageReactionAdd 侦听器单独放置在message 事件之外,它会在不需要消息的情况下进行侦听。然后,如果发送消息并且机器人重新启动,仍然会触发响应事件。只需确保确认触发事件的消息确实是应该的消息。

【讨论】:

另外,监听messageReactionAdd 事件创建一个反应收集器是多余的。但是,在您的情况下,反应收集器不会随机器人一起重新启动。

以上是关于如何修复重新启动机器人后无法正常工作的事件的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu非正常关机后,重新启动进入initramfs黑屏

如何修复在 Android 中崩溃的活动的重新启动?

电脑无法启动怎么办,出现启动修复但修复不了怎么办?

“重新启动接收器”无法正常工作 android [Xamarin.Android]

如果 Python 程序被杀死,则自动重新启动它

电脑在更新系统win11重新启动。,再开机就开不开了,怎么办?