【问题标题】:How to allow my discordjs bot to send commands?如何允许我的 discordjs 机器人发送命令?
【发布时间】:2021-10-30 12:56:13
【问题描述】:

我创建了一个简单的机器人,如果时间等于午夜,它会向我自己服务器上的每个文本频道发送一条消息。

这个想法是修剪 Rhythm 机器人的消息历史记录,而不必自己动手:

// Run dotenv
require('dotenv').config();

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

// Event listener when a user connected to the server.
client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
});


setInterval(function()
{
    var date = new Date();
    if (date.getHours() == 1) {
        if (client.channels) {
            client.channels.cache.forEach(function(el)
            {
                if (el.type === 'text') {
                    client.channels.cache.get(el.id).send('-prune');
                }
            });

        }
    }
}, 1000);

// Initialize bot by connecting to the server
client.login(process.env.DISCORD_TOKEN);

目前,它成功地将消息-prune 输出到每个频道,但是,节奏机器人/discord 服务器似乎忽略了该消息作为命令,而是将其视为纯文本。当我输入-prune 时,它会立即生效。

我什至做了不可思议的事情,并在 Discord 开发者网站上将范围设置为 bot 并将权限设置为 admin,那么我该如何让我的 bot 修剪消息,这样我就不必这样做了?

【问题讨论】:

    标签: discord discord.js


    【解决方案1】:

    Discord 机器人不应该能够从其他机器人获取命令。这是为了防止垃圾邮件。另一种方式是自我攻击,但这完全违反 TOS。最好的方法是使用它自己编写代码:

    client.channels.cache.forEach(async chan => {
      let messages = await chan.messages.fetch({limit: 100})
      messages = messages.filter(m => m.author.id === 'rythm bot id')
      chan.bulkDelete(messages)
    })
    

    这是未经测试的代码,您必须添加自己的错误处理。这只会删除 Rythm 的消息,如果它们在底部的 100 条消息以内。

    【讨论】:

      【解决方案2】:

      如前所述,您通常无法使用自己的命令运行其他机器人的命令。所有体面开发的机器人都会专门检查消息的作者是否是机器人,如果是这样,就会阻止处理消息。这是为了防止垃圾邮件,避免滥用,并防止将机器人的消息意外误解为命令。

      无需使用 Rythm 的 prune 命令,您只需自己执行相同的功能即可。一种方法是遍历所有频道,获取尽可能多的 Rythm 发送的消息,然后批量删除它们。其他答案已经证明了该解决方案。

      解决此问题的另一种方法是为 Rythm 命令设置一个特定的通道(如 #music 文本通道)。然后,您的机器人可以在午夜克隆并删除#music 频道,而不是发送-prune,从而有效地清除所有Rythm 命令。此外,这还带来了增加组织性和简单性的额外好处。 Here 是一个简单的例子,它与我的一个机器人的功能有些相似;它获取频道,克隆它,设置克隆在频道列表中的位置,然后删除原始频道。

      这是一个未经测试的示例,说明它在您的代码中的外观:

      setInterval(async function()
      {
          var date = new Date();
          if (date.getHours() == 1) {
              if (client.channels) {
                  //Gets the `#music` channel, if it exists in the cache
                  let channel = client.channels.cache.find(ch => ch.name == "music");
                  if (!channel) return;
      
                  //Gets the position of the music channel in the channel list
                  let pos = channel.position;
      
                  //Clones the music channel, and sets its position to `pos`
                  let newChannel = await channel.clone();
                  await newChannel.setPosition(pos);
      
                  //Deletes the original channel
                  channel.delete();
              }
          }
      }, 1000);
      

      请注意,这实际上并不是“清除”任何消息或频道。它实际上是在创建一个新频道后完全删除原始频道;然而,这样做会产生通道被清除的错觉。新频道是一个克隆,并保留了原始频道的所有权限和设置。此外,除非您专门添加代码来保留置顶消息,否则您将丢失原始频道中的置顶消息。

      还要注意上面的代码sn-p只是一个例子;您将需要为其添加错误处理等(例如,在克隆过程失败时防止删除原始频道)。

      如果您需要在一天内删除超过 100 条 Rythm 命令消息,并且愿意将所有 Rythm 命令压缩到 1-2 个通道,则此解决方案将比批量删除简单得多 超过 100 条消息的方法。如果没有,您要使用哪种方法完全取决于您。 Rythm 可以配置为只允许在指定的通道中发送命令,这可能对你有用。

      【讨论】:

      • 他们想要修剪 Rythm 的消息。这会克隆频道,删除原始频道,这会删除其中的所有消息。
      • 是的。如果 OP 或访问此问题的任何人可以为 Rythm 的命令创建特定通道(例如 #music-commands)并删除所述通道中的所有消息,则这是一种替代解决方案。或者,换句话说,如果他们想清除命令用法以及机器人的响应;假设没有其他重要消息会出现在专门用于 Rythm 命令的频道中。它在需要删除超过 100 条消息的情况下特别有用。
      猜你喜欢
      • 2018-09-18
      • 2023-01-26
      • 2021-04-14
      • 2021-06-02
      • 2019-06-29
      • 2021-10-05
      • 2021-04-19
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多