Farmstead Mods
EN

Модерация

Баны, временные баны, IP-баны, кики, муты, тюрьма, ваниш и заморозка.

На этой странице

Команды 42#

КомандаСинтаксисАлиасыПравоОписание
/ban/ban <player> [reason]—neoessentials.moderation.banBan a player<player> — StringArgumentType.word, сначала онлайн (без учёта регистра), иначе кэш профилей сервера; офлайн-бан возможен. Без [reason] подставляется moderation.banSettings.defaultBanReason. Закрыто neoessentials.moderation.ban на корне. Повторный бан того же UUID возвращает false, пока запись active.
/banip/banip <ip> [reason]—neoessentials.moderation.banipBan an IP address<ip> — одно слово; принимается только IPv4 из четырёх октетов 0–255, ник подставлять нельзя. Кикает всех онлайн с этим адресом. enableIPBans: false → banIP возвращает false. Право neoessentials.moderation.banip. Без причины — defaultBanReason.
/banlist/banlist [players | ips]—neoessentials.moderation.banlistList banned playersБез аргумента выполняется ветка players. players при чтении архивирует истёкшие temp-баны, если autoExpireTempBans включён. ips отдаёт сырой Map ipBans без фильтра истечения. Право neoessentials.moderation.banlist.
/clearwarnings/clearwarnings <player>—neoessentials.moderation.warnClear all warnings for a playerСтирает все варны цели. Право neoessentials.moderation.warn.
/deljail/deljail <name>—neoessentials.moderation.setjailDelete a jail locationПраво то же, что setjail. Сидящих не выпускает — только предупреждает, сколько их было. Пока локации нет, canPlayerMove возвращает true, но isPlayerJailed остаётся true до /unjail или входа (вход без локации сам снимает тюрьму).
/freeze/freeze <player> [reason]—neoessentials.moderation.freezeFreeze a playerТолько онлайн (getPlayerByName). Без причины — freezeSettings.defaultFreezeReason. Уже замороженный — ошибка. Пишет коллекцию freezes. Право neoessentials.moderation.freeze.
/freezeall/freezeall [reason]—neoessentials.moderation.freezeallFreeze all playersОпциональный greedy reason есть в дереве. Не трогает отправителя и уже замороженных. Право neoessentials.moderation.freezeall.
/freezelist/freezelist—neoessentials.moderation.freezelistList frozen playersПраво neoessentials.moderation.freezelist.
/history/history <player>—neoessentials.moderation.historyView a player's moderation history (alias)dispatcher.redirect на узел modhistory. Регистрируется только если commands.modhistory включён. То же право neoessentials.moderation.history.
/jail/jail <player> <jail> [duration_or_reason]—neoessentials.moderation.jailJail a player<jail> — имя локации. Хвост greedy, как у /mute: токен 30m/1h/… — срок, иначе вся строка — причина бессрочной посадки. Офлайн через кэш профилей. Право neoessentials.moderation.jail. Нужна существующая локация (и хотя бы одна, если requireJailLocation).
/jailfor/jailfor <player> <jail> <duration> [reason]—neoessentials.moderation.jailJail a player for a set duration<duration> обязателен и должен совпасть с тем же regexp, что у /jail, иначе invalid_duration. Доступ: neoessentials.moderation.jail.timed или neoessentials.moderation.jail (validateAnyPermission; в LuckPerms родительский узел не подразумевает .timed).
/jailinfo/jailinfo [jail]—neoessentials.moderation.jailinfoShow info about a jailБез имени — все локации; с именем — одна плюс число сидящих. Аргумент — имя клетки, не игрока. Право neoessentials.moderation.jailinfo.
/jaillist/jaillist—neoessentials.moderation.jaillistList all jail locationsВопреки каталогу /help это список посаженных игроков, не локаций. Локации — /jailinfo без аргумента. Право neoessentials.moderation.jaillist.
/jails/jails—neoessentials.moderation.jaillistList all jail locations (alias)Отдельный literal с тем же executeJailList, что /jaillist (посаженные, не локации). Право neoessentials.moderation.jaillist. Не redirect.
/kick/kick <player> [reason]—neoessentials.moderation.kickKick a playerТолько онлайн. Себя кикнуть нельзя. Без [reason] в дереве зашито «Kicked by an operator», не defaultKickReason из конфига. Экран — kickSettings.kickMessage с {reason}/{kicker}. Пишет коллекцию kicks. Право neoessentials.moderation.kick.
/kickall/kickall [reason]—neoessentials.moderation.kickallKick all playersКикает всех, кроме отправителя. Без причины в дереве зашито «Server maintenance»; текст экрана — kickAllMessage. Право neoessentials.moderation.kickall.
/modhistory/modhistory <player>—neoessentials.moderation.historyView a player's full moderation history (bans/mutes/kicks/warns)Онлайн, иначе кэш профилей — как PublicModerationEndpoint. Секции банов, мутов, киков и предупреждений, по 5 строк. Показывает причину, выдавшего, дату, активность записи и бессрочный срок. Право neoessentials.moderation.history.
/mute/mute <target> [duration_or_reason]—neoessentials.chat.muteMute a player<target> — EntityArgument.player(), только онлайн. Корень закрыт neoessentials.chat.mute (консоль проходит). duration_or_reason — greedy: первое слово вида 30m/1h/1d/2w снимается как срок, остальное — причина; без такого слова вся строка — причина, мут бессрочный. Цель с neoessentials.chat.mute.exempt (hasPermissionExplicit) не мьютится. Отдельный literal silence копирует это дерево, в этой странице не заявлен.
/mutelist/mutelist—neoessentials.chat.muteList muted playersБез аргументов. Корень закрыт neoessentials.chat.mute. Лениво протухает истекшие через isMuted. Консоль допускается.
/note/note <player> <text>—neoessentials.moderation.noteAdd a staff note to a player's record<text> обязателен (greedy). Первый note офлайн-игроку без уже существующих notes не резолвится — кэш профилей не смотрят. Право neoessentials.moderation.note.
/notes/notes <player>—neoessentials.moderation.notesView staff notes for a playerДо 5 записей, страниц нет. Право neoessentials.moderation.notes (отдельный от note).
/removenote/removenote <player> <noteId>—neoessentials.moderation.noteRemove a specific note by IDПрефикс 8 символов, как у removewarn. Право neoessentials.moderation.note.
/removewarn/removewarn <player> <warnId>—neoessentials.moderation.warnRemove a specific warning by ID<warnId> — word; достаточно префикса в 8 символов из /warnings. Право neoessentials.moderation.warn.
/report/report <player> <reason>—neoessentials.moderation.reportReport a player for staff reviewТолько игрок, не консоль; себя нельзя. Цель: онлайн или кэш профилей. Узел neoessentials.moderation.report по умолчанию выдан всем. Онлайн-стафф с neoessentials.moderation.reports получает английскую строку в чат, жалоба всё равно пишется в reports.
/reports/reports—neoessentials.moderation.reportsView the pending report queueОчередь PENDING, до 8 строк, страниц нет. Право neoessentials.moderation.reports.
/reviewreport/reviewreport <id> accept|dismiss [notes]—neoessentials.moderation.reportsAccept or dismiss a player reportВетки — литералы accept и dismiss, не свободное слово. <id> резолвится через findById (короткий префикс, если менеджер так ищет). Статусы REVIEWED / DISMISSED. Право neoessentials.moderation.reports.
/setjail/setjail <name> [sphere <radius> | cuboid]—neoessentials.moderation.setjailSet jail locationТолько игрок. Голый /setjail <name>: WorldEdit cuboid → иначе сфера в ногах с jailSettings.defaultSphereRadius. sphere <radius> — Double ≥ 1.0 в текущей позиции. cuboid требует выделение WE. Право neoessentials.moderation.setjail.
/tempban/tempban <player> <duration> [reason]—neoessentials.moderation.tempbanTemporarily ban a player<duration> — word, не greedy: «30m», «2h», «1d», не «1h 30m». Разбор BanManager.parseDuration; 0 или неизвестный формат → invalid_duration. Цель как у /ban (онлайн, иначе кэш). Право neoessentials.moderation.tempban. enableTempBans: false блокирует выдачу.
/tempbanip/tempbanip <ip> <duration> [reason]—neoessentials.moderation.tempbanipTemporarily ban an IP addressТот же IPv4-фильтр, что /banip, та же <duration>-word, что /tempban. Кикает онлайн с этим IP. Хранится expireTime в ip_bans. Право neoessentials.moderation.tempbanip.
/togglejail/togglejail <player>—neoessentials.moderation.jailToggle a player's jail stateТолько онлайн. Если уже в тюрьме — unjail; иначе сажает в getAllJailLocations().getFirst() с причиной «Toggled by staff» без срока. Пустой список локаций → ошибка. Право neoessentials.moderation.jail.
/unban/unban <player>—neoessentials.moderation.unbanUnban a playerИмя ищется в активных банах, затем в кэше профилей. Снимает по UUID, пишет unbannedBy/unbannedAt, запись остаётся в той же коллекции player_bans с active: false. Право neoessentials.moderation.unban.
/unbanip/unbanip <ip>—neoessentials.moderation.unbanipUnban an IP addressСнимает активный IP-бан, архивирует с unbannedBy. Автодополнение — текущие ключи ip_bans. Право neoessentials.moderation.unbanip.
/unfreeze/unfreeze <player>—neoessentials.moderation.unfreezeUnfreeze a playerСначала ищет в списке замороженных (офлайн тоже), иначе онлайн. Право neoessentials.moderation.unfreeze.
/unfreezeall/unfreezeall—neoessentials.moderation.unfreezeallUnfreeze all playersСнимает всех в freezes, в том числе офлайн. Право neoessentials.moderation.unfreezeall.
/unjail/unjail <player>—neoessentials.moderation.unjailRelease a player from jailОнлайн или кэш профилей. Телепорт на originalLocation, если она была записана (онлайн на момент посадки). Право neoessentials.moderation.unjail.
/unmute/unmute <target>—neoessentials.chat.muteUnmute a playerСнова EntityArgument.player() — снять мут с офлайн-игрока командой нельзя, хотя запись живёт в mutes. Корень закрыт neoessentials.chat.mute. Регистрация пропускается, если чат или commands.unmute выключены.
/unvanish/unvanish [player]—neoessentials.moderation.vanishDisable vanish modeПринудительно выключает. Без аргумента — себе; чужой — vanish.others. Право корня neoessentials.moderation.vanish. Цель только онлайн.
/v/v [player]—neoessentials.moderation.vanishToggle vanish mode (alias)Полная копия /vanish, не Brigadier-redirect. Регистрируется вместе с vanish, отдельного commands.v нет.
/vanish/vanish [player]—neoessentials.moderation.vanishToggle vanish modeБез аргумента — себе (только игрок). Чужой <player> закрыт neoessentials.moderation.vanish.others, цель только онлайн. Корень — neoessentials.moderation.vanish. Переключатель: повторный вызов снимает ваниш. Состояние пишется в vanishes. /v копирует это дерево, если включён commands.vanish.
/vanishlist/vanishlist—neoessentials.moderation.vanishlistList vanished playersОфлайн, но ещё в vanishes, показывается UUID. Право neoessentials.moderation.vanishlist.
/warn/warn <player> [reason]—neoessentials.moderation.warnIssue a warning to a playerБез причины — «No reason given.». UUID: онлайн, иначе уже существующие warns (кэш профилей не используется — первого варна офлайн-игроку без истории нет). Право neoessentials.moderation.warn.
/warnings/warnings <player>—neoessentials.moderation.warningsView warnings for a player<player> обязателен. Печатает до 5 записей, листания нет. Право neoessentials.moderation.warnings.

