пишу бота для Discord на Python, использую member = discord.utils.find(lambda m : m.id == payload.user_id, guild.members), но member = None. Почему?
код программы:
import discord
import config
client = discord.Client()
@client.event
async def on_ready():
print("Bot is logged in.")
@client.event
async def on_raw_reaction_add(payload):
messge_id = payload.message_id
if messge_id == config.POST_ID:
guild_id = payload.guild_id
guild = discord.utils.find(lambda g : g.id == guild_id, client.guilds)
if payload.emoji.name == "?":
role = discord.utils.get(guild.roles, name="Dota2")
elif payload.emoji.name == "?":
role = discord.utils.get(guild.roles, name="CS")
elif payload.emoji.name == "?":
role = discord.utils.get(guild.roles, name="GTA")
elif payload.emoji.name == "?":
role = discord.utils.get(guild.roles, name="Fortnite")
elif payload.emoji.name == "?️":
role = discord.utils.get(guild.roles, name="Rocket League")
elif payload.emoji.name == "?":
role = discord.utils.get(guild.roles, name="герой")
else:
role = discord.utils.get(guild.roles, name=payload.emoji.name)
if role is not None:
member = discord.utils.find(lambda m : m.id == payload.user_id, guild.members)
if member is not None:
await member.add_roles(role)
print("done")
else:
print("member not found")
print(payload.user_id)
print(guild.members)
print(lambda m : m.id == payload.user_id, guild.members)
print(guild)
else:
print("Role not found")
@client.event
async def on_raw_reaction_remove(payload):
pass
client.run(config.TOKEN)
Ответы (1 шт):
Для работы с участниками серверов боту необходимо выдать намерения. Их отсутствие - довольно распространенная проблема, поэтому подробнее можете почитать в одном из моих старых ответов.
Если вкратце, то нужно включить параметры PRESENCE INTENT и SERVER MEMBERS INTENT на странице вашего бота, на вкладке Bot.
А затем выдать намерения боту при инициализации:
client = discord.Client(intents=discord.Intents.all())
А, собственно, для получения объекта участника сервера (member) я бы рекомендовал использовать функцию get() из модуля discord.utils:
Она первым аргументом принимает список/кортеж или любой другой перечисляемый объект, а вторым аргументом - свойство конкретного объекта, который нужно найти. Подробнее можно почитать здесь
Пример:
# получаем объект сервера
guild = client.get_guild(payload.guild_id)
# получаем участника используя id
member = discord.utils.get(guild.members, id=payload.user_id)
При этом, если такого участника нет, member примет значение None