LuxinfinePunishments-5.2-1.7.10

Информация:

Мод для наказаний игроков. Поддерживаются баны, баны по IP, баны по HWID, муты с полной интеграцией с БД MySQL.

Для работы HWID банов нужна поддержка на стороне лаунчера. От лаунчерсервера требуется таблица, где хранится UUID игрока и его HWID (число/строка). В случае GravitLauncher в SQL скрипте есть пример триггеров, синхронизирующих banned-флаг в таблице hwids.

Мод имеет двунаправленную синхронизацию банов и IP-банов меж ванилла майнкрафтом и LuxinfinePunishments. Если кто-то программно выдаст/снимет бан через API игры - оно отразится на наш мод, также и на оборот.

Имеется опция запрета наказывать (мутить/банить) игроков, статусом выше, отправителя команды. Статус игрока считается как "вес" его наивысшей permissions группы. Позволяет предотвратить баны модераторов/админов хелперами и прочий беспредел.

Поддерживается обновление наказаний "на лету" при изменении таблиц БД извне (необходимо настроить репликацию MySQL): вы сможете в коде сайта удалить запись о бане в таблице (или, на оборот, вставить/изменить) и майнкрафт тут же разбанит/забанит игрока. Никаких задержек и rcon не нужно.

Для программистов: мод реализует Punishments интеграцию LFHelper, предоставляя доступ к API.

Конфигурация:

