【问题标题】:Online user counting (discord.js v13)在线用户计数(discord.js v13)
【发布时间】:2022-01-04 01:42:52
【问题描述】:

serverinfo命令中,对于我来说,有多少用户在线和离线是最重要的,不仅有很多重要的东西,一切都是为了更好的设计和更好的信息识别。
现在的话题正在精确计数。我知道该怎么做。但是我更新到discord.js v13后出现了一个问题,仍然没有消失。我已经更新到新版本很长一段时间了。
该机器人停止计算离线用户。有时会发生必须关闭机器人的情况。开启后,我发现离线用户数为0,虽然在我查看离线用户命令的服务器上,超过了服务器的一半。如果某些用户首先出现在线,则数字会发生变化。
其他状态也并非一切顺利:在线、空闲、dnd。
我的机器人现在的状态是空闲的,所以结果显示状态的用户不是 6,而是 5。对于其他状态,相反,假设有 6 个在线用户,但机器人消息有 7 个.

const lang = require('../bot/languageSelector');
const { MessageEmbed } = require("discord.js");
module.exports = {
    name: 'serverinfo',
    description: 'Shows information of this Discord server',
    run: async (bot, interaction, colorMe) => {
        let embed = new MessageEmbed();
        let members = interaction.guild.members.cache;
        embed.setColor(colorMe);
        embed.setTitle(`${lang(interaction.user.id, "about")} ${interaction.guild.name}`);
        embed.setFields({
            name: `${lang(interaction.user.id, "byStatuses")}`,
            value: `
                ${lang(interaction.user.id, "online")}: ${members.filter(member => member.presence?.status == "online").size}
                ${lang(interaction.user.id, "idle")}: ${members.filter(member => member.presence?.status == "idle").size}
                ${lang(interaction.user.id, "dnd")}: ${members.filter(member => member.presence?.status == "dnd").size}
                ${lang(interaction.user.id, "offline")}: ${members.filter(member => member.presence?.status == "offline").size}
            `,
            inline: true
        });
        interaction.followUp({embeds: [embed]});
    }
}

【问题讨论】:

  • 您的客户有什么意图?它有存在意图吗?
  • @MrMythical 我的所有意图都包括在内:const allIntents = new Intents(32767)const bot = new Client({intents: [allIntents]})
  • 您是否也在 Discord 开发者门户中启用了它们?
  • @MrMythical 是的,我做到了,我什至可以显示屏幕截图。

标签: javascript discord.js


【解决方案1】:

嗯,在线、dnd和idle我不太清楚,但我知道离线的

你看,如果一个成员离线,他们就没有存在。这也适用于不可见的成员。所以members.filter(mem => mem.presence?.status === "offline") 总是会返回一个空集合。

由于他们不存在,mem.presence 将为空。您还使用了可选链接,所以它会停在那里。所以你的代码基本上在做的是members.filter(mem => null === "offline"),我们知道它会返回一个空集合。

但是,要绕过这一点,您可以使用members.filter(mem => !mem.presence),这意味着过滤不存在​​任何状态的成员,换句话说,过滤掉离线的成员。

对于其他状态,可能是因为您使用的是.cache。这意味着成员/用户不会存储在缓存中,除非他们在机器人在线时发送消息,或者使用其中一个命令。要绕过这个,你可以这样做:

// other code...
let members = await interaction.guild.members.fetch()
// other code...

这将从服务器获取所有成员。这也会将成员存储在缓存中,因此您不必每次都获取它们。

【讨论】:

    猜你喜欢
    • 2021-11-09
    • 2021-10-13
    • 2021-10-23
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2021-11-03
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多