`/server` <small>(Organizer)</small>
Registry of game servers the stat collector tracks. Once a server is added, the bot
keeps an RCON connection to it and records Skirmish/Hardpoint sessions
automatically — kills, deaths, score, rounds, objective holds — into the
/stats system, classified as
competitive / scrim / pug.
/server add
gameString(choice) — currently MordhaulabelString— short unique handle, e.g.comp-1(lowercase, dashes)hostString— server public IP or hostnameportInteger— the RCON port (TCP), not the game portpasswordString— the RCON password
The password is stored encrypted at rest (AES-256-GCM). Servers are identified
by host:port — adding the same address twice errors with the existing label, and
labels are unique per game. The collector connects within a minute of adding.
The same registry lives on the web at Manage → Play → Servers: the Add server button on the Tracked servers card opens a dialog asking for the label, host, RCON port, and RCON password.
The host must resolve to a public address. Private, loopback, link-local, and
cloud-metadata addresses (127.0.0.1, 10.x/172.16–31.x/192.168.x,
169.254.169.254, …) are rejected — the collector will never be pointed at an
internal service.
One server, many leagues. Two leagues can register the same host:port — Heir
keeps a single RCON connection and fans it out, and each league records into its own
data with its own minimum match format.
/server remove
gameString,labelString
Stops tracking. Already-recorded stats are kept.
/server list
Lists tracked servers with their labels and addresses (never passwords).
/server status
Live health check for every tracked server — each line shows one of:
- 🟢 auth OK with round-trip latency, current mode/map, player count, and a 🎥 marker while a session is being recorded
- 🔴 not connected (server down or port unreachable — reconnecting with backoff)
- 🔐 auth failed — the stored RCON password is wrong; re-add the server
- 🟠 connected but the probe timed out
- ⚪ collector not attached yet (new servers connect within a minute)
Related config
/config stats-channel:— channel receiving live stat events (tracking started, round end, map end, tracking finished) with 🗑 Void / ✅ Approve buttons on each./config stats-approval:—manual(default): tracked stat matches are pending and count toward nothing until an organizer approves them;auto: they count immediately and organizers void the occasional bad one./config ref-role:— role allowed to use the in-game ref commands below./config series-format:— league series length used by the automatic result arbiter: Best of 1 / 3 / 5 / 7 (default Best of 5, first to 3)./config stats-leaderboard-channel:— channel holding the persistent stat leaderboard embeds (see/stats leaderboard)./config stats-leaderboard-buckets:— which buckets get their own embed there: a comma-separated subset ofcompetitive,casual,overall, orall/none(default:competitive,overall).
In-game announcements & ref commands
Every time a tracked map (SKM/HPT) starts, the bot announces in server chat:
[ETHR] Stat tracking active — Skirmish on Moshpit.
Players holding the Ref role (or Organizer role, or Administrator) — matched
via their linked PlayFab ID, so refs must have run /identity link — can control
tracking from in-game chat (.start, .stop, .void, .status, .red/.blue).
The full ref command reference lives with
Stat Tracking → In-game controls; a
forgotten-.stop nag and a 30-minute arm timeout guard against stray sessions.
Commands from anyone else are silently ignored, and every ref action is posted to the stats channel with who did it. Void/Approve toggle in both directions and every transition is audited. Voiding a round or game excludes just that data; voiding a stat match excludes all of it.