You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord机器人userinfo命令优化求助:移除角色提及并显示权限键

解决Discord机器人userinfo命令的角色提及与权限显示问题

没问题,我来帮你调整这个userinfo命令,搞定不提及所有角色和显示权限键这两个需求。下面是修改后的完整代码,我会逐一拆解关键改动:

from typing import Optional
import discord
from datetime import datetime

@client.command()
async def userinfo(ctx, target: Optional[discord.Member]):
    if ctx.author.guild_permissions.administrator:
        # 先判断目标用户是否有效且在当前服务器内
        if target and target in ctx.guild.members:
            # 处理角色:排除默认@everyone,只显示角色名称(避免提及)
            roles = [role.name for role in target.roles if role != ctx.guild.default_role]
            # 处理权限:提取所有开启的权限键,转成易读格式
            permissions = [
                perm.replace("_", " ").title() 
                for perm, value in dict(target.guild_permissions).items() 
                if value
            ]
            
            embed = discord.Embed(title="User Information", colour=discord.Color.gold(), timestamp=datetime.utcnow())
            embed.set_author(name=target.display_name, icon_url=target.avatar.url)
            embed.set_thumbnail(url=target.avatar.url)
            embed.set_footer(text="Mr.KapiBara", icon_url="https://cdn.discordapp.com/attachments/618434755981213716/718861010223497236/kapi-1.png")
            
            # 更新字段:替换角色提及为名称,新增权限展示项
            fields = [
                ("Name", str(target), False),
                ("ID", target.id, False),
                ("Status", str(target.status).title(), False),
                (f"Roles ({len(roles)})", ", ".join(roles) if roles else "None", False),
                ("Created At", target.created_at.strftime("%d/%m/%Y %H:%M:%S"), False),
                ("Joined At", target.joined_at.strftime("%d/%m/%Y %H:%M:%S"), False),
                ("Permissions", ", ".join(permissions) if permissions else "None", False)
            ]
            
            for name, value, inline in fields:
                embed.add_field(name=name, value=value, inline=inline)
            
            await ctx.send(embed=embed)
        else:
            await ctx.send("你需要@当前服务器里的某个用户哦!")
    else:
        await ctx.send("你没有使用这个命令的权限哦~")

关键改动说明:

  • 角色部分优化:

    • 把原来的role.mention改成role.name,彻底避免@角色带来的打扰
    • 新增判断if role != ctx.guild.default_role,过滤掉默认的@everyone角色,让角色列表更简洁
    • 处理了空角色场景:如果用户只有@everyone,会显示"None"而不是空内容
  • 权限键显示:

    • 通过dict(target.guild_permissions).items()遍历用户的服务器权限集合
    • 筛选出值为True的权限键,并用replace("_", " ").title()把下划线格式的权限名转换成更易读的标题格式(比如administrator变成Administrator)
    • 在嵌入消息里新增了"Permissions"字段,专门展示用户的有效权限
  • 细节修复:

    • 修正了拼写错误soneone为someone
    • 适配了Discord.py v2.x的API,把target.avatar_url改成target.avatar.url(如果用的是旧版本可以改回avatar_url)
    • 优化了目标用户的判断逻辑,避免空值报错

这样修改后,你的userinfo命令就完全符合需求啦~

内容的提问来源于stack exchange,提问作者enesd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:53:10