如果未列入白名单 (Discord.JS + MongoDB),则发送消息并让服务器保持就绪状态

Send message and leave server on ready event if not whitelisted (Discord.JS + MongoDB)

我正在为我的 discord 机器人编写一个白名单系统,在准备事件发生时(并在延迟 3 秒后),检查它所在的每个服务器是否都将其 ID 添加到 [=20= 的白名单数据库中].如果没有,机器人会发送一个嵌入并离开服务器。我设法让它在 guildCreate 事件上工作,但是在 ready 事件上它执行消息并在没有过滤条件的情况下在每个服务器上留下操作,即使这些已添加到列表中。我不知道为什么。另外,我对 JavaScript 还是个新手,所以这可能只是一个小错误。

//VARIABLES
const { Client, MessageEmbed } = require("discord.js")
const config = require('../../Files/Configuration/config.json');
const DB = require("../../Schemas/WhitelistDB");

//READY EVENT
module.exports = {
  name: "ready",
  once: false,
  async execute(client) {

//[ ... ]     <--- OTHER UNNECESSARY CODE IN BETWEEN

    setTimeout(function() {    // <--- 3 SECONDS DELAY

      client.guilds.cache.forEach(async (guild) => {    // <--- CHECK EVERY SERVER

        await DB.find({}).then(whitelistServers => {    // <--- CHECK MONGODB ID LIST

          if(!whitelistServers.includes(guild.id)) {
            const channel = guild.channels.cache.filter(c => c.type === 'GUILD_TEXT').random(1)[0];    // <--- SEND MESSAGE TO RANDOM TEXT CHANNEL (It is sending to every server, when it should be sending only to the not whitelisted ones)
              if(channel) {
                const WhitelistEmbed = new MessageEmbed()
                WhitelistEmbed.setColor(config.colors.RED)
                WhitelistEmbed.setDescription(`${config.symbols.ERROR} ${config.messages.SERVER_NOT_WHITELISTED}`)
                channel.send({embeds: [WhitelistEmbed]});
              }
            client.guilds.cache.get(guild.id).leave();    // <--- LEAVE SERVER (It is leaving every server, when it should be leaving only the not whitelisted ones)
          } else { return }
        });

      });

    }, 1000 * 3);

  }
}

我自己找到了解决方案!

与其查找每个公会的白名单 ID 数组,不如一次查找一个数组,而不是检查数组的内容,而是检查数组是否存在。这是更新后的代码:

//WHITELIST
setTimeout(function() {

  client.guilds.cache.forEach(async (guild) => {

    await DB.findOne({ GuildID: guild.id }).then(whitelistServers => {
      if(!whitelistServers) {
        const channel = guild.channels.cache.filter(c => c.type === 'GUILD_TEXT').random(1)[0];
          if(channel) {
            const WhitelistEmbed = new MessageEmbed()
            WhitelistEmbed.setColor(config.colors.RED)
            WhitelistEmbed.setDescription(`${config.symbols.ERROR} ${config.messages.SERVER_NOT_WHITELISTED}`)
            channel.send({embeds: [WhitelistEmbed]});
          }
        client.guilds.cache.get(guild.id).leave();
      } else { return }
    });

  });

}, 1000 * 3);