Shockwave

Getting started

The first command a new player runs.

/setup utility

Introduces Shockwave, creates your personal solo team, and walks you through picking which lane roles you like and dislike playing (for future role-aware team balancing). Press a role to pick it, then press Confirm. Safe to run again any time to update either. The intro only shows up the first time.

ParameterTypeDescription
solo_team_namestring, optionalName for your personal solo team. Always optional. Omit it the first time and the team's named after your current display name. Given on a later run, it renames your existing solo team. Omitted then, it's left alone.
Roles are picked with buttons, not typed. After the team-name step, Shockwave posts a message with 5 role buttons (highlighted once selected) and a "Confirm" button. Press the roles you like playing, press Confirm, then do the same for the roles you dislike. Only you can toggle your own selections or press your own Confirm button.
A role can't end up both liked and disliked. If you pick the same role in both rounds, it's left neutral instead of picking a side. Shockwave tells you which role that happened to and asks you to run /setup again if you'd like to fix it.
Finishing both rounds the first time unlocks the Onboarded achievement and is what /make-teams random's use_roles checks for: everyone currently in the voice channel has to have completed /setup at least once, or role-based teams won't form.

Team setup

Run these once per server, or whenever you want to reset a session.

/set is a group of one subcommand per setting, not a single command with a pile of optional parameters: /set channels, /set team-size, /set betting-timer, /set wager-channel, /set matchup-channel, /set elo, /set default-elo, /set roster-permissions, and /set game below, plus /set correct-winner, /set max-wager, and /set betting under Betting & economy. Each requires the Manage Server permission and takes only the parameters relevant to that one setting. Changing several unrelated settings at once takes several separate calls instead of one combined one. The one exception is /set view, which just shows every current setting in one place and needs no permission since it doesn't change anything.
/set channels admin

Sets the voice channel names teams get moved into. Requires the Manage Server permission.

ParameterTypeDescription
team1stringName for the first team's voice channel. Creates it if missing.
team2stringName for the second team's voice channel. Creates it if missing.
Optional to set at all. If a game is started with ▶️ before these have ever been set, Shockwave falls back to channels named Team-1/Team-2, creating them if they don't exist, and remembers them as the server's own from then on.
team1/team2 also become the display names. Whatever you name the channels is what /make-teams (any subcommand) titles the roster with, what the matchup graphic labels each side with, and what the win announcement, elo-change line, and a later /set correct-winner correction all say too, instead of the generic "Team 1"/"Team 2" a server that's never named its channels falls back to.
/set team-size admin

Sets how many players make up one side. Requires the Manage Server permission.

ParameterTypeDescription
sizeintegerNumber of players per team.
/set betting-timer admin

Sets how long a betting window stays open. Requires the Manage Server permission.

ParameterTypeDescription
secondsinteger1–600 seconds a betting window stays open. Defaults to 60 for a server that's never set one.
Applies everywhere betting happens: a roster's Start button, a sequential tournament match, and as the base per-match duration for a simultaneous tournament round (multiplied by how many matches are in that round).
/set wager-channel admin

Redirects the "betting is open"/"betting is now closed" notices to one specific text channel. Requires the Manage Server permission.

ParameterTypeDescription
channelstring, optionalName of the text channel to direct the betting-open/closed notices to. Creates it if missing. Omit to use the channel this command is run in.
Independent of /set matchup-channel. That one redirects the matchup graphic and the winner-report message instead. The two can point at different channels.
/set matchup-channel admin

Redirects every matchup graphic (a game's own, and a tournament match's ready-check/report graphic) and the winner-report message to one specific text channel, no matter where the roster or match actually started. Requires the Manage Server permission.

ParameterTypeDescription
channelstring, optionalName of the text channel to direct matchup graphics and winner-report messages to. Creates it if missing. Omit to use the channel this command is run in.
/set elo admin

Sets a specific player's elo directly to an exact value. Requires the Manage Server permission.

ParameterTypeDescription
membermemberWhose elo to set.
elointegerThe exact elo value to set them to.
Still credits tier rewards. Setting someone to Diamond+ directly unlocks that tier's trading-card title/scheme exactly like earning it normally would.
/set default-elo admin

Sets what a brand new player in this server starts at. Requires the Manage Server permission.

ParameterTypeDescription
elointegerElo a brand new player starts at. Defaults to 1000. Doesn't change existing players' elo.
/set roster-permissions admin

Controls who can press the Start / Start (no move) / Random Roles / Balanced Roles buttons on a posted roster. Requires the Manage Server permission.

ParameterTypeDescription
strictbooleanTrue: only a rostered player or a Manage Server admin can use those buttons. False (the default): anyone who can see the message can.
/set game admin

Sets which game this server's next roster tracks elo and stats for. Elo, game record, and ranked record are all tracked per game, so switching games never touches another game's numbers. The same goes for a persistent team's tournament win/loss record. Gold balance stays one shared pool across every game. Requires the Manage Server permission.

ParameterTypeDescription
gamestring, autocompleteA game this server's used before (autocomplete suggests them), or type a brand new name to start tracking it. "League" is the default.
Only applies to the next roster formed. A game already in progress keeps resolving against whichever game it actually started under, so switching mid-draft can't retroactively change which ladder it affects.
Role-based team balancing is League-only. Random Roles, Balanced Roles, and role icons on the matchup graphic only show up when the active game is League. use_roles on /make-teams random is ignored for any other game.
/current-game utility

Shows which game this server is currently tracking. No permission needed. Anyone can check, not just admins.

Also flags it if a game already in progress differs. Since /set game only applies to the next roster formed, an admin switching games mid-draft shows up here as "the current game is X, but the roster in progress is still tracking Y" instead of silently picking one.
/clear is a group of one subcommand per reset: /clear teams, /clear channels, /clear tournament, /clear elo, /clear economy, /clear achievements, and /clear card-unlocks below. Each requires the Manage Server permission and asks for confirmation before anything actually happens. Combining several resets in one go takes several separate calls, one per subcommand.
/clear teams admin

Wipes the current teams and draft state so you can start a fresh session. Any in-progress game is cancelled (bets refunded, everyone moved back) first. Channel names, tournament data, and player elo/economy are untouched. Requires the Manage Server permission.

Confirmation required. Posts a warning with "Confirm" / "Cancel" buttons. Only the member who ran the command can click them, and the prompt expires after 30 seconds with nothing changed if it's ignored (see below).
/clear channels admin

Does everything /clear teams does, and also forgets the saved team channel names. Requires the Manage Server permission.

/clear tournament admin

Deletes this server's tournament entirely: bracket, registrations, and match history. Also clears the current teams/draft. Registered/persistent teams (/team create) aren't touched. Requires the Manage Server permission.

/clear elo admin

Resets elo back to this server's default (1000 unless an admin changed it with /set default-elo), every player in the server by default, or just one player if user is given; balance, wins/losses, and gold are untouched. Also clears the current teams/draft (any in-progress game is cancelled and refunded first) once confirmed. Requires the Manage Server permission.

ParameterTypeDescription
usermember, optionalOnly reset this player's elo instead of everyone's.
/clear economy admin

