Two ways to build a raid
The deep builder for a taxed CTA, one quick modal for a thirty-second gank call.
The full builder lays every field on its own button, grouped by purpose: 📝 Basics (title, date, gather, start and duration in one modal), 🧩 Roles, ⚙️ Requirements, 📎 Media, 🔔 Ping, then the mode toggle · 🔊 Gather VC · ⭐ Ratings, then 💾 Save preset · 📣 Post raid. That depth is right for a taxed CTA and wrong for a thirty-second gank call, so a raid-board button configured as a simple content profile skips straight to one modal — Title, Time, Description, Roles — and replies with a compact card carrying ✏️ Main · 🔔 Ping · 💾 Save preset · 📣 Post raid. Whichever door you use, the draft is the same object.
Templates and presets
A template saves the comp. A preset saves the whole call — comp, mode, times, requirements, ping roles.
Templates are the reusable composition, public (officer-managed) or personal (anyone). They live on a template board anyone can browse and launch. Presets go further: a preset is the entire raid config, so a recurring Wednesday CTA goes up in two taps. Presets sit on their own board, names are unique per guild, and a preset stores a relative lead time rather than a calendar date — a “tomorrow” preset always loads as tomorrow, not as the day it was saved. Comps are snapshotted onto the preset when it is saved, so editing or deleting the source template later cannot silently swap a preset onto the wrong roster.
The comp grammar
Category > Name:slots:emoji, one per line. Paste a whole comp at once.
A comp is something you can write, paste, share and diff. Name is one slot; Name:5 is five; Name:5:⚔️ adds an emoji; Category > Name tags a role with a category that renders as a sub-header on the card. The separator is > and not / on purpose — Albion role names use / constantly for weapon choices (Heavy Mace / Hammer), and that had to stay free. Parsing is what-you-see: three Gala lines stay three separate one-slot seats and render Gala #1 / #2 / #3, because a fixed comp should read exactly as typed. Role names cap at 40 characters and 50 slots, and | is rejected in names, categories and party labels because it separates the fields inside a Discord component id.
Multi-party rosters
One raid call, several in-game parties, rendered as side-by-side columns in a single card.
A line starting with # opens a sub-party; every role under it belongs to that party until the next #. The card renders one column per sub-party inside a single embed, each with its own fill count, pinned to full desktop width by an invisible spacer image when there is no cover image. Up to 20 sub-parties, labels must be unique. This is deliberately a presentation and structure layer on top of one raid row — settlement still pools per raid, which is what kept the append-only loot ledger untouched.
Layout and weight, without retyping the comp
🧩 Roles holds ✏️ Edit roles in the builder, ➕ Add role / ➕ Add slots on a posted raid, and the layout counters on both.
columns: and density: started as typed directives and grew one-click counters. 🔢 Columns cycles 1 → 2 → 3 and lays a single-party roster across side-by-side columns without turning it into sub-parties, so signup keeps its one-click role buttons and gains no pick-a-party step. 📋 Roster flips between full (role header, players listed beneath) and compact (**⚔️ DPS (2/3)** — Alice, Bob), which fits a big comp on one screen. ⚖️ Attendance cycles ×1 to ×5. Each button shows the value actually in effect, including one inherited from a template, so one click always changes what the preview shows. Changing them on a live raid re-renders the card and touches nobody’s signup.
Five roles or sixty — still one click
Per-role buttons at or below 20 roles; one green Sign button and a picker above that.
Discord allows five buttons per row and five rows per message, so a 60-slot CTA physically cannot have a button per role. At or below 20 roles the card shows one blurple button per role, labelled with its emoji, its name and — on a multi-party raid — its sub-party (🛡️ Heavy Mace · Vanguard), so identical role names across parties stay distinguishable. Above 20 the card shows one green ✍️ Sign / change role button that opens a picker: pick a party, then a role. On a single-party comp over 25 roles you pick a category first, because a Discord select menu holds 25 options.
Bench and flex pool
🪑 Bench puts you on the roster with no role — pinged, counted, one click from a slot.
Not everyone wants to commit to a slot, and an officer building a comp needs to know who is around. The bench is a first-class roster state: benched players appear on the card with a count, get the gather ping as standby, show up in roll call as “Bench, present”, and can be seated into a role in one click by an officer — or by themselves, since picking a role converts a bench entry into a confirmed signup. What a bench seat is worth is a per-guild policy — nothing, a full share of the loot, attendance points, or both — frozen onto the raid when it is created, so a policy change tomorrow cannot rewrite what today’s raid promised.
Player profiles
/profile records which roles you can play; the bench shows them as emoji.
A member toggles their playable roles once — tank 🛡️, healer 💚, support 🔮, melee ⚔️, ranged 🏹, battlemount 🐎, caller 📣 — and the profile is global, not per-raid. Its payoff is the bench line: 🪑 Bench (3) — Alice 🛡️💚, Bob ⚔️, Cara 🏹. An officer short one healer can see who on the bench can heal without asking in voice. Officers can view or edit a member’s profile with /profile user:@name; anyone else viewing it gets a read-only panel.
No timezone math
Type the time once in guild time; every member sees their own clock automatically.
The guild sets one timezone. Raid times are entered in that local time, converted correctly across daylight-saving boundaries, and stored as a UTC instant. The card then renders Discord’s own dynamic timestamps, which each client localises: the raid line shows date, clock and a live countdown, and gather time gets its own line with the clickable gather voice channel beside it. Nobody has to post “20:30 CEST (18:30 UTC)” in the channel again, and the countdown keeps ticking on a card that was posted three days ago.
Edit a posted raid without losing signups
Rename, reorder or re-slot the comp; players keep their seats, and you are told if anyone was benched.
✏️ Edit reopens the builder prefilled with the live raid, roster included — the sub-party grammar is reconstructed so a multi-party comp round-trips as text. On save the roster is rebuilt and every confirmed signup is re-matched by identity (sub-party, role name, and which occurrence of a repeated role it was), with sub-parties matched by label first and by role content second, so renaming “Party 2” to “Flank” or reordering the columns keeps people seated. Each sub-party’s mapped voice channel rides across on the same match. Anyone whose role genuinely no longer exists is moved to the bench and never dropped, and the save reply tells you how many. Applying a whole template to a raid that already has signups asks for confirmation first, naming how many people are affected.
Grow a live roster mid-call
➕ Add role and ➕ Add slots extend a running raid without disturbing a single seat.
More people turned up than the comp has slots. The console’s 🧩 Roles panel adds one named role — name, slots, emoji, category, and on a multi-party raid which sub-party it joins — then optionally seats members into it straight away. ➕ Add slots adds 1, 2, 3, 5 or 10 open slots and is roster-aware: it tops off parties with room, then spills into a new sub-party once a party reaches Albion’s 20, converting a single-party raid into Party 1 + Party 2 automatically. You see a preview of exactly where the slots land before confirming. The guarantee that makes this safe is structural: these operations only insert rows or re-parent a role, so they can never bench a confirmed player.
Officer console in a thread
The controls live in a thread anchored to the raid post, so the card and the buttons are on screen together.
An ephemeral panel sits at the bottom of the channel while the raid post drifts upward with every signup — for a 60-person CTA that is a genuinely painful amount of scrolling. 🛠️ Managing opens a public thread on the post and puts the console in it as a persistent message, so the raid card sits at the top of the thread and the buttons sit under it. The thread doubles as the raid’s discussion thread, the settlement breakdown posts there, and on settle it is archived and stamped ✅ (reopenable, not locked). Pressing 🛠️ Managing again returns a deep link straight to the console message, so member chatter cannot bury the controls. If the bot cannot create a thread, it falls back to the old ephemeral panel rather than failing.
Gather auto-ping and auto-move
At gather time the bot pings the exact roster, and can pull them into the voice channel.
A sweep runs every 60 seconds, finds raids whose gather time has arrived, and posts one message into the raid’s officer thread if it has one, otherwise into the raid channel, mentioning each signup individually. Never @here: that pings online people who did not sign up and misses offline people who did, which is the opposite of what is wanted. Turn it on with /config gather_ping:true. /config gather_move:true adds the other half — at that same moment every signup already sitting in some voice channel is pulled into the gather VC. A failed move never suppresses the ping, because being told is the point and being dragged is the courtesy.
Roll call and bulk voice moves
Who is missing, read from Discord voice state — then 🧲 Pull in, ⚔️ Split to parties, 🔙 Regroup, ↩️ Undo.
Roll call compares the confirmed roster against who is actually in the gather voice channel and returns four buckets: ✅ Present, ⚠️ Missing (signed up, not in VC), ❓ In VC not signed up, and 🪑 Bench present. There is no “I’m here” button for players to press — presence is read from voice state, so the report is simply true. The report’s own buttons divide the missing list: 🧲 Pull in for whoever is in voice somewhere, 📣 Ping missing for whoever is not. The 🔊 Voice panel adds ⚔️ Split to parties, 🔙 Regroup, 🧹 Clear strays and ↩️ Undo move. Every destination is permission-checked before a single person moves, so you are told which channel is the problem instead of finding half a raid stranded across two rooms.
Ending a raid three honest ways
💰 Settle, 🛑 End · no split, or 📣 Call it off — and ♻️ Reopen retracts loudly.
These are not the same event and the bot refuses to pretend they are. 🛑 End · no split means the raid ran and there was no loot: sign-ups close, the card goes amber with “🔒 Closed — no loot split”, nothing moves, nobody is notified, and it stays settleable in case loot arrives late. 📣 Call it off means the raid never ran: the card says “📣 Called off — this raid did not run” with the caller’s reason quoted and attributed, everyone signed up is told to stand down in the raid channel, the gather ping is cancelled atomically so it cannot fire seconds later, and settling is blocked until you reopen. Reopen is deliberately loud — the original notice is struck through in place with mentions suppressed and a fresh ✅ BACK ON is posted, because nobody re-reads an edited message.
A public activity log anyone can read
📜 Log on the card shows who signed, switched and left — ungated.
Every signup, switch, bench and leave is captured, and the 📜 Log button on the public post opens that history to any member, not just officers. The console carries the same log plus a 🔔 Live feed toggle that mirrors changes into the thread as they happen. When a non-officer caller uses one of their delegated powers — benching, kicking, handing over the lead — an audit line is posted into the raid thread with mentions suppressed, so officers keep passive visibility without being pinged.
Members can call raids too
A non-officer’s raid is locked to casual, and they run their own call.
Members can post raids. Their calls are locked to casual — the mode toggle is hidden in the builder and enforced again when the raid publishes, so a member cannot post a taxed, tracked raid. Whoever posts a raid is its caller, and a non-officer caller gets a console of their own: bench and kick, assign roles, edit, roll call, voice moves, grow the roster, hand over the lead, end it, call it off, and settle it because a casual split moves no balances. What a caller can never do is settle a taxed raid or touch taxes, membership or exemptions.