@multiapi

Как добавить пару функций в on_member_update?

Столкнулся с проблемой добавления двух нужных функций в on_member_update, мне нужно сделать так, что бы писалось, кто выдал роль, и какая роль была выдана собственно говоря, почитав доки, нашел, что у on_member_update only before, after, как мне собственно говоря добавить данные функции?

@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)
  • Вопрос задан
  • 943 просмотра
Решения вопроса 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)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
RAINGM
@RAINGM
@commands.command(name = 'on_member_update')
async def hueta123(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)


Так можно с любой функцией в discord.py
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы