You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动