Wipes stats entirely (balance, elo, game record, betting record, and gold wagered/won/lost), every player in the server by default, or just one player if user is given. Also clears the current teams/draft (any in-progress game is cancelled and refunded first) once confirmed. Requires the Manage Server permission.

ParameterTypeDescription
usermember, optionalOnly reset this player's stats instead of everyone's.
/clear achievements admin

Resets earned achievements so they go back to locked, every player in the server by default, or just one player if user is given. A player who still qualifies (e.g. their win count is still past the threshold) simply earns it back the next time something checks; this doesn't touch elo, balance, game record, or any other unlocks. Also clears the current teams/draft (any in-progress game is cancelled and refunded first) once confirmed. Requires the Manage Server permission.

ParameterTypeDescription
usermember, optionalOnly reset this player instead of everyone.
/clear card-unlocks admin

Wipes every trading-card unlock (titles, color schemes, fonts: tier rewards, shop purchases, and achievement titles alike), every player in the server by default, or just one player if user is given. Also resets that player's equipped trading card back to Shockwave's defaults, so it never renders pointed at something no longer unlocked. Also clears the current teams/draft (any in-progress game is cancelled and refunded first) once confirmed. Requires the Manage Server permission.

ParameterTypeDescription
usermember, optionalOnly reset this player instead of everyone.
Every subcommand requires confirmation. /clear teams, /clear channels, and /clear tournament post a plain warning with "Confirm" / "Cancel" buttons before clearing anything. /clear elo, /clear economy, /clear achievements, and /clear card-unlocks clear the current teams/draft right away, but still post their own warning with "Confirm reset" / "Cancel" buttons before touching any player's elo, economy, achievements, or card unlocks. Either way, only the member who ran the command can click the buttons, and the prompt expires after 30 seconds with nothing further changed if it's ignored.

Team formation

Two tracks: casual games just organize a roster, ranked games also balance and track elo.

Casual vs. ranked: the actual difference. Every game, casual or ranked, still starts via the roster's own Start button to move players and open betting, and still updates each player's Game Record (win/loss) when a winner is reported. The only thing ranked adds: teams are split by current elo instead of pure random/draft order, and elo itself only ever moves for games built with ranked:true on /make-teams random or /make-teams draft. A casual game, either subcommand with ranked left off, never touches anyone's elo, win or lose. Pick the track when you build the roster. Everything downstream (starting via ▶️, betting, reporting the winner or cancelling with 🛑) works identically either way.

Casual

Organizes a roster for the night. Betting still works. Elo never moves.

/make-teams random casual

Randomly splits everyone in your voice channel into two even teams and posts the roster. Optionally assigns a lane to each player. Doesn't move anyone. Press Start on the roster once you're happy with the teams to move everyone and open betting.

ParameterTypeDescription
use_rolesboolean, optionalAlso hand out lane roles (Top / Jungle / Mid / Bottom / Support); needs exactly 5 players per side (10 for ranked, split 5-and-5). Combined with ranked, roles are chosen to favor each player's liked lane and to keep the two sides close in elo; see Ranked below. League-only (see /set game) - ignored, with a note explaining why, for any other game.
rankedboolean, optionalForm roughly elo-balanced teams instead of a random split, and track elo for this game once a winner is reported. See Ranked below.
Team 1
Kestrel Bramble Onyx
Team 2
Fennmark Dusk Corvid
↑ what Shockwave posts right after the shuffle
Start moves the game. Start (no move) opens betting only. Random Roles/Balanced Roles assign lanes. All four buttons sit on the second team's own message. Start moves everyone into their team channels and opens betting, clickable by anyone, not just whoever ran /make-teams random. Start (no move) does everything Start does (matchup graphic, betting window) except the move, for a group that's already elsewhere and doesn't want Shockwave touching anyone's voice channel. Random Roles and Balanced Roles only show up on a roster that landed at exactly 5 players a side (regardless of whether use_roles was set): Random Roles reshuffles each team's own player order (no one changes teams) and re-labels everyone with a fresh random lane, Balanced Roles keeps both the teams and their order as-is and assigns lanes to favor each player's liked lane while keeping the two sides close in elo, and either one edits both team messages in place, turning on lane labels for a roster that never had them even if it was a plain random split.
You have to be in a voice channel yourself to run this. That's where the roster gets drawn from. Running it from outside one gives a plain explanation instead of an error.
use_roles requires everyone in voice to have run /setup first. If anyone hasn't, the command stops and mentions who's still missing instead of forming plain (role-less) teams anyway. Same requirement whether the game ends up casual or ranked.
ranked:true shows each side's average elo right in the confirmation message - "Team 1 avg elo X, Team 2 avg elo Y" - so it's clear going in whether the matchup is close or lopsided, not just after the result posts.
/make-teams draft casual

Starts a live captain draft. Name two captains, or let Shockwave pick two at random from the voice channel. Everyone else lands in a pool the captains pick from with buttons on the draft message itself, no separate command needed to pick.

ParameterTypeDescription
captain_1member, optionalFirst captain. Required unless use_random is set.
captain_2member, optionalSecond captain. Required unless use_random is set.
use_randomboolean, optionalPick two captains at random from the voice channel instead.
rankedboolean, optionalTrack elo for the resulting game once a winner is reported. See Ranked below.
snakeboolean, optionalSnake draft: pick order reverses every 2 picks (1, 2, 2, 1, 1, 2, …) instead of strictly alternating every pick.
Team 1
Kestrel (captain)
Team 2
Fennmark (captain)
PLAYERS
Bramble Onyx Dusk Corvid
↑ the draft pool, posted once captains are set
Picking is done with buttons, not a separate command. Shockwave posts one button per player still in the pool (blue while Team 1 is picking, red while Team 2 is picking), plus a Random button that picks a remaining player for you. Only the captain whose turn it is can press anything. Picking out of turn is rejected. A pool too large to fit on one message gets First/Prev/ Next/Last paging buttons alongside Random. Every pick re-posts the picker with the new pool and whichever captain's turn is next.
Misclicked a pick? An Undo last pick button shows up on the picker right after, but only for whoever actually made that pick - not the other captain, even though it's now their turn. It only appears while the pool's small enough that paging hasn't kicked in yet, and only undoes the single most recent pick, not a whole history of them.
You have to be in a voice channel yourself to run this, with at least one other player in it. Running it from outside a voice channel, or alone in one, gives a plain explanation instead of an error.
Once the draft is full, press Start on the roster to move everyone into their team channels and open betting, or Start (no move) to open betting without moving anyone. See /make-teams random above for what each does.

Setting up a casual game

01

Get everyone into one voice channel.

02

Build the roster: /make-teams random for an instant random split, or /make-teams draft for a live captain draft.

03

Press Start on the posted roster to move everyone into their team channels and open betting.

04

Press the winning team's own button to report it, then press Confirm on the prompt that follows. Bets pay out and Game Record updates. Elo is untouched.


Ranked

Same subcommands as casual, with ranked:true set, not a separate command. Splits your voice channel into two roughly elo-balanced teams instead of a fully random/draft split, and tracks elo once a winner is reported.

