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 /report panel, 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

  1. Drop ReportDesk.cs into oxide/plugins/
  2. Grant yourself the editor with oxide.grant group admin reportdesk.admin
  3. Type /reports and press SETUP
  4. 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.

No reviews yet.

Log in to write a review (buyers only).