Discord.py如何在用户设置自定义状态时检测其正在游玩的游戏?
Discord.py如何在用户设置自定义状态时检测其正在游玩的游戏?
嗨,我完全懂你遇到的这个问题!当用户设置了自定义状态后,你的代码就抓不到他们实际玩的游戏了——这是因为after.activity默认会优先返回自定义状态(也就是带表情的个人状态),而不是真正的游戏活动。别担心,我们只需要调整一下获取活动的方式就行。
问题的核心在于:Discord用户的活动是一个列表(after.activities),里面包含了所有正在进行的活动,比如自定义状态、游戏、流媒体、听歌等等。之前你只取了第一个活动(after.activity),刚好碰到自定义状态就跑偏了。
这里给你修改后的代码,专门过滤出真正的游戏活动:
@client.event async def on_presence_update(member, after): games = ['List', 'Of', 'Games'] # 替换成你要检测的游戏列表 # 遍历用户的所有活动,而非只取第一个 for activity in after.activities: # 只筛选"正在游玩"类型的活动,排除自定义状态 if activity.type == discord.ActivityType.playing and activity.name in games: # 获取通知频道 channel = client.get_channel(你的频道ID) # 执行踢人操作 await member.kick(reason="游玩违规游戏") # 发送通知消息 await channel.send(f"{member.mention} 因游玩 {activity.name} 被踢出服务器!") # 找到匹配项后跳出循环,避免重复处理 break
关键的几个调整点:
- 用
after.activities(复数)替代after.activity,这样能获取用户的全部活动列表 - 通过
activity.type == discord.ActivityType.playing精准定位游戏活动,自定义状态的类型是discord.ActivityType.custom,会被自动排除 - 找到匹配的游戏后用
break终止循环,防止同一个用户有多个活动时重复执行踢人逻辑
另外再提醒你两个小细节:
- 确保你的机器人拥有踢人权限,而且目标用户的角色等级低于机器人,不然会触发权限错误
- 如果用户同时开启了多个游戏,这段代码会处理第一个匹配的游戏;要是你需要处理所有匹配的游戏,可以删掉
break,但记得要避免重复发送通知哦
备注:内容来源于stack exchange,提问作者Etraloom




