A modern in-game player reporting system designed for server moderation teams.
Players can easily report rule violations while moderators receive powerful tools to review, filter and process reports directly in-game using intuitive GUIs.
Version 4.0.0 is a
complete rewrite, introducing a modern report workflow, improved moderation tools, database support, Discord integration and much more.
Almost every feature, message and visual can be configured in the config!
» Modern in-game reporting system
» Easy player reporting via
/report » Optional
reason GUI and confirmation system
» Advanced
moderation GUI for staff
» Assign moderators as
report handlers » Filter and sort reports directly in-game
» Teleport to reported players or saved locations
» Reward players for valid reports
» Supports
online & offline reward claiming »
Discord webhook integration for reports and updates
»
PlaceholderAPI support for statistics and integrations
» Storage support for
YAML or MySQL » Search reports by
player, ID, reason or handler » Notification system for staff members
» Automatic cleanup for old reports
» Highly configurable messages, GUIs and behavior
» Lightweight and optimized for performance
» Supports
Folia
PlayerReport was built to help staff manage reports quickly and efficiently - directly in game.
Quick, how?» Reports can be reviewed and updated instantly.
Efficiently, how?» Lightweight design with optimized storage.
Effectively, how?» Clear moderation workflow with optional rewards.
Reports are displayed inside a fully configurable GUI.
Staff members can: • review reports
• change report status
• assign handlers
• teleport to involved players (reporting and reported player)
• remove reports
Filtering and sorting options help moderators handle large amounts of reports efficiently.
Players can optionally receive rewards when their reports are confirmed.
Due to the support of command rewards, this feature is compatible with other plugins, such as giving out vote keys as rewards or basically any other command!
This allows servers to encourage players to help maintain a fair environment.
Command
Permission
Description
Code (Text):
/report <player> <reason>
Code (Text):
playerreport.report
Create a report for a player.
Code (Text):
/reports
Code (Text):
playerreport.admin
Open the moderation GUI to view and manage reports.
Code (Text):
/reports help
Code (Text):
playerreport.admin
Shows all available PlayerReport commands.
Code (Text):
/reports search user <player>
Code (Text):
playerreport.admin
Search reports created by or against a specific player.
Code (Text):
/reports search id <reportId>
Code (Text):
playerreport.admin
Find a report by its unique ID.
Code (Text):
/reports search reason <text>
Code (Text):
playerreport.admin
Search reports containing a specific reason.
Code (Text):
/reports search handler <player>
Code (Text):
playerreport.admin
Show reports assigned to a specific moderator.
Code (Text):
/reports sethandler <reportId> <player|none>
Code (Text):
playerreport.admin.handler.set
Assign or remove a moderator as the handler of a report.
Code (Text):
/reports clear
Code (Text):
playerreport.admin.clear
Clear outdated or deleted reports.
Code (Text):
/reports claim
Code (Text):
playerreport.claim
Claim rewards for confirmed reports.
Code (Text):
/reports on
Code (Text):
playerreport.admin.notify.toggle
Enable report notifications.
Code (Text):
/reports off
Code (Text):
playerreport.admin.notify.toggle
Disable report notifications.
Code (Text):
/reports reload
Code (Text):
playerreport.reload
Reload the plugin configuration files.
Permission
Description
Code (Text):
playerreport.*
Grants access to all PlayerReport permissions.
Code (Text):
playerreport.report
Allows players to create reports using /report.
Code (Text):
playerreport.bypass.cooldown
Bypasses the report cooldown.
Code (Text):
playerreport.immune
Prevents a player from being reported.
Code (Text):
playerreport.admin
Allows access to the moderation GUI (/reports).
Code (Text):
playerreport.admin.handler.set
Allows assigning or removing report handlers.
Code (Text):
playerreport.admin.clear
Allows clearing outdated reports using /reports clear.
Code (Text):
playerreport.admin.notify.toggle
Allows toggling report notifications using /reports on/off.
Code (Text):
playerreport.reload
Allows reloading the plugin configuration with /reports reload.
Code (Text):
playerreport.update.notify
Receive notifications when a plugin update is available.
Code (Text):
playerreport.claim
Allows players to claim rewards for successful reports.
Code (Text):
# =========================================================
# PlayerReport - config.yml
# Built for Paper 1.21.x (api-version: 1.20)
#
# Color codes:
# Use & for normal Minecraft colors (example: &a, &c, &7)
# HEX colors in lang.yml are supported via &#RRGGBB or #RRGGBB
# =========================================================
# If true, the reported player must currently be online
# to be reported.
requireOnlineTarget: false
# Maximum number of open reports a single reporter
# can have at the same time.
maxOpenReportsPerReporter: 5
# Cooldown in seconds between creating reports.
cooldownSeconds: 10
# Defines how report reasons are handled.
# Available modes:
# - FREETEXT = players type any reason
# - PREDEFINED = players must use one of the predefined reasons
# - BOTH = both systems are allowed
reasonMode: FREETEXT
# List of predefined reasons used when PREDEFINED or BOTH is enabled.
predefinedReasons:
- "Cheating"
- "Bug abuse"
- "Harassment"
# GUI for selecting predefined report reasons.
reasonGui:
# Enables the reason selection GUI.
enabled: false
# If true, players may still enter a reason directly by command,
# even when the reason GUI is enabled.
allowCommandReason: true
# Inventory title of the reason selection GUI.
title: "&cSelect a reason for &f%target%"
# Inventory size of the reason selection GUI.
# Should be a valid chest size (9, 18, 27, 36, 45, 54).
size: 27
filler:
# If true, empty GUI slots are filled with the filler item.
enabled: true
# Material used for filler slots.
material: GRAY_STAINED_GLASS_PANE
reasonItem:
# Material used for each selectable reason.
material: PAPER
# Display name of a reason item.
name: "&a%reason%"
# Lore shown on each reason item.
lore:
- "&7Report &f%target% &7for: &b%reason%"
- ""
- "&eClick to continue"
# Confirmation GUI shown before the report is submitted.
confirm:
# Title of the confirmation GUI.
title: "&cReport &f%target% &cfor &b%reason%&c?"
filler:
# Material used for empty slots in the confirmation GUI.
material: GRAY_STAINED_GLASS_PANE
yes:
# Material of the confirmation button.
material: LIME_WOOL
# Display name of the confirmation button.
name: "&aYes"
no:
# Material of the cancel button.
material: RED_WOOL
# If true, a report will automatically be claimed by the
# moderator when its status changes to IN_PROGRESS.
autoClaimOnInProgress: true
# =========================================================
# Timestamps
# Formatting for displayed date and time values
# =========================================================
timestamps:
# Timezone used for report timestamps.
timezone: "Europe/Berlin"
# Date format pattern.
dateFormat: "dd.MM.yyyy"
# Time format pattern.
timeFormat: "HH:mm:ss"
# Final display format.
# Available placeholders: {date}, {time}
displayFormat: "{date} {time}"
# Enables PlaceholderAPI support if PlaceholderAPI is installed.
enabled: true
# =========================================================
# Storage
# Storage backend for reports and pending rewards
#
# Supported types:
# - YAML = local file storage
# - MYSQL = MySQL / MariaDB database
# =========================================================
storage:
reports:
# Storage type used for reports.
type: YAML
pendingRewards:
# Storage type used for pending rewards.
type: YAML
mysql:
# MySQL server host.
host: "127.0.0.1"
# MySQL server port.
port: 3306
# Database name.
database: "playerreport"
# Database username.
username: "root"
# Database password.
password: ""
# Optional JDBC parameters appended to the connection URL.
params: "useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"
# =========================================================
# Rewards
# Reward system for reporters
# Rewards themselves are defined in rewards.yml
# =========================================================
rewards:
# Enables the reward system.
enabled: false
# If true:
# when a report is set to CLOSED, rewards are automatically
# added to the reporter.
#
# If a report is marked as FALSE, it will be deleted
# to prevent rewards.
simpleReportHandling: false
# Title of the reports GUI.
# Placeholders:
# %filter%, %sort%, %page%, %pages%
Name: '&cReports &7(%filter% &8|&7 %sort% &8|&7 %page%/%pages%&7)'
# Inventory size of the reports GUI.
Size: 54
Filter-Item:
# Slot of the filter item in the GUI.
Slot: 49
OPEN:
# Material shown when the OPEN filter is active/selectable.
Material: GREEN_TERRACOTTA
# Display name of the OPEN filter item.
Name: '&a Open Reports'
# Lore of the OPEN filter item.
Lore:
- '&7Shows open & in-progress reports'
- ''
- '&eClick to switch filter'
CLOSED:
# Material shown when the CLOSED filter is active/selectable.
Material: RED_TERRACOTTA
# Display name of the CLOSED filter item.
Name: '&c Closed Reports'
# Lore of the CLOSED filter item.
Lore:
- '&7Shows closed reports'
- ''
- '&eClick to switch filter'
DELETED:
# Material shown when the DELETED filter is active/selectable.
Material: BROWN_TERRACOTTA
# Display name of the DELETED filter item.
Name: '&6 Deleted Reports'
# Lore of the DELETED filter item.
Lore:
- '&7Shows deleted reports'
- ''
- '&eClick to switch filter'
Sort-Item:
# Slot of the sort item in the GUI.
Slot: 45
# Material of the sort item.
Material: COMPARATOR
# Display name of the sort item.
Name: '&bSort: &f%sort%'
# Lore of the sort item.
Lore:
- '&7Filter: &f%filter%'
- ''
- '&7Modes:'
- '&f- NEWEST / OLDEST'
- '&f- STATUS_OPEN_FIRST / STATUS_IN_PROGRESS_FIRST (only in OPEN tab)'
- ''
- '&eClick to change sorting'
Navigation:
Prev:
# Slot of the previous-page button.
Slot: 48
# Material of the previous-page button.
Material: ARROW
# Display name of the previous-page button.
Name: '&a← Previous page'
# Lore of the previous-page button.
Lore:
- '&7Click to go back'
Next:
# Slot of the next-page button.
Slot: 50
# Material of the next-page button.
Material: ARROW
# Display name of the next-page button.
Name: '&aNext page →'
# Lore of the next-page button.
Lore:
- '&7Click to go forward'
# Always shown in the very last slot (bottom-right).
# Toggles whether the GUI should only show reports
# where the current viewer is the handler.
My-Handler-Only:
# Material of the toggle item.
Material: NAME_TAG
# Display name of the toggle item.
Name: '&bOnly my handled reports: &f%state%'
# Lore of the toggle item.
Lore:
- '&7Click to toggle'
- '&7When enabled, you will only'
- '&7see reports where you are'
- '&7the handler.'
Default-Item:
# Material used for report entries in the GUI.
Material: PAPER
# Display name of a report entry.
# Placeholders include report-related values like %id%, %reported%, etc.
Name: '&a %reported% &7(#%id%)'
only-in-game: "{prefix}&cThis command can only be used in-game."
no-permission: "{prefix}&cYou don’t have permission."
usage-report: "{prefix}&7Usage: &f/report <name> <reason>"
missing-reason: "{prefix}&cPlease provide a reason."
player-not-found: "{prefix}&cPlayer not found: &f{target}"
target-must-be-online: "{prefix}&cThis player must be online to be reported: &f{target}"
report-self-not-allowed: "{prefix}&cYou cannot report yourself."
report-target-immune: "{prefix}&cThis player cannot be reported: &f{target}"
report-cooldown: "{prefix}&cPlease wait &f{seconds}&c seconds before creating another report."
target-cooldown: "{prefix}&cThis player was reported recently. Please wait &f{seconds}&c seconds before reporting &f{target}&c again."
report-limit-reached: "{prefix}&cYou reached the limit. Max &f{limit} &cactive reports."
report-saved: "{prefix}&aReport saved."
report-failed: "{prefix}&cCould not create report."
report-select-reason: "{prefix}&7Select a reason for reporting &f{target}&7."
report-reason-not-allowed: "{prefix}&cFree-text reasons are disabled. Please pick one of the predefined reasons."
report-command-reason-disabled: "{prefix}&cReporting via command is disabled. Please use the GUI to report &f{target}&c."
admin-notify: "{prefix}&c{reporter} &7reported &c{target}&7: &f{reason}"
usage-sethandler: "{prefix}&7Usage: &f/reports sethandler <id> <player|none>"
report-not-found: "{prefix}&cReport not found: &f{id}"
report-not-found-generic: "{prefix}&cReport not found."
handler-set: "{prefix}&aHandler for report &f#{id} &aset to &f{handler}&a."
handler-cleared: "{prefix}&eHandler for report &f#{id} &ecleared."
reload-success: "{prefix}&aReloaded config.yml and lang.yml."
reload-failed: "{prefix}&cReload failed. Check console."
rewards-disabled: "{prefix}&cRewards are disabled."
rewards-nothing: "{prefix}&7You have no rewards to claim."
rewards-claimed: "{prefix}&aClaimed &f{amount}&a rewards."
rewards-claim-in-progress: "{prefix}&ePlease wait, your previous reward claim is still being processed."
rewards-load-failed: "{prefix}&cCould not load your pending rewards right now."
rewards-claim-partial-restored: "{prefix}&cAn error occurred while giving your rewards. Remaining rewards were restored."
reward-granted: "{prefix}&aReward has been stored for the reporter."
reward-not-granted: "{prefix}&eNo reward stored (already granted or missing reporter/reward config)."
reward-skipped: "{prefix}&7No reward will be given."
rewards-available: "{prefix}&aYou have &f{amount}&a reward(s) available! Use &f/reports claim&a to collect them."
report-marked-false: "{prefix}&eReport marked as false and deleted."
update-available: "{prefix}&eUpdate available: &f{current} &7-> &a{latest}
{prefix}&7Spigot: &b{url}"
reports-gui-delete-failed: "{prefix}&cReport could not be deleted."
reports-gui-status-update-failed: "{prefix}&cReport status could not be updated."
location-player-offline: "{prefix}&cLocation: N/A (player offline)"
location-not-available: "{prefix}&cLocation: N/A"
teleported: "{prefix}&aTeleported."
gui:
shared:
filler-name: " "
report-reason:
title: "&cSelect a reason for &f{target}"
reason-item:
name: "&a{reason}"
lore:
- "&7Report &f{target} &7for: &b{reason}"
- ""
- "&eClick to continue"
status-select:
title: "&bSet status #{id}"
open:
name: "&aOPEN"
lore-1: "&7Set status to &aOPEN"
lore-2: "&7(Handler will be cleared)"
in-progress:
name: "&eIN_PROGRESS"
lore-1: "&7Set status to &eIN_PROGRESS"
closed:
name: "&cCLOSED"
lore-1: "&7Set status to &cCLOSED"
back:
lore: "&7Return to details"