JPStaff
Staff mode, vanish, punishments, reports and moderation cases for Paper servers.
Downloads open soon.
Features
- Staff mode with tools, vanish and freeze
- Bans, IP bans, mutes, warnings and kicks, with history and alts
- Reports, moderation cases and an audit log
- Staff chat, chat mute and clear chat
- Appeal link on ban screens, and a Discord webhook
- Sync between servers
Requirements
- Paper 26.1 or newer (Java 25)
- Optional:
- JPChat: staff chat and mutes in chat
- JPTab: vanished staff hidden from the tab list
Installation
- Put
JPStaff-<version>.jarin your server'spluginsfolder. - Restart the server.
plugins/JPStaff/is created with the config and messages. - Change what you want in the files, then reload or restart.
Type /jp as an operator to see every JP plugin you have installed, its version and which optional plugins it found.
Commands
| Command | Description | Permission |
|---|---|---|
/jpstaff <reload> | Main plugin management command | jpstaff.admin |
/staff | Toggle staff mode | jpstaff.staff |
/vanishAliases: /v | Toggle vanish on or off | jpstaff.vanish |
/staffchat [toggle|spy|message]Aliases: /sc | Staff chat toggle or send message | jpstaff.staffchat |
/freeze <player> | Freeze or unfreeze a player | jpstaff.freeze |
/ban <player> [duration] [reason] | Ban a player | jpstaff.ban |
/banip <player> [duration] [reason] | IP ban a player | jpstaff.banip |
/unban <player> | Unban a player | jpstaff.unban |
/unbanip <player|ip> | Unban an IP | jpstaff.unbanip |
/mute <player> [duration] [reason] | Mute a player | jpstaff.mute |
/unmute <player> | Unmute a player | jpstaff.unmute |
/warn <player> [reason] | Warn a player | jpstaff.warn |
/unwarn <id> | Remove a warning | jpstaff.unwarn |
/kick <player> [reason] | Kick a player | jpstaff.kick |
/history <player> [page] | View a player's punishment history | jpstaff.history |
/alts <player> | View a player's alt accounts | jpstaff.alts |
/report <player> <reason> | Report a player | jpstaff.report |
/mutechatAliases: /mc | Toggle server-wide chat mute | jpstaff.mutechat |
/stafflistAliases: /sl | List all staff currently in staff mode | jpstaff.stafflist |
/clearchatAliases: /cc | Clear chat for all players | jpstaff.clearchat |
/reports [page] | View pending reports | jpstaff.reports |
/case <id>|assign|status|note|evidence|resolve | View and manage moderation cases | jpstaff.case |
/cases [player] [page] | List moderation cases | jpstaff.cases |
/auditlog [player] [page] | View staff audit logs | jpstaff.auditlog |
Permissions
| Permission | Default | Description |
|---|---|---|
jpstaff.* | operators | Full access to JPStaff |
jpstaff.admin | operators | Admin access (reload, etc.) |
jpstaff.staff | operators | Toggle staff mode |
jpstaff.vanish | operators | Toggle vanish |
jpstaff.staffchat | operators | Use staff chat |
jpstaff.staffchat.spy | operators | Spy on staff chat without being staff |
jpstaff.freeze | operators | Freeze players |
jpstaff.ban | operators | Ban players |
jpstaff.banip | operators | IP ban players |
jpstaff.unban | operators | Unban players |
jpstaff.unbanip | operators | Unban IPs |
jpstaff.mute | operators | Mute players |
jpstaff.unmute | operators | Unmute players |
jpstaff.warn | operators | Warn players |
jpstaff.unwarn | operators | Remove warnings |
jpstaff.kick | operators | Kick players |
jpstaff.history | operators | View punishment history |
jpstaff.alts | operators | View alt accounts |
jpstaff.report | everyone | Report players |
jpstaff.silent | operators | Use silent flag on punishments |
jpstaff.bypass.duration | operators | Bypass duration limits |
jpstaff.staff.vanish | operators | Vanish when entering staff mode |
jpstaff.staff.godmode | operators | Godmode in staff mode |
jpstaff.staff.pvpprotection | operators | PvP protection in staff mode |
jpstaff.notifications | operators | Receive staff notifications on join |
jpstaff.bypass.freeze | operators | Immune to being frozen |
jpstaff.bypass.ban | operators | Immune to bans and IP bans |
jpstaff.bypass.mute | operators | Immune to mutes |
jpstaff.bypass.kick | operators | Immune to kicks |
jpstaff.bypass.warn | operators | Immune to warnings |
jpstaff.inspect.inventory | operators | View player inventory via inspection tool |
jpstaff.inspect.enderchest.modify | operators | Take items out of / put items into a player's ender chest while inspecting |
jpstaff.inspect.enderchest | operators | View player ender chest via inspection tool |
jpstaff.mutechat | operators | Toggle server-wide chat mute |
jpstaff.bypass.mutechat | operators | Bypass server-wide chat mute |
jpstaff.stafflist | operators | View the staff list |
jpstaff.clearchat | operators | Clear server chat |
jpstaff.bypass.clearchat | operators | Bypass chat clear |
jpstaff.reports | operators | View pending reports |
jpstaff.case | operators | View case details |
jpstaff.case.manage | operators | Assign, resolve, and change case status |
jpstaff.case.note | operators | Add internal notes to cases |
jpstaff.case.evidence | operators | Attach evidence to cases |
jpstaff.cases | operators | List moderation cases |
jpstaff.auditlog | operators | View staff audit logs |
Configuration
All files are in plugins/JPStaff/. Files: config.yml, messages.yml.
When you update the plugin, new options are added to your config.yml by themselves, with their comments. Your own settings stay as they are, and the old file is kept as config.old-v<number>.yml.
Languages: English, Spanish, Portuguese, French and German. Set language: in config.yml (en, es, pt, fr or de).
Default config.yml
# Used to add new options to this file after an update. Don't change it.
config-version: 1
# JPStaff Configuration
# Production-grade moderation framework
#
# Staff mode, vanish, freeze, bans/mutes/warns/kicks, reports, cases and an audit log.
# Texts live in messages.yml. Apply changes with /jpstaff reload.
# Durations for /ban, /mute...: 30s, 10m, 5h, 1d, 2w, 1y, combined (1d5h30m) or perm.
# Language of the messages: en (messages.yml), es, pt, fr or de (lang/<code>.yml).
# Your own language: copy a file in the lang folder to lang/<code>.yml, translate it
# and set its code here (for example it for lang/it.yml).
language: en
# Replace messages.yml with the new design when the plugin is updated.
# Your old file is kept as messages.old-vX.yml. false = never touch it.
auto-update-style: true
# Appeal link shown on the ban screen (and to muted players), so punished players
# know where to ask for a second chance. Put your Discord invite here.
appeals:
enabled: true
link: 'https://discord.gg/yourserver'
# The line that is added. {link} = the link above. MiniMessage and &-codes work.
# (Links on the ban screen cannot be clicked - Minecraft does not allow it - so keep
# the link short and easy to type.)
text: '<gray>Think this is a mistake? Appeal on our Discord:</gray><newline><#5865F2><underlined>{link}</underlined></#5865F2>'
# Switch whole features (and their commands) on or off.
# A disabled module's commands reply "That feature is turned off".
modules:
staff-mode: true # /staff
vanish: true # /vanish
staff-chat: true # /staffchat
freeze: true # /freeze
mute-chat: true # /mutechat
bans: true # /ban /banip /unban /unbanip
mutes: true # /mute /unmute
warnings: true # /warn /unwarn
kicks: true # /kick
history: true # /history
alts: true # /alts
reports: true # /report /reports
staff-list: true # /stafflist
clear-chat: true # /clearchat
audit-log: true # /auditlog
database:
# Type: sqlite or mysql
type: sqlite
# SQLite file name (relative to plugin folder)
sqlite-file: "jpstaff.db"
# MySQL settings (only used if type is mysql)
mysql:
host: "localhost"
port: 3306
database: "jpstaff"
username: "root"
password: ""
pool-size: 10
staff:
# Gamemode when entering staff mode: CREATIVE, SPECTATOR, SURVIVAL, ADVENTURE
gamemode: CREATIVE
# Enable flight in staff mode
flight: true
# Enable invulnerability (godmode) in staff mode
godmode: true
# Enable PvP protection in staff mode
pvp-protection: true
# Auto-vanish when entering staff mode
vanish-on-enable: true
# Enable glow effect on staff mode players
glow: true
# Give night vision to staff mode players
night-vision: true
# Show actionbar vanish indicator to staff mode players
actionbar-enabled: true
# Allow staff to silently open player chests in-game (right-click container)
silent-chest: true
# Prevent block placement and breaking while in staff mode
block-protection: true
# Notify other staff members when someone enters/leaves staff mode
notify-staff-toggle: true
# Staff mode items (hotbar slot 0-8 -> material:name). The material decides what
# the tool does: ENDER_PEARL or COMPASS = teleport to a random player,
# BOOK = inspect, ICE = freeze, ENDER_EYE = vanish, REDSTONE = leave staff mode.
items:
0: "ENDER_PEARL:DD5ED&lRandom Teleport"
1: "BOOK:&#B784FF&lInspect Player"
2: "ICE:DD5ED&lFreeze Player"
7: "ENDER_EYE:ED957&lToggle Vanish"
8: "REDSTONE:&#FF5F6D&lLeave Staff Mode"
vanish:
# Send fake leave message when a player vanishes
fake-leave: true
# Send fake join message when a player unvanishes
fake-join: true
freeze:
# Apply blindness effect
blindness: true
# Apply slowness effect
slowness: true
# Place ice helmet on frozen player
ice-helmet: true
# Auto punish on logout while frozen
auto-punish-on-logout: true
# Duration of auto-ban on logout (e.g. "7d", "12h", "perm")
auto-punish-duration: "7d"
# Reason for auto-punishment
auto-punish-reason: "Disconnected while frozen"
# Commands allowed while frozen (without the /)
whitelisted-commands:
- "msg"
- "tell"
- "reply"
- "r"
# Staff in staff mode do not trigger pressure plates
suppress-pressure-plates: true
punishments:
# Broadcast punishments to all players
broadcast: true
# Default reason if none provided
default-reason: "No reason specified"
# Seconds between checks that lift expired bans and mutes
expiration-check-interval: 60
# Max punishments per history page
history-per-page: 8
reports:
# Cooldown between reports (in seconds)
cooldown: 30
# Max reports per page in /reports
per-page: 10
# Send report notifications to Discord
discord-enabled: false
# Discord webhook URL for reports (can be same or different from main webhook)
discord-webhook-url: ""
cases:
# Enable the moderation case system
enabled: true
# Max cases shown per page in /cases
per-page: 10
# Reuse the latest active case for a player instead of opening a new one
reuse-open-cases: true
# Automatically open/link cases from punishments, freezes, and reports
auto-create-on-punishment: true
auto-create-on-freeze: true
auto-link-reports: true
# Status a case gets in each situation.
statuses:
# Supported values: OPEN, INVESTIGATING, ACTION_TAKEN, RESOLVED, CLOSED
default: OPEN
report: OPEN
freeze: INVESTIGATING
punishment: ACTION_TAKEN
resolve: RESOLVED
notes:
# Maximum number of characters in a single internal note
max-length: 400
evidence:
# Maximum number of evidence entries per case
max-per-case: 10
discord-sync:
# Send case timeline activity to a Discord webhook
enabled: false
webhook-url: ""
# Also post internal staff notes and evidence links to Discord.
include-notes: true
include-evidence: true
audit:
# Enable persistent audit logging for staff actions
enabled: true
# Max audit entries shown per page in /auditlog
per-page: 12
# Toggle individual audit categories
log-staff-mode: true
log-vanish: true
log-freeze: true
log-inspection: true
log-punishments: true
log-case-actions: true
log-reports: true
clearchat:
# Number of blank lines to send when clearing chat
lines: 100
# Main Discord webhook for punishments.
# Get the URL in Discord: channel settings > Integrations > Webhooks > New Webhook > Copy URL.
discord:
# Enable Discord webhook integration
enabled: false
# Webhook URL
webhook-url: ""
# Bot username
username: "JPStaff"
# Avatar URL
avatar-url: ""
# Send these punishment types to Discord (BAN, BANIP, MUTE, KICK, WARN)
send-types:
- BAN
- BANIP
- MUTE
- KICK
- WARN
staffchat:
# Format for staff chat messages (MiniMessage, &a and &#hex all work)
# Placeholders: {player}, {message}, and PlaceholderAPI ones like %luckperms_prefix% (for the sender)
format: "<gradient:#FF416C:#FF4B2B><bold>ꜱᴄ</bold></gradient> <dark_gray>»</dark_gray> <gray>{player}</gray> <dark_gray>»</dark_gray> <white>{message}</white>"
# Send staff chat to Discord
discord-enabled: false
# Discord webhook URL for staff chat (can be same or different)
discord-webhook-url: ""
join:
# Show a welcome message to first-time players
first-join-message-enabled: true
# Notify staff when a player joins for the first time
first-join-staff-notify: true
# Show online staff count to staff members when they join
staff-count-on-join: true
# ----------------------------------------------------------
# Network (several servers behind Velocity or BungeeCord)
# ----------------------------------------------------------
# One ban list for all servers: set database.type to MYSQL with the same database on
# every server. Bans then apply everywhere when a player joins. With the network on,
# they also apply at once: a player banned on one server is kicked from any other
# server they are on, mutes start straight away and staff chat is shared.
# MYSQL = messages go through that same database (nothing else to install).
# REDIS = messages go through a Redis server (instant).
network:
enabled: false
# A short name for this server, shown after staff chat names: Steve (lobby)
server-name: 'lobby'
messenger: MYSQL
mysql-poll-ms: 1000
redis:
host: localhost
port: 6379
password: ''
channel: jp
# Share staff chat between servers.
staffchat: true
staffchat-server-suffix: ' &8({server})'
# Also show "X was banned" broadcasts from other servers here.
broadcast-punishments: trueSupport
Guides and the docs of every JP plugin are on the JP Plugins website. Questions, bugs or ideas? Join the JP Plugins Discord.
License
JPStaff is free to use on any server, including servers that make money, but it is not open source. Don't reupload, sell or share modified copies of it. The full terms are in LICENSE.txt, which is also inside the jar.