sonik-boom71/omp-moderator
Модератор — модерация чата для open.mp: антиреклама, фильтр слов, антикапс, антифлуд (компонент на C++)
README.md
Модератор
Модерация чата для сервера open.mp (SA-MP). Компонент проверяет сообщения в чате до того, как их увидит мод. Он блокирует рекламу чужих серверов, запрещённые слова, капс и флуд. Работает сразу после установки, мод трогать не нужно. Для тонкой настройки есть функции и колбэк для Pawn.
Живое демо → Чат, в котором работает тот же фильтр, что и в компоненте. Попробуйте пронести рекламу или мат.
Статус: v0.2.0, предварительная версия. Проверено на open.mp 1.5.8 под Windows: загрузка компонента, чтение настроек, функции Pawn и вся логика фильтра (автотесты). Блокировку сообщений живых игроков ещё предстоит проверить в игре. Если что-то работает не так, создайте issue.
Возможности
- Антиреклама. Ловит IP-адреса (
185.169.134.67:7777, в том числе с пробелами185 . 169 . 134 . 67) и сайты (samp-rp.ru,samp-rp . ru,t.me/канал,discord.gg/...,сервер.рф). Свой сервер, форум и Discord можно добавить в белый список. - Фильтр слов. Работает по вашему списку и видит маскировку:
ДуРаК,д.у.р.а.к,дyр@к(латиница, цифры и символы вместо русских букв). - Антикапс. Блокирует сообщения, в которых заглавных букв больше заданного процента.
- Антифлуд. Ограничивает число сообщений за интервал и запрещает повторять одно и то же сообщение.
- Предупреждение и лог. Игрок получает предупреждение, блокировка пишется в консоль сервера.
- Управление из Pawn. Иммунитет для админов, проверка текста в командах, колбэк для своих наказаний.
Установка
- Скачайте
Moderator.dllна странице Releases. - Положите его в папку
componentsсервера. - Запустите сервер. В консоли должна появиться строка:
Successfully loaded component Moderator (0.2.0.0) with UID 5a1c7e9d2b40f613 - Если хотите управлять фильтром из мода, положите
moderator.inc(есть в релизе и в папкеpawn) вqawno/include.
Компонент собран под Windows (32 бита, как сам сервер open.mp). Сборки под Linux пока нет.
Настройка
Все настройки задаются в разделе moderator файла config.json, указывать их все не обязательно. Для начала обычно хватает белого списка и слов:
"moderator": {
"allowed_hosts": ["mysite.ru", "123.45.67.89", "discord.gg"],
"bad_words": ["слово", "*корень"]
}
| Параметр | По умолчанию | Что делает |
|---|---|---|
anti_ads | true | Блокировать рекламу |
allowed_hosts | [] | Разрешённые сайты и IP. Сайт указывается как имя.зона: mysite.ru разрешает и forum.mysite.ru |
anti_caps | true | Блокировать капс |
caps_min_letters | 6 | Сообщения короче этого числа букв капсом не считаются («ОК», «ГГ») |
caps_percent | 70 | Доля заглавных букв в процентах, с которой сообщение считается капсом |
anti_flood | true | Блокировать флуд |
flood_messages | 3 | Сколько сообщений можно отправить за flood_interval_ms; следующее блокируется |
flood_interval_ms | 2000 | Интервал антифлуда в миллисекундах |
repeat_interval_ms | 10000 | Сколько миллисекунд нельзя повторять одно и то же сообщение (0 отключает проверку) |
bad_words | [] | Запрещённые слова (см. ниже) |
log_blocked | true | Писать блокировки в консоль и лог сервера |
message_ads | Реклама в чате запрещена. | Предупреждение игроку за рекламу |
message_bad_word | Следите за языком. | Предупреждение за запрещённое слово |
message_caps | Не пишите капсом. | Предупреждение за капс |
message_flood | Не флудите: подождите пару секунд. | Предупреждение за флуд |
message_repeat | Не повторяйте одно и то же сообщение. | Предупреждение за повтор |
Пустая строка в message_* отключает это предупреждение. Полный раздел со значениями по умолчанию выводит команда omp-server --default-config. Она перезаписывает config.json, поэтому запускайте её в копии папки сервера.
Как задавать запрещённые слова
"дурак"— слово ищется в начале каждого слова сообщения: сработает на «дурак», «ДуРаКи», «д.у.р.а.к», но не на «чудак»."*тупиц"— звёздочка означает поиск в любом месте слова: сработает на «сверхтупица».- Регистр не важен. Пишите слова через «е», а не «ё»: тогда сработают оба варианта написания.
- Со звёздочкой осторожнее: короткий корень даёт ложные срабатывания. Например,
*ебазаблокирует слово «хлеба».
Использование в Pawn
#include <open.mp>
#include <moderator>
| Функция | Что делает |
|---|---|
MODERATOR_REASON:Moderator_CheckText(const text[]) | Проверяет текст на рекламу, запрещённые слова и капс. Возвращает причину или MODERATOR_OK |
bool:Moderator_SetImmune(playerid, bool:immune) | Выдаёт или снимает иммунитет: сообщения игрока в чате не проверяются. Возвращает false, если игрока нет |
bool:Moderator_IsImmune(playerid) | Есть ли у игрока иммунитет |
OnModeratorBlock(playerid, MODERATOR_REASON:reason, const text[]) | Колбэк на каждую блокировку. Верните 0, чтобы игрок не получил стандартное предупреждение |
Причины блокировки: MODERATOR_FLOOD, MODERATOR_REPEAT, MODERATOR_ADVERTISING, MODERATOR_CAPS, MODERATOR_BAD_WORD.
Иммунитет для админов — вызовите там, где мод авторизует админа:
if (PlayerInfo[playerid][pAdmin] > 0) // проверка админки в вашем моде
{
Moderator_SetImmune(playerid, true);
}
Проверка текста в командах. Команды (/pm, /ad и т. п.) компонент сам не проверяет, для них есть Moderator_CheckText:
if (Moderator_CheckText(text) != MODERATOR_OK)
{
return SendClientMessage(playerid, 0xFF6347FF, "Объявление не прошло проверку.");
}
Свои наказания — например, мут за рекламу вместо стандартного предупреждения:
public OnModeratorBlock(playerid, MODERATOR_REASON:reason, const text[])
{
if (reason == MODERATOR_ADVERTISING)
{
SendClientMessage(playerid, 0xFF6347FF, "Реклама запрещена. Мут на 10 минут.");
// MutePlayer(playerid, 10); — ваш код
return 0;
}
return 1;
}
Как это работает
- Компонент подписывается на сообщения в чат с более высоким приоритетом, чем Pawn. Если сообщение заблокировано,
OnPlayerTextмода не вызывается и сообщение никто не видит. - Текст проверяется в кодировке cp1251, в ней русские клиенты SA-MP отправляют чат. Строки из
config.json(UTF-8) перекодируются автоматически, так что слова пишутся в конфиге обычными русскими буквами. - Флуд и повторы считаются только в обычном чате.
- Иммунитет и счётчики флуда сбрасываются, когда игрок переподключается и когда мод перезапускается (
gmx).
Сборка из исходников
Нужна Visual Studio 2022 с компонентом «Разработка классических приложений на C++»; CMake и Ninja входят в неё.
git clone --recursive https://github.com/sonik-boom71/omp-moderator
cd omp-moderator
build.bat
build.bat сам находит Visual Studio, собирает 32-битный build\Moderator.dll и запускает автотесты. Зависимости (open.mp SDK и pawn-natives) подключены как git-подмодули, поэтому при клонировании нужен --recursive.
Тесты
- Автотесты логики фильтра (
tests/filter_tests.cpp) запускаются при каждой сборке. Проверяются реклама, слова, капс, флуд, иммунитет и перекодировка cp1251 (сверкой с Windows по всем 256 символам). - Проверка на настоящем сервере —
server_test.bat. Распакуйтеopen.mp-win-x86.zipиз релизов open.mp так, чтобы получилосьdeps\server-dist\Server\omp-server.exe. Скрипт поднимет локальный сервер на127.0.0.1:7797с тестовым модомtestmode/moderator_test.pwnи проверит результат.
Структура проекта
| Путь | Что там |
|---|---|
src/filter.* | Логика фильтра: реклама, слова, капс, флуд, иммунитет. От open.mp не зависит |
src/cp1251.* | Перекодировка cp1251 ↔ UTF-8 и работа с регистром русских букв |
src/component.cpp | Связка с open.mp: настройки, перехват чата, функции и колбэк для Pawn |
pawn/moderator.inc | Include для Pawn |
tests/ | Автотесты |
testmode/ | Тестовый мод и настройки для server_test.bat |
demo/ | Страница живого демо: логика фильтра, перенесённая на JavaScript. Публикуется на Vercel при каждом пуше |
deps/ | open.mp SDK и pawn-natives (подмодули), amx.h из компилятора Pawn |
Лицензия
MIT. Используются open.mp SDK (MIT), pawn-natives и amx.h из компилятора Pawn (© ITB CompuPhase, лицензия zlib).
chat-filteropen-mpopen-mp-componentpawnsa-mpsamp
Esta página é montada com o que o GitHub publica sobre o repositório. O samp.directory não hospeda o código. Avisar de um problema com esta página