Hermes Games

Commands

Tournaments are slash commands under /tour. The dice games share /roll — Death Roll is /roll dr, and the next dice game takes its own name beside it — hi, lo, far, close. There is no verb to type: /roll dr throws down a challenge anyone can take, and /roll dr user:@rival aims it at somebody. /roll dice is just a number — 1 to 100, or to whatever max: says. Poker nights are under /poker — a roster, the payments and the record for a game played away from Discord.

Inside a tournament's thread, commands know which tournament you mean. Anywhere else, add code: — every tournament shows its code in its thread name.

Playing a tournament

CommandWhat it does
/tour joinTake a spot in the tournament in this thread
/tour join entries:2Take two spots — you may hold several
/tour join code:K4M2QPJoin from anywhere by quoting the code
/tour join entries:2 tab:@friendYou play, they pay — they get tagged
/tour join entries:2 for:@friendYou pay, they play — they get tagged
/tour leaveDrop all your spots, or entries:1 to drop one
/tour checkinConfirm you are here once check-in opens

The bracket starts only once every place has checked in. Joining during check-in takes an empty place only, never one somebody is still holding; an organizer can check in a player who is there but missed it with /tour admin checkin, or remove a no-show with /tour admin dq to open their place.

While it fills

Every join is announced in the thread — who joined, and how full the tournament now is — and the roster is pinned and kept current: one message for the whole tournament, edited as people join, leave, check in or are substituted. When it starts, the bracket image is pinned beside it.

Looking things up

CommandWhat it does
/tour infoThe tournament card: rules, fee, prize and its picture
/tour bracketThe current bracket as an image
/tour rosterWho is in so far — and, when the fee is a price, what each payer owes so far, with the total if the bracket fills
/tour pendingBring every unfinished match back to the bottom of the thread, so nobody scrolls to confirm. In an olympics, a game that finished without its result reaching the bracket is put in
/tour summaryWhat everyone owes, the winner and the prize — once the bracket is drawn
/tour listEvery tournament running in this server
/tour profileYour record, or player:@name for someone else
/tour helpAll of this, in the channel

Settling a match

A live match card carries a green Won button beside each player's name. Press the one next to whoever won — you do not have to be that player:

This exists because a match should not stall behind a winner who has gone quiet. Whoever claimed a win can never confirm their own claim, so a result always has two people behind it.

If a match goes quiet, anyone in the tournament can run /tour pending to bring the unfinished cards back down — both the ones waiting on a confirmation and the ones nobody has played yet. In an olympics it brings back each match's dice card instead, with the rolls so far, and pings whoever still has to roll. A match whose game already finished but never moved the bracket on gets its result put in. An organizer can also /tour ping waiting:true, which mentions exactly the players a round is stuck on and tells each of them what they owe.

Running a tournament

Organizers only — a role you choose, or Manage Server.

CommandWhat it does
/tour create name:Summer Cup size:16 prize-value:$120Ask to open a tournament. An approval card is posted in the channel and the hosts are tagged; the thread opens when another host presses Approve. The bot's owner can approve any request, including their own. prize-value is what the prize is worth (0 if there is none), shown next to what a full bracket collects
Reject on the cardAnother host turns it down, with a reason if they like. The host who asked presses Edit to change the name, fee, prize, prize value or description, and it is sent for approval again. Withdraw drops the request
… entry-fee:£5 prize:Trophy prize-image:<link>Optional details, all editable later
… style:olympicsThe bot deals every match as a dice game and takes the result — nobody reports anything. The final is best of three: each finalist secretly picks one game, and the bot draws the third from the rest
… style:olympics match-minutes:60How long a match may sit unrolled before the bot rolls for whoever hasn't — 10 minutes if you leave it out. The final has no limit
/tour open-checkinClose registration, open check-in, ping everyone
/tour startDraw the bracket and ping round one
/tour cancelCancel it. In an olympics, every dice game still being played is closed and settles nothing
/tour admin force-win round:2 match:1 winner:@aliceSet a result outright
/tour admin reopen round:2 match:1Undo a result and everything downstream. In an olympics the match is dealt again, and a later match being played is stopped until its seats are decided
/tour admin void-entries player:@alice count:1Remove entries at random
/tour admin checkin player:@aliceDuring check-in: check a player in. all:true checks in everyone who hasn't yet
/tour admin dq player:@alice replacement:@bobDisqualify a player. Once the bracket has started a replacement is required, and takes every seat they held; before the draw, leave it off and their places reopen
/tour admin substitute out:@alice in:@bobHand every seat a player holds to someone else
/tour ping message:Doors openPing everyone still in the tournament
/tour ping waiting:truePing only the players a match is waiting on, and say what each owes. In an olympics, only the players who have not rolled yet
/tour admin set prize:New prizeChange a detail; - clears one. prize-value:$150 corrects what the prize is worth
/tour admin set match-minutes:10Olympics: change the match clock at any time, including for matches already in play
/tour admin redrawRe-run the draw, before anything has been played. In an olympics the dealt cards are closed and the new draw is dealt
/tour summary cost:5Set the price of one entry and post what everyone owes

