Бот дискорд который выдает роли по нажатию на эмодзи выдает ошибку
Я сделал бота дискорд который при нажатии на реакцию под любым постом дает определенную роль, когда я нажимаю на жмодзи в консоль выдается ошибка
Вот сам код:
import discord
import config
intents = discord.Intents.default()
intents.members = True
class DiscordBot(discord.Client):
async def on_ready(self):
print(f"Бот {self.user} в сети")
async def on_raw_reaction_add(self, paylood):
if paylood.message.id == config.ID_POST:
channel = self.get_channel(paylood.channel_id)
message = await channel.fetch_message(paylood.message_id)
user = discord.utils.get(message.guild.members, id=paylood.user_id)
emoji = str(paylood.emoji)
try:
role = discord.utils.get(message.guild.roles, id=config.ROLE_LIST(emoji))
if len([i for i in user.roles if i.id not in config.USER_ROLES_LIST]) <= config.MAX_ROLES:
await user.add_roles(role)
print(f"{user.name} получил роль {role.name}")
else:
await message.remove_reaction(paylood.emoji, user)
print(f"Ошибка! пользователь {user.name} пытался получить слишком много ролей")
except Exception as _ex:
print(repr(_ex))
async def on_raw_reaction_remove(self, paylood):
channel = self.get_channel(paylood.channel_id)
message = await channel.fetch_message(paylood.message_id)
user = discord.utils.get(message.guild.members, id=paylood.user_id)
try:
emoji = str(paylood.emoji)
role = discord.utild.get(message.guild.roles, id=config.ROLE_LIST[emoji])
await user.remove_roles(role)
except Exception as _ex:
print(repr(_ex))
client = DiscordBot(intents=intents)
client.run(config.BOT_TOKEN)
Вот config.py
BOT_TOKEN = "M"
ID_POST = 0
USER_ROLES_LIST = ()
MAX_ROLES = 3
ROLE_LIST = {
"✅": 1051595649646338118, #Верифицированый
}
Вот ошибка которая выдается в консоль после нажатия на эмодзи которая должна давать роль в дискорде:
Traceback (most recent call last):
File "C:\Users\hadji\PycharmProjects\pythonProject\venv\lib\site-packages\discord\client.py", line 409, in _run_event
await coro(*args, **kwargs)
File "C:\Users\hadji\PycharmProjects\pythonProject\dsrolebot\rolebot.py", line 14, in on_raw_reaction_add
if paylood.message.id == config.ID_POST:
AttributeError: 'RawReactionActionEvent' object has no attribute 'message'
Ответы (1 шт):
А с чего вы взяли, что у объекта payload будут такие же свойства, как и у контекста команды ctx? Конечно, это было бы логично, но на практике оказалось не так.
А ведь все, что нужно было сделать, это просто посмотреть список свойств объекта RawReactionActionEvent в документации.
Отсюда видим, что из необходимого есть только свойство message_id. Имея id, сообщение можно получить используя объект канала, в котором оно находится. А для получения объекта канала есть вся необходимая информация:
channel = bot.get_channel(payload.channel_id)
message = await channel.fetch_message(payload.message_id)
Чтобы не натыкаться на подобные проблемы в будущем, рекомендую научиться пользоваться документацией
