【问题标题】:I want to use a discord members count command in my bot but it gives me an error我想在我的机器人中使用不和谐成员计数命令,但它给了我一个错误
【发布时间】:2022-01-21 07:03:35
【问题描述】:

这是 discord.js v13 membercount 命令。由于某种原因它不起作用。我在许多不和谐的服务器上寻求帮助,但他们视而不见。如果有人可以提供帮助,那就太棒了。

const Discord = require("discord.js");
const {MessageEmbed} = require("discord.js");
const config = require("../../botconfig/config.json")
var ee = require("../../botconfig/embed.json")
const settings = require("../../botconfig/settings.json");
module.exports = {
  name: "membercount", //the command name for execution & for helpcmd [OPTIONAL]
  category: "Information", //the command category for helpcmd [OPTIONAL]
  aliases: [], //the command aliases for helpcmd [OPTIONAL]
  cooldown: 5, //the command cooldown for execution & for helpcmd [OPTIONAL]
  usage: "membercount", //the command usage for helpcmd [OPTIONAL]
  description: "Shows the Amount of Members in DETAIL", //the command description for helpcmd [OPTIONAL]
  memberpermissions: [], //Only allow members with specific Permissions to execute a Commmand [OPTIONAL]
  requiredroles: [], //Only allow specific Users with a Role to execute a Command [OPTIONAL]
  alloweduserids: [], //Only allow specific Users to execute a Command [OPTIONAL]
  minargs: 0, // minimum args for the message, 0 == none [OPTIONAL]
  maxargs: 0, // maximum args for the message, 0 == none [OPTIONAL]
  minplusargs: 0, // minimum args for the message, splitted with "++" , 0 == none [OPTIONAL]
  maxplusargs: 0, // maximum args for the message, splitted with "++" , 0 == none [OPTIONAL]
  argsmissing_message: "", //Message if the user has not enough args / not enough plus args, which will be sent, leave emtpy / dont add, if you wanna use command.usage or the default message! [OPTIONAL]
  argstoomany_message: "", //Message if the user has too many / not enough args / too many plus args, which will be sent, leave emtpy / dont add, if you wanna use command.usage or the default message! [OPTIONAL]
  run: async (client, message, args, plusArgs, cmdUser, text, prefix) => {
    try {
      await message.guild.members.fetch();
        message.reply({embeds: [new Discord.MessageEmbed()
        .setAuthor("Member-Count Information About: " +  message.guild.name, message.guild.iconURL({
          dynamic: true
        }),)
        .setColor(ee.color)
        .addField("❱ Total USERS", "???? \`" + message.guild.memberCount + "\`", true)
        .addField("❱ Total HUMANS", "???? \`" + message.guild.members.cache.filter(member => !member.user.bot).size + "\`", true)
        .addField("❱ Total BOTS", "???? \`" + message.guild.members.cache.filter(member => member.user.bot).size + "\`", true)
        
        .addField("❱ ONLINE", "???? \`" + message.guild.members.cache.filter(member => member.presence.status != "offline").size + "\`", true)
        .addField("❱ ONLINE", "???? \`" + message.guild.members.cache.filter(member => !member.user.bot && member.presence.status != "offline").size + "\`", true)
        .addField("❱ ONLINE", "???? \`" + message.guild.members.cache.filter(member => member.user.bot && member.presence.status != "offline").size + "\`", true)
        
        .addField("❱ IDLE", "???? \`" + message.guild.members.cache.filter(member => member.presence.status == "idle").size + "\`", true)
        .addField("❱ IDLE", "???? \`" + message.guild.members.cache.filter(member => !member.user.bot && member.presence.status == "idle").size + "\`", true)
        .addField("❱ IDLE", "???? \`" + message.guild.members.cache.filter(member => member.user.bot && member.presence.status == "idle").size + "\`", true)
        
        .addField("❱ DND", "???? \`" + message.guild.members.cache.filter(member => member.presence.status == "dnd").size + "\`", true)
        .addField("❱ DND", "???? \`" + message.guild.members.cache.filter(member => !member.user.bot && member.presence.status == "dnd").size + "\`", true)
        .addField("❱ DND", "???? \`" + message.guild.members.cache.filter(member => member.user.bot && member.presence.status == "dnd").size + "\`", true)
        
        .addField("❱ OFFLINE", ":black_circle:\`" + message.guild.members.cache.filter(member => member.presence.status == "offline").size + "\`", true)
        .addField("❱ OFFLINE", ":black_circle:\`" + message.guild.members.cache.filter(member => !member.user.bot && member.presence.status == "offline").size + "\`", true)
        .addField("❱ OFFLINE", ":black_circle:\`" + message.guild.members.cache.filter(member => member.user.bot && member.presence.status == "offline").size + "\`", true)
        .setTimestamp()
      ]});
    } catch (e) {
      console.log(String(e.stack).bgRed)
      return message.reply({embeds: [new MessageEmbed()
          .setColor(ee.wrongcolor)
          .setFooter(ee.footertext, ee.footericon)
          .setTitle(`❌ ERROR | An error occurred`)
          .setDescription(`\`\`\`${e.message ? String(e.message).substr(0, 2000) : String(e).substr(0, 2000)}\`\`\``)
      ]});
    }
  }
}

这是错误

