F-Essentials
Punishments, IPlock, maintenance mode, and much more ..
F-Essentials
<p align="center"> <img src="https://i.imgur.com/F4yTBhW.png" alt="logo" width="700"/> </p>
<p align="center"> <img src="https://i.imgur.com/EmmGm2F.png" alt="Fess" width="400"/> </p>
<p align="center"> <img src="https://i.imgur.com/aKw3pwn.png" alt="Fess" width="400"/> </p>
<p align="center"> <a href="https://ko-fi.com/nightbeamstudio"> <img src="https://cdn.prod.website-files.com/5c14e387dab576fe667689cf/670f5a0171bfb928b21a7e00_support_me_on_kofi_beige.png" alt="logo" width="300"/> </a> </p>
<p align="center"> <a href="https://discord.gg/TJc3CxR4jK"> <img alt="Discord Server" src="https://img.shields.io/static/v1?label=&message=Discord&color=ECEBE6&labelColor=2F4858&style=for-the-badge&logo=discord&logoColor=white" /> </a> <a href="https://www.youtube.com/@nightbeamstudio"> <img alt="Nightbeam Studio YouTube" src="https://img.shields.io/static/v1?label=&message=YouTube&color=ECEBE6&labelColor=2F4858&style=for-the-badge&logo=youtube&logoColor=white" /> </a> <a href="https://github.com/MeherBenSalem"> <img alt="Nightbeam Studio GitHub" src="https://img.shields.io/static/v1?label=&message=GitHub&color=ECEBE6&labelColor=2F4858&style=for-the-badge&logo=github&logoColor=white" /> </a> <a href="https://www.curseforge.com/members/nightbeamstudio/projects"> <img alt="Nightbeam Studio CurseForge" src="https://img.shields.io/static/v1?label=&message=CurseForge&color=ECEBE6&labelColor=2F4858&style=for-the-badge&logo=curseforge&logoColor=white" /> </a> <a href="https://modrinth.com/organization/nightbeam"> <img alt="Nightbeam Studio Modrinth" src="https://img.shields.io/static/v1?label=&message=Modrinth&color=ECEBE6&labelColor=2F4858&style=for-the-badge&logo=modrinth&logoColor=white" /> </a> </p>
Fssentials is a production-ready moderation and admin utilities plugin for Paper (Folia-aware). This document enumerates every feature implemented in the current codebase so server operators can configure, use, and extend the plugin confidently.
---
High-level Overview
- Folia-friendly scheduler utilities for safe async/global/entity dispatch (`FoliaScheduler`). - Full-featured punishment system with persistent YAML storage and temporary punishments. - IP-locking (per-account allowed IP entries + login-blocking) with admin commands and bypass permission. - Maintenance subsystem with whitelist, MOTD sets, scheduling/timers and join notifications. - Broadcast/announcement system using MiniMessage titles with optional configurable sound. - Vanish and admin protections for hidden staff members. - Inventory viewing and editing (InvSee) with Folia-safe snapshot/restore behavior. - Central `MessageService` for configurable chat messages and prefix handling.
---
Features (exhaustive)
Punishment System - Supported punishment types: `KICK`, `BAN`, `MUTE`, `WARN`, `NOTE`, `IP_BAN`. - Supports permanent and temporary punishments. Temporary durations parse via `TimeParser` and server-configurable time-layout tokens (e.g. `#default`). - Each punishment stores: id, type, target UUID/name/ip, actor, reason, createdAt, expiresAt, active flag and silent flag. - Storage: persisted to `punishments.yml` via `YamlPunishmentStorage` when `storage.persistence-enabled` is true. - Management: create, deactivate (unpunish), change reason, delete record, list history, view active punishments, page helper utilities (`PunishmentManager`). - Expiration: scheduled expiration runs on Folia async scheduler and notifies staff when punishments expire.
Commands (handled by `CommandRouter`): - `kick <player> <reason...>` — immediate kick with enforcement message. - `ban <player> <reason...>` — permanent ban (kicks online target). - `mute <player> <reason...>` — mute (blocks chat via `PunishmentListener`). - `warn <player> <reason...>` — adds a warn record; notifies target if online. - `note <player> <note...>` — internal note record. - `banip <player|ip> <reason...>` — IP ban (kicks matching IPs). - `tempban/tempmute/tempwarn/tempipban <player|ip> <duration> <reason...>` — temporary punishments. - `unban/unmute/unwarn/unnote/unpunish <id|player>` — remove punishments. - `change-reason <id> <new reason>` — edit a punishment's reason. - `warns <player>` / `notes <player>` — list warns/notes. - `check <player>` — show UUID, IP, ban/mute status, counts. - `banlist [page]` — list active bans (paginated). - `history <player> [page]` — view player's punishment history (paginated).
Notes: - Commands support a `-s` prefix to make an action silent (announce only to staff with the configured silent notify permission). - Reason layouts can be referenced with `@layoutKey` to reuse predefined layouts from `config.yml` (`layouts.`). - Time-layout tokens (e.g. `#default`) map to values in `time-layouts` config.
IP Locking - Per-account IP lock storage in `ip-locks.yml` (`IpLockManager`). - Admin commands to `set`, `remove`, `change`, and `check` an account's allowed IP. - Normalizes IPs using Java networking APIs; invalid inputs are rejected. - Login flow hooks: pre-login collects attempted IP and if mismatch is found the player is kicked (unless they have bypass permission). - Configurable: `ip-lock.enabled`, `ip-lock.log-blocked-attempts`, `ip-lock.kick-message`.
Maintenance Mode - Enable/disable maintenance mode programmatically or via commands. - Whitelist management (add/remove/list) for players allowed during maintenance. - MOTD sets: multiple message sets supported and editable using `/maintenance motd` and `setmotd`. - Scheduling/timers: `starttimer`, `endtimer`, `schedule`, `aborttimer` to schedule enable/disable automatically (`MaintenanceTimer`). - Join notifications: staff with `notify` permission receive join-attempt notifications during maintenance. - Configurable messages and bypass/notify permissions via `MaintenanceConfig`.
Maintenance commands (via `maintenance` command): - `maintenance on|off|reload` - `maintenance add <player>` / `remove <player>` / `whitelist` - `maintenance starttimer <minutes>` / `endtimer <minutes>` / `schedule <startMinutes> <durationMinutes>` / `aborttimer` - `maintenance motd` / `maintenance setmotd <index> <line> <message>`
Broadcast / Announcements - `/broadcast <title> [subtitle]` — sends a full-screen title to all players using MiniMessage formatting. - Supports splitting title/subtitle by `|` or heuristics; configurable sound (`announcements.sound.*` in config).
Vanish & Admin Tools - Toggle vanish with `/vanish` (visibility handled by `VanishService`). - `AdminToolsListener` protects vanished staff from being interacted with or damaged. - Vanish state is reapplied on join for session-owned vanished players.
InvSee (Inventory View/Edit) - `/invsee <player>` opens a 54-slot GUI snapshot of the target player's inventory (uses `InvseeInventoryHolder`). - Snapshot and restore are Folia-safe: inventory cloning happens on the target's entity scheduler and GUI open on the viewer's entity scheduler. - Viewer edits are written back on close (invsee allows editing of player storage, armor, off-hand slots as described in the GUI layout).
Message Service & Localization - `MessageService` loads `messages.yml` from the plugin folder; messages use a `prefix` and support placeholder replacement via `MessageService.get(key, placeholders)`. - Error/usage/enforcement messages are all configurable in `messages.yml` and `config.yml`.
Folia Scheduler Compatibility - `FoliaScheduler` centralizes Folia-friendly task dispatch: `runAsync`, `runAsyncTimer`, `runGlobal`, `runAtEntity`. - All file I/O and long-running work is dispatched async; player-specific operations run on the player's entity scheduler.
Storage Files Created/Used - `punishments.yml` — persisted punishment records (via `YamlPunishmentStorage`). - `ip-locks.yml` — per-account IP lock entries. - `messages.yml` — plugin messages loaded by `MessageService` (copied from plugin jar to data folder on first run).
---
Commands (complete list registered at runtime)
- `kick`, `ban`, `mute`, `warn`, `note`, `banip` - `tempban`, `tempmute`, `tempwarn`, `tempipban` - `unban`, `unmute`, `unwarn`, `unnote`, `unpunish` - `change-reason`, `warns`, `notes`, `check`, `banlist`, `history` - `fssentials`, `systemprefs`, `vanish`, `offlinetp`, `playerlist`, `punishment`, `invsee` - `maintenance` (separately registered with its own executor) - `broadcast`, `iplock` (separately registered)
Refer to `plugin.yml` for the exact help/usage lines; `fssentials` command prints configurable help-lines from `config.yml`.
---
Permissions (used in code)
- `fssentials.punish.kick` — kick players - `fssentials.punish.ban` / `fssentials.punish.tempban` — ban players - `fssentials.punish.mute` / `fssentials.punish.tempmute` — mute players - `fssentials.punish.warn` / `fssentials.punish.tempwarn` — warn players - `fssentials.punish.banip` / `fssentials.punish.tempipban` — IP ban - `fssentials.punish.unpunish` — remove punishments - `fssentials.punish.change-reason` — edit punishment reason - `fssentials.view.banlist` / `fssentials.view.history` / `fssentials.view.check` / `fssentials.view.playerlist` — view lists/check info - `fssentials.invsee` — view and edit player inventories - `fssentials.vanish` — toggle vanish - `fssentials.admin.reload` — reload plugin - `fssentials.admin.systemprefs` — view system prefs - `fssentials.maintenance.admin` — full maintenance administration - maintenance bypass/notify permissions are configurable (defaults shown in `MaintenanceConfig`). - IP-locking bypass permission: `plugin.iplock.bypass` (constant in `IpLockManager`).
Note: the plugin uses permission checks liberally; ensure your server's permission system maps the nodes to the desired roles.