{
  "configuration": {
    "mute_blocked_commands": {
      "comment": "Список команд, которые нельзя выполнять в муте",
      "type": "Set<String>",
      "default": [
        "msg",
        "reply"
      ],
      "value": [
        "msg",
        "reply"
      ]
    },
    "check_punishments_time": {
      "comment": "Интервал проверки времени банов и мутов в секундах. При его срабатывании в БД будут удаляться истекшие по сроку наказания",
      "range": "От 10 до 2147483647",
      "type": "int",
      "default": 60,
      "value": 60
    },
    "check_hwid_bans_on_login": {
      "comment": "Проверять наличие HWID бана при попытке подключения игрока к серверу. Если ваш лаунчерсервер сам проверяет HWID-баны - опцию можно отключить",
      "type": "boolean",
      "default": true,
      "value": true
    },
    "database": {
      "properties": {
        "mutes": {
          "properties": {
            "mutes_db_id": {
              "comment": "ID подключения к БД, где мод будет записывать действующие блокировки чата в таблицу",
              "range": "От -2147483648 до 2147483647",
              "type": "int",
              "default": 0,
              "value": 0
            },
            "mutes_mutedBy_column": {
              "comment": "Колонка с UUID игрока, который выдал блокировку чата",
              "type": "String",
              "default": "muted_by",
              "value": "muted_by"
            },
            "mutes_db_listener_id": {
              "comment": "ID подключения слушателя БД. Если подключен, при изменении таблицы извне (сайт и т.п.) - в игре тут же будет применён/снят мут. Значение -1 отключает опцию",
              "range": "От -1 до 2147483647",
              "type": "int",
              "default": 0,
              "value": 0
            },
            "mutes_expiresAt_column": {
              "comment": "Колонка с датой истечения блокировки чата",
              "type": "String",
              "default": "expires_at",
              "value": "expires_at"
            },
            "mutes_uuid_column": {
              "comment": "Колонка с UUID игрока, которому заблокировали чат",
              "type": "String",
              "default": "uuid",
              "value": "uuid"
            },
            "mutes_reason_column": {
              "comment": "Колонка с причиной блокировки чата",
              "type": "String",
              "default": "reason",
              "value": "reason"
            },
            "mutes_mutedAt_column": {
              "comment": "Колонка с датой блокировки чата",
              "type": "String",
              "default": "muted_at",
              "value": "muted_at"
            },
            "mutes_table": {
              "comment": "Имя таблицы с блокировками чата",
              "type": "String",
              "default": "punishments_mutes",
              "value": "punishments_mutes"
            },
            "mutes_server_id_column": {
              "comment": "Колонка с ID сервера",
              "type": "String",
              "default": "server_id",
              "value": "server_id"
            }
          }
        },
        "ip_bans": {
          "properties": {
            "ip_bans_expiresAt_column": {
              "comment": "Колонка с датой истечения бана",
              "type": "String",
              "default": "expires_at",
              "value": "expires_at"
            },
            "ip_bans_ip_column": {
              "comment": "Колонка с IP забаненного игрока",
              "type": "String",
              "default": "ip",
              "value": "ip"
            },
            "ip_bans_table": {
              "comment": "Имя таблицы с IP банами",
              "type": "String",
              "default": "punishments_ip_bans",
              "value": "punishments_ip_bans"
            },
            "ip_bans_reason_column": {
              "comment": "Колонка с причиной бана",
              "type": "String",
              "default": "reason",
              "value": "reason"
            },
            "ip_bans_bannedBy_column": {
              "comment": "Колонка с UUID игрока, который выдал бан",
              "type": "String",
              "default": "banned_by",
              "value": "banned_by"
            },
            "ip_bans_db_listener_id": {
              "comment": "ID подключения слушателя БД. Если подключен, при изменении таблицы извне (сайт и т.п.) - в игре тут же будет применён/снят бан. Значение -1 отключает опцию",
              "range": "От -1 до 2147483647",
              "type": "int",
              "default": 0,
              "value": 0
            },
            "ip_bans_bannedAt_column": {
              "comment": "Колонка с датой бана",
              "type": "String",
              "default": "banned_at",
              "value": "banned_at"
            },
            "ip_bans_db_id": {
              "comment": "ID подключения к БД, где мод будет записывать действующие IP баны в таблицу",
              "range": "От -2147483648 до 2147483647",
              "type": "int",
              "default": 0,
              "value": 0
            },
            "ip_bans_server_id_column": {
              "comment": "Колонка с ID сервера",
              "type": "String",
              "default": "server_id",
              "value": "server_id"
            }
          }
        },
        "bans": {
          "properties": {
            "bans_expiresAt_column": {
              "comment": "Колонка с датой истечения бана",
              "type": "String",
              "default": "expires_at",
              "value": "expires_at"
            },
            "bans_reason_column": {
              "comment": "Колонка с причиной бана",
              "type": "String",
              "default": "reason",
              "value": "reason"
            },
            "bans_bannedBy_column": {
              "comment": "Колонка с UUID игрока, который выдал бан",
              "type": "String",
              "default": "banned_by",
              "value": "banned_by"
            },
            "bans_db_listener_id": {
              "comment": "ID подключения слушателя БД. Если подключен, при изменении таблицы извне (сайт и т.п.) - в игре тут же будет применён/снят бан. Значение -1 отключает опцию",
              "range": "От -1 до 2147483647",
              "type": "int",
              "default": 0,
              "value": 0
            },
            "bans_db_id": {
              "comment": "ID подключения к БД, где мод будет записывать действующие баны в таблицу",
              "range": "От -2147483648 до 2147483647",
              "type": "int",
              "default": 0,
              "value": 0
            },
            "bans_uuid_column": {
              "comment": "Колонка с UUID забаненного игрока",
              "type": "String",
              "default": "uuid",
              "value": "uuid"
            },
            "bans_table": {
              "comment": "Имя таблицы с банами",
              "type": "String",
              "default": "punishments_bans",
              "value": "punishments_bans"
            },
            "bans_bannedAt_column": {
              "comment": "Колонка с датой бана",
              "type": "String",
              "default": "banned_at",
              "value": "banned_at"
            },
            "bans_server_id_column": {
              "comment": "Колонка с ID сервера",
              "type": "String",
              "default": "server_id",
              "value": "server_id"
            }
          }
        },
        "hwid_bans": {
          "properties": {
            "users_hwid_column": {
              "comment": "Колонка с HWID игрока. Значение 0 в колонке означает, что HWID неизвестен",
              "type": "String",
              "default": "hwid",
              "value": "hwid"
            },
            "hwid_bans_reason_column": {
              "comment": "Колонка с причиной бана",
              "type": "String",
              "default": "reason",
              "value": "reason"
            },
            "hwid_bans_bannedAt_column": {
              "comment": "Колонка с датой бана",
              "type": "String",
              "default": "banned_at",
              "value": "banned_at"
            },
            "users_uuid_column": {
              "comment": "Колонка с UUID игрока",
              "type": "String",
              "default": "uuid",
              "value": "uuid"
            },
            "hwid_bans_hwid_column": {
              "comment": "Колонка с HWID забаненного игрока. Тип данных здесь должен быть такой же, как в колонке HWID в таблице игроков (мод сам подстроится)",
              "type": "String",
              "default": "hwid",
              "value": "hwid"
            },
            "hwid_bans_expiresAt_column": {
              "comment": "Колонка с датой истечения бана",
              "type": "String",
              "default": "expires_at",
              "value": "expires_at"
            },
            "hwid_bans_db_id": {
              "comment": "ID подключения к БД, где мод будет записывать действующие HWID баны в таблицу",
              "range": "От -2147483648 до 2147483647",
              "type": "int",
              "default": 1,
              "value": 1
            },
            "users_db_id": {
              "comment": "ID подключения к БД с таблицей игроков и HWID (в ней должен быть UUID игрока и его HWID)",
              "range": "От -2147483648 до 2147483647",
              "type": "int",
              "default": 1,
              "value": 1
            },
            "hwid_bans_bannedBy_column": {
              "comment": "Колонка с UUID игрока, который выдал бан",
              "type": "String",
              "default": "banned_by",
              "value": "banned_by"
            },
            "hwid_bans_db_listener_id": {
              "comment": "ID подключения слушателя БД. Если подключен, при изменении таблицы извне (сайт и т.п.) - в игре тут же будет применён/снят бан. Значение -1 отключает опцию",
              "range": "От -1 до 2147483647",
              "type": "int",
              "default": 0,
              "value": 0
            },
            "users_table": {
              "comment": "Имя таблицы с игроками",
              "type": "String",
              "default": "dle_users",
              "value": "dle_users"
            },
            "hwid_bans_table": {
              "comment": "Имя таблицы с HWID банами",
              "type": "String",
              "default": "punishments_hwid_bans",
              "value": "punishments_hwid_bans"
            },
            "hwid_bans_server_id_column": {
              "comment": "Колонка с ID сервера",
              "type": "String",
              "default": "server_id",
              "value": "server_id"
            }
          }
        },
        "debug_without_database": {
          "comment": "Отладка мода без подключения к БД",
          "type": "boolean",
          "default": false,
          "value": false
        },
        "server_id": {
          "comment": "ID сервера. Записывается в server_id колонку в таблицах мода. Также все наказания с другим server_id будут игнорироваться для текущего сервера. Если на вашем проекте общие баны меж серверами - можно оставить по умолчанию (0). Если баны на каждый сервер свои - укажите уникальный ID в конфиге каждого сервера",
          "range": "От -2147483648 до 2147483647",
          "type": "int",
          "default": 0,
          "value": 0
        }
      }
    },
    "max_entries_per_page": {
      "comment": "Максимальное кол-во строк наказаний в списках, выводимых командами /bans /banips /hardbans /mutes",
      "range": "От 1 до 2147483647",
      "type": "int",
      "default": 10,
      "value": 10
    },
    "immune": {
      "properties": {
        "check_perms_lvl": {
          "comment": "Запретить выдачу наказаний, если целевой игрок имеет статус выше того, кто выполняет команду. Статус определяется как приоритет самой наивысшей permissions-группы отправителя (для консоли/api - приоритет максимальный)",
          "type": "boolean",
          "default": true,
          "value": true
        },
        "mute_immune_users": {
          "comment": "Список имен игроков, которые не могут быть замучены не при каких условиях (Исключение - команда из консоли)",
          "type": "Set<String>",
          "default": [
            "daniorio"
          ],
          "value": [
            "daniorio"
          ]
        },
        "ban_immune_users": {
          "comment": "Список имен игроков, которые не могут быть забанены не при каких условиях (Исключение - команда из консоли)",
          "type": "Set<String>",
          "default": [
            "daniorio"
          ],
          "value": [
            "daniorio"
          ]
        },
        "kick_immune_users": {
          "comment": "Список имен игроков, которые не могут быть выгнаны не при каких условиях (Исключение - команда из консоли)",
          "type": "Set<String>",
          "default": [
            "daniorio"
          ],
          "value": [
            "daniorio"
          ]
        }
      }
    },
    "notify": {
      "properties": {
        "mute_broadcast": {
          "comment": "Оповещать всех игроков при муте игрока",
          "type": "boolean",
          "default": true,
          "value": true
        },
        "unban_broadcast": {
          "comment": "Оповещать всех игроков при разбане игрока",
          "type": "boolean",
          "default": false,
          "value": false
        },
        "ban_broadcast": {
          "comment": "Оповещать всех игроков при бане игрока",
          "type": "boolean",
          "default": true,
          "value": true
        },
        "unmute_broadcast": {
          "comment": "Оповещать всех игроков при размуте игрока",
          "type": "boolean",
          "default": false,
          "value": false
        },
        "hard_ban_broadcast": {
          "comment": "Оповещать всех игроков при HWID бане игрока. Если на сервере никого нет с целевым HWID - сообщение выедено не будет",
          "type": "boolean",
          "default": false,
          "value": false
        },
        "ip_ban_broadcast": {
          "comment": "Оповещать всех игроков при IP бане игрока. Если на сервере никого нет с целевым IP - сообщение выедено не будет",
          "type": "boolean",
          "default": false,
          "value": false
        },
        "kick_broadcast": {
          "comment": "Оповещать всех игроков при кике игрока",
          "type": "boolean",
          "default": true,
          "value": true
        }
      }
    }
  }
}

