JP Plugins
All plugins

JPStaff

Staff mode, vanish, punishments, reports and moderation cases for Paper servers.

Core plugin, version 1.0.0

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

  1. Put JPStaff-<version>.jar in your server's plugins folder.
  2. Restart the server. plugins/JPStaff/ is created with the config and messages.
  3. 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

CommandDescriptionPermission
/jpstaff <reload>Main plugin management commandjpstaff.admin
/staffToggle staff modejpstaff.staff
/vanish
Aliases: /v
Toggle vanish on or offjpstaff.vanish
/staffchat [toggle|spy|message]
Aliases: /sc
Staff chat toggle or send messagejpstaff.staffchat
/freeze <player>Freeze or unfreeze a playerjpstaff.freeze
/ban <player> [duration] [reason]Ban a playerjpstaff.ban
/banip <player> [duration] [reason]IP ban a playerjpstaff.banip
/unban <player>Unban a playerjpstaff.unban
/unbanip <player|ip>Unban an IPjpstaff.unbanip
/mute <player> [duration] [reason]Mute a playerjpstaff.mute
/unmute <player>Unmute a playerjpstaff.unmute
/warn <player> [reason]Warn a playerjpstaff.warn
/unwarn <id>Remove a warningjpstaff.unwarn
/kick <player> [reason]Kick a playerjpstaff.kick
/history <player> [page]View a player's punishment historyjpstaff.history
/alts <player>View a player's alt accountsjpstaff.alts
/report <player> <reason>Report a playerjpstaff.report
/mutechat
Aliases: /mc
Toggle server-wide chat mutejpstaff.mutechat
/stafflist
Aliases: /sl
List all staff currently in staff modejpstaff.stafflist
/clearchat
Aliases: /cc
Clear chat for all playersjpstaff.clearchat
/reports [page]View pending reportsjpstaff.reports
/case <id>|assign|status|note|evidence|resolveView and manage moderation casesjpstaff.case
/cases [player] [page]List moderation casesjpstaff.cases
/auditlog [player] [page]View staff audit logsjpstaff.auditlog

Permissions

PermissionDefaultDescription
jpstaff.*operatorsFull access to JPStaff
jpstaff.adminoperatorsAdmin access (reload, etc.)
jpstaff.staffoperatorsToggle staff mode
jpstaff.vanishoperatorsToggle vanish
jpstaff.staffchatoperatorsUse staff chat
jpstaff.staffchat.spyoperatorsSpy on staff chat without being staff
jpstaff.freezeoperatorsFreeze players
jpstaff.banoperatorsBan players
jpstaff.banipoperatorsIP ban players
jpstaff.unbanoperatorsUnban players
jpstaff.unbanipoperatorsUnban IPs
jpstaff.muteoperatorsMute players
jpstaff.unmuteoperatorsUnmute players
jpstaff.warnoperatorsWarn players
jpstaff.unwarnoperatorsRemove warnings
jpstaff.kickoperatorsKick players
jpstaff.historyoperatorsView punishment history
jpstaff.altsoperatorsView alt accounts
jpstaff.reporteveryoneReport players
jpstaff.silentoperatorsUse silent flag on punishments
jpstaff.bypass.durationoperatorsBypass duration limits
jpstaff.staff.vanishoperatorsVanish when entering staff mode
jpstaff.staff.godmodeoperatorsGodmode in staff mode
jpstaff.staff.pvpprotectionoperatorsPvP protection in staff mode
jpstaff.notificationsoperatorsReceive staff notifications on join
jpstaff.bypass.freezeoperatorsImmune to being frozen
jpstaff.bypass.banoperatorsImmune to bans and IP bans
jpstaff.bypass.muteoperatorsImmune to mutes
jpstaff.bypass.kickoperatorsImmune to kicks
jpstaff.bypass.warnoperatorsImmune to warnings
jpstaff.inspect.inventoryoperatorsView player inventory via inspection tool
jpstaff.inspect.enderchest.modifyoperatorsTake items out of / put items into a player's ender chest while inspecting
jpstaff.inspect.enderchestoperatorsView player ender chest via inspection tool
jpstaff.mutechatoperatorsToggle server-wide chat mute
jpstaff.bypass.mutechatoperatorsBypass server-wide chat mute
jpstaff.stafflistoperatorsView the staff list
jpstaff.clearchatoperatorsClear server chat
jpstaff.bypass.clearchatoperatorsBypass chat clear
jpstaff.reportsoperatorsView pending reports
jpstaff.caseoperatorsView case details
jpstaff.case.manageoperatorsAssign, resolve, and change case status
jpstaff.case.noteoperatorsAdd internal notes to cases
jpstaff.case.evidenceoperatorsAttach evidence to cases
jpstaff.casesoperatorsList moderation cases
jpstaff.auditlogoperatorsView 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:&#6DD5ED&lRandom Teleport"
    1: "BOOK:&#B784FF&lInspect Player"
    2: "ICE:&#6DD5ED&lFreeze Player"
    7: "ENDER_EYE:&#7ED957&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: true

Support

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.