How the elo-balanced split works (/make-teams random ranked:true). Each player's elo gets a random nudge. Teams are then drafted strongest-to-weakest in a snake pattern (side A, side B, side B, side A, …) so team sizes stay even and the top players don't all land on one side. /make-teams draft ranked:true runs the exact same live draft as plain /make-teams draft. The only difference is the resulting game has elo tracked.
Adding roles to a ranked split (/make-teams random ranked:true use_roles:true, 10 players only, 5 a side). Each of the five lanes gets filled from whoever's marked it as a liked role in /setup first, then from anyone with no stated preference, and only from someone who disliked it if there's truly nobody else left for that lane. Playing off-role quietly costs a player some of their elo for balancing purposes only (more if it's a lane they said they dislike, not just one they didn't pick). Real elo never changes from this. On top of that, Shockwave tries swapping pairs of players' lanes to see if it nets a closer overall matchup, keeping whichever combination balances the two sides best.

There's one case where a disliked lane does touch real elo: winning on it. A player who wins a ranked game while playing a role they marked disliked gets their own elo gain boosted by 50% on top of the normal team-average swing, a reward for pulling off a win on a less-wanted assignment. Losing on a disliked role gets no such bonus.

Setting up a ranked game

01

Get everyone into one voice channel. New players start at 1000 elo automatically (an admin can change that server-wide with /set default-elo). Nothing to set up ahead of time otherwise.

02

Build the roster: /make-teams random ranked:true for an elo-balanced instant split (add use_roles:true with exactly 10 players for lane assignments too), or /make-teams draft ranked:true for a live draft that's still marked ranked.

03

Press Start on the posted roster to move everyone into their team channels and open betting, identical to the casual flow.

04

Press the winning team's own button to report it, then press Confirm on the prompt that follows. Bets pay out, Game Record updates, and elo shifts for every rostered player: more for beating a stronger team, less for beating a weaker one.

05

Reported the wrong result? /set correct-winner undoes the wrong elo/payouts and re-applies them correctly. Admin-only.

Ending a ranked game early. The Cancel Game button on the report message works exactly like it does for a casual game: it refunds any open bets and moves everyone back. Since elo only ever changes when a winner is actually reported, cancelling a ranked game before that happens leaves elo completely untouched, same as if the game had never been played.

Voice channel ops

Moving people around without dragging them by hand.

Start button voice

Not a slash command: a Start button Shockwave attaches to every posted team roster (/make-teams random, /make-teams draft once the draft finishes, /make-teams saved). Pressing it moves the current rosters into their team channels and kicks off the game. Anyone can press it, not just whoever ran the original command. Remembers the channel everyone started in, so the Cancel Game button on the report message (see below) knows where to send them back. Also opens a betting window on the match and posts the winner-report message immediately (60-second betting window by default. See /set betting-timer). See Betting & economy below for how that works.

Posts a matchup graphic. Right before betting opens, Start shows both teams' rosters (captain starred) facing off, the same graphic a tournament match gets. A team with no logo set gets a random built-in one for the image instead of a blank slot.
Nobody in voice? Start looks for a rostered player who's currently sitting in a voice channel to know where to move everyone. If it can't find one it posts a message asking someone to join a voice channel first, and the button stays clickable to try again.
Someone else not in voice? That only checks that at least one rostered player is in voice, not everyone - if a specific player has left (or a drafted captain never joined), Start still moves whoever it can and says who it couldn't, rather than getting stuck partway through. Betting still opens and the matchup graphic still posts either way.
Missing a permission? A server that's never run /set channels gets its default team voice channels created automatically on the very first Start click - if Shockwave is missing Manage Channels, it says so specifically instead of the button just doing nothing. Same idea if it can't post the matchup image (missing Attach Files): a plain text notice takes its place, and the game still starts and betting still opens either way.
/notify voice

DMs a one-time invite link to your voice channel, to one member, or to everyone holding a given role. Give one or the other, not both.

ParameterTypeDescription
membermember, optionalA specific member to invite.
rolerole, optionalInvite every member of this role instead.
messagestring, optionalReplaces the default invite text. Either way, the DM is signed "Sent by" you.
You have to be in a voice channel yourself to run this. That's the channel the invite link points to. Running it from outside one gives a plain explanation instead of an error.
A closed DM doesn't stop the rest of a role invite, but a missing invite-creation permission does. The two fail differently on purpose: one member's closed DMs is just tallied and skipped, everyone else in the role still gets invited; but if Shockwave can't create an invite link in your voice channel at all, that's going to fail the exact same way for every member, so it says so immediately instead of quietly repeating the same failure through the whole role.

Betting & economy

Every server member has a gold balance. Bet it on who wins the current game.

How a betting round works. Pressing Start on a posted roster opens betting for 60 seconds by default (configurable server-wide with /set betting-timer) and immediately posts a separate winner-report message, with each team's own button (labeled with the team's actual name, or the generic "Team 1"/"Team 2" a server that's never named its channels falls back to) plus a Cancel Game button: it doesn't wait for the betting window to close, since a real game doesn't wait for a countdown to finish before anyone knows who won. The bot stays fully responsive to every other command the whole time. Pressing a team's button posts a Confirm/Cancel prompt rather than recording the result immediately. Pressing Confirm is what actually pays out bets, updates everyone's game record (and elo too, for ranked:true games), and moves both teams back to the original channel. Cancel Game works the same way now: it posts its own Confirm/Cancel prompt rather than cancelling on the spot, since refunding bets and moving everyone back shouldn't hinge on one accidental click either. Either prompt's Cancel (or letting it time out) puts the original message's buttons back to pressable, in case the wrong team got picked or Cancel Game was pressed by mistake. Confirming a winner report removes the original message entirely, while confirming Cancel Game strips its buttons instead, since either way that game is done. Reported the wrong result and already confirmed it? /set correct-winner fixes it after the fact. The "betting is open"/"now closed" text and the winner-report message are two independent postings: each goes wherever the game started unless redirected, the open/closed text with /set wager-channel and the winner-report message (alongside the matchup graphic itself) with /set matchup-channel.
Someone left voice before the game ended? Confirming a winner report or Cancel Game both try to move everyone back to the original channel. If a specific player is no longer reachable (left voice entirely), the message says who couldn't be moved rather than the whole confirmation silently doing nothing - payouts, records, elo, and (for a tournament match) the bracket all still update normally either way.
Every rostered player earns gold just for playing, separate from anything anyone bet: 300 for being on the winning side, 150 for the losing side. It applies the moment a game resolves, ranked or casual, and is included in the winner-report message alongside the elo line. Correcting a misreported winner with /set correct-winner doesn't pay it out twice or take it back. It correctly flips who gets the win amount and who gets the loss amount, same as everything else the correction re-derives.
/wager team betting

Bets gold on one team winning the current game, or, with match_id, on one specific match in a simultaneous-mode tournament round. Only works while betting is open, only one bet per player per game/match, and you can't bet on a game or match you're actually playing in.

