Shockwave

General

What does Shockwave actually do?

It looks at who's sitting in a voice channel, splits them into two teams (random, drafted, or balanced by elo, a skill rating like a chess rating: it rises when you win and falls when you lose), optionally hands out lane roles, moves everyone into their team's voice channel with a Start button, and tracks the result, including an optional betting economy and a ranked elo ladder. Everything runs through Discord slash commands and buttons. Nobody has to leave the app.

Are Shockwave's images AI generated?

No, every image Shockwave posts (trading cards, team cards, tournament brackets, matchup graphics) is made programmatically with Pillow, a Python image-creation library. Layouts, colors, and text are drawn by code, not generated by an AI model.

Do I need to be a server admin to use it?

No, for most commands. Anyone in the voice channel can build teams, start a game, wager, or check /stats. Adding the bot to a server requires the Manage Server permission (that's a Discord requirement for any bot invite, not something Shockwave adds), and one command, /set correct-winner, which fixes a misreported result, is restricted to members with Manage Server so it can't be abused to rewrite outcomes after the fact.

Is the gold economy real money?

No, it's an entirely in-server, made-up currency with no cash value or exchange. Everyone gets 1000 free gold once a day with /daily, and it exists purely to add stakes to /wagering on games.

Does my elo or balance carry over between servers?

No, every stat Shockwave tracks (elo, gold balance, win/loss record, betting history) is scoped per-server. Playing ranked games in one Discord server has no effect on your numbers in another.

What happens if the bot restarts mid-game?

Team rosters, betting state, and the original voice channel are all persisted to disk as they happen, not held only in memory, so a restart doesn't wipe an in-progress game. The one exception is an open betting countdown's exact timer, which restarts fresh (betting just stays open until the game is reported or cancelled instead of auto-closing). If that matters, the Cancel Game button on the report message cleanly ends the round and refunds any bets placed so far.

Can teams be uneven, or bigger/smaller than 5v5?

Yes. /set team-size tells a captain draft (/make-teams draft) when each side is full, so extra people in the voice channel stay spectators instead of getting drafted. /make-teams random ignores it and just splits whoever's in the voice channel down the middle. Odd numbers land one extra player on a side. Lane roles (use_roles on /make-teams random, reassignable afterward with the roster's Random Roles or Balanced Roles button) are the one feature that specifically needs exactly 5-a-side, since there are five named lanes to hand out.


Using Shockwave for games other than League

Almost everything about Shockwave is game-agnostic: team formation, moving voice channels, betting, and ranked elo don't know or care what you're actually playing. A server can track any number of games side by side, each with its own elo and stats. There's exactly one League-specific feature, and it's opt-in.

How does Shockwave know which game we're playing?

/set game sets it. Give it a name already in the autocomplete list, or type a brand new one to start tracking it. "League" is the default for a server that's never run it. Elo, game record, and ranked record are all tracked separately per game, so switching never touches another game's numbers, only whichever one is currently active. The same goes for /team stats's persistent tournament win/loss record. Gold balance and betting record stay one shared pool across every game, same as always.

What's actually League-specific?

Only lane roles: Top / Jungle / Mid / Bottom / Support, assigned by use_roles on /make-teams random or reassigned with the roster's own Random Roles or Balanced Roles button. Those only work while League is the active game (via /set game). Every other game skips them entirely, with a note explaining why if you ask for them anyway. Everything else (random or drafted team splits, moving voice channels, the betting economy, ranked elo and team balancing) has nothing to do with League and works identically for any team-based game played by a voice-channel-sized group.

How do I set it up for another game?

Run /set game with the game's name, then /set channels with team1/team2 once. From there it's /make-teams random or /make-teams draft, with ranked:true if you want elo tracked. Every roster's own confirmation message names the active game and reminds you how to switch it, so it's always visible which game's numbers a game you're about to start will count toward. This works for Valorant 5-stacks, Rocket League 3v3s, a chess club splitting into two draft brackets, or any other group that needs to be divided into sides and moved somewhere.

Can I get lane-style roles for a different game?

Not out of the box. The five roles are hardcoded to League's lanes. If your game has its own fixed positions (an FPS's entry/support/anchor, for example) and you're comfortable editing Python, the role list lives in a small, self-contained spot in the codebase. Swapping the five names is the whole change. See the self-hosting guide if you're running your own instance and want to make that kind of tweak.

Does ranked elo make sense for a non-League game?

Yes, the elo system is a standard win/loss rating (the same math chess ratings use), not anything League-flavored. ranked:true on /make-teams random or /make-teams draft balances teams by the active game's current elo and adjusts it after a reported result, regardless of what game you're actually playing. /stats and /leaderboard always show whichever game is currently active.


Just for fun

Why is it called "Shockwave"?

It's a League of Legends reference: Orianna's ultimate, Command: Shockwave, pulls everyone caught in it together into one place. That's more or less exactly what the bot does to a voice channel full of people: gather everyone up and move them where they need to be. The name stuck as the project's namesake.


Report a bug

Found something broken? Open an issue on GitHub.

Anyone can open one. The repository is public, and GitHub lets any signed-in GitHub user file an issue there, not just this project's maintainers. Include what command you ran, what you expected, and what actually happened, plus a screenshot if it's something visual.

Open an issue on GitHub →