Примеры#

Закрыть IP, а не ник, и проверить срок#

Альт на том же адресе не должен зайти после бана основного аккаунта. Нужен и вечный IP-бан, и временный.

/banip 203.0.113.10 griefing
/banlist ips
/tempbanip 203.0.113.20 2h proxy
/unbanip 203.0.113.10

В /banip и /tempbanip идёт адрес, не ник: «Steve» не пройдёт isValidIP (ровно 4 октета 0–255). Все онлайн с 203.0.113.10 сразу отключаются шаблоном ipBanMessageFormat. Запись живёт в коллекции ip_bans того же storage.type, что и весь мод; веб-панель пишет туда же через POST /api/moderation/ipban. Временный бан хранит expireTime: isIPBanned на входе и планировщик раз в checkExpiredBansInterval секунд (по умолчанию 300) при autoExpireTempBans: true архивируют его с unbannedBy = null. /banlist ips истечение в строке не печатает — в отличие от /banlist players.

Временный бан игрока и общая история с панелью#

Выдать 30 минут, убедиться, что после истечения зайти можно, а запись не стёрлась — и что панель показывает то же, что игра.

/tempban Steve 30m cheating
/banlist
/modhistory Steve
/unban Steve

Steve кикается tempBanMessageFormat ({reason}, {bannedBy}, {expiry}). UUID резолвится онлайн или из кэша — офлайн-tempban работает, если игрок когда-то заходил. /banlist без аргумента = players и при чтении сам архивирует просроченное. /modhistory читает BanManager.getBanHistory + MuteManager + KickManager + WarnManager — те же коллекции, что GET /api/moderation/bans/{uuid} и публичный lookup. /unban не удаляет документ: active: false, заполняются unbannedBy/unbannedAt. Повторный /ban того же UUID, пока бан active, не накладывается поверх.