SQL скрипт развёртывания структуры БД для мода:

create table punishments_ip_bans
(
    ip       varchar(15)        not null,
    server_id  tinyint unsigned not null,
    banned_at  datetime         not null,
    expires_at datetime         null,
    banned_by  varchar(36)      null,
    reason     varchar(256)     not null,
    primary key (ip, server_id)
)
    charset = utf8mb3;

create table punishments_bans
(
    uuid       varchar(36)      not null,
    server_id  tinyint unsigned not null,
    banned_at  datetime         not null,
    expires_at datetime         null,
    banned_by  varchar(36)      null,
    reason     varchar(256)     not null,
    primary key (uuid, server_id)
)
    charset = utf8mb3;

create table punishments_mutes
(
    uuid       varchar(36)      not null,
    server_id  tinyint unsigned not null,
    muted_at   datetime         not null,
    expires_at datetime         null,
    muted_by   varchar(36)      null,
    reason     varchar(256)     not null,
    primary key (uuid, server_id)
)
    charset = utf8mb3;

create table punishments_hwid_bans
(
    hwid       bigint           not null, -- Тип данных можно заменить под тот, который используется в колонке hwid в таблице игроков, мод подстроится
    server_id  tinyint unsigned not null,
    banned_at  datetime         not null,
    expires_at datetime         null,
    banned_by  varchar(36)      null,
    reason     varchar(256)     not null,
    primary key (hwid, server_id)
)
    charset = utf8mb3;


