Click outside or press Esc to close
Version
1.0.0
Updated
2 hours ago
Views
5
Downloads
0
Overview
ReportDesk collects player reports from F7 and from chat, puts them on a triage board, and posts them to Discord. Ban and kick are buttons on the board.
Reports are not the hard part. Triage is. Players report whoever just killed them, so the genuine cheater ends up buried under forty revenge reports and the admin stops reading the channel by week two. Every report plugin ships the collecting. None of them ship the sorting.
ReportDesk sorts. It tracks how often each reporter turns out to be right, shows that on every card, and weights its spike detection by it — so one trusted reporter counts for more than eight players who have never had a report upheld. It also captures a snapshot of the accused at the moment the report lands, so you can see headshot rate, K/D and whether they had just killed the reporter, without teleporting anywhere.
Free, MIT, no dependencies. A Discord webhook URL is the only setup, and even that is optional.
Features
- Captures native F7 reports and a full
/reportpanel, both into one queue - Four-column triage board: NEW, REVIEWING, WATCHING, CLOSED TODAY
- Click any report to open that player's full file with every report against them
- BAN, KICK, WATCH, DISMISS, CLAIM, SPECTATE and TELEPORT on the board
- Ten separate permissions, so ban and kick can be handed out independently
- Reporter credibility tracked across every wipe and shown on every card
- Evidence snapshot captured automatically when a report is filed
- Spike detection when several players report the same person quickly
- Discord webhooks: main, spikes with a role ping, audit log, and one per reason
- Every wipe archived on its own, with a wipe picker in the board header
- Ban delivery through the server, a command template, or another plugin's hook
- Unlimited report reasons, each with its own colour, rules and webhook
- Anti-abuse: cooldowns, daily caps, repeat-target guard, team and staff exemptions
- Every visible string editable in game, unlimited languages, player language switcher
- Full in-game editor. Nothing needs a config file
- Free, MIT, no dependencies
Where reports come from
Both paths feed the same board. You do not have to teach anybody a command.
| Path | What happens |
|---|---|
| F7 | Rust's own report window. ReportDesk reads it, matches the category onto your reasons, and files it. Most of your reports will arrive this way because it is the button the game already gives players. |
/report |
A panel with a searchable player list sorted by who is nearest, your reason buttons, and a note box. |
/report name reason note |
Skips the panel for players who know what they want. |
F7 reports can be set to ignore the cooldown, and that is the default. Rust's own dialog already tells the player their report was sent, so a plugin that quietly disagrees with the game leaves them with no idea the two systems are separate.
Credibility — the part that makes the queue readable
Every reporter carries a record across every wipe: reports filed, reports upheld, reports dismissed. That produces a score, and the score appears on every card:
Marek · 6 filed, 5 upheld <- worth reading first
kx_ · 41 filed, 0 upheld <- almost certainly a grudge
The score is settled with a prior, so a brand new player starts neutral rather than being treated as untrustworthy for having no history. It only moves once they have a record.
You can optionally refuse reports from anyone below a score you choose, which stops a determined spammer filling the queue without you having to mute them by hand.
The evidence snapshot
The moment a report is filed, ReportDesk records the state of the accused so you are not reconstructing it later:
| Captured | Why it is on the card |
|---|---|
| Headshot rate, against your server's own average | The single number admins check first, and meaningless without the server baseline next to it |
| Longest kill and the weapon used | A 300m kill with a shotgun reads differently to one with a bolt |
| Kills, deaths, time played | 40 kills in two hours is not the same as 40 kills in three hundred |
| Did the target kill the reporter just before this? | Identifies a revenge report instantly |
| Distance between the two players | A wallhack report from someone 400m away is noise |
| Prior reports, this wipe and all wipes | Repeat offender or a one-off |
None of this is proof, and the panel says so. There is a line under the evidence block stating it is context only. A card reading 89% headshots next to a BAN button is exactly how innocent players get banned, and the plugin should never pretend otherwise. It is there to tell you what to look at first, not what to do.
Spikes
When several different players report the same person in a short window, that is worth interrupting you for.
| Setting | Default |
|---|---|
| Score needed | 3 |
| From this many different players | 3 |
| Within | 10 minutes |
| Weight by reporter credibility | On |
| Alert online staff, ping Discord | On |
| Automatically kick or ban | Off |
A spike marks every report involved, pings a Discord role you choose, and shows a flag on the card.
Automatic bans are off by default and should stay that way. Five players who can coordinate on a call can manufacture a spike on anyone they dislike. If you do turn it on, leave credibility weighting on as well, or you have handed your ban button to whoever is best organised. The editor says this next to the switch, not just here.
The board
/reports opens a four-column board. Reports move right as they are handled, so a team of admins can see at a glance what is untouched and what somebody is already on.
| Column | Meaning |
|---|---|
| NEW | Nobody has looked yet |
| REVIEWING | An admin has claimed it, and their name is on the card |
| WATCHING | Not enough to act on, but keep an eye out |
| CLOSED TODAY | What was actioned, by whom, with the outcome |
The header carries a search box, a MINE ONLY filter, the wipe picker and a live count. The footer shows median time from report to action and how many each admin has handled.
The player file
Clicking any card opens the accused's file rather than a single ticket — because when the same name keeps coming up you want to judge the person once, not five tickets separately.
It shows their name, SteamID, time played, whether they are online and where, prior reports, prior bans, the four evidence stats, and then every report ever filed against them stacked underneath with each reporter's credibility colour-coded. Reports from earlier wipes are counted at the bottom.
All the actions sit on that page: BAN, KICK, WATCH, DISMISS, CLAIM, SPECTATE, TELEPORT.
Discord
Paste a webhook URL and reports start arriving. There is a SEND A TEST button in the editor so you can confirm it works in one click rather than waiting for a real report.
- A rich embed per report with the note, the evidence block and the reporter's record
- Colour-coded by reason, with Steam and BattleMetrics links for the accused
- A separate webhook per reason, so cheat reports need not share a channel with spam
- A spike webhook with a role ping
- An audit webhook logging every ban, kick and dismissal with who did it
- A send queue with rate-limit backoff, so twenty reports in a minute is not twenty lost reports
On ban buttons inside Discord. A plain webhook can post buttons but cannot receive the click — only a bot with an interaction listener can. So buttons in Discord need the DiscordExtension. That path exists in the plugin but ships switched off and untested; the webhook path is the one that works with nothing installed. This is stated plainly rather than sold as a feature that quietly does nothing.
Punishment and permissions
Bans and kicks are delivered whichever way suits your server:
| Mode | What it does |
|---|---|
| Native | The server's own banid and kick commands |
| Command | A line you write, with {steamid} {name} {reason} {days} |
| Plugin | Calls a hook on whatever ban plugin you already run |
The command template is the important one: it means ReportDesk works with your existing ban system without needing to integrate with it specifically.
| Permission | Grants |
|---|---|
reportdesk.use |
File a report, if you have gated reporting |
reportdesk.view |
Open the board, read only |
reportdesk.handle |
Claim, watch and dismiss |
reportdesk.kick |
The KICK button |
reportdesk.ban |
The BAN button |
reportdesk.banperm |
Permanent bans specifically |
reportdesk.teleport |
Teleport and spectate |
reportdesk.wipes |
See archived wipes |
reportdesk.admin |
The editor and admin commands |
reportdesk.immune |
Cannot be reported |
Splitting kick from ban is deliberate. Trial staff can clear the queue and kick without being able to ban anybody permanently.
Wipe history
Every wipe is archived on its own file when a new save is detected. The wipe picker in the board header switches to any of them, read only, so you can look back at what happened last month.
Player records carry across wipes by default, which is what makes reported 14 times across 6 wipes and the credibility score possible at all. You choose how many wipes to keep.
Anti-abuse
- Cooldown between reports, with F7 optionally exempt
- Daily cap per player
- The same target cannot be reported twice by the same player within a window
- Optional minimum playtime before a player may report
- Teammates and staff can be made unreportable
- A minimum note length, per reason
- Open reports close automatically when a player is banned
Nothing is ever silently dropped. If a report is refused, the player is told why and the reason is written to the server console. A report system that swallows reports without saying so is worse than no report system, because you believe it is working.
Reasons
Six ship enabled and you can add as many as you like. Each has a label, a colour that drives it everywhere in the interface, whether a note is required, whether it counts towards spikes, and its own Discord webhook.
The defaults are CHEATING, TOXICITY, TEAMING, SPAM, GRIEFING and BUG ABUSE. F7 categories are matched onto them automatically, and anything unrecognised falls back to your first enabled reason.
Commands
| Command | What it does |
|---|---|
/report |
Open the report panel. Also /rep |
/report <name> <reason> <note> |
File without the panel |
/reports |
The board. Also /rd |
/reports <name> |
Jump straight to that player's file |
/reports mute |
Turn your own new-report alerts off |
reportdesk.report |
Console readout: counts, median time, most reported, F7 diagnostics |
reportdesk.open <steamid> |
Open the board on a player |
reportdesk.archive |
Archive the current wipe by hand |
Setup
- Drop
ReportDesk.csintooxide/plugins/ - Grant yourself the editor with
oxide.grant group admin reportdesk.admin - Type
/reportsand press SETUP - Paste a Discord webhook into DISCORD and press SEND A TEST
Everything works out of the box with no webhook at all — reports simply stay in game. Reports, player records and translations live in oxide/data/ReportDesk/, everything else in the config file, and all of it is editable from the panel.
Run reportdesk.report after your first day. It tells you how many F7 reports have been seen since load and how many were refused, which is the fastest way to confirm capture is working before you rely on it.
Developer API
[PluginReference] private Plugin ReportDesk;
ReportDesk?.Call("OpenBoard", player);
ReportDesk?.Call("GetOpenCount"); // int
ReportDesk?.Call("GetReportCount", steamId); // int, this wipe
ReportDesk?.Call("GetReportCountAll", steamId); // int, every wipe
ReportDesk?.Call("GetCredibility", steamId); // float, 0 to 1
ReportDesk?.Call("FileReport", reporter, targetId, "cheat", "note text");
Three hooks fire:
void OnReportFiled(BasePlayer reporter, ulong target, string reason) { }
void OnReportActioned(ulong target, string outcome) { }
void OnReportSpike(ulong target, int reports) { }
GetCredibility is the useful one for other plugins — it lets anything else on your server know whether a given player's word has historically been worth acting on.
Compatibility
Oxide and Carbon. No dependencies. Notify and DiscordExtension are optional and detected automatically.
It sits alongside other report plugins without conflict, so you can run it in parallel while you switch over and compare what each one catches.
Panel size, blur, background darkness and text scale are all settings, so if anything renders oddly on an unusual resolution you can size it to suit. The symbols used in the interface are configurable characters, so if your server's font renders one as a box you can replace it with anything you like.
Requirements & compatibility
Oxide and Carbon. No dependencies. Notify and DiscordExtension are optional and detected automatically.
No updates yet.