Есть ли способ проверить, кто выполнил действие (например, удаленный канал)

#python #discord #discord.py-rewrite

#python #Discord #discord.py

Вопрос:

Я работаю над ботом, и мне было интересно, есть ли способ проверить, кто совершил событие? Как будто кто-то удаляет канал / роль, как я могу узнать, кто был пользователем, стоящим за этим?

Я пробовал async def on_guild_channel_delete(ctx, member): , но он возвращается TypeError: on_guild_channel_delete() missing 1 required positional argument: 'member' .

Любая помощь будет с благодарностью!

Ответ №1:

Редактировать Чтобы проанализировать журналы аудита в событиях удаления канала, попробуйте это (вашему боту потребуются разрешения для просмотра журнала аудита):

 @client.event
async def on_guild_channel_delete(channel):
    entry = await channel.guild.audit_logs(action=discord.AuditLogAction.channel_delete, limit=1).get()
    print("User {} deleted channel {} at time {}".format(entry.user.name, channel.name, entry.created_at))
  

Вывод по событию удаления канала:
User MyDeleter deleted channel my-test-channel at time 2020-09-22 03:08:11.638000
Что происходит: guild.audit_logs() возвращает записи в журнал аудита для гильдии (мы получаем гильдию из channel.guild ).
.get() возвращает первый элемент в этом итераторе, который будет самой новой записью.
action=discord.AuditLogAction.channel_delete будет искать только записи, которые удалили каналы. limit=1 вернет максимум 1 событие. Полезно для написания итераторов, но в этом нет необходимости при использовании .get() , но я бы все равно оставил это на случай повышения эффективности (по правде говоря, я забыл, что это было там, пока я не писал это).

Что касается получения удаления из события удаления канала (оригинальный ответ): Из документов

 >  discord.on_guild_channel_delete(channel)  
>    Called whenever a guild channel is deleted or created  
>  Parameters  
>     channel (abc.GuildChannel) – The guild channel that got created or deleted.  
  

Единственный доступный параметр channel .
То же ограничение применяется для роли, единственным параметром является role .
Если вам нужна эта информация для целей модерации, Discord сохраняет эту информацию в настройках сервера> Журнал аудита

Далее: я замечаю, что вы вызываете его с параметром ctx (context), хорошей практикой для событий является ссылаться на параметр по тому, что он конкретно представляет, потому что он не содержит много информации (контекста), как может быть первый параметр команды. Назовите это так:

 @client.event
async def on_guild_channel_delete(channel):
   print("A channel was deleted")
  

Комментарии:

1. большое вам спасибо, чувак, это сработало, И вы объяснили, как!