如何显示用户正在玩什么而不是他们的状态?

问题描述 投票:0回答:1

我正在尝试制作一个机器人,当用户第一次玩游戏时会显示该机器人。我对 Python 尤其是 Discord.py 还比较陌生。相反,它只是显示用户的状态,这意味着当用户具有自定义状态时它会失败。

import discord
from discord.abc import GuildChannel

intents = discord.Intents.default()
intents.message_content = True
intents.presences = True
intents.members = True

client = discord.Client(intents=intents)

gameCheck = True

@client.event
async def on_ready():
  print(f'We have logged in as {client.user}')

@client.event
async def on_presence_update(before, after):
    if after.activity is not None and after.activity.type == discord.ActivityType.playing:
        game_name = after.activity.name
        print(str(before.name) + " is now playing " + game_name)
        
        system_channel = client.guilds[0].system_channel
        if system_channel is not None:
            await system_channel.send(str(before.name) + " is now playing " + game_name)

@client.event
async def on_message(message):
  global gameCheck
  if message.author == client.user:
      return

  if message.content.startswith('$toggle'):
    gameCheck = False if gameCheck == True else True
    await message.channel.send('Game check toggled to ' + str(gameCheck))

client.run('TOKEN')

我尝试仅检查活动类型的基线,但这似乎不起作用。当他们更新上线时,它会过滤掉消息以及类似的内容,但如果他们有自定义状态,它只会显示该消息而不是游戏。例如,如果用户登录 Minecraft,但他们有自定义状态,则会显示“(用户)正在玩(状态)”而不是“(用户)正在玩(游戏)。”

python python-3.x discord discord.py bots
1个回答
0
投票

我相信问题出在您的 on_presence_update 事件处理程序中。 after.activity 可能会选取列表中的第一个活动,这可能是自定义状态而不是游戏。要解决此问题,您应该迭代 after.activities 中的所有活动并检查每个活动以查看其是否是所需的类型 (discord.ActivityType.playing)。这样,您就可以检测用户何时开始玩游戏,即使他们具有自定义状态。

这是我会做什么的一个简单示例:

@client.event
async def on_presence_update(before, after):

    for activity in after.activities:
        if activity.type == discord.ActivityType.playing:
            game_name = activity.name
            print(f"{before.name} is now playing {game_name}")
            
            system_channel = client.guilds[0].system_channel
            if system_channel is not None:
                await system_channel.send(f"{before.name} is now playing {game_name}")
            break  
© www.soinside.com 2019 - 2024. All rights reserved.