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 обращайтесь к официальной документации по ссылке выше и выводите то, что нужно вашему процессу модерации.