Discord语音频道成员计数机器人优化:修复管理员移人计数失效问题
修正Discord机器人语音频道计数问题的方案
原代码存在几个核心问题导致计数失效:
- 用局部变量
members维护计数,每次事件触发都会重置为0,根本没法累积统计 - 错误地把Channel对象和字符串ID直接比较(比如
before.channel != "id"),正确的做法应该比较频道的id属性 - 逻辑覆盖不全,管理员移动用户的场景没被正确识别
直接获取目标语音频道的实时成员数是最可靠的方案,不用手动维护计数,能完全覆盖用户自主进出、管理员移动用户的所有场景。修正后的代码如下:
@bot.event async def on_voice_state_update(member, before, after): # 替换成你的目标语音频道ID(注意是整数类型,不要加引号) target_voice_channel_id = 123456789012345678 # 替换成你的目标文本频道ID target_text_channel_id = 987654321098765432 # 获取目标语音频道对象 target_voice_channel = bot.get_channel(target_voice_channel_id) if not target_voice_channel: return # 如果频道不存在,直接返回 # 获取频道内的成员数量(排除机器人) member_count = len([m for m in target_voice_channel.members if not m.bot]) # 当成员数刚好等于3时发送消息 if member_count == 3: target_text_channel = bot.get_channel(target_text_channel_id) if target_text_channel: await target_text_channel.send("目标语音频道现在有3名成员啦!")
代码说明:
- 直接通过
target_voice_channel.members获取频道内的所有成员,过滤掉机器人后统计数量,完全同步真实成员状态 - 不管用户是自主进出、被管理员移动,只要频道成员数变化,都会触发统计,不会遗漏任何场景
- 用整数类型的ID(不要加引号),因为Discord的频道ID是整数,原代码里的字符串ID会导致比较错误
- 增加了频道存在性判断,避免因频道不存在导致报错
内容的提问来源于stack exchange,提问作者ginta_caro
相关产品推荐
相关产品推荐