-- Это пример триггера для синхронизации HWID банов с GravitLauncherServer
create definer = root@localhost trigger after_hardban_insert
    after insert
    on punishments_hwid_bans
    for each row
BEGIN
UPDATE hwids SET banned = true WHERE id = NEW.hwid;
END;

create definer = root@localhost trigger after_hardban_remove
    after delete
on punishments_hwid_bans
    for each row
BEGIN
UPDATE hwids SET banned = false WHERE id = OLD.hwid;
END;

Команды:

Команда
Права и атрибуты
Описание

/ban <игрок> [длительность] [причина]

Основные права:

  • command.punishments.ban

Дополнительные права:

  • command.punishments.ban.permanent - выдача бессрочного наказания

Дополнительные атрибуты:

  • command.punishments.ban.max_duration - лимит длительности выдаваемого наказания в секундах

Блокирует (банит) игрока

Длительность указывается опционально через префиксы d(дни), h(часы), m(минуты), s(секунды). Пример: 1d4h5s - 1 день 4ч 5сек. Если длительность не указана - при наличии permanent права наказание бессрочно, иначе на максимально возможное время с учетом атрибута. Причина также указывается опционально

/banip <игрок | IP> [длительность] [причина]

Основные права:

  • command.punishments.banip

Дополнительные права:

  • command.punishments.banip.permanent - выдача бессрочного наказания

Дополнительные атрибуты:

  • command.punishments.banip.max_duration - лимит длительности выдаваемого наказания в секундах

Блокирует (банит) игрока по IP Первый аргумент команды - ник онлайн игрока, либо вручную введенный IPv4 адрес

Длительность указывается опционально через префиксы d(дни), h(часы), m(минуты), s(секунды). Пример: 1d4h5s - 1 день 4ч 5сек. Если длительность не указана - при наличии permanent права наказание бессрочно, иначе на максимально возможное время с учетом атрибута. Причина также указывается опционально

/hardban <игрок> [длительность] [причина]

Основные права:

  • command.punishments.hardban

Дополнительные права:

  • command.punishments.hardban.permanent - выдача бессрочного наказания

