#python #python-3.x #discord #discord.py
#python #python-3.x #Discord #discord.py
Вопрос:
Я хочу, чтобы пользователю назначалась роль, когда он выбирает определенную реакцию в моем канале discord с приветствиями и ролями. Я искал везде и не могу найти код на python, который работает с самой последней версией discord.py . Вот что у меня есть до сих пор:
import discord
client = discord.Client()
TOKEN = os.getenv('METABOT_DISCORD_TOKEN')
@client.event
async def on_reaction_add(reaction, user):
role_channel_id = '700895165665247325'
if reaction.message.channel.id != role_channel_id:
return
if str(reaction.emoji) == "<:WarThunder:745425772944162907>":
await client.add_roles(user, name='War Thunder')
print("Server Running")
client.run(TOKEN)
Комментарии:
1. Что не так с программой? Вы получаете ошибки при добавлении реакции или код просто ничего не делает?
2. Я не получаю никаких кодов ошибок, но да, код просто ничего не делает.
Ответ №1:
Использовать on_raw_reaction_add
вместо on_reaction_add
, As on_reaction_add
будет работать, только если сообщение находится в кэше бота, в то время как on_raw_reaction_add
будет работать независимо от состояния внутреннего кэша сообщений.
Все идентификаторы, идентификаторы ролей, идентификаторы каналов, идентификаторы сообщений …, являются целыми числами, а не строкой, поэтому ваш код не работает, поскольку он сравнивает INT с STR.
Также вам нужно получить роль, вы не можете просто передать имя роли
Ниже приведен рабочий код
@client.event
async def on_raw_reaction_add(payload):
if payload.channel_id == 123131 and payload.message_id == 12121212: #channel and message IDs should be integer:
if str(payload.emoji) == "<:WarThunder:745425772944162907>":
role = discord.utils.get(payload.member.guild.roles, name='War Thunder')
await payload.member.add_roles(role)
Редактировать: для on_raw_reaction_remove
@client.event
async def on_raw_reaction_remove(payload):
if payload.channel_id == 123131 and payload.message_id == 12121212: #channel and message IDs should be integer:
if str(payload.emoji) == "<:WarThunder:745425772944162907>":
#we can't use payload.member as its not a thing for on_raw_reaction_remove
guild = bot.get_guild(payload.guild_id)
member = guild.get_member(payload.user_id)
role = discord.utils.get(guild.roles, name='War Thunder')
await member.add_roles(role)
Комментарии:
1. Понял. Теперь, чтобы удалить роль при удалении реакции, разве мне не нужно просто использовать on_raw_reaction_remove? Тем не менее, этот код не работает:
py async def on_raw_reaction_remove(payload): # channel and message IDs should be integer: if payload.channel_id == 700895165665247325 and payload.message_id == 756577133165543555: if str(payload.emoji) != "<:WarThunder:745425772944162907>": role = discord.utils.get(payload.member.guild.roles, name='War Thunder') await payload.member.remove_roles(role)
2. Я получаю эту ошибку при удалении моей реакции на сообщение:
line 25, in on_raw_reaction_remove guild = bot.get_guild(payload.guild_id) AttributeError: module 'discord.ext.commands.bot' has no attribute 'get_guild'