ParameterTypeDescription
amountintegerHow much gold to wager. Must not exceed your balance.
teamstring, autocompleteWhich team you think will win. Autocompletes with the current roster's actual team names (not a generic "Team 1"/"Team 2").
match_idinteger, autocomplete, optionalA specific tournament match's id. Autocompletes as "Match #N: TeamA vs TeamB" for every match currently open for betting, so there's no need to separately look one up on the bracket. Omit to bet on the current casual/ranked game or sequential tournament match instead. See /tournament start's simultaneous-mode note.
Payouts favor the underdog. Winners split the losing side's pool proportional to their own bet, on top of getting their wager back. A bet on the team fewer people backed pays out more than the same-sized bet on the heavily-favored side. Betting on a specific match_id settles independently: a match resolving pays out only that match's own bettors, without waiting on any other concurrent match.
Lopsided pools get raked. The losing side's pool isn't always paid out in full. The more one-sided the betting was, the more gets held back before the split (up to 50% at a maximally lopsided pool), so reliably betting whichever side looks obviously stronger isn't free money over time. A genuinely close pool, or a bet that ends up on the winning side despite being the minority pick, still pays full odds untouched.
Made a mistake? Your bet confirmation has a Cancel bet button that refunds you, as long as betting's still open. Once it closes, the bet's locked in like normal.
/wager against betting

Challenges another player to a heads-up gold wager, completely separate from the team-game betting above. No active game required.

ParameterTypeDescription
membermemberWho to challenge. Can't be yourself or a bot.
amountintegerHow much gold each side stakes. Must not exceed your balance.
How it plays out. Shockwave posts a message mentioning the challenged player with Accept, Decline, and Cancel challenge buttons. Only the challenged player can press Accept or Decline, and only the challenger can press Cancel challenge. Nothing is held from either side until Accept is pressed. Decline/Cancel challenge just make the challenge go away, nothing to refund. On accept, both players' gold is held by the bot and a new message goes out asking who actually won, with Challenger Won, Target Won, and Cancel Duel buttons. Pressing any of them posts a Confirm/Cancel prompt rather than acting immediately. Confirming a winner pays out the full pot to them, the same confirm step used when reporting a team game's winner. Confirming Cancel Duel instead refunds both players their exact stake and settles nothing else. If either player can no longer cover the amount by the time it's accepted, the wager is cancelled instead of running.
Cancel Duel is there for a duel neither side wants to finish: a disagreement on who actually won, one player leaving, or it just being forgotten. Either participant, or a member with the Manage Server permission, can press it once the duel's been accepted. Before that, Decline (for the challenged player) or Cancel challenge (for whoever sent it) already cover backing out cleanly.
Changed your mind before they've answered? Cancel challenge, right next to Accept and Decline on the challenge you sent, retracts it. You can only have one pending challenge open against the same person at a time. Cancel the old one first if you want to send a different one.
An unanswered challenge expires after 24 hours, same as an unanswered /team invite. Nothing was ever held on either side, so there's nothing to refund. Once accepted, though, a challenge stays open however long it takes to report a result or cancel it. Only a still-pending, never-accepted challenge expires on its own.
/daily betting

Claims 1000 free gold. Once per calendar day, per player.

/give betting

Gives some of your gold to another player. Immediate, no confirmation needed from either side.

ParameterTypeDescription
membermemberWho to give gold to. Can't be yourself or a bot.
amountintegerHow much gold to give. Must not exceed your balance.
Not a wager, so it isn't limited by /set max-wager or turned off by /set betting. There's no risk or outcome to hedge against, it's just moving gold from one balance to another.
/stats betting

The full picture for one player: elo (shown with a League-style rank), actual in-game win/loss record (combined, and broken out separately for ranked and casual games), betting record, balance, net gold won or lost overall, and their liked/disliked roles from /setup, all in one embed. Shows their Discord avatar as the embed thumbnail.

ParameterTypeDescription
membermember, optionalWhose stats to look up. Defaults to you.
gamestring, autocomplete, optionalWhich game's elo/record to show. Autocompletes from games this server has actually tracked before. Defaults to the current game; rejects one it's never seen.
Elo and game record are for this server's current game, unless you say otherwise. See /set game: a server running more than one game tracks each one's ladder separately. Switching games doesn't erase an earlier one's stats, just moves the default off it - use game to check back on it any time. Balance and betting record stay one shared pool across every game.
Avatar toggles between this server's identity and your regular one. Press it and it switches from this server's own nickname and profile picture for that player (the default: whatever /stats already shows) to their regular Discord display name and account-wide avatar. Name and picture always switch together, never just one on its own. Press again to switch back. Same button either direction, and anyone can click it, not just the player it's about. Works on the plain embed and on the trading card below (Card): it re-renders the whole card image with the other identity rather than disappearing once you're looking at the card.
Card turns the embed into a trading card. Press it and the whole embed (stats, fields, avatar, all of it) is replaced with a portrait-style trading card. Top to bottom: Shockwave's logo and this server's name across the top, the player's actual Discord username (not their nickname) in the opposite corner, their Discord avatar as the centerpiece, a customizable title underneath it, a colored rank badge with elo/ranked record/ranked win rate (each its own line), and finally, if they're rostered on any, their persistent teams, each with its own logo. Only Card disappears once this fires, replaced with a single Back button. Press that to swap back to the plain stats embed, which restores Card. Avatar stays either way, since it still has something to toggle on the card, and whichever identity was showing carries straight across when you press Card or Back: if you'd toggled to your regular Discord name and avatar on the plain embed, the card opens showing that same identity instead of resetting to this server's. Colors, title, and font are stored per player in the database (trading_cards) and default to Shockwave's own palette (a deep purple background) and a plain "Rookie" title until something changes them.
Elo is ranked-only, per-server. Every player starts at 1000, unless an admin has changed this server's starting elo with /set default-elo. Elo only changes for games formed with ranked:true. Plain /make-teams random and /make-teams draft games update the Game Record above but never touch elo. When it does update, the size of the change is based on the average rating on each side: beating a higher-rated team gains more than beating a lower-rated one.
Game Record is ranked + casual combined. Ranked and Casual split it out separately. Fields are grouped in three rows: Elo/Ranked Wins/Ranked Win Rate, then Game/Casual/Bet Record (each showing its win rate right alongside the W-L count, e.g. 4W - 1L (80.0%)), then Balance/Net Gold/Gold Wagered. A player with no games in one of those categories yet shows 0W - 0L and N/A.
Elo shows an emoji rank alongside the number, the same way League does: nine tiers, each spanning 250 elo, with the 1000 starting elo landing everyone in Platinum by default. Iron through Diamond also break down into four divisions (IV lowest, I highest) the same way League's do. Master and up just show the tier, same as League switching to raw LP once you're that high:
EloRankDivisions
0 – 249⚙️ IronIV – I
250 – 499🥉 BronzeIV – I
500 – 749🥈 SilverIV – I
750 – 999🥇 GoldIV – I
1000 – 1249🔷 PlatinumIV – I
1250 – 1499💎 DiamondIV – I
1500 – 1749🟣 MasterN/A
1750 – 1999🔴 GrandmasterN/A
2000+👑 ChallengerN/A
/card-set betting

