Player Report
A modern, fully in-game player reporting system designed for server moderation teams.
Quick challenge
How far can you run before the mobs catch you?
Minecraft check
Confirm your run
Complete the quick check to get your code.
Player Report
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.
complete rewrite 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 Folia - Optional Folia and confirmation system - Advanced Folia for staff - Assign moderators as Folia - Filter and sort reports directly in-game - Teleport to reported players or saved locations - Reward players for valid reports - Supports Folia - Folia for reports and updates - Folia for statistics and integrations - Storage support for Folia - Search reports by Folia - 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.
→ → Reports can be reviewed and updated instantly. → → Lightweight design with optimized storage. → → 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.
`/reports claim` - command rewards - item rewards - offline reward storage - reward claiming via `/reports claim`
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.
Commands
| Command | Permission | Description | |---|---|---| | `/report <player> <reason>` | `playerreport.report` | Create a report for a player. | | `/reports` | `playerreport.admin` | Open the moderation GUI to view and manage reports. | | `/reports help` | `playerreport.admin` | Shows all available PlayerReport commands. | | `/reports search user <player>` | `playerreport.admin` | Search reports created by or against a specific player. | | `/reports search id <reportId>` | `playerreport.admin` | Find a report by its unique ID. | | `/reports search reason <text>` | `playerreport.admin` | Search reports containing a specific reason. | | `/reports search handler <player>` | `playerreport.admin` | Show reports assigned to a specific moderator. | | `/reports sethandler <reportId> <player|none>` | `playerreport.admin.handler.set` | Assign or remove a moderator as the handler of a report. | | `/reports clear` | `playerreport.admin.clear` | Clear outdated or deleted reports. | | `/reports claim` | `playerreport.claim` | Claim rewards for confirmed reports. | | `/reports on` | `playerreport.admin.notify.toggle` | Enable report notifications. | | `/reports off` | `playerreport.admin.notify.toggle` | Disable report notifications. | | `/reports reload` | `playerreport.reload` | Reload the plugin configuration files. |
Permissions
| Permission | Description | |---|---| | `playerreport.*` | Grants access to all PlayerReport permissions. | | `playerreport.report` | Allows players to create reports using /report. | | `playerreport.bypass.cooldown` | Bypasses the report cooldown. | | `playerreport.immune` | Prevents a player from being reported. | | `playerreport.admin` | Allows access to the moderation GUI (/reports). | | `playerreport.admin.handler.set` | Allows assigning or removing report handlers. | | `playerreport.admin.clear` | Allows clearing outdated reports using /reports clear. | | `playerreport.admin.notify.toggle` | Allows toggling report notifications using /reports on/off. | | `playerreport.reload` | Allows reloading the plugin configuration with /reports reload. | | `playerreport.update.notify` | Receive notifications when a plugin update is available. | | `playerreport.claim` | Allows players to claim rewards for successful reports. |
config.yml
```yaml
=========================================================
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
=========================================================
=========================================================
Reporting
Settings for creating reports
=========================================================
reporting:
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
Display name of the cancel button.
name: "&cNo"
=========================================================
Claims
Settings for claim / handler behavior
=========================================================
claims:
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}"
=========================================================
Messages
General message display settings
=========================================================
messages: headerFooter:
Enables optional header/footer formatting in messages.
enabled: false
=========================================================
Notifications
Staff notification settings
=========================================================
notifications:
If true, notification toggle states are stored persistently.
persist: true
toggleCommand:
Enables the /reports on and /reports off commands.
enabled: true
=========================================================
Delete / Retention
Controls how deleted reports are handled
=========================================================
delete:
Delete mode:
- TAG = report is marked as deleted
- PURGE = report is permanently removed
mode: TAG
Retention period for deleted reports.
0 usually means no retention-based cleanup.
retention: 0
=========================================================
Updates
Update notification settings
=========================================================
updates:
If true, players with the proper permission are notified
on join when an update is available.
notifyOnJoin: true
=========================================================
PlaceholderAPI
Placeholder expansion settings
=========================================================
placeholderapi:
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
=========================================================
Discord Webhook
Sends report events to Discord
=========================================================
discord: webhook:
Enables Discord webhook integration.
enabled: false
Discord webhook URL.
url: ""
events:
Send a webhook when a new report is created.
onReportCreated: true
Send a webhook when a report status changes.
onStatusChanged: true
Send a webhook when a handler changes.
onHandlerChanged: true
Custom webhook username shown in Discord.
username: "PlayerReport"
Optional avatar URL for the webhook.
avatarUrl: ""
If true, webhook messages are sent as embeds.
useEmbeds: true
Optional mention text, for example:
"@everyone" or "<@&roleId>"
mention: ""
=========================================================
Reports GUI
Main moderation GUI
=========================================================
GUI:
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%)'
Lore of a report entry.
Lore: - - ' &eReason: &b%reason%' - - ' &eReporter: &b%reporter%' - ' &eReported: &c%reported%' - - ' &eReason: &b%reason%' - - '&aLeft-Click &7→ Open report' - '&eMiddle-Click &7→ Change Status' - '&cRight-Click &7→ Remove'
Player-Commands:
Commands triggered for the different click types.
Leave empty brackets [] to disable.
LEFT: [] MIDDLE: [] RIGHT: []
=========================================================
GUI Defaults
Default filter and sorting for the reports GUI
=========================================================
gui:
Default filter when opening the reports GUI.
Available: OPEN, CLOSED, DELETED
defaultFilter: OPEN
Default sorting mode when opening the reports GUI.
Available:
- NEWEST
- OLDEST
- STATUS_OPEN_FIRST
- STATUS_IN_PROGRESS_FIRST
defaultSort: NEWEST ```
lang.yml
```yaml prefix: "&8[&bPlayerReport&8]&r "
header: "&8&m------------------------" footer: "&8&m------------------------"
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}"
reports-search-usage: "{prefix}&7Usage: &f/reports search user <name>&7 | &f/reports search id <id>&7 | &f/reports search reason <reason>&7 | &f/reports search handler <name>" reports-notify-on: "{prefix}&aNotifications enabled." reports-notify-off: "{prefix}&cNotifications disabled." reports-toggle-disabled: "{prefix}&cToggle command disabled in config." reports-clear-failed: "{prefix}&cCould not clear reports." reports-cleared: "{prefix}&aCleared &f{amount}&a reports."
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}n{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"
report-confirm: title: "&cReport &f{target} &cfor &b{reason}&c?" yes: name: "&aYes" no: name: "&cNo"
reward-decision: title: "&bGive reward? &7(# {id})" yes: "&aYes, give reward" no: "&cNo, don't give reward"
reports: shared: back: name: "&cBack" state-on: "&aON" state-off: "&cOFF" not-available: "N/A" location: "&7Location: &f{location}" filter: open: "OPEN" closed: "CLOSED" deleted: "DELETED" sort: newest: "NEWEST" oldest: "OLDEST" status-open-first: "STATUS_OPEN_FIRST" status-in-progress-first: "STATUS_IN_PROGRESS_FIRST" status: open: "OPEN" in-progress: "IN_PROGRESS" closed: "CLOSED" deleted: "DELETED"
list: title: "&cReports &7(%filter% &8|&7 %sort% &8|&7 %page%/%pages%&7)" only-my-handler: name: "&bOnly my handled reports: &f{state}" lore: - "&7Click to toggle" - "&7When enabled, you will only" - "&7see reports where you are" - "&7the handler." filter: open: name: "&a Open Reports" lore: - "&7Shows open & in-progress reports" - "" - "&eClick to switch filter" closed: name: "&c Closed Reports" lore: - "&7Shows closed reports" - "" - "&eClick to switch filter" deleted: name: "&6 Deleted Reports" lore: - "&7Shows deleted reports" - "" - "&eClick to switch filter" sort: name: "&bSort: &f{sort}" 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: name: "&a← Previous page" lore: - "&7Click to go back" next: name: "&aNext page →" lore: - "&7Click to go forward" search: user: "User: {value}" id: "ID: {value}" reason: "Reason: {value}" handler: "Handler: {value}" entry: name: "&a %reported% &7(#%id%)" lore: - "" - " &eCreated: &7%created%" - " &eStatus: &7{status_display}" - " &eHandler: &7%handler%" - "" - " &eReporter: &b%reporter%" - " &eReported: &c%reported%" - "" - " &eReason: &b%reason%" - "" - "&aLeft-Click &7→ Open report" - "&eMiddle-Click &7→ Change Status" - "&cRight-Click &7→ Remove"
confirm-delete: title: "&cRemove report?" confirm: name: "&aConfirm" cancel: name: "&cCancel" info: name: "&7Target: &f{target}"
details: title: "&cReport #{id}" teleport-click: "&7Click to teleport" teleport-reporter-current: name: "&aTeleport: reporter (current)" teleport-reporter-snapshot: name: "&aTeleport: reporter (at report)" teleport-target-current: name: "&eTeleport: reported (current)" teleport-target-snapshot: name: "&eTeleport: reported (at report)" status: name: "&bSet status" lore-created: "&7Created: &f{created}" lore-current: "&7Current: &f{status}" lore-handler: "&7Handler: &f{handler}" lore-click: "&7Click to choose" back: lore: "&7Return to /reports"
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"
discord: report-created: title: "New report #{id}" description: "Status: {reporter}nStatus: {target}nStatus: {reason}nStatus: {status}" status-changed: title: "Report #{id} status changed" description: "Status: {actor}nStatus: {target}nStatus: {old_status}nStatus: {new_status}nStatus: {handler}" handler-changed: title: "Report #{id} handler updated" description: "Status: {actor}nStatus: {target}nStatus: {handler}nStatus: {status}" ```
Placeholders
| Placeholder | Description | |---|---| | `%playerreport_reports_total%` | Total number of reports stored on the server. | | `%playerreport_reports_open%` | Total number of currently open reports. | | `%playerreport_reports_in_progress%` | Total number of reports currently being handled. | | `%playerreport_reports_closed%` | Total number of closed reports. | | `%playerreport_reports_deleted%` | Total number of deleted reports. | | `%playerreport_reports_created%` | Number of reports created by the player. | | `%playerreport_reports_against%` | Number of reports made against the player. | | `%playerreport_reports_handled%` | Number of reports handled by the player (as moderator). | | `%playerreport_reports_open_for_player%` | Number of open reports created by the player. | | `%playerreport_reports_handled_open%` | Number of open reports currently assigned to the player as handler. |
Please <u>DO NOT</u> leave bad reviews for issues. If you encounter problems, please contact me via PM, the discussion tab or the Discord server.
Thank you!