在Discord.js中制作一个机器人,我想看看在机器人所在的服务器中有多少用户(除了服务器的机器人之外)
我已经尝试了几个星期了,但当我想得到这个价值时,它给了我别的东西.
这是我的密码:
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 ):
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和!
如果你知道如何解决这个问题,请帮助我。
谢谢。
发布于 2022-03-01 19:34:54
这里的问题是,您只使用成员缓存中的用户,这并不保证包含服务器中的所有用户。您需要获取用户(从API请求他们),而不是使用缓存。
下面是直接取自Discord.js指南这里的代码
// 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意图,并且在不和谐的应用程序页面中启用了同样的功能(在上面的链接中解释),您就无法获取成员。这是供参考的官方意图指南页。
下面的代码可以根据您的特定目的对上述代码进行调整:
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`);
}注意:除非您有非常具体的原因,否则不要使用var。https://chris-franklin.com/why-is-var-considered-a-bad-practice-in-javascript/
上面的代码效率不高(也不处理潜在的错误),可以使用Promise.all();重写以同时获取所有公会的所有成员,但是考虑到这段代码现在只在启动时运行,最好不要立即将所有这些请求发送到API。
请考虑一下这段代码,但您不应该经常抓取所有成员。事实上,Discord.js v12曾经有一个.fetchAllMembers()函数,但是这个被移除了由于违背了数据抓取用户的意图。
https://stackoverflow.com/questions/71308008
复制相似问题