首页 > 解决方案 > Python 类自变量未转移到函数 (discord.py)

问题描述

在这段代码中on_raw_reaction_add()得到self.server了,Noneon_raw_reaction_remove()它确实得到了我在__init__(). 简单的解决方案是在该函数内执行相同的操作,但我想了解为什么它不像我所知的那样工作。

编辑:试过self.client.server_id也没有用

on_raw_reaction_remove()编辑二:正如我之前所说,它在任何一个都不起作用

编辑三:找出原因。该机器人在调用时尚未运行,因此get_guildNone. 呃。

class reactionsCog(commands.Cog):
    def __init__(self, client):
        self.client = client
        self.server = self.client.get_guild(client.server_id)

    @commands.Cog.listener()
    async def on_raw_reaction_add(self, reaction):
        #Private events
        for i in range(2):
            if reaction.message_id == self.client.pri_message[i].id:
                print('Someone reacted to pri_message ', i, ' with ', str(reaction.emoji))
                if str(reaction.emoji) == '✅':
                    if reaction.user_id != self.client.user.id:
                        member = self.server.get_member(reaction.user_id)
                        userstr = member.display_name
                        if userstr in self.client.pri_not_sure[i]:
                            await self.client.pri_message[i].remove_reaction('❔', member)
                        self.client.pri_attending[i].append(userstr)
                        try:
                            await self.client.pri_message[i].remove_reaction('❌', member)
                        except:
                            pass
                        print(member.name, ' added to pri_attending ', i)

    @commands.Cog.listener()
    async def on_raw_reaction_remove(self, reaction):
        #Private events
        for i in range(2):
            if reaction.message_id == self.client.pri_message[i].id:
                if str(reaction.emoji) == '✅':
                    member = self.server.get_member(reaction.user_id)
                    print(member.name, ' removed from pri_attending ', i)
                    userstr = member.display_name
                    self.client.pri_attending[i].remove(userstr)

标签: pythonpython-3.xdiscord.py

解决方案


正如您所发现的,这是因为get_guild在机器人连接到不和谐 API 服务之前被调用。on_ready您可以通过包含一个在机器人连接时触发的事件来解决此问题:

class reactionsCog(commands.Cog):
    def __init__(self, client):
        self.client = client

    @commands.Cog.listener()
    async def on_ready(self):
        await self.client.wait_until_ready()
        self.server = self.client.get_guild(client.server_id)

    ...

推荐阅读