Settling up

When the final is decided, the bot posts what everyone owes under the champion: the price of an entry, and one line per person who bought any, tagged so they see it. A friend who covered two spots on a tab sees them on their own line:

@rich — $9.63 · 3 entries (1 own, 2 for @alice)

The price comes from the entry fee when the fee is a plain price — $5, £3.50, 5 each. If it is anything else, or there was none, the host is tagged with a Set the price button instead. /tour summary cost: sets or corrects it at any time. Every entry in the bracket pays in full, including ones later disqualified; the bot never tracks who has paid.

Before the draw, the roster shows the same lines so far, for anyone who wants to pay up front: $5 an entry × 6 of 16 entries = $30 so far · $80 if full. Each line is exact for the entries that payer holds now; only the total is an estimate, because the field can still change until the draw.

Substitute is the exception to the role: only the tournament's creator — or the bot's operator — can run it, because it is the one command that changes who is playing after the bracket exists. Results, positions and the shape of the tree are untouched; only the name on those seats changes.

A plain roll

CommandWhat it does
/roll diceA number from 1 to 100
/roll dice max:48484A number from 1 to 48,484 — a raffle with that many tickets

No game, no opponent and nothing on the scoreboard — and still checkable. Each roll's card carries the fingerprint for the next roll in that channel, so every roll after the first can be held to a secret posted before anybody pressed. The first in a channel says it cannot be; see Fairness.

One roll each

Four games with the same shape: both players roll once, and a comparison decides it. A tie rolls again — in far and close that includes two different rolls the same distance from 50, like 30 and 70.

CommandWhat it does
/roll hiHighest roll wins — open challenge, 1–100
/roll loLowest roll wins
/roll farFurthest from 50 wins — always 1–100
/roll closeNearest 50 wins — always 1–100
/roll hi user:@rival wager:100Aimed at somebody, for a wager
/roll lo max:1000A bigger range — hi and lo only
/roll hi item:a Steam keyName what you are playing for — a thing, or a link to one
/roll hi user:@rival best-of:3First to two games takes the series — and the wager, once
/roll hi code:K4M2QPRoll in that game, if its card has scrolled away

far and close are fixed at 1–100 so they stay the games everybody knows: over 1–10 every roll is below 50, and “furthest from 50” would quietly mean “lowest”.

Death Roll

CommandWhat it does
/roll drOpen challenge — anyone but you may accept, nothing at stake
/roll dr user:@rivalChallenge them in particular — no wager
/roll dr user:@rival wager:100Challenge them for a wager of 100
/roll dr user:@rival wager:100 start:500…and rolling starts at 500
/roll dr wager:100Open challenge for a wager
/roll dr item:a Steam keyName what you are playing for — a thing, or a link to one
/roll dr user:@rival wager:100 best-of:3First to win two duels takes the series and the 100
/roll dr code:K4M2QPRoll in that duel, if its card has scrolled away
/roll cancel [code]Withdraw a challenge you are still offering
/roll statsOne dice record — wins, losses, played, and your score
/roll historyYour recent games, all dice games together
/roll topThis server's top ten by wins, across every dice game
/roll helpAll of this, in the channel
/roll void code:CODEOrganizers: clear a stuck game

Several at once

You can be in as many duels at once as you like, and leave as many challenges waiting — being mid-duel does not make you unchallengeable. The buttons belong to their own duel, so they are never ambiguous, and a typed roll has to name its duel with code: rather than the bot picking whichever came back first.

Starting a game, and rolling in one

/roll dr starts a game: on its own the challenge is open to the room, and user: aims it at somebody. Add wager: and start: to set the terms.

item: names what you are playing for — “a Steam key”, or a link to it. It rides on every card the game posts, from the challenge to the result, so nobody has to scroll back to remember what was at stake. The bot only carries the words: a wager moves a score, but an item is between the two of you to hand over. The two are independent, so a game can have either, both or neither.

Best of three

best-of:3 turns any dice game into a series: the first to win two games takes it. It is still one game — one challenge, one code, one wager — so nothing moves after game one or two, and the whole stake moves once when somebody reaches two. The boards count the series as one win and one loss.

Each card says where the series stands — Best of 3 · game 2 · @alice leads 1–0 — and a short score card goes up between games. In Death Roll every duel starts again from the agreed number and draws its own first turn, because going first is the worse seat and alternating would give it to one player twice. A tie in the one-roll games still just rolls again; it is not a game won by nobody.

The whole series draws from one secret, published when it ends, so every roll of every game can be checked with 🔒. A series that goes quiet part-way closes like any game does: nothing settles, whatever the score.

Rolling is the button on the card addressed to you. The only typed roll is /roll dr code:K4M2QP, which exists for a card that has scrolled away — and it names the duel rather than guessing, because a roll in the wrong game cannot be taken back.

