【问题标题】:Is there a way to react to every message ever sent with discord.js有没有办法对使用 discord.js 发送的每条消息做出反应
【发布时间】:2019-11-18 03:27:52
【问题描述】:

我想使用一个机器人来使用 discord.js f.e. 对频道中的每条消息做出反应。我有一个表情符号竞赛频道,我想在其中的每个帖子上添加 ✅ 和 ✖ 反应 ofc,所有不必要的消息都被清理,所以有大约 50 条消息

【问题讨论】:

    标签: discord discord.js


    【解决方案1】:

    根据https://discord.js.org/#/docs/main/stable/class/TextChannel

    你可以使用fetchMessages 从特定频道获取所有消息,然后返回Message的集合

    然后您可以使用.react 函数通过迭代并在每个消息上调用.react 来将您的反应应用于此消息集合。

    编辑:

    channelToFetch.fetchMessages()
        .then(messages => {
            messages.tap(message => {
                message.react(`CHARACTER CODE OR EMOJI CODE`).then(() => {
                  // Do what ever or use async/await syntax if you don't care 
                     about Promise handling
                })
            })
        })
    

    【讨论】:

      【解决方案2】:
      const emojiChannelID = 'ChannelIDHere';
      
      client.on('ready', async () => {
        try {
          const channel = client.channels.get(emojiChannelID);
          if (!channel) return console.error('Invalid ID or missing channel.');
      
          const messages = await channel.fetchMessages({ limit: 100 });
      
          for (const [id, message] of messages) {
            await message.react('✅');
            await message.react('✖');
          }
        } catch(err) {
          console.error(err);
        }
      });
      
      client.on('message', async message => {
        if (message.channel.id === emojiChannelID) {
          try {
            await message.react('✅');
            await message.react('✖');
          } catch(err) {
            console.error(err);
          }
        }
      });
      

      在这段代码中,您会注意到我使用的是for...of 循环而不是Map.forEach()。这背后的原因是后者将简单地调用方法并继续前进。这将导致任何被拒绝的承诺 not 被捕获。我还使用了async/await 样式而不是then() 链,这很容易变得混乱。

      【讨论】:

      • 让它像那样工作,谢谢,但我对 js 编码很陌生,这是什么 => 我认为这并不意味着 sammerl 或等于
      • => 实际上是arrow function 语法的一部分。 <=>=relational operators。 =>>= 很容易混淆,但它们有很大的不同。
      • 你能在被拒绝的承诺部分上进行开发吗?我在之前的一个答案中使用了Map.forEach(),但没有想到/不知道。你说的是message.react 承诺,不是吗?因为如果一个承诺被拒绝,forEach 将停止,所以它会被停止并像你一样进入,不是吗?
      • forEach() 的工作方式,不。它只是调用 Promise 并继续迭代。到它完成时,Promise 仍将处于待处理状态。即使您使用await 关键字,它也不会对这个问题有效。请参阅 here 以获得对工作原理和问题的更全面的解释。
      猜你喜欢
      • 2021-04-02
      • 1970-01-01
      • 2021-06-24
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多