Посадить на срок и отличить /jail от /jailfor#

Клетка у спавна, Steve на два часа, Alex строго через отдельную команду. По истечении — автовыпуск без /unjail.

/setjail spawn
/jail Steve spawn 2h griefing
/jailfor Alex spawn 30m
/jaillist
/jailinfo spawn

/setjail spawn без хвоста ставит сферу радиуса defaultSphereRadius (10.0) в ногах, если нет палочной/WE-выделенки. У /jail хвост greedy: слово 2h совпало с regexp срока — посадка timed, expireAt = now+2h, причина griefing. /jailfor без duration в дереве нет. Раз в секунду (20 тиков) и на входе checkJailTimeout снимает истёкших и пишет jail.released_expired. /jaillist печатает сидящих; координаты клетки — /jailinfo. Счётчик maxJailsBeforeTempBan/PermBan (3 и 6 в шаблоне) живёт только в памяти процесса: после рестарта эскалация начинается с нуля, на третий jail той же сессии придёт auto_tempban_notice, на шестой — permban вместо посадки.

Ваниш переживает перезаход, «видеть ваниш» — нет#

Спрятаться, выйти, зайти снова — остаться невидимым. Понять, почему коллега без отдельного тира вас не видит даже с OP.

/vanish
/vanishlist
/unvanish

UUID и число priority пишутся в коллекцию vanishes и поднимаются при старте. onPlayerLeave состояние не чистит; на входе через 1 тик снова шлются пакеты скрытия. vanishOnJoin — отдельный флажок: при true любой с neoessentials.moderation.vanish автоматически ванишится, даже если раньше не прятался (в шаблоне false). Кто видит ваниш: узел neoessentials.vanish.priority. из ряда 1000, 500, 250, 100, 50, 25, 10, 5, 1, проверка hasPermissionStrict — OP и голый neoessentials.* тир не дают. Равный или больший тир видит младшего; тир 0 не видит никого. Карта viewerPriorities (сессионный «see vanished») в DataStore не пишется и ни одна команда её не заполняет: литерала /vanish see в дереве нет.