How a duel goes

Both players roll once to decide who goes first, each on their own message. Then turns alternate: the range is 1 to the last number rolled, inclusive, so rolling the ceiling exactly is legal and simply leaves it where it was. Roll a 1 and the duel is over.

A wager moves a notional score — see Terms. The bot never announces anyone's running total on its own; /roll stats and /roll top are how it is read.

Poker nights

The bot does not deal — a poker night happens at a table, or in a client the bot has no account on. What it does is the part that goes wrong in Discord: who is coming, what it costs, where to send the money, who has sent it, and who won.

The roster card is deleted and reposted every time somebody joins, so it stays near the bottom of the channel instead of scrolling away. It carries the buy-in, the payment link, the prize and a Join button.

CommandWhat it does
/poker joinTake a seat at the night running in this channel
/poker join code:P4M2QJoin from anywhere by quoting the code
/poker leaveGive your seat back
/poker infoCost, payment link, prize and who is in
/poker info code:P4M2QAny night, including one that finished months ago
/poker profileYour points, nights played, and where you finished each time
/poker profile player:@nameSomebody else's
/poker leaderboardMost participation points in this server
/poker leaderboard month:09/2026Just that month
/poker helpAll of this, in the channel

Participation points

Every finishing position is worth something, and the size of the field sets the scale. At a table of N the winner takes N points, second takes N−1, and last takes 1.

Field1st2nd3rd…last
20 players201918…1
8 players876…1
2 players21—

So coming fourth of twenty is worth 17 — more than winning a heads-up game, and that is the point. A big night is worth more at every position, and somebody who turns up every week can out-rank somebody who won twice and stopped coming. Points and nights played are separate numbers: one is how well you did, the other is how often you showed up.

The leaderboard ranks on points, with first, second and third places breaking ties. A cancelled night pays nothing.

Paying, on the night

/poker checkin pings every player and posts a card with one button per person. You press your own once you have paid; the host can press anybody's, for whoever hands over cash at the door. Nothing is verified — the bot records that a human said the money arrived, and never touches the money itself.

A night can seat up to 50. Past 20 the card carries one I've paid button and a menu the host marks people from, because Discord allows a limited number of buttons on one message.

Running one

Opening a night is an organizer command, because it puts a payment link on a card the bot renders. You host one night at a time, which is why none of these need a code — add code: to act on somebody else's.

CommandWhat it does
/poker create cost:$20Open a night in this channel
/poker create cost:$20 pay:paypal.me/you…with somewhere to send it
/poker create … prize:The pot prize-image:<link>…and a prize, with a picture
/poker create … name:Friday Poker notes:7pm, bring chipsName it, and add a note
/poker create … playing:falseYou are running it, not sitting at it
/poker checkinPing everyone and open the paid buttons — re-runnable
/poker remove player:@ghostSomebody who never paid or never turned up
/poker completeThe night is over — opens the ranking, then puts it on the board
/poker cancelIt did not happen — nobody's record is touched
/poker admin adjust user:@alice played:1Correct a monthly count by hand
/poker admin adjust user:@bob played:-1 note:counted twiceUndo one — adjustments are appended, never edited
/poker admin adjust user:@dan points:5 note:dealt all nightAward points the finishing order cannot express

Ranking the night

Points need the whole field placed, first to last. There are three ways to do that and a host can mix them freely in one night — they all fill the same list of positions.

Way inWhen it suits
Busted, on the check-in cardPress it as each player goes out. They take the lowest position still free, so by the last hand there is nothing left to do.
/poker completeA button per player, headed with the place being filled and what it is worth. Press down the order.
Type the orderSeat numbers from the roster, best first — 3,1,5,2,4. The whole field at once, for a host who wrote the payouts down.

The last player is placed for you, and Undo takes back the most recent result wherever you pressed it. The roster locks once ranking starts — a position is anchored to the size of the field that played — so undo first if somebody needs adding or removing.

Participation is counted by calendar month, in Eastern time, so a game that runs past midnight still belongs to the evening it was played. A cancelled night counts for nothing at all.

Checking a game was fair

CommandWhat it does
/verify code:K4M2QPThe commitment, the player seed, the revealed secret, and how to recompute the rolls yourself
/verifyHow many games here are still running and unproven, and how many fingerprints are waiting for the next /roll dice

Every result card also carries a 🔒 Provably fair button, which shows the same panel without typing anything. Works for any game of chance the bot runs, including ones added later — see Fairness for the method in full.

Server settings

CommandWhat it does
/config organizer-role role:@OrganizersWhich role may run organizer commands, for every game
/config game-role game:poker role:@PokerHostsA role that runs one game's organizer commands and no other's
/config game-role game:pokerLeave the role out to clear it

A game role is added to the organizer role, never substituted for it: whoever holds @Organizers still runs everything, and Manage Server always works. So setting one can only ever widen who can do something — it can never take access away. Useful when the people you trust with a poker buy-in are not the same people who run your brackets.