samp.directory
← Scripts y librerías

sonik-boom71/omp-moderator

Модератор — модерация чата для open.mp: антиреклама, фильтр слов, антикапс, антифлуд (компонент на C++)

Plugin★ 0actualizado hace 27 díasMITC++
Abrir en GitHub

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. Иммунитет для админов, проверка текста в командах, колбэк для своих наказаний.

Установка

  1. Скачайте Moderator.dll на странице Releases.
  2. Положите его в папку components сервера.
  3. Запустите сервер. В консоли должна появиться строка:
    Successfully loaded component Moderator (0.2.0.0) with UID 5a1c7e9d2b40f613
    
  4. Если хотите управлять фильтром из мода, положите 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_adstrueБлокировать рекламу
allowed_hosts[]Разрешённые сайты и IP. Сайт указывается как имя.зона: mysite.ru разрешает и forum.mysite.ru
anti_capstrueБлокировать капс
caps_min_letters6Сообщения короче этого числа букв капсом не считаются («ОК», «ГГ»)
caps_percent70Доля заглавных букв в процентах, с которой сообщение считается капсом
anti_floodtrueБлокировать флуд
flood_messages3Сколько сообщений можно отправить за flood_interval_ms; следующее блокируется
flood_interval_ms2000Интервал антифлуда в миллисекундах
repeat_interval_ms10000Сколько миллисекунд нельзя повторять одно и то же сообщение (0 отключает проверку)
bad_words[]Запрещённые слова (см. ниже)
log_blockedtrueПисать блокировки в консоль и лог сервера
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.incInclude для 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 se genera con lo que GitHub publica sobre el repositorio. samp.directory no aloja el código. Informar de un problema con esta ficha