Мут на час в игре — и почему IP-мут только в панели#

Заглушить онлайн-нарушителя на срок так, чтобы /mutelist, /modhistory и панель показали одну запись. Понять предел команды относительно панели.

/mute Steve 1h spam in chat
/mutelist
/modhistory Steve
/unmute Steve

Steve должен быть онлайн: EntityArgument.player() офлайн не принимает, хотя MuteManager ключует имя в нижнем регистре и переживает рестарт (коллекция mutes). 1h снимается как duration, spam in chat — причина; цель сразу получает target_notification. Чат, /msg и почта режутся isMuted по имени. Панель POST /api/moderation/mute бьёт в тот же MuteManager (duration там в секундах, не «1h»). IP-мут — только POST /api/moderation/ipmute → коллекция ip_mutes: игровой команды нет, и ChatMuteGuard isIPMuted не вызывает, так что IP-мут сам по себе чат не глушит. /unmute снова требует онлайн-цель.

Тонкие места#

Одна витрина наказаний: игра и панель#

BanManager, MuteManager, KickManager, WarnManager, NoteManager, ReportManager, JailManager, FreezeManager, VanishManager пишут в коллекции player_bans, ip_bans, mutes, ip_mutes, kicks, warns, notes, reports, jails, jail_locations, freezes, vanishes активного storage.type. ModerationEndpoint и PublicModerationEndpoint вызывают те же методы, что команды, а не отдельную таблицу. Исключение по единицам времени: тело панели передаёт duration в секундах (durationSeconds * 1000), в игре — токены 30m/2h. duration: -1 в POST /api/moderation/ban = вечный бан.

Что делать: После бана из панели смотрите /banlist и /modhistory <player> — это не «другая база». Не путайте секунды API с суффиксами команд.

Срок бана: что снимает его само#

expireTime > 0 && now > expireTime — истёк. Для игроков /banlist (players), isPlayerBanned на входе и планировщик checkExpiredBansInterval архивируют запись (unbannedBy пустой). Для IP планировщик и isIPBanned на входе делают то же, но /banlist ips отдаёт сырую карту и может показать уже мёртвый temp-бан до следующего тика очистки. autoExpireTempBans: false оставляет ключ в карте, проверки возвращают «не забанен», архива нет. parseDuration понимает s/m/h/d/w/mo/y; у /tempban* аргумент word, пробельный «1h 30m» в дерево не влезет; «1h30m» как одно слово станет 130 минутами (цифры склеиваются, суффикс hm падает в default = минуты).

Что делать: Для составного срока пишите одно слово с одной единицей или несколько через запятую без пробела-разделителя аргументов. Не ждите, что /banlist ips мгновенно спрячет истекшее — смотрите вход или подождите интервал.

/mute, /unmute, /mutelist закрыты узлом и бьют только по онлайну#

Корень трёх команд закрыт neoessentials.chat.mute: без выдачи их нет в дереве и в tab-complete (консоль проходит). <target> — EntityArgument.player(), офлайн нельзя ни выдать, ни снять, хотя запись в mutes переживает рестарт. /mute регистрируется всегда (плюс literal silence); /unmute и /mutelist не вешаются, если чат или их флаг в commands выключены. Срок в первом слове greedy: regexp без mo/y, поэтому /mute Steve 1mo воспримет 1mo как причину, не как месяц.

Что делать: Модераторам выдайте neoessentials.chat.mute. Офлайн-мут — POST /api/moderation/mute по имени.

Ваниш в vanishes, приоритет зрителя — только сессия и без команды#

Исчезнувший UUID+priority персистятся. viewerPriorities (режим «see vanished») специально не пишется и с легаси-файла не мигрируется. enableSeeVanished / toggleSeeVanished в менеджере есть, из Brigadier их никто не зовёт — /vanish see нет. Реальный просмотр: neoessentials.vanish.priority.<tier> через hasPermissionStrict (не OP-bypass, не голый neoessentials.*). Тир 0 не видит ваниш. vanishOnJoin ванишит вход штаба с neoessentials.moderation.vanish, это не то же самое, что восстановление уже записанного vanishes.

Что делать: Штабу, который должен видеть коллег, выдайте конкретный neoessentials.vanish.priority.50 (или выше цели). Не рассчитывайте, что OP сам по себе видит ваниш.

Срок тюрьмы и автоэскалация#

expireAt в коллекции jails. Проверка каждую секунду у онлайн и на логине; офлайн сидит до входа, даже если часы вышли, пока checkJailTimeout не отработает. /jail <p> <jail> 2h reason и /jailfor пишут один и тот же путь. Счётчик повторных посадок (jailCounts) не сериализуется: /neoe reload/рестарт обнуляет его, зато внутри аптайма 3-я посадка (шаблон maxJailsBeforeTempBan) даёт temp-бан tempBanDurationMinutes (1440), 6-я — вечный бан System / «Exceeded maximum jailings», посадка не создаётся, вызывающему уходит auto_*ban_notice. Perm-проверка идёт первой: если оба порога равны, temp-ветка мертва.

Что делать: Держите maxJailsBeforePermBan строго выше temp. Для тестов /jail на одном аккаунте либо поднимите пороги, либо рестартуйте, чтобы счётчик сбросился.

/jaillist — не список клеток; /deljail не выпускает#

