Discord commands

/stats

Inspect supported team-match statistics and administer tracked matches.

Who can use it: League members; import and reclassification require an Organizer.

In-game team-match statistics for Mordhau and Chivalry: Medieval Warfare — kills, deaths, score, and available mode-specific measurements, recorded per round, per game, per match. Mordhau offers Skirmish (SKM) and Hardpoint (HPT); Chivalry offers Last Team Standing (LTS) and Team Objective (TO). The command lists all four modes, but a League accepts only modes for its configured game. Duel and opt-in Deathmatch combat are covered separately in tracking profiles.

Stats come in three buckets:

  • Competitive — officially scheduled league matches
  • Casual — scrims (team vs team, unscheduled) and pugs (mixed teams)
  • Overall — everything combined

Players need the Identity for their League’s game: PlayFab ID for Mordhau, or a verified Steam account for Chivalry. Use /identity link for the appropriate linking flow. Eligible stats recorded before linking are backfilled once the Identity is connected.

/stats player

Your (or another player's) tracked stats, shown as Competitive / Casual / Overall.

  • user User (optional)
  • mode String (optional) — Skirmish (SKM), Hardpoint (HPT), Last Team Standing (LTS), or Team Objective (TO); must match the League’s game

/stats match

One tracked match's breakdown: per-game mode, map, final score, winner, and top performer.

  • id String — the stat match id shown on stat embeds and imports

The plan can limit access to old match details (Free defaults to 30 days; Pro to 180 days; Ultimate and Enterprise are unlimited, with entitlement overrides possible). A match outside that browsing window is rejected with an upgrade message; the stored match and its aggregates are retained. Player aggregates and ratings are not windowed by this display limit.

/stats leaderboard

Tracked players sorted by the chosen stat. Visible depth depends on the League’s plan.

  • stat String (optional) — K/D (default), Kills, Score, Time on point, Clutches (1vX won), Rounds played, or Round Impact (WP swing)
  • type String (optional) — Overall (default), Competitive, or Casual
  • mode String (optional) — Skirmish (SKM), Hardpoint (HPT), Last Team Standing (LTS), or Team Objective (TO); must match the League’s game

Ranking uses the League’s configured minimum (50 by default). The board always renders: while nobody meets the minimum it shows all players marked provisional, and with no data at all it says so instead of erroring.

Persistent leaderboards

Besides the on-demand command, a channel can host always-current leaderboard embeds — one message per bucket, edited in place (never reposted, so message links stay stable):

  • Top row: Kills, Score, K/D — top 5 each
  • Second row: Clutches, Time on Point, Rounds Played, and Round Impact — top 3 each
  • Distinct colors per bucket (🏆 Competitive red, 🎮 Casual blue, 🌐 Overall gold)

Set it up with /config stats-leaderboard-channel: and pick buckets with /config stats-leaderboard-buckets: (default: competitive + overall). The embeds refresh automatically whenever approved stats change: a tracked match finishes, an organizer approves/voids/restores anything, or a match is imported or reclassified. The League’s configured ranking floor applies per bucket, with a provisional fallback.

The channel may be the team elo leaderboard channel — the stat messages are tracked and survive its repost cycle — or any other channel you prefer.

/admin tracking import

Moved from /stats import: organizer-only stat tools now live under /admin tracking so /stats is purely a player command.

Import a stat match from a JSON file. Imports are idempotent — re-importing the same externalId updates instead of duplicating. Validation errors name the exact field (games[0].players[2].score: expected a number). The attachment must be a Discord CDN file smaller than 5 MB. Importing queues normalization and rating projection after the command acknowledges.

  • file Attachment — a StatMatch payload:
{
  "contractVersion": 1,
  "externalId": "comp-1-2026-08-03-2100",
  "matchType": "competitive",
  "server": "comp-1",
  "startedAt": 1754250000000,
  "games": [{
    "mode": "SKM",
    "map": "Moshpit",
    "winnerSide": 0,
    "finalScore": {"side0": 7, "side1": 4},
    "players": [{"playfabId": "77A5DDC1BC678308", "name": "ore023", "side": 0,
                  "kills": 12, "deaths": 8, "teamKills": 0, "suicides": 0, "score": 1450}],
    "rounds": [{"index": 0, "winnerSide": 0,
                 "players": [{"playfabId": "77A5DDC1BC678308", "kills": 2, "deaths": 0, "score": 220}]}]
  }]
}

This is a minimal illustrative legacy contract-v1 example. It does not provide complete measured participation or enhanced-mod coverage. Do not use it as proof that an import qualifies for current player ratings. See tracking contracts and coverage.

HPT games use "segments": [{"side": 0, "seconds": 42, "points": 42}] instead of rounds, plus per-player timeOnPoint.

/admin tracking reclassify

Move a match between buckets (e.g. a scheduled match that was detected as a scrim). Only stat bucketing changes — league match results and Elo are never touched. Player ratings are rebuilt asynchronously, and the action is audited.

  • id String
  • type String — competitive / scrim / pug

Clutches (1vX) — one-life rounds

Because Skirmish and Last Team Standing are one life per round, the collector tracks the full alive pool and detects clutch situations: the moment a player becomes their team's last one standing against 2 or more living enemies. If their team then wins the round, that's a 1vX clutch won — announced live in the stats channel (🔥 CLUTCHname won the 1v3!), shown on /stats player (🔥 3 clutches (best 1v3)), and rankable via /stats leaderboard stat:clutchWins (shown in Discord as Clutches). Failed attempts are recorded too.

  • X is fixed at the moment the clutch begins — killing two of three enemies and finishing 1v1 still counts as the 1v3 it started as.
  • A mid-round disconnect counts as an elimination for the alive pool (but not as a death for the leaver), so clutch detection can't be cheated by rage-quits.
  • 1v1 games never produce clutches — X must be ≥ 2.
  • Hardpoint and Team Objective have no one-life clutches: these modes allow respawns. Clutch data applies to recorded SKM/LTS rounds with the required alive-pool evidence.

Conventions

  • Suicides count as deaths; team kills are tracked separately and never count toward kills or K/D.
  • Voided rounds/games/matches are excluded from all aggregates.
  • Games below the league's minimum match format do not qualify as team matches. Duel and presence profiles have separate recording rules.
  • Stat matches are recorded automatically by the collector on servers registered via /server add (the League’s supported SKM/HPT or LTS/TO team modes), or entered manually via /admin tracking import.