Discord commands

/server

Register a game server and check its collector connection.

Who can use it: League Organizers.

Registry of game servers the stat collector tracks. Once a server is added, the bot keeps an RCON connection to it and records sessions according to its tracking profile — kills, deaths, score, rounds, objective holds — into the /stats system, classified as competitive / scrim / pug.

/server add

  • game String (choice) — choose from the registered choices; the Discord catalog offers Mordhau and Chivalry: Medieval Warfare
  • label String — short unique handle, e.g. comp-1 (lowercase, dashes)
  • host String — server public IP or hostname
  • port Integer — the RCON port (TCP), not the game port
  • password String — 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 attempts a connection after registration; an Online state confirms a successful probe. Connection health and tracking state are separate.

The same registry lives on the web at Manage League → Stats & game servers: the Add server button in Game servers 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 tracking profile and minimum match format.

/server remove

  • game String, label String

Stops tracking. Already-recorded stats are kept.

/server list

Lists tracked servers with their labels and addresses (never passwords).

/server status

/server status currently replies that a required option is missing, because Discord does not offer the game and label values it asks for. Check a game server from Manage League → Stats & game servers on the website, or use /server list, until the command is fixed.

When the command does receive a game and label, its private reply reports one of these states:

  • the last successful connection and response latency
  • the latest connection error and when Heir last tried it (including refused, timed out, address-not-found, unreachable, or authentication failure)
  • a connection attempt that is still waiting for a response
  • no connection attempt yet, which normally means the collector will try within a minute of adding the server

The command does not expose a live map, player count, or session marker in its current response. Use the web tracking page for the richer tracking state.

  • /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 of competitive,casual,overall, or all / 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.

Website setup and troubleshooting

Use Connect a game server for Match, Duel, and Presence profiles, per-server overrides, and the first successful observation. Read tracking status if the server remains VERIFYING or combat data is absent. Duel and opt-in Deathmatch can record combat without creating a team match.