TypeError: Cannot read properties of null (reading 'status')
    at C:\Users\Lucaq\OneDrive\Desktop\NamiSwan\commands\Information\membercount.js:34:102
    at Map.filter (C:\Users\Lucaq\OneDrive\Desktop\NamiSwan\node_modules\@discordjs\collection\dist\index.js:1:2066)
    at Object.run (C:\Users\Lucaq\OneDrive\Desktop\NamiSwan\commands\Information\membercount.js:34:69)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

我应该添加更多细节。您不需要阅读此内容,它只是不断要求我添加越来越多的细节。

我应该添加更多细节。您无需阅读此内容,它只是不断要求我添加越来越多的细节。

【问题讨论】:

  • member.presence 为空。找出原因。
  • @ceejayoz 问题是我不知道我问的原因是什么
  • @ceejayoz 因为我认为没有什么可以定义
  • Member#presence离线 成员返回 null。检查member.presence === null

标签: javascript node.js discord discord.js bots


【解决方案1】:

注意:此代码是为 Discord.js v13.3.1 编写的


过滤空值

正如@ceejayoz 所指出的,Member#presence 是未定义的。当用户离线时会发生这种情况,因为如果您离线,您就没有活动状态。你的存在是空的。 (改编自@Elitezen 的评论)。一个简单的解决方案是通过删除 Presence 为空的任何成员来过滤您正在获取的列表。它看起来像这样:

<GuildMemberManager>.cache.filter(m => m.presence != null)

现在,我已将 GuildMemberManager 放入 。这意味着您可以用 GuildMemberManager 替换它。为了您的使用,您可以将其替换为

message.guild.members

但是,你可以简单地这样声明。

多用途

我还注意到您使用类似的代码一遍又一遍地重复相同的行。我所指的部分是 GuildMemberManager。您可以通过在开头声明一个变量并在需要 GuildMemberManager 时重用它来简化代码,您可以引用该变量。这是您可以做的一个示例。你必须使用 await 因为这个函数是基于 Promise 的。

const manager = await message.guild.members.fetch()

此外,在代码的顶部,您两次使用 require 函数来导入两个对象。您导入整个 Discord 对象,然后导入 MessageEmbed 对象。这可以通过删除第一行轻松减少。

const { MessageEmbed } = require(`discord.js`)

在第 25 行,您将代码从 Discord.MessageEmbed 更新为 MessageEmbed。您还可以通过使用.addFields(...) 来简单地编写更多代码,而不是一遍又一遍地重复运行.addField(...)

结果代码

最后,通过我在这里展示的所有更改,这就是您的新代码的样子。 重要! 您必须在调用管理器构造函数之前以及当它可以访问message 变量时放置它。定义 run 函数后的第 23 行可以很好地解决这个问题。

const { MessageEmbed } = require(`discord.js`);
// ...
const manager = await message.guild.members.fetch()
.addFields(
  { name: `❱ Total USERS`, value: `? \`${message.guild.memberCount}\``, inline: true },
  { name: `❱ Total HUMANS`, value: `? \`${manager.filter(m => !m.user.bot).size}\``, inline: true },
  { name: `❱ Total BOTS`, value: `? \`${manager.filter(m => m.user.bot).size}\``, inline: true },
  { name: `❱ ONLINE`, value: `? \`${manager.filter(m => m.presence != null).size}\``, inline: true },
  { name: `❱ ONLINE`, value: `? \`${manager.filter(m => m.presence != null && !m.user.bot).size}\``, inline: true },
  { name: `❱ ONLINE`, value: `? \`${manager.filter(m => m.presence != null && m.user.bot).size}\``, inline: true },
  { name: `❱ IDLE`, value: `? \`${manager.filter(m => m.presence != null && m.presence.status === `idle`).size}\``, inline: true },
  { name: `❱ IDLE`, value: `? \`${manager.filter(m => m.presence != null && m.presence.status === `idle` && !m.user.bot).size}\``, inline: true },
  { name: `❱ IDLE`, value: `? \`${manager.filter(m => m.presence != null && m.presence.status === `idle` && m.user.bot).size}\``, inline: true },
  { name: `❱ DND`, value: `? \`${manager.filter(m => m.presence != null && m.presence.status === `dnd`).size}\``, inline: true },
  { name: `❱ DND`, value: `? \`${manager.filter(m => m.presence != null && m.presence.status === `dnd` && !m.user.bot).size}\``, inline: true },
  { name: `❱ DND`, value: `? \`${manager.filter(m => m.presence != null && m.presence.status === `dnd` && m.user.bot).size}\``, inline: true },
  { name: `❱ OFFLINE`, value: `:black_circle: \`${manager.filter(m => m.presence === null).size}\``, inline: true },
  { name: `❱ OFFLINE`, value: `:black_circle: \`${manager.filter(m => m.presence === null && !m.user.bot).size}\``, inline: true },
  { name: `❱ OFFLINE`, value: `:black_circle: \`${manager.filter(m => m.presence === null && m.user.bot).size}\``, inline: true }
)

【讨论】:

  • 我遇到了问题。我似乎已经完成了你告诉我要做的所有步骤,但是在总人类行和总机器人行上,它说的是对象地图,现在每个人都显示为离线。我将代码放在源 bin 中,这样它就不会超过限制 sourceb.in/bEwp5A4Ayq
  • 我已对此进行了编辑以解决您强调的问题。 manager 现在获取成员列表,这应该可以解决每个人都显示为离线的问题。
猜你喜欢
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2021-12-29
  • 1970-01-01
  • 2022-08-05
相关资源
最近更新 更多