''NoneType' object has no attribute 'remove_roles' Discord.py
Keep getting an error for the reaction_remove, just copy-pasted my whole code(minus the client id) cause it might help, I have no idea what's wrong as the first half works perfectly fine.
Also, trying to add "if member is not None: await member.remove_roles(role) else: Print(error)" at the very end and itgave me errors every time I tried removing roles, just in case it helps.
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()
It was able to give me a role after adding a reaction, but has not been able to remove the role after removing that reaction here
Solution 1:[1]
The below answer is one part of the solution to make this code work so implement the provided answer. I found out in another issue that in the documentation payload.member
is only available if the event_type
is REACTION_ADD
so i fixed it by adding:
intents = discord.Intents.default()
intents.members = True
client = discord.Client(intents=intents)
After you have added this, change the
member = payload.member
to
member = guild.get_member(payload.user_id)
That is what worked for me let me know if this helps.
Solution 2:[2]
If you try printing the payload.member
the output will be None
- it's because you didn't enable intents.members
. To enable them:
intents = discord.Intents.default()
intents.members = True
client = discord.Client(intents=intents)
Also make sure to enable intents in the developer portal
Solution 3:[3]
I dont know if this is still an active problem, but I had the same problem and solved it right now after some time and wanted to share with you how I have done this.
I hope i could help other peoble with this.
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)
Solution 4:[4]
payload.member
will always be None
when the event is on_raw_reaction_remove
. As such, you will have to use guild.get_member()
and the payload's user_id
to obtain the member from cache, which also requires having the members intent enabled.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Amit Gupta |
Solution 2 | Åukasz KwieciÅ„ski |
Solution 3 | HolyDeadAngel |
Solution 4 | thegamecracks |