【问题标题】:'NoneType' object has no attribute 'remove_roles' Discord.py'NoneType' 对象没有属性 'remove_roles' Discord.py
【发布时间】:2021-02-03 11:08:15
【问题描述】:

remove_remove 不断出现错误,只是复制粘贴了我的整个代码(减去客户端 ID),因为它可能会有所帮助,我不知道有什么问题,因为前半部分工作得很好。

另外,尝试添加 “如果成员不是无: 等待 member.remove_roles(角色) 别的: 打印(错误)” 最后,每次我尝试删除角色时都会出错,以防万一它有帮助。

import discord

client = discord.Client()

@client.event 
async def on_ready():
    print('We have logged in as {0.user}'.format(client))

@client.event 
async def on_raw_reaction_add(payload):
    message_id = payload.message_id
    
    if message_id == 806406876593127464:
        guild_id = payload.guild_id
        guild = discord.utils.find(lambda g : g.id == guild_id, client.guilds)
        if payload.emoji.name == "049":
            role = discord.utils.get(guild.roles, name = 'SCP-049')
        elif payload.emoji.name == "0492":
            role = discord.utils.get(guild.roles, name = 'SCP-049-2')
        elif payload.emoji.name == "096":
            role = discord.utils.get(guild.roles, name = 'SCP-096')
        elif payload.emoji.name == "106":
            role = discord.utils.get(guild.roles, name = 'SCP-106')
        elif payload.emoji.name == "173":
            role = discord.utils.get(guild.roles, name = 'SCP-173')
        elif payload.emoji.name == "682":
            role = discord.utils.get(guild.roles, name = 'SCP-682')
        elif payload.emoji.name == "939":
            role = discord.utils.get(guild.roles, name = 'SCP-939')
        elif payload.emoji.name == "999":
            role = discord.utils.get(guild.roles, name = 'SCP-999')
        elif payload.emoji.name == "Chaos":
            role = discord.utils.get(guild.roles, name = 'Chaos Insurgency')
        elif payload.emoji.name == "DClass":
            role = discord.utils.get(guild.roles, name = 'D-Class')
        elif payload.emoji.name == "MTF":
            role = discord.utils.get(guild.roles, name = 'MTF')
        elif payload.emoji.name == "Scientist":
            role = discord.utils.get(guild.roles, name = 'Scientist')

        member = payload.member
        await member.add_roles(role)

@client.event 
async def on_raw_reaction_remove(payload):
    message_id = payload.message_id
    
    if message_id == 806406876593127464:
        guild_id = payload.guild_id
        guild = discord.utils.find(lambda g : g.id == guild_id, client.guilds)
        if payload.emoji.name == "049":
            role = discord.utils.get(guild.roles, name = 'SCP-049')
        elif payload.emoji.name == "0492":
            role = discord.utils.get(guild.roles, name = 'SCP-049-2')
        elif payload.emoji.name == "096":
            role = discord.utils.get(guild.roles, name = 'SCP-096')
        elif payload.emoji.name == "106":
            role = discord.utils.get(guild.roles, name = 'SCP-106')
        elif payload.emoji.name == "173":
            role = discord.utils.get(guild.roles, name = 'SCP-173')
        elif payload.emoji.name == "682":
            role = discord.utils.get(guild.roles, name = 'SCP-682')
        elif payload.emoji.name == "939":
            role = discord.utils.get(guild.roles, name = 'SCP-939')
        elif payload.emoji.name == "999":
            role = discord.utils.get(guild.roles, name = 'SCP-999')
        elif payload.emoji.name == "Chaos":
            role = discord.utils.get(guild.roles, name = 'Chaos Insurgency')
        elif payload.emoji.name == "DClass":
            role = discord.utils.get(guild.roles, name = 'D-Class')
        elif payload.emoji.name == "MTF":
            role = discord.utils.get(guild.roles, name = 'MTF')
        elif payload.emoji.name == "Scientist":
            role = discord.utils.get(guild.roles, name = 'Scientist')

        member = payload.member
        await member.remove_roles(role)
client.run()

添加反应后可以给我一个角色,但删除该反应后无法删除该角色here

【问题讨论】:

  • 获取角色对象了吗?在错误行上方尝试 print(role)
  • 刚刚在 member.add/remove_roles 之前添加了一张带有 print(role) 和 print(member) 的控制台图片

标签: python discord.py


【解决方案1】:

如果您尝试打印payload.member,输出将是None - 这是因为您没有启用intents.members。要启用它们:

intents = discord.Intents.default()
intents.members = True 

client = discord.Client(intents=intents)

还要确保在developer portal 中启用意图

How to enable privileged intents

【讨论】:

  • 我添加了这个并将它添加到开发门户,但它根本没有改变任何东西
【解决方案2】:

以下答案是使此代码正常工作的解决方案的一部分,因此请实施提供的答案。我在另一个问题中发现,在文档中 payload.member 只有在 event_typeREACTION_ADD 时才可用,所以我通过添加来修复它:

intents = discord.Intents.default()
intents.members = True 

client = discord.Client(intents=intents)     

添加后,更改

member = payload.member 

member = guild.get_member(payload.user_id)

这对我有用,如果有帮助,请告诉我。

【讨论】:

    【解决方案3】:

    我不知道这是否仍然是一个活跃的问题,但我遇到了同样的问题并在一段时间后立即解决了,并想与您分享我是如何做到这一点的。

    我希望我可以帮助其他人。

    intents = discord.Intents().all()
    bot = commands.Bot(command_prefix='!', intents=intents)
    
    ↑ Add this at the top of your code right under imports
    
    
    
    @bot.event
    async def on_raw_reaction_add(payload):
        guild = bot.get_guild(payload.guild_id)
        member = payload.member
        emoji = payload.emoji.name
        channel = discord.utils.get(guild.channels, name='regeln')
        channel_id = channel.id
        message_id = 874741218523873370
    
        if message_id == payload.message_id:
            if payload.channel_id == channel_id:
                if emoji == '1️⃣':
                    role = discord.utils.get(guild.roles, name='News1')
                if emoji == '2️⃣':
                    role = discord.utils.get(guild.roles, name='News2')
                if emoji == '3️⃣':
                    role = discord.utils.get(guild.roles, name='News3')
                if emoji == '4️⃣':
                    role = discord.utils.get(guild.roles, name='News4')
            await member.add_roles(role)
    
    
    
    @bot.event
    async def on_raw_reaction_remove(payload):
        guild = bot.get_guild(payload.guild_id)
        member = guild.get_member(payload.user_id)
        emoji = payload.emoji.name
        channel = discord.utils.get(guild.channels, name='regeln')
        channel_id = channel.id
        message_id = 874741218523873370
    
        if message_id == payload.message_id:
            if payload.channel_id == channel_id:
                if emoji == '1️⃣':
                    role = discord.utils.get(guild.roles, name='News1')
                if emoji == '2️⃣':
                    role = discord.utils.get(guild.roles, name='News2')
                if emoji == '3️⃣':
                    role = discord.utils.get(guild.roles, name='News3')
                if emoji == '4️⃣':
                    role = discord.utils.get(guild.roles, name='News4')
            await member.remove_roles(role)
    

    【讨论】:

    • 还要确保在 discord 开发者门户中启用意图。
    【解决方案4】:

    当事件为on_raw_reaction_remove 时,payload.member 将始终为None。因此,您必须使用guild.get_member() 和有效负载的user_id 从缓存中获取成员,这还需要启用members intent

    【讨论】:

      猜你喜欢
      • 2021-07-27
      • 2021-01-05
      • 1970-01-01
      • 2021-05-06
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多