Notifications
This page is hidden behind SLKARDS' spoiler gate. There's a way to unlock it. If you know the way, use it — otherwise, keep exploring the game.
Notifications
Notifications fall into three categories: DM notifications (sent via the bot’s direct message feature), channel notifications (posted in specific server channels, often with role pings), and in-thread notifications (posted within active interaction threads). All notifications that reference a server include the server name so players active on multiple servers can tell them apart.
[REDACTED]
Section titled “[REDACTED]”Every bot-initiated DM funnels through bot/notifier.py — a single shared queue with rate-limit-aware delivery so call sites never block on Discord I/O.
Notificationdataclass. Captures the user, payload (content / embed), an optionalfallback_channel, and metadata for logging. Producers build one and hand it toNotifier.enqueue().EnqueueResultenum. Returned fromenqueue()so producers can branch on overflow if they care. Current call sites are fire-and-forget.- Bounded queue — 5000 entries. When the queue is full, the oldest queued notification is evicted and the new one is admitted (drop-oldest back-pressure per SEC-012). Stale alerts (wishlist spawns, auction outbids) are usually obsolete by the time the queue is saturated, so newer-is-better is the right policy.
- Single worker drains via
Throttle.send_dm().bot/throttle.pyruns token buckets for channel, guild, global DM (≈5/s), and per-user secret attempts. The DM bucket is the global ceiling — no other code path may bypass it. - Retries with exponential backoff. Transient
discord.HTTPExceptionretries up toMAX_RETRIES=2(3 total tries). - Fallback channel. If the DM hits
discord.Forbidden(DMs disabled) or exhausts retries, and the notification carries afallback_channel, the message is posted in that channel instead. Without a fallback channel, the notification is dropped only after retries are exhausted — matching “DMs are best-effort” semantics.
[REDACTED]
Section titled “[REDACTED]”DMs are the primary notification method for player-specific events that don’t need a public channel post. Every DM that references a server includes the server name so players active across multiple servers can tell them apart.
[REDACTED]
Section titled “[REDACTED]”When a kard on a player’s wishlist spawns or appears on the marketplace, the player receives a DM. These are time-sensitive — the player needs to act quickly for spawns.
| Trigger | Message template |
|---|---|
| Kard spawns | "The kard #{kardID} • {kardName} has spawned in {serverName}!" |
| Kard listed on marketplace | "The kard #{kardID} • {kardName} has been added to the marketplace in {serverName}! Current cost: {price}" |
[REDACTED]
Section titled “[REDACTED]”Players are notified of event progress and milestones via DM. Notifications differ by event type. The whole events pipeline ships with 0.8.
Competition Events:
| Trigger | Message template |
|---|---|
| Player enters a new reward tier (top 50%, 25%, 10%, 5%, or 1%) | "You've entered the top {tierPercent}% in the {eventName} event in {serverName}!" |
| Player drops out of a reward tier | "You've dropped out of the top {tierPercent}% in the {eventName} event in {serverName}. Your current placement: #{placement}." |
| Event ends | "The {eventName} event in {serverName} has ended! Your final placement: #{placement} (top {tierPercent}%). Rewards: {koinsReward} koins, {gpReward} GP." |
Task Events:
| Trigger | Message template |
|---|---|
| Player completes an individual task | "You've completed the task '{taskDescription}' in the {eventName} event in {serverName}! Rewards: {koinsReward} koins, {gpReward} GP." |
| Player completes all tasks | "You've completed ALL tasks in the {eventName} event in {serverName}! Bonus rewards: {bonusKoins} koins, {bonusGP} GP." |
Co-op Events:
| Trigger | Message template |
|---|---|
| Co-op goal the player contributed to is completed | "The server-wide goal '{goalDescription}' has been completed in the {eventName} event in {serverName}! Participation reward: {koinsReward} koins, {gpReward} GP." |
| All co-op goals are completed | "ALL goals in the {eventName} event in {serverName} have been completed! You contributed to {contributionPercent}% of the goals. Bonus rewards: {bonusKoins} koins, {bonusGP} GP." |
[REDACTED]
Section titled “[REDACTED]”Players involved in marketplace transactions receive DM updates for time-sensitive activity. Sale-side notifications are shipped today (counter-offer received, sale purchased). Auction notifications are upcoming with the 0.3.5 auction flow — see the # TODO 0.3.5 markers in services/store_market.py and cogs/stores/marketplace.py.
| Trigger | Status | Message template |
|---|---|---|
| Auction outbid | [Upcoming 0.3.5] | "You've been outbid on kard #{kardID} • {kardName} in {serverName}! New highest bid: {newBidAmount} koins. Time remaining: {timeRemaining}." |
| Auction won | [Upcoming 0.3.5] | "You've won the auction for kard #{kardID} • {kardName} in {serverName}! Final price: {finalPrice} koins. The kard has been added to your inventory." |
| Auction ended (seller) | [Upcoming 0.3.5] | "Your auction for kard #{kardID} • {kardName} in {serverName} has ended! Sold for {finalPrice} koins (after 5% fee: {netAmount} koins)." |
| Sale counter-offer received | [Shipped] | "You've received a counter-offer of {offerAmount} koins for your listing of kard #{kardID} • {kardName} in {serverName}. Visit the marketplace to accept or decline." |
| Sale purchased | [Shipped] | "Your listing for kard #{kardID} • {kardName} in {serverName} has been purchased for {price} koins (after 5% fee: {netAmount} koins)." |
[REDACTED]
Section titled “[REDACTED]”At the end of each monthly ranked season, all players who participated in at least one ranked match receive a DM with their season summary. The whole ranked system ships with 0.4.
| Trigger | Message template |
|---|---|
| Season end summary | "Ranked Season {seasonNumber} in {serverName} has ended! Your final rank: {finalRank} (ELO: {finalElo}). Peak rank: {peakRank}. Rewards: {koinsReward} koins, {gpReward} GP. Your ELO has been soft-reset for the new season. Good luck!" |
[REDACTED]
Section titled “[REDACTED]”When a player unlocks an achievement, they receive a DM with the details and reward. Ships with the 0.6 achievements release.
| Trigger | Message template |
|---|---|
| Achievement unlocked | "Achievement unlocked in {serverName}: '{achievementName}' — {achievementDescription}. Rewards: {koinsReward} koins{titleReward}{footnoteReward}." |
[REDACTED]
Section titled “[REDACTED]”When a lab job (artificial rarity, modifier, limitbreaker, or evolution prep) completes its timer, the player is notified. Ships with the 0.5 Labrats release.
| Trigger | Message template |
|---|---|
| Lab job complete | "Dr. Higginbotham's work on kard #{kardID} • {kardName} in {serverName} is complete!" |
[REDACTED]
Section titled “[REDACTED]”Alliance members receive DMs for important alliance events that require their attention or action. Ships with the 0.7 United Forces release.
| Trigger | Message template |
|---|---|
| Contract offer | "You've received a contract offer from {allianceName} in {serverName}! Sign-on bonus: {signOnBonus} koins. Weekly wage: {weeklyWage} koins. Visit the recruitment channel to accept or counter-offer." |
| AvA scheduled | "An AvA battle has been scheduled for {allianceName} vs. {opponentName} in {serverName}! Battle date: {battleDate}. Check the AvA announcement channel for details." |
| Raid available | "A raid against {bossName} ({difficulty}) has been started by {allianceName} in {serverName}! You have 5 attempts this week. Head to the raid channel to begin." |
| Weekly wage paid | "You've been paid {netWage} koins ({grossWage} - {taxAmount} tax) by {allianceName} in {serverName}." |
| Weekly wage frozen | "{allianceName} in {serverName} doesn't have enough treasury funds to pay wages this week. The alliance will stop earning XP until the treasury is replenished." |
| Kicked from alliance | "You've been removed from {allianceName} in {serverName}." |
[REDACTED]
Section titled “[REDACTED]”When a player triggers NG+ for the first time or completes another cycle, they receive a celebratory DM in addition to the in-server announcement. Ships with 0.8 Creative Mode.
| Trigger | Message template |
|---|---|
| NG+ activated | "Congratulations on reaching NG+{cycleCount} in {serverName}! New title unlocked: '{ngTitle}'. Bonus: {bonusKoins} koins." |
[REDACTED]
Section titled “[REDACTED]”Channel notifications are posted in specific server channels and are visible to all players (or all members of an alliance). They are used for events that affect the entire server or alliance.
[REDACTED]
Section titled “[REDACTED]”Posted by cogs/wipes.py. Three messages fire at specific intervals before and during a Wipe, pinging the player role. Scheduling is bound to the admin_setup.completed bus event so freshly configured guilds get their first wipe queued automatically.
| Channel | Trigger | Message |
|---|---|---|
slkards-wipes | 48 hours before | @{playerRoleID} **WARNING: A WIPE WILL HAPPEN IN 48 HOURS! HALF OF ALL OWNED KARDS WILL BE WIPED.** |
slkards-wipes | 24 hours before | @{playerRoleID} **WARNING: THE WIPE IS IMMINENT! 24 HOURS UNTIL HALF OF ALL KARDS ARE WIPED.** |
slkards-wipes | At wipe execution | @{playerRoleID} **SNAP! HALF OF ALL KARDS OWNED HAVE BEEN RANDOMLY REMOVED!** |
[REDACTED]
Section titled “[REDACTED]”| Channel | Trigger | Message |
|---|---|---|
slkards-events | Event start | An embed with the event name, type, description, duration, active modifiers, and reward tiers. |
slkards-events | Co-op progress updates | A progress bar embed that is edited periodically as server-wide goals advance. |
slkards-events | Event end | A results embed showing top players, winners, and reward distribution. |
[REDACTED]
Section titled “[REDACTED]”| Channel | Trigger | Message |
|---|---|---|
slkards-announcements | Season end/start | "Ranked Season {seasonNumber} has ended! Season {newSeasonNumber} begins now. All ELO ratings have been soft-reset." |
[REDACTED]
Section titled “[REDACTED]”| Channel | Trigger | Message |
|---|---|---|
slkards-player-chat | Player reaches NG+ | "@{playerName} has reached NG+{cycleCount}! Congratulations!" |
[REDACTED]
Section titled “[REDACTED]”| Channel | Trigger | Message |
|---|---|---|
{alliance_name}-members | Member joins/leaves | "{playerName} has joined/left the alliance!" |
{alliance_name}-members | Alliance levels up | "The alliance has reached Level {level}! New unlocks: {unlocksList}." |
{alliance_name}-members | Boon activated | "{boonName} Level {boonLevel} has been activated! Active for 7 days." |
{alliance_name}-members | Raid boss available | "A raid against {bossName} ({difficulty}) has been initiated! Head to the raid channel." |
{alliance_name}-officers | Join request pending (invite-only mode) | "{playerName} has requested to join the alliance. Accept or deny in the recruitment channel." |
{alliance_name}-officers | Donation shortfall warning | "{playerName} has not met their weekly donation requirement ({current}/{required})." |
{alliance_name}-officers | Shop purchase suggestion | "{playerName} has suggested purchasing {itemName} ({itemCost} koins)." |
{alliance_name}-donations | Donation made | Donation tracker embed is edited in place when a donation is made. |
{alliance_name}-results | Raid completion | Raid result embed posted on raid completion. |
{alliance_name}-results | AvA completion | AvA result embed posted on AvA completion. |
{alliance_name}-archive | Any administrative action | One-line log entry for every administrative action (kicks, setting changes, purchases, etc.). |
[REDACTED]
Section titled “[REDACTED]”In-thread notifications are messages posted within active interaction threads. They are visible only to the participants of that thread. These are typically real-time updates during ongoing game interactions.
[REDACTED]
Section titled “[REDACTED]”- Turn narration: Each turn’s results are posted as an embed within the battle thread (formatted by the chosen narrator style).
- GAMBIT activation: A special highlighted embed when a GAMBIT triggers.
- Evolution triggered: A dramatic embed when a kard evolves mid-battle.
- Battle conclusion: Final results embed with winner, kards remaining, ELO change (ranked), and GP awarded.
[REDACTED]
Section titled “[REDACTED]”- Kard selection updates: As each player adds or removes kards from their offer, the trade summary embed is updated.
- Confirmation prompts: Double-confirmation embeds before the trade is finalized.
- Trade receipt: Final summary of what was exchanged.
- Rep prompt: Ephemeral message asking each player to leave +rep or -rep.
[REDACTED]
Section titled “[REDACTED]”- Pack opening: Animated reveal of the 3 kards in a pack, followed by the pick-2 selection interface. [Shipped]
- Lab job started: Confirmation embed with the job details, cost paid, and estimated completion time. [Upcoming — 0.5]
- Marketplace listing created: Confirmation embed with the listing details and transaction ID. [Shipped]
[REDACTED]
Section titled “[REDACTED]”- Attack narration: Turn-by-turn narration of the player’s attacks against the raid boss, similar to battle threads.
- Boss ability triggered: Special embed when the boss uses its unique mechanic.
- Attack conclusion: Summary of damage dealt this attempt, boss HP remaining, and attacks remaining for the player.
[REDACTED]
Section titled “[REDACTED]”- Check-in prompt: Embed with a check-in button when the battle day arrives.
- Check-in timeout warning: 10-minute warning if neither or one player has checked in.
- Battle narration: Same as regular battle threads once both players check in.