
AdvancedSensitiveWords
Мощный антимат-плагин для серверов Minecraft на Paper. Фильтрует чат, команды, книги, таблички, предметы и ники с помощью DFA-алгоритма и опционального ИИ. Подходит для любых проектов, где нужен полный контроль над контентом.
AdvancedSensitiveWords
AdvancedSensitiveWords - это плагин для Paper, который решает проблему нецензурной лексики и нежелательного контента на серверах Майнкрафт. В основе лежит DFA-алгоритм (детерминированный конечный автомат) для быстрого поиска совпадений, плюс событийная проверка контента, модульные уровни нарушений и опциональная модерация через LLM (языковые модели).
Версия 2.x - это ломающий релиз. Он работает только на Paper, использует Gradle с Kotlin DSL и генерирует новую конфигурацию в kebab-case. Не используй старые конфиги до 2.0 без проверки каждого параметра.
Требования
| Компонент | Требование |
|---|---|
| Сервер | Paper 1.21.11 или новее |
| Java | Java 21 |
| Прокси (опционально) | Velocity с соответствующей Velocity-сборкой |
| Опциональные интеграции | TrChat, PacketEvents, PlaceholderAPI, Floodgate, AuthMe |
Spigot, CraftBukkit и BungeeCord не поддерживаются с версии 2.x.
Установка
- Скачай Paper-артефакт из релиза или собери
paper:shadowJarлокально. - Положи Paper-джар в папку
plugins/сервера и запусти Paper один раз. - Настрой
plugins/AdvancedSensitiveWords/config.ymlи сгенерированныеmessages_en.ymlилиmessages_zhcn.yml. - Выполни
/asw reload allпосле изменения словарей или/asw reload configпосле изменения только конфигурации.
Для уведомлений на Velocity и прокси-команд установи Velocity-артефакт на прокси, включи plugin.hook-velocity: true на Paper, затем перезапусти обе стороны. Прокси-модуль сам по себе не фильтрует чат.
Что фильтрует 2.x
- Чат и команды: Paper
AsyncChatEvent, предобработка команд, контекст сообщений между сообщениями, настраиваемая замена или отмена, фейковые сообщения при отмене и совместимость с TrChat (фейковые сообщения/шадовбан). - Книги: проверка книг с пером по событиям, опциональная проверка по всем страницам в режиме отмены и кэш обработанных книг.
- Таблички: проверка по строкам, по нескольким строкам и контекст последних табличек. В режиме отмены опциональный PacketEvents фейковый вид показывает автору его текст, а другие игроки видят реальную чистую табличку.
- Наковальни и предметы: фильтрация переименований, а также отображаемых имен и описаний предметов через Adventure компоненты.
- Ники игроков и объявления: отклонение входа для заблокированных ников и опциональная фильтрация объявлений.
- Опциональная LLM-модерация: асинхронная проверка сообщений, которые не прошли DFA или контекст чата. Отключена по умолчанию, никогда не отзывает чат; может уведомлять, записывать, увеличивать отдельный AI VL и выполнять настроенные действия после подтвержденного ответа.
Быстрая настройка
Конфигурация генерируется в нижнем kebab-case. Сгенерированный файл - авторитетный список значений по умолчанию и встроенных комментариев.
plugin:
language: en
enable-chat-check: true
enable-sign-edit-check: true
chat:
method: CANCEL # REPLACE или CANCEL
fake-message-on-cancel: false
context-check: true
REPLACE заменяет совпавший текст на настроенный заменитель. CANCEL отклоняет взаимодействие. Фейковые сообщения чата и фейковый вид табличек - функции только для режима отмены.
Правила аргументов команд
chat.command-white-list также определяет, какие аргументы команд проверяются. При invert-command-white-list: true (по умолчанию) проверяются перечисленные пути команд, а команды вне списка пропускаются.
chat:
invert-command-white-list: true
command-white-list:
- "[default:include] /msg [ignore:1]"
- "[default:include] /bc [ignore:1,-1]"
- "[default:ignore] /mail send [include:2..]"
Аргументы нумеруются после пути команды, начиная с 1. -1 - последний аргумент; 2.. означает со второго до конца. Директивы include и ignore обрабатываются по порядку. Игнорируемые аргументы разбивают сегменты обнаружения, так что заблокированное слово не может совпасть через пропущенный ник игрока, название сервера, число или другой параметр.
Наказания и уровни нарушений
У каждого модуля фильтрации свой список punishment и свой VL: CHAT, AI, BOOK, SIGN, ANVIL и ITEM. Команды используют общий VL CHAT. Ручной список по умолчанию в plugin.manual-punishment - исключение: его условия VL используют сумму по всем модулям.
chat:
punishment:
- "COMMAND|kick %player% Blocked content|VL>2"
- "SHADOW|60|VL>5"
Поддерживаемые типы действий: COMMAND, COMMAND_PROXY, DAMAGE, HOSTILE, EFFECT и SHADOW. Используй %player% или %PLAYER% в командных действиях. Пустые списки оставляют активными обнаружение, логирование, уведомления и подсчет VL, но отключают автоматические действия.
Опциональная LLM-модерация
Включай LLM-проверку только после настройки совместимого провайдера и API-ключа. Paper загружает библиотеки LangChain4j через plugin.yml, так что серверу нужен доступ к сети или существующий кэш библиотек Paper при первом запуске.
a i:
enabled: true
base-url: https://api.deepseek.com
api-mode: CHAT_COMPLETIONS # CHAT_COMPLETIONS, RESPONSES или ANTHROPIC_MESSAGES
api-key-environment: DEEPSEEK_API_KEY
model-name: deepseek-v4-flash
Перед запросом ASW требует, чтобы прямые DFA и контекстные проверки чата не сработали, затем применяет ограничения по длине сообщения, энтропии, кулдауну на игрока, количеству выполняемых запросов, конкурентности и очереди. Вывод LLM строго парсится локально перед любым последующим действием.
У каждой категории есть независимые пороги уверенности для уведомлений и наказаний, а также действия в разделе ai.category-policy. Запросы и ответы LLM аудируются в plugins/AdvancedSensitiveWords/llm-history/. Относись к этой папке как к чувствительным операционным данным.
ai.server-context-can-override - это политический переключатель владельца сервера. Когда включен, ai.server-context вставляется в доверенную системную политику и намеренно опускается из пользовательского JSON-пейлоада. Держи текст политики под контролем администратора; никогда не помещай туда ввод игрока, учетные данные или личные данные.
Команды
| Команда | Назначение |
|---|---|
/asw help [query] | Показать справку по командам. |
/asw status | Показать общий статус плагина. |
/asw ai status | Показать счетчики LLM, состояние очереди, модель, режим API и политики категорий. |
| `/asw reload [all | config]` |
/asw test <text...> | Проверить текст через DFA-фильтр. |
/asw word add/remove <word> [word...] | Изменить список заблокированных слов для текущей сессии. |
/asw allow add/remove <word> [word...] | Изменить список разрешенных слов для текущей сессии. |
/asw player info <online-player> | Показать VL по модулям и общий VL. |
/asw player reset <online-player> [module] | Сбросить VL всех или одного модуля. |
/asw player punish <online-player> [method...] | Выполнить настроенное ручное наказание или одно указанное действие. |
/asw teleport <world-id> <x> <y> <z> | Телепортировать сотрудника на указанную локацию. |
/asw и /advancedsensitivewords эквивалентны. Изменения списков слов во время сессии сбрасываются при полной перезагрузке словаря или перезапуске сервера.
Права доступа (Permissions)
| Право | По умолчанию | Назначение |
|---|---|---|
advancedsensitivewords.bypass | false | Обход фильтрации. |
advancedsensitivewords.notice | op | Получение уведомлений для персонала. |
advancedsensitivewords.update | op | Получение уведомлений об обновлениях. |
advancedsensitivewords.command.* | false | Родительский узел для всех команд управления. |
advancedsensitivewords.command.help | op | Использование справки. |
advancedsensitivewords.command.status | op | Использование общего статуса. |
advancedsensitivewords.command.ai.status | op | Использование статуса AI. |
advancedsensitivewords.command.reload.all | op | Перезагрузка конфигурации и словарей. |
advancedsensitivewords.command.reload.config | op | Перезагрузка только конфигурации. |
advancedsensitivewords.command.test | op | Использование DFA-теста. |
advancedsensitivewords.command.word.add | op | Добавление заблокированных слов во время сессии. |
advancedsensitivewords.command.word.remove | op | Удаление заблокированных слов во время сессии. |
advancedsensitivewords.command.allow.add | op | Добавление разрешенных слов во время сессии. |
advancedsensitivewords.command.allow.remove | op | Удаление разрешенных слов во время сессии. |
advancedsensitivewords.command.player.info | op | Просмотр VL игрока. |
advancedsensitivewords.command.player.reset | op | Сброс VL игрока. |
advancedsensitivewords.command.player.punish | op | Применение ручного наказания. |
Интеграции и API
- TrChat: совместимость с фейковыми сообщениями чата и отображением шадовбана. TrChat остается ответственным за свой форматирующий пайплайн.
- PacketEvents: опционально и мягко требуется только для фейкового вида табличек. Без него поведение отмены табличек остается активным без фейкового вида.
- PlaceholderAPI: включи
plugin.enable-placeholder, чтобы получить доступ к плейсхолдерам%asw_version%,%asw_total_filtered%,%asw_is_shadow%и%asw_violation_count%. - Floodgate / AuthMe: опциональная обработка Bedrock-ников и статуса аутентификации.
Другие плагины Paper могут получить доступ к API шадовбана без зависимости от классов реализации:
import io.wdsj.asw.bukkit.api.AdvancedSensitiveWordsApi;
import java.time.Duration;
AdvancedSensitiveWordsApi.shadowBan().shadow(player, Duration.ofMinutes(5));
Событие AsyncModerationResponseEvent вызывается асинхронно после ответа LLM. Обработчики событий могут наблюдать, отменять последующие действия ASW или заменять подтвержденный результат, но должны сами планировать работу с Bukkit entity/world.
Сборка из исходников
.\gradlew.bat --no-daemon build
Лицензия
AdvancedSensitiveWords распространяется под лицензией GNU AGPL-3.0.