Equips any combination of your unlocked trading-card title, color scheme, and/or font in one call (see /stats' Card button), and shows the resulting card. Every field you give is checked against what you've actually unlocked before anything is applied. If one fails, none of them are equipped.

ParameterTypeDescription
titlestring, autocomplete, optionalWhich title to equip. Autocomplete only offers titles you've actually unlocked: "Rookie" (the default, always available) plus anything you've earned.
color_schemestring, autocomplete, optionalWhich color scheme to equip. Autocomplete only offers schemes you've actually unlocked: "Default" (Shockwave's own palette, always available) plus anything you've earned.
font_stylestring, autocomplete, optionalWhich font to equip. Autocomplete only offers fonts you've purchased: "Default" (Shockwave's own Chakra Petch/IBM Plex Sans pairing, always available) plus anything from /shop.
Reaching Diamond, Master, Grandmaster, or Challenger permanently unlocks that tier's own title and color scheme ("Unbreakable", "Mastermind", "Grandmaster", "The Challenger", each paired with that tier's own rank-badge color, automatically brightened just enough to stay readable against the card's background) the moment you first get there. Both stay unlocked forever after, even if your elo drops back down below the tier that earned them. Picking one here doesn't require currently being at that rank, just having reached it once.
Fonts are shop-only. Unlike titles and color schemes, there's no way to earn one by rank. Each one is a genuinely different bundled typeface, not just a different weight of the default: "Bold" is Russo One, "Elegant" is Cinzel, "Handwritten" is Permanent Marker, "Cyber" is Orbitron, "Retro" is Press Start 2P, "Villain" is Creepster, "Military" is Black Ops One, "Neon" is Bungee, "Western" is Rye, all free/open-source (Google Fonts, SIL Open Font License). Bold, Elegant, and Handwritten are the "quiet" faces and cost less. Every other style commits hard to one loud look and costs more for it. Use /shop preview to see what each one actually looks like before buying.
/shop preview betting

Shows every option for one customization type in a single gallery image, regardless of what you've personally unlocked yet, the "what are my options" companion to /card-set and /team set.

ParameterTypeDescription
typechoiceLogos, Card Titles, Color Schemes, or Fonts.
Logos and Color Schemes are laid out as a grid, each item labeled with its exact name underneath, useful as a lookup table for what to actually type into /team set logo: or /card-set color_scheme:, not just a gallery. Fonts get shown in their own real typeface rather than just named. Generated once and cached, so this loads instantly after the first time anyone runs it.
/shop browse betting

Lists every trading-card title, color scheme, and font purchasable with gold, grouped by category, with your current balance and a ✅ next to anything you already own.

16 color schemes: five standalone colors (Crimson, Emerald, Azure, Sunset, Fire) plus one for each Runeterra region (Demacia, Noxus, Freljord, Ionia, Piltover, Zaun, Shurima, Shadow Isles, Bilgewater, Bandle City, Targon), the same region set /team set's built-in crests cover, so a team already using one of those logos has a matching player-card scheme to go with it.
Sort: Price / Sort: Owned, and Ascending / Descending buttons sit under the listing so you can re-sort each category on the fly, no need to re-run the command. Only the person who ran /shop browse can click them.
/shop buy betting

Purchases a trading-card cosmetic with gold, permanently unlocking it the same way reaching an elo tier does.

ParameterTypeDescription
itemstring, autocompleteWhich item to buy. Autocomplete only offers items you don't already own, labeled with their price.
Refuses the purchase if you already own the item or can't afford it. Nothing is deducted either way. On success, equip it with /card-set.
/achievements betting

Lists every trading-card achievement with its description and a ✅/🔒 marker for whether you've earned it. No permission gate. Anyone can check their own progress.

18 achievements, each unlocking an exclusive title equipped the same way as any other via /card-set:
  • First Blood. Win a game.
  • Veteran ladder (four tiers, each its own distinct title, not just "Veteran II"): Veteran (10 career wins) → Elite (50) → Battle-Hardened (150) → Immortal (500).
  • On Fire ladder (three tiers): On Fire (5-game win streak) → Unstoppable (10) → Untouchable (20).
  • High Roller. Win a single bet of 5000+ gold.
  • Jackpot. Win a single bet paying out 3x+ your wager, any size.
  • Giant Slayer. A big single-match elo swing.
  • Team Player. Rostered on 3+ persistent teams at once.
  • The Captain. Actually captain one.
  • Big Spender. Own 3+ items bought from /shop buy.
  • Frequent Better. Place 25+ total bets, win or lose.
  • Iron Will. Rack up 20+ game losses without quitting.
  • Tournament Champion. Win a tournament.
  • Onboarded. Run /setup for the first time.
Gold-based achievements are keyed off a single transaction, never a balance milestone: /daily hands out free gold every day, so "save up N gold" would just reward showing up. Unlocking one posts a notification in the channel where it happened. Running /achievements also retroactively unlocks anything you already qualify for but haven't been credited with yet.
Veteran and On Fire get their own sections. Since each is a ladder of several rising tiers, their achievements are grouped into their own field in the results instead of being scattered alphabetically alongside every unrelated achievement, so the four-rung Veteran progression (and the three-rung On Fire one) reads clearly as one climb from top to bottom.
Locked achievements show your current progress where there's a plain count behind them, e.g. "Place 25+ total bets. (12/25)": Veteran/On Fire, Iron Will, Frequent Better, Team Player, and Big Spender. One-off achievements like First Blood or Tournament Champion just show locked or unlocked, with no progress count.
/leaderboard betting

Ranks every player in the server who has stats to show. Leave both options out for an overview sorted by elo, showing the raw elo number alongside the ranked win/loss record. Pick a specific stat to rank by just that instead.

ParameterTypeDescription
filterchoice, optionalElo, Balance, Game Wins, Game Losses, Game Win Rate, Ranked Wins, Ranked Losses, Ranked Win Rate, Casual Wins, Casual Losses, Casual Win Rate, Bet Wins, Bet Losses, Bet Win Rate, Net Gold, or Gold Wagered. Omit for the elo-sorted overview.
orderchoice, optionalDescending (highest first) or Ascending (lowest first). Defaults to Descending.
An empty filtered result says which stat came up empty (e.g. "Nobody has any Ranked Win Rate stats to show yet"), rather than a generic "nobody has any stats" - a server that's simply never played ranked games still has a full overview leaderboard one filter away.
Elo/game/ranked/casual stats are for this server's current game. See /set game: each game a server plays gets its own leaderboard. Balance, net gold, gold wagered, and bet stats stay one shared pool across every game.
Always starts as the ranked list. Press the Cards button to flip through each ranked player's full stats card one at a time instead, the same view /team list's own cards option uses. List brings you back to the ranked list. Both stay on the same message.
Paging happens on the same message. The result gets First/Prev/Next/Last buttons. Clicking previous/next/first/last edits that message in place instead of posting a new one, so the leaderboard stays a single message no matter how many pages someone flips through. Anyone in the server can page through it, not just whoever ran the command. Players who've never touched the economy (no /daily, bets, or games) don't have a row yet and won't appear until they do.
Ascending/Descending buttons flip the sort direction in place, no need to re-run the command with a different order. Resets back to the first page, since ascending and descending generally show completely different players there.
cards:true flips through each ranked player's full stats card one at a time, same paging (and Ascending/Descending) buttons, just sourced from the ranked list instead of a summary table. A Card button also shows up, swapping the current player's stats card for their actual trading card. Whichever one you're looking at stays selected as you keep paging, the same way /team list's own cards:true works.
/set correct-winner admin

Fixes a misreported winner for the most recently resolved game. Undoes the wrong payouts, win/loss records, and elo changes, then re-applies all of it for the correct team, or invalidates the game entirely. Requires the Manage Server permission.

