Помощь по поводу on_member_update и спец. списка
Всем привет! Столкнулся с двумя проблемами.
Добавления двух нужных функций в on_member_update, мне нужно сделать так, что бы писалось, кто выдал роль, и какая роль была выдана собственно говоря, почитав доки, нашел, что у on_member_update only before, after, как мне собственно говоря добавить данные функции?
Не выводит нужных людей в списке, команда должна выводить людей с определенной ролью, но не выводит ничего, так же если поможете разобраться, как сделать так, что бы эти люди были в mention буду очень благодарен.
Ниже прилагаю все нужные коды, а так же как они выглядят.
Код 1:
@client.event
async def on_member_update(before, after):
if before.roles != after.roles:
channel = client.get_channel(729733881129074768)
emb = discord.Embed(title = '', description = f'**Обновление ролей пользователя - {before.mention}**', colour = discord.Color.red())
emb.add_field(name = '**Роли до**', value = [r.mention for r in before.roles] )
emb.add_field(name = '**Роли после**', value = [r.mention for r in after.roles] )
await channel.send(embed = emb)
Код 2:
@client.command()
async def members_info(ctx):
server_members = ctx.guild.members
data = ("\n".join([member for member in server_members if "Следящий за Discord" in member.roles]))
embed = discord.Embed(title = f'Участники сервера', description = f"{data}", color = discord.Color.purple())
await ctx.send( embed = embed )
Ответы (1 шт):
- Используйте данные из лога аудита
@client.event
async def on_member_update(before, after):
if before.roles != after.roles:
channel = client.get_channel(729733881129074768)
emb = discord.Embed(description = f'**Обновление ролей пользователя - {before.mention}**', colour = discord.Color.red())
emb.add_field(name = '**Роли до**', value = ", ".join([r.mention for r in before.roles]))
emb.add_field(name = '**Роли после**', value = ", ".join([r.mention for r in after.roles]))
async for event in before.guild.audit_logs(limit=1, action=discord.AuditLogAction.member_role_update): # https://discordpy.readthedocs.io/en/v1.3.4/api.html#discord.AuditLogAction.member_role_update
# event: AuditLogEntry — https://discordpy.readthedocs.io/en/v1.3.4/api.html#discord.AuditLogEntry
if getattr(event.target, "id", None) != before.id:
# изменение ролей пользователя прошло без записи в логах аудита, или в лог аудита попала другая запись перед выполнением текущего участка кода
continue
emb.add_field(name="Изменённые роли", value = ", ".join([getattr(r, "mention", r.id) for r in event.before.roles or event.after.roles])) # event.before, event.after: AuditLogDiff — https://discordpy.readthedocs.io/en/v1.3.4/api.html#discord.AuditLogDiff
emb.add_field(name="Модератор", value = event.user)
break
await channel.send(embed = emb)
member.roles- список объектов типаdiscord.Role, а не список строк.
@client.command()
async def members_info(ctx):
server_members = ctx.guild.members
data = "\n".join([member.mention for member in server_members if discord.utils.get(ctx.guild.roles, name="Следящий за Discord") in member.roles])
embed = discord.Embed(title="Участники сервера", description=data, color=discord.Color.purple())
await ctx.send(embed=embed)
примечание: рекомендую получать роль по ID через guild.get_role(ID), вместо получения роли по имени. Это значительно снизит риск возможных проблем если появится вторая роль с таким же названием:
@client.command()
async def members_info(ctx):
server_members = ctx.guild.members
data = "\n".join([member.mention for member in server_members if ctx.guild.get_role(565686928782228899) in member.roles])
embed = discord.Embed(title="Участники сервера", description=data, color=discord.Color.purple())
await ctx.send(embed=embed)