executeJailList печатает getAllJailedPlayers(). Локации — /jailinfo без аргумента. /jails — тот же список сидящих. /deljail удаляет jail_locations, сидящие остаются в jails: движение больше не возвращает в клетку (canPlayerMove true, если локации нет), ломание/атака всё ещё режутся по isPlayerJailed. На следующем входе без локации игрока снимут автоматически.

Что делать: Перед сносом клетки пройдите /jaillist и /unjail. Координаты клеток смотрите /jailinfo, не /jaillist.

Кто резолвится офлайн, а кто нет#

/ban//tempban//jail//report//modhistory — онлайн, затем кэш профилей. /warn//note — онлайн, затем только уже лежащие warns/notes: первого варна или note человеку, который не в игре и без истории, не будет, даже если он в кэше. /freeze//vanish//kick//mute//togglejail — только онлайн. /unfreeze сначала смотрит freeze-список (офлайн можно разморозить).

Что делать: Первый /warn//note — пока цель в игре, либо сразу через панель (она резолвит имя своими правилами).

/banip не принимает ник и не принимает IPv6#

Игровой isValidIP — только dotted IPv4. Панель перед BanManager/MuteManager пропускает и IPv6. Забанить «IP игрока», подставив ник в /banip, нельзя: будет invalid_ip. Кик по IP сравнивает строку getPlayerIP как есть.

Что делать: Адрес берите из лога входа или из панели. IPv6-бан — только dashboard /api/moderation/ipban.

Замороженный не пишет в чат; ваниш глушит звук шагов#

ChatHandler отменяет чат, если FreezeManager.isPlayerFrozen. Ваниш ставит setSilent(true) — шаги не слышны соседям. Freeze переживает рестарт (freezes) и на входе шлёт reminder; позиция заморозки дописывается, если была пуста.

Что делать: Ничего чинить не нужно; если «не пишет» после /freeze — так и задумано, не путать с мутом.

Известные проблемы#

IP-мут из панели не закрывает чат#

MuteManager.muteIP / коллекция ip_mutes / маршруты /api/moderation/ipmute существуют, isIPMuted объявлен. ChatMuteGuard и ChatHandler проверяют только isMuted по имени игрока; вызовов isIPMuted в моде больше нет. Игровой команды IP-мута тоже нет. Запись в хранилище появляется, чат, /msg и почта идут как обычно.

Что делать: Глушите имя через /mute или POST /api/moderation/mute. IP-бан (/banip) по-прежнему не пускает на сервер — это другой механизм.

Штабной пинг /report не локализуется#

/modhistory использует локализованные строки и спокойный формат с причиной, выдавшим и датой. После /report онлайн с neoessentials.moderation.reports всё ещё получают сырую строку [Report] <nick> reported <nick>: <reason>, минуя lang.

Что делать: Историю наказаний смотрите через /modhistory <player>. Для пинга новых жалоб используйте панель, если нужен русскоязычный интерфейс.

Права 41#

УзелВ реестреЧто даёт
neoessentials.jail.allow-attackреестр: нетAttack entities while jailed
neoessentials.jail.allow-breakреестр: нетBreak blocks while jailed
neoessentials.jail.allow-interactреестр: нетInteract with blocks/items while jailed
neoessentials.jail.allow-placeреестр: нетPlace blocks while jailed
neoessentials.jail.bypassреестр: нетBuild/break inside jail cells (maintenance)
neoessentials.moderation.banреестр: нетBan players
neoessentials.moderation.banipреестр: нетBan IP addresses
neoessentials.moderation.banlistреестр: нетView ban list
neoessentials.moderation.clearwarningsреестр: нетClear all warnings for a player
neoessentials.moderation.deljailреестр: нетDelete jail locations
neoessentials.moderation.freezeреестр: нетFreeze players
neoessentials.moderation.freezeallреестр: нетFreeze all players
neoessentials.moderation.freezelistреестр: нетView frozen players list
neoessentials.moderation.jailреестр: нетJail players, indefinitely or for a set duration (/jail, /jailfor)
neoessentials.moderation.jail.timedреестр: нетJail players for a set duration (/jailfor) - neoessentials.moderation.jail grants this too
neoessentials.moderation.jailinfoреестр: нетView jail location info
neoessentials.moderation.jaillistреестр: нетView jailed players
neoessentials.moderation.kickреестр: нетKick players
neoessentials.moderation.kickallреестр: нетKick all players
neoessentials.moderation.noteреестр: нетAdd/remove staff notes on a player (/note, /removenote)
neoessentials.moderation.notesреестр: нетView a player's staff notes (/notes)
neoessentials.moderation.notificationsреестр: нетReceive moderation event broadcasts
neoessentials.moderation.notifyреестр: нетReceive moderation notifications
neoessentials.moderation.reportреестр: даReport another player (/report)
neoessentials.moderation.reportsреестр: нетView and resolve the report queue (/reports, /reviewreport)
neoessentials.moderation.seevanishedреестр: нетSee vanished players
neoessentials.moderation.setjailреестр: нетCreate jail locations
neoessentials.moderation.stafflogреестр: нетReceive the private in-game moderation log
neoessentials.moderation.tempbanреестр: нетTemporarily ban players
neoessentials.moderation.tempbanipреестр: нетTemporarily ban an IP address
neoessentials.moderation.togglejailреестр: нетToggle a player's jail state
neoessentials.moderation.unbanреестр: нетUnban players
neoessentials.moderation.unbanipреестр: нетUnban IP addresses
neoessentials.moderation.unfreezeреестр: нетUnfreeze players
neoessentials.moderation.unfreezeallреестр: нетUnfreeze all players
neoessentials.moderation.unjailреестр: нетUnjail players
neoessentials.moderation.vanishреестр: нетVanish self
neoessentials.moderation.vanish.othersреестр: нетVanish other players
neoessentials.moderation.vanishlistреестр: нетView vanished players list
neoessentials.moderation.warnреестр: нетIssue warnings to players (/warn)
neoessentials.moderation.warningsреестр: нетView player warning history (/warnings)