ParameterTypeDescription
teamstring, autocomplete, optionalThe team that actually won. Autocompletes with the real team names from the game (or match) being corrected, not a generic "Team 1"/"Team 2". Give this or invalidate, not both.
invalidateboolean, optionalUndo the last game entirely instead of picking a winner: refunds every bet to its exact pre-bet amount, and undoes elo, game/ranked records, and win/loss gold. Nothing is re-applied for either team, and there's no result left behind for a further correction to work from.
match_idinteger, optionalCorrect a specific tournament match instead of the last game. See the note there. Doesn't touch elo (tournament matches don't affect it) - just that match's recorded winner, the bracket, and any bet payouts already settled on it. Winners-bracket matches only for now. A losers-bracket or Grand Finals match_id is refused with an explanatory message. invalidate isn't supported here yet.
Invalidating refunds the exact stake, not just the payout. Simply undoing a winner's recorded delta would remove their whole payout (stake plus winnings) and leave them down by exactly what they bet, the same state as a loss. Invalidating adds each wager's original amount back on top of that undo, so every bettor, winner or loser, lands back at their exact pre-bet balance, the same way cancelling an unresolved bet round already refunds it.
Nothing is reversed or reapplied until you confirm. Running this posts a Confirm/Cancel prompt describing exactly what's about to change, the same two-step confirmation every other winner-report flow in Shockwave uses, since a real payout/elo change for potentially every player in the game shouldn't hinge on a single click. If something else changes the underlying result while that prompt is still up (another game resolves before you confirm a last-game correction, or the next round starts before you confirm a match correction), Confirm refuses instead of applying against stale data. Just run the command again.
/set max-wager admin

Caps how much gold a single /wager team, /wager against, or duel challenge can be. Requires the Manage Server permission.

ParameterTypeDescription
amountinteger, optionalMax gold for a single wager. Omit to remove the cap. Bets are then limited only by balance.
/set betting admin

Turns /wager team and /wager against on or off for this server. Requires the Manage Server permission.

ParameterTypeDescription
enabledbooleanTrue (the default): bets are accepted. False: wagering is rejected outright.
Games, elo, and reporting a winner all still work the same either way. This only gates the wagering layer on top of them. The winner-report buttons still post and still work with betting off.
/set welcome-message admin

Turns the one-time join welcome message on or off for this server. Requires the Manage Server permission.

ParameterTypeDescription
enabledbooleanTrue (the default): post it if Shockwave ever joins this server again. False: don't.
Only matters for a future join. Shockwave posts a short message pointing at /setup and /help the moment it's added to a server. This can't retroactively post or unpost that one. It's here for if the bot is ever removed and re-added later and you don't want it showing up again.
/set view

Shows this server's current settings in one embed: team channels, team size, current game, default starting elo, roster button permissions, betting on/off and its timer and cap, the wager and matchup channel redirects, and the welcome-message toggle.

Read-only, so no admin permission needed. Every other /set subcommand only confirms the new value it just changed. This is the one place to see them all together afterward instead of digging back through old command responses.

Tournaments & teams

A separate system from the casual/ranked games above: persistent, named teams a player can captain, and a bracket built from whichever of those teams register for the server's tournament.

Persistent teams

