AttributeError: 'list' object has no attribute 'id'
Вот код
@bot.event
async def on_member_join(member):
with open('roles.json', 'r', encoding='utf-8') as f:
role = json.load(f)
role_id = role[str(member.guild.id)]
await member.add_roles(role_id)
Я пробовал добавить ctx но так ломается весь код
Ошибка:
Ignoring exception in on_member_join
Traceback (most recent call last):
File "C:\Users\fun\Virtualenv\lib\site-packages\discord\client.py", line 343, in _run_event
await coro(*args, **kwargs)
File "C:\Users\fun\PycharmProjects\telebot_quest\ds_bot\bot_polina.py", line 554, in on_member_join
await member.add_roles(role_id)
File "C:\Users\fun\Virtualenv\lib\site-packages\discord\member.py", line 777, in add_roles
await req(guild_id, user_id, role.id, reason=reason)
AttributeError: 'list' object has no attribute 'id'
Файл roles.js:
{
"913940251951661056": "938100288651395073"
}
Я даже не знаю на что думать. Я плохо знаком с файлами js поэтому я буду не удивлён если это будет незначительная проблема.
Ответы (1 шт):
Если открыть документацию по методу await member.add_roles(), то можно увидеть, что он принимает не id роли, а именно саму роль типа discord.Role
Получить роль можно либо так:
role = member.guild.get_role(id)
Либо так:
role = discord.utils.get(member.guild.roles, id=id)
В обоих случаях в качестве id принимается значение числового типа (int), а у вас из файла считывается строка (str).
Так что в итоге должно быть как-то так:
@bot.event
async def on_member_join(member):
with open('roles.json', 'r', encoding='utf-8') as f:
role = json.load(f)
role = member.guild.get_role(int(role[str(member.guild.id)]))
await member.add_roles(role)
Ну и учтите, что считывать неменяющиеся данные из файла roles.json каждый раз при входе пользователя на сервер не имеет смысла - лучше вынести это за функцию