Дополнительные атрибуты:

  • command.punishments.hardban.max_duration - лимит длительности выдаваемого наказания в секундах

Блокирует (банит) игрока по железу Первый аргумент команды - ник игрока. Если для него в БД не нашлось валидного HWID - блокировка не удастся, будет выведено предупреждение. HWID считается валидным, если НЕ равен значениям 0, null, пустрой строке

Длительность указывается опционально через префиксы d(дни), h(часы), m(минуты), s(секунды). Пример: 1d4h5s - 1 день 4ч 5сек. Если длительность не указана - при наличии permanent права наказание бессрочно, иначе на максимально возможное время с учетом атрибута. Причина также указывается опционально

/mute <игрок> [длительность] [причина]

Основные права:

  • command.punishments.mute

Дополнительные права:

  • command.punishments.mute.permanent - выдача бессрочного наказания

Дополнительные атрибуты:

  • command.punishments.mute.max_duration - лимит длительности выдаваемого наказания в секундах

Блокирует (мутит) чат игроку

Длительность указывается опционально через префиксы d(дни), h(часы), m(минуты), s(секунды). Пример: 1d4h5s - 1 день 4ч 5сек. Если длительность не указана - при наличии permanent права наказание бессрочно, иначе на максимально возможное время с учетом атрибута. Причина также указывается опционально

/unban <игрок>

Основные права:

  • command.punishments.unban

Снимает блокировку с игрока

/unbanip <IPv4>

Основные права:

  • command.punishments.unbanip

Снимает блокировку указанного IPv4 адреса

/unhardban <игрок>

Основные права:

  • command.punishments.unhardban

Снимает блокировку с HWID (железа) указанного игрока

/unmute <игрок>

Основные права:

  • command.punishments.unmute

Снимает блокировку чата (мут) с указанного игрока

/bans [игрок | страница]

Основные права:

  • command.punishments.bans

Показывает информацию о действующем бане указанного игрока / все действующие баны Если указан игрок - выведет активное наказание для него (если есть) Если указано число - выводит заданную страницу из списка всех наказаний Если ничего не указано - выводит первую страницу списка всех наказаний

/banips [IPv4 | страница]

Основные права:

  • command.punishments.banips

Показывает информацию о действующем бане указанного IPv4 адреса / все действующие баны Если указан IP - выведет активное наказание для него (если есть) Если указано число - выводит заданную страницу из списка всех наказаний Если ничего не указано - выводит первую страницу списка всех наказаний

/hardbans [игрок | страница]

Основные права:

  • command.punishments.hardbans

Показывает информацию о действующем HWID (по железу) бане указанного игрока / все действующие баны по железу Если указан игрок - выведет активное наказание для него (если есть) Если указано число - выводит заданную страницу из списка всех наказаний Если ничего не указано - выводит первую страницу списка всех наказаний

/mutes [игрок | страница]

Основные права:

  • command.punishments.mutes

Показывает информацию о действующей блокировки чата (муте) указанного игрока / все действующие блокировки чатов Если указан игрок - выведет активное наказание для него (если есть) Если указано число - выводит заданную страницу из списка всех наказаний Если ничего не указано - выводит первую страницу списка всех наказаний

/searchtwinnks byip <игрок | IPv4>

Основные права:

  • command.punishments.searchtwinks

  • command.punishments.searchtwinks.byip

Находит всех онлайн игроков с указанным IP адресом

Можно передать как адрес напрямую, так и игрока - тогда будет взят его текущий адрес и выполнен поиск по нему

/searchtwinnks byhard <игрок>

Основные права:

  • command.punishments.searchtwinks

  • command.punishments.searchtwinks.byhard

Находит всех игроков (в т.ч. оффлайн) с совпадающим HWID с указанным игроком Если для указанного игрока HWID неизвестен - выдаст предупреждение

/punishments reload

Основные права:

  • command.punishments.punishments

  • command.punishments.punishments.reload

Перезагружает кешируемые в памяти наказания с базы данных

/kick <игрок> [причина]

Основные права:

  • command.punishments.kick

Выгоняет игрока с сервера

Дополнительные права мода:

Право
Описание

punishments.ban.immune

Защищает пользователя от получения блокировок (банов). Защиту обходит только консоль

punishments.mute.immune

Защищает пользователя от получения блокировок чата (мутов). Защиту обходит только консоль

Last updated