2025, Dec 26 06:02

Как отследить срабатывания AutoMod в Discord.py: on_automod_action

Разбираем, почему on_automod_action_execution не работает в Discord.py, и показываем правильный слушатель on_automod_action для логирования триггеров AutoMod.

Расширение AutoMod на сервере Discord часто начинается с одной простой потребности: отследить, когда срабатывает правило AutoMod, чтобы вести журнал, уведомлять или реагировать. Если ваш обработчик никогда не запускается, причина может оказаться более приземлённой, чем конфигурация — неверное имя события в слушателе Discord.py.

Проблема

Бот настроен с полными intents, а слушатель пытается перехватить срабатывания AutoMod. Однако ничего не происходит. Корень проблемы — несоответствующее имя события, которого нет в системе событий Discord.py.

import discord
from discord.ext import commands
from discord import app_commands
flags = discord.Intents.all()
client = commands.Bot(command_prefix=".", intents=flags)
@client.event
async def on_ready():
    print(f"Signed in as {client.user.name} ({client.user.id})")
@client.event
async def on_automod_action_execution(evt: discord.AutoModAction):
    try:
        print("AutoMod Action Executed")
        print(f"Rule ID: {evt.rule_id}")
        print(f"User ID: {evt.user_id}")
        print(f"Matched Content: {evt.matched_content}")
        print(f"Matched Keyword: {evt.matched_keyword}")
        print(f"Content: {evt.content}")
    except Exception as err:
        print(f"Failed to handle AutoMod event: {err}")

Почему это не работает

Discord.py опирается на предопределённые имена событий. Имя функции on_automod_action_execution не является распознаваемым триггером и отсутствует в официальной документации, поэтому корутина никогда не запускается. Правильное событие — on_automod_action, оно задокументировано здесь: discord.on_automod_action. Колбэк принимает один аргумент — объект discord.AutoModAction с деталями вроде правила и совпавшего содержимого.

Решение

Используйте задокументированное имя события и принимайте объект execution. Остальная логика — чтение полей из payload и их вывод — может остаться без изменений.

import discord
from discord.ext import commands
from discord import app_commands
all_intents = discord.Intents.all()
runner = commands.Bot(command_prefix=".", intents=all_intents)
@runner.event
async def on_ready():
    print(f"Logged in as {runner.user.name} ({runner.user.id})")
@runner.event
async def on_automod_action(execution: discord.AutoModAction):
    try:
        print("AutoMod Action Executed")
        print(f"Rule ID: {execution.rule_id}")
        print(f"User ID: {execution.user_id}")
        print(f"Matched Content: {execution.matched_content}")
        print(f"Matched Keyword: {execution.matched_keyword}")
        print(f"Content: {execution.content}")
    except Exception as exc:
        print(f"Failed to handle AutoMod event: {exc}")

Что важно помнить

Имя события должно совпадать в точности, иначе обработчик не запустится. В событие передаётся ваш payload discord.AutoModAction, в котором доступны поля, выведенные выше. Такой подход работает, например, с фильтром по ключевым словам, настроенным на конкретную фразу: пользовательское ключевое слово вроде «bazinga» вызовет событие, и в вывод попадёт совпавшее содержимое.

Если видите, что каждое действие AutoMod логируется дважды, проверьте, не запущен ли процесс более одного раза и не определён ли обработчик события в дубликате. AutoMod не действует на модераторов, поэтому для проверки срабатываний используйте аккаунт без прав модератора.

Зачем это важно

Корректно подключённый слушатель AutoMod — основа модераторских процессов: аудит срабатываний правил, уведомления для команды и более информативные логи. Без нужного события ни один из этих последующих шагов не заработает.

Итоги

Используйте on_automod_action, чтобы отслеживать триггеры AutoMod в Discord.py, и читайте детали из объекта discord.AutoModAction. Тестируйте с аккаунтом без прав модератора, а также убедитесь, что бот запущен в единственном экземпляре, чтобы избежать дублированного вывода. За дополнительными атрибутами payload обращайтесь к официальной документации по ссылке выше и выводите то, что нужно вашему процессу модерации.