Подробное руководство#

Раздел ниже — исходная документация проекта (docs/Wiki/ModerationSystem.md). Ссылки на другие страницы вики переписаны на этот сайт; текст самих руководств не редактируется, чтобы синк с апстримом не давал конфликтов.

Version: 1.0.5+build.54 · Config: config.json → moderation / storage sections


Overview#

Comprehensive player moderation — ban, temp-ban, IP ban, kick, mute (with IP mutes), jail (timed), freeze, vanish, warnings, staff notes, and player reports — all with persistent storage, full history/audit trails, permission integration, and event enforcement.

Bans, mutes, kicks, warnings, notes, and reports are backed by a single canonical store per feature (see Storage Backend below) — there is exactly one code path that enforces each punishment, and the Web Dashboard's moderation API reads and writes through the same managers, so in-game commands and dashboard actions always agree.


Bans#

Commands#

Command Syntax Permission Description
/ban /ban <player> [reason] neoessentials.moderation.ban Permanently ban a player
/tempban /tempban <player> <duration> [reason] neoessentials.moderation.tempban Temporarily ban (e.g. 30m, 2h, 1d)
/unban /unban <player> neoessentials.moderation.unban Unban a player
/banip /banip <ip> [reason] neoessentials.moderation.banip Ban an IP address (takes the IP directly, not a player name)
/tempbanip /tempbanip <ip> <duration> [reason] neoessentials.moderation.tempbanip Temporarily ban an IP
/unbanip /unbanip <ip> neoessentials.moderation.unbanip Unban an IP
/banlist /banlist [players\|ips] neoessentials.moderation.banlist View active bans (defaults to players)

Duration format: 30s · 5m · 2h · 1d · 1w

History & Audit Trail#

Every ban (player and IP) is stored with a unique ID, an active flag, optional evidence, and — once lifted — who unbanned it and when (unbannedBy / unbannedAt). Expired temp-bans are archived the same way (auto-marked inactive, no "unbanned by" staff member). Unbanning and re-banning a player never destroys their prior ban records; they remain queryable as history via the dashboard's /api/moderation/bans/{uuid} and /api/moderation/ipbans routes (see Web Dashboard).

Moderation History#

Command Syntax Permission Description
/modhistory /modhistory <player> neoessentials.moderation.history View a player's full moderation history — bans, mutes, kicks, and warns — in one summary
/history alias for /modhistory same Alias

Kicks#

Command Syntax Permission Description
/kick /kick <player> [reason] neoessentials.moderation.kick Kick a player
/kickall /kickall [reason] neoessentials.moderation.kickall Kick all players

Every kick (including dashboard-initiated kicks) is recorded with a timestamp, reason, and issuing staff member, and is queryable as history via the dashboard's /api/moderation/kicks / /api/moderation/kicks/{name} routes — there is no in-game command to view kick history.


Mutes#

Command Syntax Permission Description
/mute /mute <player> [reason] neoessentials.chat.mute Mute a player (indefinite)
/silence alias for /mute same Alias
/unmute /unmute <player> neoessentials.chat.mute Unmute a player
/mutelist /mutelist neoessentials.chat.mute List muted players

