首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获得每个公会的memberCount的问题+除了公会中的机器人(Discord.js)

获得每个公会的memberCount的问题+除了公会中的机器人(Discord.js)
EN

Stack Overflow用户
提问于 2022-03-01 11:46:22
回答 1查看 169关注 0票数 1

在Discord.js中制作一个机器人,我想看看在机器人所在的服务器中有多少用户(除了服务器的机器人之外)

我已经尝试了几个星期了,但当我想得到这个价值时,它给了我别的东西.

这是我的密码:

代码语言:javascript
复制
var AllUsers = 0
client.on('ready', () => {
    client.guilds.cache.forEach( guild => {
        var memners = 0
        mems = mems + guild.memberCount
        var Bcount = 0
        Bcount = Bcount + guild.members.cache.filter(member => !member.user.bot).size
        var users = mems - Bcount
        AllUsers = AllUsers + users
    })
    console.log(`the bot is ready and dealing with ${AllUsers} users`)
}

在这段代码中,我实际上排除了memberCount本身中的机器人计数,但我的问题是它根本不工作!代码guild.members.cache.filter(*member* => !member.user.bot).size不工作!这不会给我一个错误..。

它实际上给了我这个(我为此做了一些console.logs ):

代码语言:javascript
复制
in my Bots server: 
members: 5    
Bcount: 1  
users: 4   
AllUsers: 4
---------  
in Code server:      
members: 4    
Bcount: 1  
users: 3   
AllUsers: 7
---------  
in Games server:  
members: 3    
Bcount: 1
users: 2
AllUsers: 9
---------

这就像Bcount的值是"1“,而它不是!

我尝试过:guild.members.cache.filter(guild.members.cache.filter成员而不是:guild.members.cache.filter(member => !member.user.bot).size ),这次Bcount的值是"0“。

太荒谬了!因为这三个服务器都有2机器人,但是它给了我1和!

如果你知道如何解决这个问题,请帮助我。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-03-01 19:34:54

这里的问题是,您只使用成员缓存中的用户,这并不保证包含服务器中的所有用户。您需要获取用户(从API请求他们),而不是使用缓存。

下面是直接取自Discord.js指南这里的代码

代码语言:javascript
复制
// First use guild.members.fetch to make sure all members are cached
guild.members.fetch({ withPresences: true }).then(fetchedMembers => {
    const totalOnline = fetchedMembers.filter(member => member.presence?.status === 'online');
    // Now you have a collection with all online member objects in the totalOnline variable
    console.log(`There are currently ${totalOnline.size} members online in this guild!`);
});

但是,如果您的bot没有GUILD_MEMBERS意图,并且在不和谐的应用程序页面中启用了同样的功能(在上面的链接中解释),您就无法获取成员。这是供参考的官方意图指南页

下面的代码可以根据您的特定目的对上述代码进行调整:

代码语言:javascript
复制
let AllUsers = 0;
// async is added here so we can use await in the function
client.on('ready', async () => {
    const guilds = client.guilds.cache;
    // Loop through all guilds
    for (let [guildId, guild] of guilds) {
        // Wait for the members to be fetched, then add to AllUsers
        const members = await guild.members?.fetch();
        // If members is defined, then add the count
        AllUsers += (members !== undefined) ? members?.filter(member => !member.user.bot).size : 0;
    }

    console.log(`the bot is ready and dealing with ${AllUsers} users`);
}

注意:除非您有非常具体的原因,否则不要使用varhttps://chris-franklin.com/why-is-var-considered-a-bad-practice-in-javascript/

上面的代码效率不高(也不处理潜在的错误),可以使用Promise.all();重写以同时获取所有公会的所有成员,但是考虑到这段代码现在只在启动时运行,最好不要立即将所有这些请求发送到API。

请考虑一下这段代码,但您不应该经常抓取所有成员。事实上,Discord.js v12曾经有一个.fetchAllMembers()函数,但是这个被移除了由于违背了数据抓取用户的意图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71308008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档