【问题标题】:Discord.py member roles listDiscord.py 成员角色列表
【发布时间】:2022-01-01 10:10:12
【问题描述】:

所以我的目标是为服务器中的每个成员提取角色列表并将它们存储在 MYSQL 数据库中。在我的机器人的后端。但是,当我尝试提取角色时,我得到 [none] 作为我的列表。所以我知道我做错了什么。我似乎无法解决它,所以我要求一些指针。

有点前言 我正在使用 SQLalchemy 和 pymysql,并重写了 discord.py。此代码也位于一个 cog 中。

她是故障码部分

@tasks.loop(hours=24)
    # Runs every 24 hours to update tables
    async def update_24(self):
        print("Updating...")
        async for guild in self.client.fetch_guilds():
            Eng = create_engine(f'mysql+pymysql://{self.sql_user}:{self.sql_passwd}@{self.sql_host}/{guild.id}',
                                echo=False)
            Engine = create_engine(f'mysql+pymysql://{self.sql_user}:{self.sql_passwd}@{self.sql_host}/{self.sql_ddb}',
                                   echo=False)

            async for member in guild.fetch_members():
                member_id = member.id  # Integer
                displayName = member.display_name  # String
                discriminator = member.discriminator  # String
                mention = member.mention  # String
                server = guild.name  # String
                # update existing
                User = discord.Member
                _roles = member.roles # <== Trouble spot

                roles = str(_roles)
                print(f"Guild: {guild.name}, User: {member.name}, roles: {_roles}, {roles}")
                dm = str(User.dm_channel)
                dt = datetime.today()
                date = dt
                engine1 = create_engine(f'mysql+pymysql://{self.sql_user}:{self.sql_passwd}@{self.sql_host}/{guild.id}',
                                        echo=False)
                with Session(engine1) as session:
                    usr = Users()

                    UserExists = session.query(Users).filter_by(UserID=member.id).first()
                    if not UserExists:
                        usr.UserID = member_id
                        usr.DisplayName = displayName.encode(encoding='UTF-8')
                        usr.Discriminator = discriminator.encode(encoding='UTF-8')
                        usr.Mention = mention.encode(encoding='UTF-8')
                        usr.DMChannel = dm.encode(encoding='UTF-8')

                        # TODO: needs fixed, stores as property object (needs to be string or list of actual names of roles)
                        usr.Roles = roles.encode(
                            encoding='UTF-8')

                        usr.Server = server.encode(encoding='UTF-8')
                        usr.LastUpdate = date
                        session.add(usr)
                        session.commit()
                        session.close()

                    else:
                        session.query(Users).filter_by(UserID=member.id).update({
                            "DisplayName": displayName.encode(encoding='UTF-8'),
                            "Discriminator": discriminator.encode(encoding='UTF-8'),
                            "Mention": mention.encode(encoding='UTF-8'),
                            "DMChannel": dm.encode(encoding='UTF-8'),
                            "Roles": roles.encode(encoding='UTF-8'),
                            "PostCount": 0,
                            "LastUpdate": date
                        }, synchronize_session="fetch")
                        session.commit()
                        session.close()

我必须验证列表的打印语句的输出是:

Guild: Sinless Games Official Discord, User: Helix, roles: [None], [None]
Guild: Sinless Games Official Discord, User: Jessica Riley, roles: [None], [None]
Guild: Sinless Games Official Discord, User: Andrew Palermo, roles: [None], [None]
Guild: Sinless Games Official Discord, User: lilfizzle063, roles: [None], [None]
Guild: Sinless Games Official Discord, User: WidgetBot, roles: [None], [None]

我如何验证每个成员都有角色。根据文档,即使@everyone 角色也是默认的,并且总是首先出现,但我得到一个空列表。

【问题讨论】:

    标签: sqlalchemy discord.py


    【解决方案1】:

    所以经过几个小时后,我设法解决了这个问题,因为我做了一些我认为毫无意义的事情。

    这是我为以后可能需要帮助的人提供的解决方案。

    member: Member
                async for member in guild.fetch_members():
                    member = await guild.fetch_member(member.id) # <== Fetches member object
                    member_id = member.id  # Integer
                    displayName = member.display_name  # String
                    discriminator = member.discriminator  # String
                    mention = member.mention  # String
                    server = guild.name  # String
                    # update existing
                    User = Member
                    _roles = []
                    for role in member.roles:  # <== Iterates through each roll and adds them to a list
                        _roles.append(role.name) # adds to list
                    roles = str(_roles) # makes the list to string for storage
                    # print(f"Guild: {guild.name}, User: {member.name}, roles: {_roles}, {roles}")
                    dm = str(User.dm_channel)
                    dt = datetime.today()
                    date = dt
                    engine1 = create_engine(f'mysql+pymysql://{self.sql_user}:{self.sql_passwd}@{self.sql_host}/{guild.id}',
                                            echo=False)
    

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 2021-06-12
      • 2021-06-29
      • 2021-07-01
      • 2021-10-16
      • 2021-07-26
      • 2021-03-26
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多