discord.py斜杠命令无法正确检测用户在线状态问题求助
问题原因与解决方案
核心原因
斜杠命令(应用命令)模式下,Discord传递的discord.Member对象默认不包含实时状态数据——应用命令的交互 payload 里只提供基础用户信息,不会主动附带在线状态这类需要实时同步的字段。而前缀命令是通过bot本地缓存获取成员数据,缓存里已经包含了通过Intents同步的状态信息,所以能正常显示。
代码额外问题
你代码里还有个明显bug:把创建embed和发送消息的逻辑放在了for status in l:循环内部,这会导致同一个命令触发四次消息发送,且状态替换逻辑会重复执行,必须把这部分代码移到循环外面。
修复步骤
- 拉取最新成员数据:在使用
member.status前,调用await member.fetch()强制从Discord API获取最新的成员信息,包括在线状态。 - 调整代码结构:将embed创建、消息发送逻辑移到状态替换循环之外,避免重复发送。
修复后的代码示例:
@client.hybrid_command(name="userinfo", with_app_command=True, description="Get information about a user") @app_commands.guilds(discord.Object(id=1009907559391567912)) async def userinfo(ctx: commands.Context, member: discord.Member = None): datetime_format = "%a, %d %b %Y" if member is None: member = ctx.author # 关键:拉取最新成员数据,确保状态正确 member = await member.fetch() mstatus = str(member.status) status_mapping = [ ["dnd", "🔴 Do Not Disturb"], ["idle", "🟠 Idle"], ["online", "🟢 Online"], ["offline", "⚫ Offline"] ] # 状态替换逻辑 for status in status_mapping: mstatus = mstatus.replace(status[0], status[1]) roles = [role for role in member.roles[1:]] embed = discord.Embed( color=discord.Color(embedcolor), # 注意:embedcolor需提前定义 title=f"{member}" ) embed.add_field(name="**•Status•**", value=str(mstatus), inline=True) embed.set_thumbnail(url=f"{member.avatar.url}") embed.add_field(name=f"**•Roles• ({len(member.roles) - 1})**", value='• '.join([role.mention for role in roles]), inline=False) embed.add_field(name="**•Account Created At•**", value=f"{member.created_at.strftime(datetime_format)}", inline=True) embed.add_field(name="**•Joined Server At•**", value=f"{member.joined_at.strftime(datetime_format)}", inline=True) await ctx.reply(embed=embed)
额外说明
- 确认你的bot已开启
presences和membersIntents(你提到已开启,这部分无需调整)。 member.fetch()会调用Discord API,这类低频操作不会触发调用次数限制,可放心使用。
内容的提问来源于stack exchange,提问作者Phoenix
相关产品推荐
相关产品推荐