Muted players cannot chat, send private messages, or send mail. The mute system is implemented in the chat module (com.zerog.neoessentials.chat), not the moderation module — all three commands share the single neoessentials.chat.mute permission (there's no separate exempt/list/unmute node), plus neoessentials.chat.mute.exempt to make a player un-mutable.

⚠️ Unlike every other moderation command, /mute//unmute//mutelist have no root permission gate at registration — neoessentials.chat.mute is only checked deep inside the command body, not at the point Brigadier registers the command. This means all three are visible to every player in /help and can be attempted by anyone, though the body-level check should still reject an unauthorized caller — worth verifying directly if you rely on this restriction, rather than assuming registration-time enforcement like most other commands.

Like bans, every mute tracks reason, issuing staff member, an active flag, and — once lifted — unmutedBy / unmutedAt, with full history preserved. IP mutes are also supported (mute an IP directly rather than a player name) — currently exposed via the dashboard's /api/moderation/ipmute / /api/moderation/ipmutes routes rather than an in-game command.


Jail#

Jail teleports the player to a set jail location and blocks movement, interaction, combat, and teleport until released.

Commands#

Command Syntax Permission Description
/jail /jail <player> <jail> [duration] [reason] neoessentials.moderation.jail Jail permanently or for a set duration
/jailfor /jailfor <player> <jail> <duration> [reason] neoessentials.moderation.jail.timed or neoessentials.moderation.jail Jail for a set duration
/unjail /unjail <player> neoessentials.moderation.unjail Release a player from jail
/setjail /setjail <name> (auto-detect shape) · /setjail <name> sphere <radius> · /setjail <name> cuboid neoessentials.moderation.setjail Create a jail location — see Jail Region Shapes below
/deljail /deljail <name> neoessentials.moderation.setjail Delete a jail location (same permission as /setjail)
/jailwand /jailwand neoessentials.jail.wand Give yourself the jail-region selection wand
/jaillist /jaillist neoessentials.moderation.jaillist List all jail locations
/jailinfo /jailinfo [name] neoessentials.moderation.jailinfo Show info for one jail, or all jails if no name given
/jails alias for /jaillist same Alias
/togglejail /togglejail <player> neoessentials.moderation.jail Toggle jail on/off for a player

Jail Region Shapes#

A jail location can be either a sphere (radius around a point) or a cuboid (two-corner box):

  • /setjail <name> — auto-detects: uses a wand or WorldEdit cuboid selection if one is active, otherwise falls back to a sphere at your current position using moderation.jailSettings.defaultSphereRadius.
  • /setjail <name> sphere <radius> — explicit sphere at your current position.
  • /setjail <name> cuboid — cuboid from the current wand/WorldEdit selection.
  • /jailwand gives an item (configurable via moderation.jailSettings.wandItem) — right-click sets corner 1, left-click sets corner 2, then run /setjail <name> cuboid.

Jail Enforcement#

While jailed, the following are blocked: - Movement outside jail radius - Teleport commands (redirected back to jail on respawn too) - Breaking/placing blocks (unless neoessentials.jail.allow-break / allow-place) - Interactions (unless neoessentials.jail.allow-interact) - Attacking entities (unless neoessentials.jail.allow-attack)

Timed jails auto-release when the duration expires (checked every second and on login). Durations use s, m, h, d, or w, for example /jail Steve spawn-jail 2h griefing.


Freeze#

Command Syntax Permission Description
/freeze /freeze <player> [reason] neoessentials.moderation.freeze Freeze a player in place
/unfreeze /unfreeze <player> neoessentials.moderation.unfreeze Unfreeze a player
/freezeall /freezeall neoessentials.moderation.freezeall Freeze all online players
/unfreezeall /unfreezeall neoessentials.moderation.unfreezeall Unfreeze all players
/freezelist /freezelist neoessentials.moderation.freezelist List frozen players

Vanish#

Command Syntax Permission Description
/vanish /vanish [player] neoessentials.moderation.vanish (self) + neoessentials.moderation.vanish.others (targeting another player) Toggle vanish for yourself or another
/v alias same Alias
/unvanish /unvanish [player] same as above Force-disable vanish
/vanishlist /vanishlist neoessentials.moderation.vanishlist List vanished players

Broadcasting vanish toggles to staff/everyone and console logging are all config-driven (moderation.vanishSettings.broadcastToStaffVanish, etc. — see below).


Warnings#

Command Syntax Permission Description
/warn /warn <player> [reason] neoessentials.moderation.warn Issue a warning to a player
/warnings /warnings <player> neoessentials.moderation.warnings View a player's warnings and total count
/clearwarnings /clearwarnings <player> neoessentials.moderation.warn Clear all warnings for a player
/removewarn /removewarn <player> <warnId> neoessentials.moderation.warn Remove a single warning by its ID (accepts the short 8-char ID prefix)

Warnings persist for offline players and are shown with a truncated ID, timestamp, reason, and issuing staff member.


Staff Notes#

Freeform notes staff can leave on a player's record — for context that isn't a punishment (e.g. "watch this player, borderline behavior last week").

Command Syntax Permission Description
/note /note <player> <text> neoessentials.moderation.note Add a note to a player's record
/notes /notes <player> neoessentials.moderation.notes View a player's notes (paginated, 5 per page)
/removenote /removenote <player> <noteId> neoessentials.moderation.note Remove a note by ID (accepts the short 8-char prefix)

Notes persist for offline players and record author, timestamp, and text. Also available via the dashboard's /api/moderation/notes/{name} and /api/moderation/note routes.


Player Reports#

Lets players flag misbehavior even while no staff are online — reports persist and show up in the review queue whenever staff next check.

Command Syntax Permission Description
/report /report <player> <reason> neoessentials.moderation.report Report a player (default: granted to everyone)
/reports /reports neoessentials.moderation.reports Staff: view the pending review queue (8 per page)
/reviewreport /reviewreport <id> <accept\|dismiss> [notes] neoessentials.moderation.reports Staff: resolve a report, optionally with review notes

Submitting a report also immediately notifies any online staff with neoessentials.moderation.reports, in addition to persisting for later review. Reports track reporter, target, reason, timestamp, and status (PENDING / REVIEWED / DISMISSED) plus who reviewed it and when. Also available via the dashboard's /api/moderation/reports, /api/moderation/reports/all, /api/moderation/reports/{id}, and /api/moderation/reports/{id}/review routes.


Data Files & Storage Backend#

Bans, mutes (including IP mutes), kicks, warnings, notes, and reports are persisted through a pluggable DataStore abstraction rather than bespoke JSON files — configured under config.json → storage:

"storage": {
  "type": "json",
  "autoMigrate": true,
  "sqlite": { "file": "data.db" },
  "mysql": { "host": "localhost", "port": 3306, "database": "neoessentials", "username": "neoessentials", "password": "", "useSSL": false, "poolSize": 10 }
}
Key Default Description
type "json" Backend to use: json, yaml, sqlite, or mysql
autoMigrate true On first boot with an empty store, import each manager's existing legacy JSON data automatically and losslessly
sqlite.file "data.db" SQLite database filename (under neoessentials/store/)
mysql.* — Connection details for a shared MySQL database — point every server in a network at the same database to share bans/mutes/etc. in real time

Each punishment type is one collection (a schema-less table of JSON documents keyed by ID):

Collection Contents
player_bans Player bans — active and historical, with unban audit trail
ip_bans IP bans — active and historical, with unban audit trail
mutes Player mutes — active and historical, with unmute audit trail
ip_mutes IP mutes — active and historical
kicks Kick history
warns Warnings
notes Staff notes
reports Player reports
jails / jail_locations Active jail state / named jail locations
freezes / vanishes Frozen player state / vanish state

With the default json backend, collections live at neoessentials/store/<collection>.json. With yaml, neoessentials/store/<collection>.yml. With sqlite, all collections live as tables in neoessentials/store/data.db. With mysql, all collections live as tables in the configured database. If MySQL is unreachable at boot, the mod automatically falls back to the JSON backend rather than failing to start.

As of this release, storage.type covers the entire mod, not just moderation — economy, homes/warps/spawn, kits, chat (AFK/ignore/chat-format), holograms, shops, permissions (including group inheritance), the dashboard's own accounts, and the Auction House are all backed by the same DataStore system now. See Storage Backend for the complete collection list and per-system breakdown.


Config (config.json → moderation)#

Settings are nested under per-feature sub-objects, not flat keys directly under moderation.

moderation.banSettings#

Key Default Description
broadcastBans false Announce bans to all players
logBanActions — Log ban details to console
defaultBanReason (built-in default) Reason used when none is given
maxBanReason — Max reason length
enableIPBans — Enable/disable IP bans
enablePermanentBans — Enable/disable permanent (non-timed) bans
enableTempBans — Enable/disable temp bans
autoExpireTempBans — Automatically lift temp bans when they expire
checkExpiredBansInterval — How often (seconds) to check for expired temp bans
banMessageFormat / tempBanMessageFormat / ipBanMessageFormat — Disconnect screen message templates

moderation.kickSettings#

Key Default Description
enableKickSystem true Enable/disable the kick system
broadcastKicks false Announce kicks to all players
logKickActions true Log kick details to console
notifyStaffOnKick true Notify staff (players with neoessentials.moderation.notifications) on kick, independent of broadcastKicks
kickMessage "You have been kicked from the server.\nReason: {reason}\nKicked by: {kicker}" Default kick screen message
kickAllMessage "Server maintenance in progress. Please reconnect in a few minutes." /kickall screen message
defaultKickReason "Kicked by an operator" Reason used when none is given
maxKickReason 500 Max reason length

moderation.freezeSettings#

Key Default Description
enableFreezeSystem true Enable/disable the freeze system
defaultFreezeReason "Frozen by an operator" Reason used when none is given
maxFreezeReason 500 Max reason length
freezeMessage / unfreezeMessage — Message templates sent to the frozen/unfrozen player ({reason}, {freezer} / {unfreezer})
freezeReminder — Periodic reminder message shown while frozen
freezeReminderInterval 30 Seconds between freeze reminders
logFreezeActions true Log freeze/unfreeze to console
freezeOnLogin true Re-apply freeze if a frozen player logs back in
preventCommands true Block command use while frozen
allowedCommands [] Commands still allowed while frozen

moderation.vanishSettings#

Key Default Description
enableVanishSystem — Enable/disable the vanish system
preventInteraction true Block interactions while vanished
broadcastToStaffVanish false Announce vanish toggles to staff
BroadcastToAllVanish — Announce vanish toggles to all players (note the config's mixed-case key)
hideFromTabList — Hide vanished players from the tab list
vanishOnJoin — Re-apply vanish if a vanished player logs back in
logVanishActions — Log vanish/unvanish to console

moderation.jailSettings#

Key Default Description
defaultJailReason — Reason used for /jail when none is given
logJailActions — Log jail/unjail to console
preventJailEscape — Block movement out of the jail region
jailMessageFormat — Message template shown to the jailed player
wandItem — Item ID used as the jail-region selection wand (given by /jailwand)
defaultSphereRadius — Radius used by /setjail <name> auto-detect and /setjail <name> sphere when no explicit radius is given
maxJailsBeforeTempBan — Number of times a player can be jailed before an automatic temp-ban escalation

Notes & Reports Permissions#

Node Default Description
neoessentials.moderation.note 🔒 Add/remove staff notes (/note, /removenote)
neoessentials.moderation.notes 🔒 View a player's staff notes (/notes)
neoessentials.moderation.report ✅ granted Submit a player report (/report)
neoessentials.moderation.reports 🔒 View and review the report queue (/reports, /reviewreport)

Back to Wiki Home