我正在尝试制作一个机器人,当用户第一次玩游戏时会显示该机器人。我对 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,但他们有自定义状态,则会显示“(用户)正在玩(状态)”而不是“(用户)正在玩(游戏)。”
我相信问题出在您的 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