Дискорд бот не выдаёт роли (Пайтон)
При попытке получить роль путём установки реакции, бот выдаёт ошибку: [ERROR] KeyError, no role found for ? помогите пожалуйста
основной код: import discord from discord import utils
import config
class MyClient(discord.Client): async def on_ready(self): print('Logged on as {0}!'.format(self.user))
async def on_raw_reaction_add(self, payload):
if payload.message_id == config.POST_ID:
channel = self.get_channel(payload.channel_id) # получаем объект канала
message = await channel.fetch_message(payload.message_id) # получаем объект сообщения
member = utils.get(message.guild.members, id=payload.user_id) # получаем объект пользователя который поставил реакцию
try:
emoji = str(payload.emoji) # эмоджик который выбрал юзер
role = utils.get(message.guild.roles, id=config.ROLES[emoji]) # объект выбранной роли (если есть)
if(len([i for i in member.roles if i.id not in config.EXCROLES]) <= config.MAX_ROLES_PER_USER):
await member.add_roles(role)
print('[SUCCESS] User {0.display_name} has been granted with role {1.name}'.format(member, role))
else:
await message.remove_reaction(payload.emoji, member)
print('[ERROR] Too many roles for user {0.display_name}'.format(member))
except KeyError as e:
print('[ERROR] KeyError, no role found for ' + emoji)
except Exception as e:
print(repr(e))
async def on_raw_reaction_remove(self, payload):
channel = self.get_channel(payload.channel_id) # получаем объект канала
message = await channel.fetch_message(payload.message_id) # получаем объект сообщения
member = utils.get(message.guild.members, id=payload.user_id) # получаем объект пользователя который поставил реакцию
try:
emoji = str(payload.emoji) # эмоджик который выбрал юзер
role = utils.get(message.guild.roles, id=config.ROLES[emoji]) # объект выбранной роли (если есть)
await member.remove_roles(role)
print('[SUCCESS] Role {1.name} has been remove for user {0.display_name}'.format(member, role))
except KeyError as e:
print('[ERROR] KeyError, no role found for ' + emoji)
except Exception as e:
print(repr(e))
client = MyClient() client.run(config.TOKEN)
дополнительный код: TOKEN = '(тут токен стоял)'
POST_ID = 842360110650884096
ROLES = { ':video_game:': 842354678024241162, #GAMER ':computer:': 842354808739332119, #DARU-ITARU ':u6e80:': 842354912272842843, #NYA }
EXCROLES = {}
MAX_ROLES_PER_USER = 5
Ответы (1 шт):
Автор решения: RAINGM
→ Ссылка
Написал код на получение/удаление роли при клике на реакцию
@commands.Cog.listener()
async def on_raw_reaction_add(self, payload):
message_id = payload.message_id
if message_id == message_id:
guild_id = payload.guild_id
guild = discord.utils.find(lambda g: g.id == guild_id, self.bot.guilds)
channel = self.bot.get_channel(channel_id)
msg = await channel.fetch_message(message_id)
if payload.emoji.id == emoji_id:
role = discord.utils.get(guild.roles, id=role_id)
await msg.remove_reaction('<:emoji_namea:emoji_id>', self.bot.get_user(payload.user_id))
else:
pass
member = discord.utils.get(guild.members, id=payload.user_id)
if role != None:
if member != None:
if role not in member.roles:
await member.add_roles(role)
else:
await member.remove_roles(role)
else:
print(f'Role {role} not found')