Distinct from the temporary team1/team2 a /make-teams random or /make-teams draft game produces. These stick around across sessions and are what tournament registration works against. Every team-name field below autocompletes as you type, scoped to your own teams (the ones you captain for an action that requires it, any you're rostered on otherwise), the same way /card-set only ever suggests titles/schemes/ fonts you've actually unlocked. Team names are case-insensitive: typing "red" finds a team named "Red", and it can't be taken again as "RED" by someone else. The one exception is renaming a team to a different capitalization of its own current name, which is still allowed. A new or changed name is capped at 90 characters - short of the point it could ever get rejected by Discord's own limits on the things a team name can end up inside (a voice channel name, an embed title).

/team create teams

Creates a persistent team with you as its captain. Team ids are assigned automatically.

ParameterTypeDescription
namestringTeam name. Must be unique in this server.
team_sizeintegerHow many players the team is looking for in total.
captainmember, optionalMake this member the captain instead of you.
/team save teams

Copies one side of the server's last completed game into a brand new persistent team, with you as captain, instead of building one from scratch.

ParameterTypeDescription
teamchoiceTeam 1 or Team 2: which side of the last game to save.
namestringName for the new team. Must be unique in this server.
You have to have actually played on the side you're saving. Trying to save a side you weren't rostered on is rejected. The new team starts already full, sized to however many players were on that roster.
/team set teams

Sets a team's voice channel and/or logo, any combination in one call. The team's captain, or anyone with Manage Server, can do this.

ParameterTypeDescription
teamstringName of the team.
voice_channelvoice channel, optionalExisting channel to use. Can't be combined with new_voice_channel.
new_voice_channelboolean, optionalCreate a brand new voice channel named after the team instead of naming an existing one.
logostring, autocomplete, optionalWhich built-in Clash-themed logo to use. Autocompletes as you type from the full built-in set.
Reusing another team's channel asks first. If voice_channel is already set for a different team, Shockwave posts a warning with "Yes, use it anyway" / "No" buttons instead of silently reassigning it. "No" doesn't retry anything. Just run the command again with a different channel. Any logo given in the same call is still applied even while that confirmation is pending.
Every team gets a logo automatically. A team with no logo set gets a random one assigned the first time it's looked up (creation, /team stats, /team list, …). logo here is for picking a specific one instead of leaving it to chance.
/team rename teams

Renames a persistent team. The team's captain, or anyone with Manage Server, can do this.

ParameterTypeDescription
teamstringCurrent name of the team.
new_namestringNew name. Must be unique in this server, same rule /team create enforces.
Everything else about the team is untouched, roster, record, voice channel, and logo all carry over unchanged. Renaming doesn't rename an assigned voice channel to match. Use /team set for that separately if you want them to match.
/team delete teams

Permanently deletes a persistent team. Its roster, record, and any pending invites go with it. The team's captain, or anyone with Manage Server, can do this.

ParameterTypeDescription
teamstringName of the team to delete.
Confirmation required. Posts a warning with "Delete team" / "Cancel" buttons instead of deleting immediately. Only the member who ran the command can click them, and the prompt expires after 30 seconds with nothing deleted if it's ignored, the same pattern /clear uses for its own destructive subcommands.
Doesn't affect a tournament this team is already registered in. Registration snapshots a copy of the team at the time it registered, not a live link back to it, so an in-progress bracket plays out exactly as registered either way.
/team transfer teams

Offers a persistent team's captaincy to another player already on its roster. The team's captain, or anyone with Manage Server, can start this.

ParameterTypeDescription
teamstringName of the team to transfer.
membermemberWho to offer the captaincy to. Must already be on the team's roster. Invite them with /team invite first if they aren't.
forceboolean, optionalManage Server only: transfers immediately, skipping the new captain's own confirmation.
Captaincy doesn't move until they accept. The offered player gets Accept and Decline buttons, same as a /team invite. Captaincy only actually changes hands once they press Accept. Cancel transfer, right next to those buttons, lets the captain (or a Manage Server admin) retract the offer. Only one offer can be pending per team at a time. Cancel it first if you want to offer it to someone else. An offer nobody answers expires after 24 hours, same as /team invite.
force (Manage Server only) skips all of that and transfers immediately, no confirmation needed, for when it has to happen right now rather than waiting on a response.
Only the captaincy moves. The roster, record, voice channel, and logo are all untouched. The old captain stays on the team as a regular member unless they /team leave afterward.
/team invite teams

Invites up to 5 members at once to a team, in a single shared message. The team's captain, or anyone with Manage Server, can do this.

ParameterTypeDescription
teamstringName of the team.
member_1memberWho to invite.
member_2 … member_5member, optionalUp to 4 more members to invite in the same message.
forceboolean, optionalManage Server only: adds everyone straight to the roster, skipping their own confirmation.
Each invite has to be accepted (or declined) individually. Shockwave posts one message mentioning everyone valid with Accept and Decline buttons. Each invited player presses one for themselves, entirely independently of whether anyone else invited alongside them has responded. Bots, duplicates, anyone already on the team, and anyone who already has an invite to this team still pending are skipped with a note rather than failing the whole invite.
An invite nobody answers expires after 24 hours, so it doesn't sit around forever. Accepting, declining, or just letting it expire all leave anyone else invited alongside it untouched.
Invited the wrong person? A Cancel invite button on the same message retracts it for everyone still pending, not just one invitee. Same permission as sending it: the team's captain, or anyone with Manage Server.
force skips all of that, no posted invite, no buttons, nobody's own confirmation needed. Requires Manage Server even for the team's own captain.
Roster size is a target, not a hard cap. Nothing stops accepting an invite from going past the team's own declared size (set at /team create) - but if accepting every pending invite would push it over, the response says so up front, so it's not a surprise later. It matters at /tournament register time: a tournament requires the roster to match its team size exactly.
/team remove teams

Removes a player from a team's roster who won't (or can't) leave themselves. The team's captain, or anyone with Manage Server, can do this. No confirmation needed.

ParameterTypeDescription
teamstringName of the team.
membermemberWho to remove from the roster.
The captain/admin counterpart to /team leave, the same way force above is the captain/admin counterpart to a normal accepted invite. It's the only way to get someone off a roster who won't (or can't) run /team leave themselves.
Can't be used on the team's own captain. Same reason /team leave refuses the captain too. Use /team transfer to hand off the captaincy first, or /team delete if the team should just be gone entirely.
/team leave teams

Removes you from a persistent team's roster. No permission needed. Anyone rostered can do this to themselves.

ParameterTypeDescription
teamstringName of the team to leave.
The team's captain can't use this one directly. A captain who wants out has to answer "who's in charge now" first: /team transfer the captaincy to someone else on the roster, then leave normally, or /team delete the team if it shouldn't exist at all anymore.
/team stats teams

Shows a team's captain, roster, voice channel, win/loss record, and logo (if it has one) as a thumbnail.

ParameterTypeDescription
teamstringName of the team.
The win/loss record shown is for this server's current game. See /set game; a team's tournament results only ever count toward the game they were actually played under, so switching games shows a different (and, for a brand new game, empty) record for the same team. This applies to /team list's record and win-rate sorting too.
Card turns the embed into a team card. Press it and the whole embed is replaced with a portrait-style card built around the team's own logo as the centerpiece: colors (frame, header, labels, background) are all sampled straight from that logo, not a stored setting, so every team's card automatically matches its own crest. A dark logo color gets automatically lightened just enough to stay easily readable against the card's own background, so text is never sacrificed for the sake of matching the crest exactly. Below the logo: the team's name, then its captain, record, and win rate, then its full roster with the captain starred. A Back button replaces Card once the card is up and swaps back to the plain embed, restoring Card in turn: a real toggle, not a one-way trip. A team with no logo set falls back to Shockwave's own gold.
/team list teams

Browses every team in the server, filtered and sorted however you like, including by win rate, to rank teams, or just your own, with mine:true.

ParameterTypeDescription
searchstring, optionalOnly show teams whose name contains this.
recruiting_onlyboolean, optionalOnly show teams still short of their target roster size.
sortchoice, optionalName, Wins, Losses, Win Rate, or Roster Size. Defaults to Name.
orderchoice, optionalAscending or Descending. Defaults to Ascending.
cardsboolean, optionalFlip through each matching team's full stats card one at a time, instead of a summary list. Defaults to false.
mineboolean, optionalOnly show teams you're rostered on (captain or not). Defaults to false.
member_1 … member_5member, optionalOnly show teams that have every given member on their roster together, up to 5, all optional.
To rank teams by win rate, use sort:"Win Rate" order:"Descending". Paged with the same First/Prev/Next/Last buttons as /leaderboard.
mine:true (optionally with cards:true) is the quickest way to flip through just your own teams without mentioning yourself, the same idea as giving your own name as a member_1, just without needing to. It combines with the member filters too: mine:true member_1:@someone finds the teams you and they share.
Giving more than one member (including via mine) finds the team they're all rostered on together, not every team any of them happens to be on. To just check where one specific person plays, give a single member (or mine) on its own.
In cards:true mode, a Card button also shows up, the same Card/Back toggle /team stats has, swapping the currently-shown team's stats card for its actual trading card. Whichever one you're looking at stays selected as you keep paging: Next/ Prev/First/Last move to the next team's trading card while a trading card is showing, or the next team's stats card while a stats card is showing.
/make-teams saved teams

Loads two persistent teams straight into a casual or ranked game, skipping /make-teams random//make-teams draft's random-split-or-draft entirely: the quickest way to run a scrim between two teams that already exist.

ParameterTypeDescription
team1string, autocompleteName of the first team.
team2string, autocompleteName of the second team. Must be different from team1.
rankedboolean, optionalTrack elo for this game. Defaults to casual.
Autocomplete isn't limited to your own teams. An empty box suggests teams you're on first, but the moment you start typing it searches every team in the server - since the whole point here is usually loading up a game against someone else's team.
Ranked loads show each side's average elo up front, the same "Team 1 avg elo X, Team 2 avg elo Y" preview /make-teams random's own ranked mode already shows - so it's clear going in whether this is a close matchup or a lopsided one, not just after the result posts.
Same contract as /make-teams random and /make-teams draft. This only loads the roster. Nobody moves and no elo/betting starts until you press Start (or Start (no move), to open betting without moving anyone) on it.
/make-teams repeat teams

Re-posts the exact same two teams from whichever of /make-teams random, /make-teams draft, or /make-teams saved ran last, instead of drawing a fresh random split or captains draft. No parameters. It just runs the last game back.

Stays ranked if the last game was ranked, casual if it was casual, same for role labels on a 5v5 roster. If a game from those same teams is still being bet on or played, it's cancelled first (bets refunded, everyone moved back) before the roster's reposted.

Tournaments

A server has at most one tournament at a time. Build the shell, register teams into it, then build the bracket. Re-running the bracket step rerolls it from whoever's currently registered.

/tournament create tournament

Creates an empty tournament shell for this server: a name, a team size, and a bracket size. A server can only have one tournament at a time.

ParameterTypeDescription
namestringTournament name. Capped at 90 characters.
teamsizeintegerNumber of players on each registered team.
numteamsintegerHow many teams the bracket holds. At least 2.
double_elimboolean, optionalDouble elimination instead of single. Defaults to single.
Creating the first tournament in a server needs no special permission. Overwriting an existing one does. Since a server only ever has one tournament, running this again while one already exists requires the Manage Server permission, and doesn't overwrite it right away even then. Shockwave posts a warning naming the existing tournament with "Overwrite tournament" / "Cancel" buttons, same confirmation pattern as /clear elo//clear economy. Only the member who ran the command can click them, and the prompt expires after 30 seconds untouched if ignored.
/tournament register tournament

Registers one of your teams for the server's tournament. The team's captain, or anyone with Manage Server, can do this.

ParameterTypeDescription
teamstringName of the team to register.
Has to actually fit. The team's current roster size must match the tournament's team size exactly - if it doesn't, the error names which command fixes it (/team remove if the roster's too big, /team invite if it's too small). It can't already be registered. The bracket can't already be full. And none of its players can already be on another team registered for this same tournament. A player can sit on multiple teams in the server, just not two that are both in the same tournament.
/tournament unregister tournament

Undoes a registration, the lightweight fix for registering the wrong team. The team's captain, or anyone with Manage Server, can do this. No confirmation needed.

ParameterTypeDescription
teamstringName of the team to unregister.
Only works before the bracket is built. Once /tournament create-bracket has run, every registered team is already seeded into the bracket tree, so this refuses instead of leaving it referencing a team the tournament no longer considers entered. Reroll the bracket itself (which does require confirmation once it has real match history) if the lineup genuinely needs to change after that point.
/tournament create-bracket tournament

Builds the tournament bracket from whichever teams are currently registered, seeded in random order.

ParameterTypeDescription
elimination_typechoiceSingle or double elimination.
losers_bracket_timingchoiceDouble elimination only. When the losers bracket plays: after the whole winners bracket finishes (default), or interleaved as each round unlocks it.
Running it again is a reroll, replacing whatever bracket already existed with one reshuffled from the currently-registered teams. If the team count isn't a power of two, the leftover slots are byes. The bracket is printed automatically right after. No need to also run /tournament print-bracket unless you want to see it again later. A reroll before /tournament start has ever been run needs no confirmation and no particular permission, since there's nothing at stake yet. Rerolling over a bracket that already has real match history (results, and any bets that were never settled) requires the Manage Server permission and a Confirm/Cancel prompt before it erases anything.
Double elimination builds a real losers bracket, not just a label. A team gets a second chance after its first loss instead of being knocked out immediately. See /tournament start below for how the whole thing plays out.
Two ways to time the losers bracket. The default keeps the two brackets fully separate in time. The losers bracket doesn't start until the winners bracket has crowned its champion. losers_bracket_timing: Interleaved instead pauses the winners bracket after each of its rounds to let any losers-bracket round that round just unlocked play out first, so both brackets make progress side by side instead of one sitting idle until the other finishes.
/tournament print-bracket tournament

Posts the current bracket as an actual image: every round's matchups connected with lines, the same layout you'd sketch on a whiteboard, plus a short status line naming the current champion (or TBD).

Needs a bracket to already exist. If /tournament create-bracket hasn't been run yet, this rejects immediately with a message telling you so, instead of building a misleading empty bracket image.
Unplayed slots show TBD (or BYE for a permanently empty seed) until the match feeding them actually resolves, but the bracket lines themselves already show every possible matchup for every round, not just the next one.
Double elimination posts two images. The winners bracket and the losers bracket each get their own attached image on the same message, plus a Grand Finals status line once both brackets have produced a champion, showing the winners-bracket champion (undefeated) against the losers-bracket champion (one loss), and the tournament's actual final result once it's decided.
Big brackets converge toward the center. Once a bracket is 16 or more teams, it's drawn as two mirrored halves growing inward from either side and meeting in the middle, the same layout a printed tournament poster uses, rather than one long strip. Smaller brackets still print left to right.
/tournament start tournament

Starts playing the current round of the bracket. Byes auto-advance immediately. Everything else becomes a match.

ParameterTypeDescription
modechoiceSequential or Simultaneous, see below. Applies to the whole tournament run, not just this round.
Every match gets a matchup graphic posted alongside its text announcement: both teams' logos and rosters facing off, captain starred and listed first, and which round of the tournament it is.
Sequential. One match at a time. Shockwave posts "Match #N: A vs B" with a Ready button. Either team's captain, or anyone with Manage Server, can press it to begin the match - the same admin escape hatch the winner-report buttons have, in case a captain's gone AFK; the ready check has no timeout, so it would otherwise sit open forever with no way to force it short of deleting the whole tournament. Once accepted, that match runs through the exact same cycle a Start-triggered game does: /wager team opens, the usual Team 1/Team 2 winner report resolves it, payouts and elo apply normally. As soon as it resolves, the bracket updates in chat and the next match's ready check goes out. The round doesn't advance until every match in it is done, even if two other teams are both sitting there ready to go.
Simultaneous. Every match in the round posts its "Match #N: A vs B" report at once, with Team 1/Team 2 buttons like any normal winner report: no ready check. Betting opens once for the whole round, covering every match in it at the same time: the base duration from /set betting-timer is multiplied by how many matches are in the round, and /wager team takes a match_id to say which one you're betting on. You can bet on more than one concurrently-open match. Each match settles its own bets independently the moment it resolves, without waiting on the rest of the round. The bracket updates in chat as each match comes in.
Every Team 1/Team 2 report, either mode, needs a Confirm press before it counts. Pressing either button posts a Confirm/Cancel prompt rather than resolving the match immediately, closing betting on that match right away either way. Cancel (or letting the prompt time out) puts the match's buttons back to pressable, in case the wrong side got picked.
Round transitions get their own announcement. Once every match in a round has resolved, Shockwave posts "🏁 Round N has ended!" with a fresh copy of the bracket, then immediately kicks off the next round, or, once the bracket has nothing left to play, announces the champion. None of this blocks the bot: everything runs off button presses rather than a waiting loop, so /wager team and every other command keep working normally for other games in progress while a tournament round plays out.
Every match gets an id. Shown as Match #N in its messages. Pass it as match_id to /set correct-winner to fix a wrong result, as long as the next round hasn't started yet. (Currently only supported for winners-bracket matches. See the note there.)
Double elimination keeps going after the winners bracket. Once it crowns its own champion, the losers bracket plays out the same way (byes auto-advance, everything else becomes a match, sequential or simultaneous per the same mode). No need to run /tournament start again. Once the losers bracket also has a champion, Shockwave posts Grand Finals: the winners-bracket champion (undefeated) against the losers-bracket champion (one loss). If the winners-bracket champion wins, the tournament's over. If the losers- bracket champion wins instead, both sides now have exactly one loss, so a second, decider match settles it. Whoever wins that one is champion regardless of which bracket they came from.

Utility

/roll utility

Rolls a random number between 1 and a number you give it. Handy for deciding who gets first pick.

ParameterTypeDescription
numintegerTop of the range. Must be greater than 1.
/help utility

Run with no arguments for a link to this page. Pass a command name (with or without the leading slash) for a short usage line and description without leaving Discord.

ParameterTypeDescription
commandstring, optionalName of the command to look up, e.g. wager. Omit for the full site link.