当我尝试将 user_id 转换为 discord.py 上的成员用户名时,我不断收到 NoneType

Posted

技术标签:

【中文标题】当我尝试将 user_id 转换为 discord.py 上的成员用户名时,我不断收到 NoneType【英文标题】:I keep getting NoneType when I try to convert user_id's to member usernames on discord.py 【发布时间】:2021-08-06 06:11:42 【问题描述】:

在使用这行代码时返回成员 ID 时遇到问题,当我不调用任何东西时,我只是让它运行为:

 table = ("\n".join(f'idx + 1. (entry[0]) (XP: entry[1] | Level: entry[2])'
                for idx, entry in enumerate(entries)))

我将用户 ID 存储在我的数据库中。

但是一旦我尝试将它们转换为不和谐的成员用户名,我就会得到非类型对象

 table = ("\n".join(f'idx + 1. self.ctx.guild.get_member(entry[0]) (XP: entry[1] | Level: entry[2])'
                for idx, entry in enumerate(entries)))

需要更多代码来回答这个问题,所以在这里

class HelpMenu(ListPageSource):
    def __init__(self, ctx, data):
        self.ctx = ctx
        super().__init__(data, per_page = 10)

    async def write_page(self, menu, fields=[]):
         offset = (menu.current_page * self.per_page) + 1
         len_data = len(self.entries)

         embed = Embed(title="Server XP Leaderboard",
                       colour=self.ctx.author.colour)
         embed.set_thumbnail(url = self.ctx.guild.icon_url)
         embed.set_footer(text = f"offset:, - min(len_data, offset+self.per_page-1):, of len_data:, members.")

         for name, value in fields:
             embed.add_field(name=name, value=value, inline=False)
         return embed

    async def format_page(self, menu, entries):
        fields = []

        table = ("\n".join(f'idx + 1. self.ctx.guild.get_member(entry[0]) (XP: entry[1] | Level: entry[2])'
                for idx, entry in enumerate(entries)))

        fields.append(("Ranks", table))

        return await self.write_page(menu, fields)


class Exp(Cog):
    def __init__(self, bot):
        self.bot = bot

    @command(aliases = ['lvl', 'level'])
    async def rank(self, ctx):

        db = sqlite3.connect('xpdata.db')
        cursor = db.cursor()

        # user_id = self.author.id
        guild_id = ctx.guild.id
        #
        # cursor.execute(f'SELECT * FROM xpdata WHERE user_id = user_id  AND guild_id = guild_id')
        # for row in cursor.fetchall():
        #     level_display = row[3]

        cursor.execute(f'SELECT user_id, xp, level FROM xpdata WHERE guild_id = guild_id ORDER BY xp DESC')
        xp_ranking = cursor.fetchall()

        #menu
        ranking_menu = MenuPages(source=HelpMenu(ctx, xp_ranking))
        await ranking_menu.start(ctx)

        #await ctx.channel.send(' is currently level  and rank '.format(ctx.author.mention, level_display))

bot.add_cog(Exp(bot))

【问题讨论】:

你有所有的意图吗? 我对你的意思感到困惑 你有不和谐的特权意图吗?机器人需要识别服务器中的成员。 discordpy.readthedocs.io/en/stable/intents.html 我刚刚启用了它,但我仍然收到同样的错误 另外,我认为你应该使用ctx.guild.fetch_member('id here') 而不是ctx.guild.get_member(entry[0])。对于您的代码,是否定义了 self.ctx?即使这个命令在一个类中,我认为你应该有像 async def command_name(self, ctx) 这样的参数 【参考方案1】:

为了解决这个问题,我需要打开不和谐的特权意图。

您可以在 discord 开发门户网站上执行此操作。

然后我需要用它来初始化它

intents = discord.Intents(messages=True, guilds=True)

【讨论】:

以上是关于当我尝试将 user_id 转换为 discord.py 上的成员用户名时,我不断收到 NoneType的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 在尝试将游戏消息转换为不和谐消息时给我留下“TypeError:无法读取未定义的属性 'includes'”

Kotlin discord jda 无法通过 id 获取消息

当我尝试将错误处理程序与 discord.py 一起使用时,“忽略 on_command_error 中的异常”

如何以另一种形式使用标签中的 user_id

Python 'guild' 无法转换为 MySQL 类型

Discord Bot Client.User 在 Python 中转换为 Discord.Utils 时出错