如何统计服务器所有语音通道中的所有人

Posted

技术标签:

【中文标题】如何统计服务器所有语音通道中的所有人【英文标题】:How to count all people in all voice channel of server 【发布时间】:2022-01-16 07:57:27 【问题描述】:

我正在使用打字稿,我使用了这段代码:但它不起作用

let count = 0;
const userCount = client.guilds.cache.get("MY Server_ID")?.channels.cache.filter(ch => ch.type === "GUILD_VOICE").map((ch) => count  +=  ch.members.size);

错误:

Property 'size' does not exist on type 'Collection<string, GuildMember> | ThreadMemberManager'.
  Property 'size' does not exist on type 'ThreadMemberManager'.

文档说 ch.members 有 said 但它给出了一个错误

https://discord.js.org/#/docs/main/stable/class/GuildChannel?scrollTo=members https://discord.js.org/#/docs/collection/main/class/Collection

【问题讨论】:

你需要添加一个类型检查来判断返回值 ch.members 是否是 GuildMember 集合。 你能举个例子吗? @Elitezen 【参考方案1】:

您可以使用.isVoice() 类型保护和Array#reduce()

let channels = client.guilds.cache.get("MY Server_ID")?.channels.cache.filter(ch => ch.type === "GUILD_VOICE")
let userCount = channels.reduce((a, c) => 
  if (!c.isVoice()) return;
  return a + c.members.size
, 0) // should be member count in all channels

但是,检查 VC 中的人数的更好方法是过滤成员

await client.guilds.cache.get("MY Server_ID")?.members.fetch()
let userCount = client.guilds.cache.get("MY Server_ID")?.members.cache.filter(m => m.voice.channel).size

【讨论】:

谢谢,但我认为cache 有问题,因为在某些情况下无法正常工作@MrMythical 尝试使用 Guild.members.fetch()

以上是关于如何统计服务器所有语音通道中的所有人的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 discord.py 制作一个检查某个服务器通道中所有消息的机器人

机器人加入公会的所有语音频道并播放文件

检索存在于语音通道中的成员

连接到语音通道并在 Discord.net 中发送音频

静音整个 Discord 语音通道 (JS)

如何访问discord.py中的哪个语音通道用户写入命令?