This bot gives out a role when you click on a reaction in a message, when you delete a reaction, it takes it away, this code worked a year ago and there were no problems, now I run it and get
JavaScript
x
2
1
AttributeError("'NoneType' object has no attribute 'roles'")
2
I tried to look on the Internet and it seems that I have everything right, I don’t understand where I made a mistake, please help
Code:
JavaScript
1
50
50
1
import discord
2
from discord import utils
3
import config
4
5
class MyClient(discord.Client):
6
7
async def on_ready(self):
8
print('Logged on as {0}!'.format(self.user))
9
async def on_raw_reaction_add(self, payload):
10
11
if payload.message_id == config.POST_ID:
12
channel = self.get_channel(payload.channel_id)
13
message = await channel.fetch_message(payload.message_id)
14
member = utils.get(message.guild.members, id=payload.user_id)
15
16
try:
17
emoji = str(payload.emoji)
18
role = utils.get(message.guild.roles, id=config.ROLES[emoji])
19
20
if(len([i for i in member.roles if i.id not in config.EXCROLES]) <= config.MAX_ROLES_PER_USER):
21
await member.add_roles(role)
22
print('[SUCCESS] User {0.display_name} has been granted with role {1.name}'.format(member, role))
23
24
else:
25
await message.remove_reaction(payload.emoji, member)
26
27
print('[ERROR] Too many roles for user {0.display_name}'.format(member))
28
except KeyError as e:
29
print('[ERROR] KeyError, no role found for ' + emoji)
30
31
except Exception as e:
32
print(repr(e))
33
async def on_raw_reaction_remove(self, payload):
34
channel = self.get_channel(payload.channel_id)
35
message = await channel.fetch_message(payload.message_id)
36
member = utils.get(message.guild.members, id=payload.user_id)
37
38
try:
39
emoji = str(payload.emoji)
40
role = utils.get(message.guild.roles, id=config.ROLES[emoji])
41
await member.remove_roles(role)
42
print('[SUCCESS] Role {1.name} has been remove for user {0.display_name}'.format(member, role))
43
except KeyError as e:
44
print('[ERROR] KeyError, no role found for ' + emoji)
45
except Exception as e:
46
print(repr(e))
47
48
client = MyClient()
49
client.run(config.TOKEN)
50
Advertisement
Answer
JavaScript
1
66
66
1
import discord
2
from discord import utils
3
4
import logging
5
6
logger = logging.getLogger('discord')
7
logger.setLevel(logging.DEBUG)
8
handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w')
9
handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))
10
logger.addHandler(handler)
11
12
import config
13
14
intents = discord.Intents.all()
15
intents.members = True
16
17
class MyClient(discord.Client):
18
async def on_ready(self):
19
print('Logged on as {0}!'.format(self.user))
20
21
async def on_raw_reaction_add(self, payload):
22
if payload.message_id == config.POST_ID:
23
channel = self.get_channel(payload.channel_id) # getting the channel object
24
message = await channel.fetch_message(payload.message_id) # getting the message object
25
member = utils.get(message.guild.members, id=payload.user_id) # we get the object of the user who set the reaction
26
27
try:
28
emoji = str(payload.emoji) # the emoji that the user chose
29
role = utils.get(message.guild.roles, id=config.ROLES[emoji]) # объект выбранной роли (если есть)
30
31
if(len([i for i in member.roles if i.id not in config.EXCROLES]) <= config.MAX_ROLES_PER_USER):
32
await member.add_roles(role)
33
print('[SUCCESS] User {0.display_name} has been granted with role {1.name}'.format(member, role))
34
else:
35
await message.remove_reaction(payload.emoji, member)
36
print('[ERROR] Too many roles for user {0.display_name}'.format(member))
37
38
except KeyError as e:
39
print('[ERROR] KeyError, no role found for ' + emoji)
40
41
except Exception as e:
42
print(repr(e))
43
44
async def on_raw_reaction_remove(self, payload):
45
channel = self.get_channel(payload.channel_id) # getting the channel object
46
message = await channel.fetch_message(payload.message_id) # getting the message object
47
member = utils.get(message.guild.members, id=payload.user_id) # we get the object of the user who set the reaction
48
49
try:
50
emoji = str(payload.emoji) # the emoji that the user chose
51
role = utils.get(message.guild.roles, id=config.ROLES[emoji]) # the object of the selected role (if any)
52
53
await member.remove_roles(role)
54
print('[SUCCESS] Role {1.name} has been remove for user {0.display_name}'.format(member, role))
55
56
except KeyError as e:
57
print('[ERROR] KeyError, no role found for ' + emoji)
58
except Exception as e:
59
print(repr(e))
60
61
62
client = discord.Client(intents=intents)
63
client = MyClient(intents = discord.Intents.all())
64
# RUN
65
client.run(config.TOKEN)
66