ALPHA: Testers Wanted

After Hours is in active development. Commands change often, and some will break. That's expected at this stage. The whole point of the alpha is to find those breakages before a stable release. If you run the tests below and report what goes wrong, every report makes the next build steadier. Thanks for helping.

How to report a bug

If any test below fails or behaves differently than the expected result, message @vasucoded on Discord directly.

Include three things so the bug can actually be fixed:

1. What you ran: the exact command and options (e.g. /coinflip amount:50 side:heads).
2. What you expected: what the checklist said should happen.
3. What actually happened: the real result, including any error text like "The application did not respond." A screenshot helps.

No tests match your filter.

This checklist covers only the commands that are live in the current build. Planned commands that aren't implemented yet are left out on purpose, because there's nothing to test there. Run each one in a server where After Hours is installed. Where an Edge case is listed, please test it too. Those are the situations most likely to expose a bug.

Economy & Jobs

/balance

Action /balance

Expected An embed shows your current Rokda balance. The very first time you run it, your wallet is created with a starting balance instead of an error.

Action /balance user:@anotherperson

Expected Shows that person's balance instead of yours.

/daily

Action /daily

Expected Your balance goes up by somewhere between 150 and 400 Rokda, and an embed confirms the amount and your current daily streak.

Edge case /daily again right away

Expected It refuses and tells you how long until you can claim again. Your balance does not change. You cannot claim twice in one day.

/weekly

Action /weekly

Expected Your balance goes up by 1000–2000 Rokda once, and a 7-day cooldown starts.

Edge case /weekly again right away

Expected Cooldown message with time remaining. No second payout.

/job list

Action /job list

Expected Lists every available job, each with its payout range and cooldown.

/job apply

Action /job apply name: then pick a job from the dropdown

Expected You're assigned that job and get a confirmation. The job comes from a dropdown, so you can't type a job name that doesn't exist.

/job stats

Action /job stats

Expected Shows your current job, your XP, and your payout bonus tier. If you haven't applied for a job yet, it tells you to apply first rather than erroring.

/work

Action /work

Expected You earn Rokda for your current job and your balance rises. If you have no job, it prompts you to apply for one first.

Edge case /work again right away

Expected A per-job cooldown message. No extra pay until the cooldown is up.

/shop, /buy, /inventory

Action /shop, then /buy item: and pick a badge, a title, and a booster.

Expected The shop lists items grouped into badges, titles, and boosters. Each buy debits the exact price. A badge then shows on your /rank; a booster shows a 2× XP timer.

Action /inventory, then use the dropdown to equip a title, then /rank.

Expected Inventory lists what you own and the active booster; equipping a title makes it appear next to your name on /rank.

Edge case Buy the same badge twice, and try a purchase you can't afford.

Expected The second badge buy is refused with "already own"; an unaffordable buy is refused and does not change your balance.

/bank

Action /bank deposit (no amount), then /bank balance, then /bank withdraw amount:100.

Expected Deposit with no amount moves your whole wallet into the bank; balance shows wallet vs bank vs net worth; withdraw moves Rokda back to the wallet.

Edge case /bank withdraw amount:999999999 (more than banked).

Expected Refused with how much you actually have banked. Nothing moves.

/rob

Action /rob user:@someone who has Rokda in their wallet.

Expected Either you steal a slice of their wallet, or you get caught and pay them a fine. A 1-hour cooldown starts.

Edge case /rob again right away; and rob someone who banked all their Rokda.

Expected The repeat is refused with a cooldown timer; robbing someone with an empty wallet says they're not worth robbing (their bank is untouchable).

/quests

Action /quests, complete one (e.g. claim /daily or send messages), then /quests again and click Claim.

Expected Three daily quests with progress bars. Progress advances as you play; a completed quest becomes claimable and pays Rokda + XP once. The same three stay all day.

/grind & /crime

Action /grind fish without a rod, then buy 🎣 Fishing Rod from /shop and try again. Then /grind beg and /crime.

Expected Fishing is refused until you own the rod. With it, you catch something and earn Rokda on a cooldown. Beg sometimes finds nothing; crime either pays big or fines you.

Edge case /grind fish twice in a row.

Expected The second is refused with a cooldown timer, and no double reward.

Functional shop tools

Action Buy 🛡️ Shield, have someone /rob you. Buy 💼 Briefcase, then /work.

Expected The Shield blocks one rob and then disappears from /inventory. Briefcase gives a visible 1.5× on work payouts. (No Discord roles are ever granted.)

Gambling

/coinflip

Action /coinflip amount:50 side:heads

Expected Your balance drops by 50 if you lose, or you net +50 (the bet is doubled) if you win. A result embed appears either way, with no "application did not respond" error.

Edge case /coinflip amount:999999 side:heads (more than you own)

Expected Rejected for not having enough Rokda; your balance is unchanged. Amounts below 10 or above 250,000 are blocked by Discord before the command even runs.

/slots

Action /slots amount:50

Expected Three reels are shown, your bet is deducted, and you're paid out when symbols match. The embed shows the reels and whether you won or lost.

/blackjack

Action /blackjack amount:100, then use the Hit / Stand buttons

Expected You're dealt a hand against the dealer with working Hit and Stand buttons. The hand resolves to a win, loss, or push and your balance updates. A natural blackjack pays 3:2.

Edge case Start a hand, then run /blackjack amount:100 again before finishing the first

Expected The second attempt is blocked. Only one hand at a time. Separately, if you start a hand and just wait, it auto-resolves after 60 seconds instead of getting stuck.

/dice

Action /dice amount:50 mode:higher number:10

Expected A hidden 20-sided die is rolled. You win even money if it lands higher than 10, otherwise you lose. The embed shows the roll.

Action /dice amount:50 mode:exact number:7

Expected You only win if the roll is exactly 7, but the payout multiplier is much bigger than a higher/lower guess.

Edge case /dice amount:50 mode:higher number:25 (outside 1–20)

Expected Discord rejects the number before the command runs. It must be between 1 and 20.

/roulette

Action /roulette amount:50 bet_type:red

Expected The wheel spins and the embed shows which pocket it landed on. A red bet pays 1:1 if it hits.

Action /roulette amount:50 bet_type:number value:17

Expected A straight-up bet on 17 pays 35:1 if the wheel lands on 17.

Edge case /roulette amount:50 bet_type:number with no value

Expected It tells you a number is required and the bet is not placed, and your balance stays the same.

/crash

Action /crash amount:50, then press Cash Out

Expected A multiplier climbs from 1.00x. Pressing Cash Out pays your bet times the multiplier at that instant. The embed shows where you cashed out.

Edge case /crash amount:50 and never press Cash Out

Expected When the multiplier crashes you lose your bet, with no payout, and the message resolves cleanly rather than hanging.

/lottery buy

Action /lottery buy tickets:1

Expected The ticket cost is deducted, a confirmation shows how many tickets you now hold and the current pool size. The draw happens weekly.

Edge case /lottery buy tickets:99999 (beyond your balance or the per-purchase cap)

Expected Rejected: either the ticket count is capped by Discord or you're told you can't afford it. Your balance is unchanged.

/race

Action /race bet amount:50 horse: then pick a horse

Expected Your bet is placed on that horse and a betting round opens for the server.

Action /race start

Expected Betting closes, the race animates to a finish, and backers of the winning horse are paid.

Edge case /race start with no bets placed, or place a bet and never start

Expected Starting with no open race tells you there's nothing to start. If a round is left unstarted, it auto-cancels after a short wait and refunds everyone who bet.

/elimination

Action /elimination start, then react to join

Expected A join message appears; reacting enters you and deducts the entry fee. After the join window, entrants are removed one at a time until one player remains and takes the pot.

Edge case Start an event where fewer than 2 people join

Expected The event cancels and everyone who joined is refunded their entry fee.

Action /elimination config enabled:true

Expected Only works if you have the Manage Server permission; it turns the short-timeout penalty for eliminated players on or off. Members without that permission get a permission error instead.

/heist

Action /heist buyin:500, have a second person click "Join the crew", then let the timer end (or the host clicks "Start now").

Expected A lobby shows the crew, pot, and success chance (which rises as more people join). At the end the crew either wins a multiplied pot split evenly, or busts and loses their buy-ins.

Edge case Start a heist that nobody joins; try to join without enough Rokda.

Expected With a solo crew it cancels and refunds the host. A join you can't afford is refused privately and doesn't add you.

/rps

Action /rps user:@someone bet:100; the other person clicks Accept, then both pick rock/paper/scissors.

Expected Both stakes are held; picks stay hidden until both lock in. The winner gets the whole pot, a tie refunds both. Declining or timing out refunds the challenger.

/highlow & /scratch

Action /highlow bet:100, click Higher/Lower. Then /scratch a few times.

Expected Highlow reveals the next card and pays 2× on a correct call; scratch shows a 3×3 grid and pays up to 20× on three-of-a-kind. With a 🍀 Lucky Charm owned, some losses are voided/refunded with a note.

Fun & Social

/owo <at|uwu|fight|leaderboard>

Action /owo at user:@someone a few times, /owo uwu, /owo fight user:@someone, then /owo leaderboard.

Expected OwO/UwU post flavour and ping only the target (not everyone). Your OwO counter climbs and the leaderboard ranks the top OwO-ers.

/gag & /text

Action /gag pp, /gag iq user:@someone, /gag simp. Then /text clap text:hello world, /text reverse, /text emojify.

Expected Gag ratings are the same every time for the same user (deterministic joke). Text transformers clap/reverse/emojify the input and never ping anyone.

/td

Action /td

Expected The bot picks a random truth or dare and posts it with a Reroll button.

Action /td mode:dare, then press Reroll a few times

Expected Forces a dare. Reroll swaps in a new one, but stops working after 3 rerolls on the same message.

/activechat

Action /activechat

Expected Posts a random conversation starter. Occasionally (roughly a quarter of the time) it posts a light truth instead, for variety.

/pickup

Action /pickup

Expected Returns a random pickup line.

Action /pickup category: then pick a style

Expected Returns a line from the chosen style category.

/joke

Action /joke

Expected Returns a random joke.

Action /joke category: then pick a style

Expected Returns a joke from the chosen category.

/8ball

Action /8ball question:will I win the next coinflip

Expected Replies with a random yes / no / maybe style answer.

/roast

Action /roast user:@someone

Expected Posts a random templated roast aimed at the mentioned user.

/compliment

Action /compliment user:@someone

Expected Posts a random templated compliment aimed at the mentioned user.

/ship

Action /ship user1:@a user2:@b

Expected Shows a compatibility percentage for the pair.

Edge case Run the exact same pair again

Expected You get the same percentage every time. The result is deterministic for a given pair.

/rate

Action /rate thing:my chances of hitting the jackpot

Expected Returns a 0–100 rating for whatever you typed, with a short flavor comment.

/wyr

Action /wyr, then react with one of the two options

Expected Posts a would-you-rather with two reaction options, tallies votes for about 30 seconds, then reveals the split.

Moderation

These commands only appear in Discord's slash-command list for members who hold the matching permission (e.g. Ban Members for /ban). If you can't see a command at all, that's the permission gate working correctly, not a bug. Ask a server admin to grant you a staff role with the needed permissions before testing the rest of this section. Test these on a throwaway account or a member who's expecting it, not a real regular.

/warn

Action /warn user:@testaccount reason:testing

Expected A private reply confirms the warning number, and an entry appears in the mod-log channel (if one is configured).

Edge case Run /warn on the same user 3 times total

Expected On the 3rd warning, the bot also applies a 10-minute timeout automatically and says so in the reply, as long as your role is above the target's.

Edge case /warn user:@yourself reason:testing

Expected Rejected: you can't warn yourself.

/warnings

Action /warnings user:@testaccount (after giving them at least one warning)

Expected Lists each warning with its reason, who issued it, and when, showing the most recent 15 if there are more.

Edge case /warnings user:@someoneneverwarned

Expected Says the user has no warnings, instead of an empty or broken embed.

/kick

Action /kick user:@testaccount reason:testing

Expected The member is removed from the server, you get a private confirmation, and it's logged to the mod-log channel.

Edge case /kick user:@someonewithahigherrole

Expected Rejected with a message about role hierarchy, and nobody gets kicked.

/ban and /unban

Action /ban user:@testaccount reason:testing

Expected The member is banned, you get a private confirmation, and it's logged.

Action /unban user-id:<their ID> reason:testing

Expected The ban is lifted and confirmed. You'll need the numeric user ID, not their username.

Edge case /unban user-id:<an ID that was never banned>

Expected Says that user isn't banned, with no error and no false success.

/timeout

Action /timeout user:@testaccount duration:5 reason:testing

Expected The member can't send messages or react for 5 minutes; the reply confirms the duration and shows when it lifts.

Edge case /timeout user:@yourself duration:5

Expected Rejected: you can't time yourself out.

/purge

Action Post a few throwaway messages, then /purge amount:5

Expected The 5 most recent messages in the channel disappear and the bot confirms how many were deleted.

Edge case /purge amount:150

Expected Discord blocks the option before the command runs. 100 is the max.

/slowmode

Action /slowmode seconds:10, then try sending two messages quickly

Expected Discord itself enforces a 10-second gap between your messages in that channel. The bot's confirmation posts publicly (not just to you), since it's a visible channel setting.

Action /slowmode seconds:0

Expected Slowmode is disabled and the bot confirms it.

/lock and /unlock

Action /lock reason:testing in a test channel

Expected @everyone can no longer send messages in that channel; the bot posts a public embed confirming the lock.

Action /unlock reason:testing in the same channel

Expected @everyone can send messages again; a public embed confirms the unlock.

/lockdown and /unlockdown

Action /lockdown reason:testing, then press Confirm

Expected A warning prompt appears first, listing how many channels will be affected. After confirming, every text/announcement/forum channel locks and the bot reports how many succeeded.

Action /unlockdown reason:testing, then press Confirm

Expected Same flow in reverse. Every channel unlocks.

Edge case Run /lockdown again, but press Cancel (or just let the prompt sit for 30 seconds)

Expected Cancel: nothing is locked, and the bot says so. Timeout: same outcome after 30 seconds pass with no click.

/nickname reset

Action Set a nickname on a test account, then /nickname reset user:@testaccount

Expected The nickname clears back to their username, and the bot confirms it privately.

Edge case /nickname reset user:@someonewithnonickname

Expected Says that member doesn't have a nickname set, so nothing changes.

/modlog set

Action /modlog set channel:#mod-log

Expected Confirms the channel is set. Running any moderation command afterward (warn, kick, ban, etc.) should now post a log entry there.

Edge case /modlog set channel: pointed at a channel the bot can't post in

Expected Rejected with a message saying the bot can't send messages there, so the setting isn't saved.

Leveling & Leaderboards

/rank

Action Send a few messages, then /rank

Expected An embed with your level, server rank, total XP, and a progress bar to the next level.

/leaderboard

Action /leaderboard type:level

Expected Top 10 by level. Without type, it ranks by Rokda balance instead.

/achievements

Action /achievements, then trigger one (e.g. a big gambling win or reaching a balance milestone) and check /rank.

Expected Lists unlocked and locked milestones with an X / total counter. Unlocking one posts a short celebration, and the badge then appears on your /rank.

Image & Meme Tools

These were previously broken and are now fixed. Please confirm each actually returns an image.

/action

Action /action type:hug user:@someone, then a solo one like /action type:dance

Expected An anime reaction GIF with a caption. Solo reactions ignore the target.

/image <subcommand>

Action Run each subcommand: /image deepfry, pixelate, wasted, jail, glitch, caption, ship-card, wanted, pfp-card, achievement, ascii, on yourself or another member.

Expected A rendered image (or ASCII text for ascii). No "invalid size" errors, because that bug is fixed. All eleven effects are now under the one /image command.

Edge case /image wanted with no user, and /image ship-card user1:@a user2:@b

Expected wanted uses your own avatar with a bounty from your Rokda; ship-card renders both avatars with a compatibility %.

Community & Engagement

/mc

Action /mc status, then /mc whitelist name:YourMcName, then /mc me.

Expected Status lists who's online (or says the server is offline, without erroring). Whitelisting confirms and you can then join. me shows the name you claimed.

Edge case Try /mc whitelist name:bad name!, then claim a second name, then have someone else claim the name you already took.

Expected An invalid username is refused before anything is sent to the server. You can only claim one name, and a name already claimed by someone else is refused.

Action In the bridge channel, send a message that mentions someone, and one with an image.

Expected In game it reads [Discord] Name: @TheirUsername, not a raw <@123456…> id. Images appear as an [attachment] link. Game chat, joins, leaves, deaths and server up/down come back to Discord.

/counting

Action /counting set channel:#counting, then in that channel post 1, have someone else post 2, then 3.

Expected Each correct number gets a ✅. A new record also gets a 🎉.

Edge case Post the next number twice in a row yourself; then post a wrong number; then post hello and 5 nice.

Expected Counting twice in a row is ❌ and resets to 0. A wrong number is ❌, resets, and calls out who broke it and at what. Non-numbers are ignored completely: no ❌, no reset. /counting stats shows the record surviving the reset.

/story

Action /story start, then take turns posting single words with someone else, then /story see.

Expected Each accepted word gets a ✅ and see reads the story back in order.

Edge case Post two words in a row yourself; post two words; then /story end and post another word.

Expected A second word in a row gets ⏳ and is not added. A multi-word message is ignored entirely. After end, words stop being added but /story see still shows the finished story.

/reactionrole add

Action /reactionrole add with a message link, an emoji, and a role, then react on that message.

Expected The bot reacts to the message; reacting gives you the role, un-reacting removes it. Works on old messages too.

/welcome set & /goodbye set

Action Set both channels, then have someone join/leave.

Expected A welcome / goodbye embed posts with the live member count. (Needs the Server Members Intent.)

/autorole set

Action /autorole set role:@Member, then have someone join.

Expected New members get the role automatically. The role must sit below the bot's top role.

/poll & /suggest

Action /poll with 2–4 options; /suggest text:...

Expected Poll posts with numbered reactions; suggest posts with 👍/👎 pre-added.

/giveaway start

Action /giveaway start duration:2m prize:Test, react 🎉, wait ~2 min.

Expected After the timer, a winner is drawn from the reactors and announced.

/starboard set

Action /starboard set channel:#starboard threshold:3, then ⭐ a message 3 times.

Expected The message is reposted to the starboard with a live ⭐ count; drops off if it falls below the threshold.

/remind & /reminders

Action /remind when:2m text:test, then /reminders

Expected Confirms it's set and lists it; ~2 min later the bot pings you. Survives a bot restart.

/afk

Action /afk reason:brb, have someone mention you, then send a message yourself.

Expected The bot tells whoever pings you that you're AFK; your next message clears it.

/confess & /confess-settings panel

Action Set the channel, run /confess-settings panel, click the button, submit; also try /confess.

Expected A numbered anonymous confession posts to the channel. Your side is private; the post never shows who sent it.

More Games & Systems

/invest

Action /invest market/invest buy ticker:CHAI amount-in-rokda:500/invest portfolio

Expected Market lists tickers; buying deducts Rokda and adds shares; portfolio shows value and P/L.

/meme

Action /meme submit image:..., then /meme leaderboard

Expected The meme posts with a 🔥 seed reaction; the leaderboard shows vote counts and the prize pool.

/trivia start

Action /trivia start, react with the correct letter.

Expected A question with A/B/C/D; the first correct answer wins Rokda (faster = more).

/focus

Action /focus setroom, join it, /focus start minutes:25, then leave.

Expected On leaving you're DM'd your payout (2 Rokda/min). /focus leaderboard shows totals.

/studybuddy, /birthday, /automod, /pulse

Action /studybuddy join (two accounts) → /studybuddy match; /birthday set; /automod toggle; /pulse setchannel.

Expected Match DMs both users; birthday saves; automod toggles; pulse channel is set (recap posts weekly).

Social

/family

Action /family adopt user:@a, /family friend user:@b, /family brother user:@c, /family sister user:@d (each accepts), then /family view.

Expected A modern card (accent bar + your avatar) shows your tree. Adopt/friend/brother/sister use accept buttons; the tree lists Children, Friends, Brothers, Sisters, derived Siblings, and your partner. /family unsibling removes a sibling.

Action /family marry user:@someone (they click Accept), then /family marriage, then /family divorce.

Expected Marrying asks the partner to accept with a button; marriage shows the couple and how long married; /daily pays a +10% bonus while married. These used to be /marriage and now live under /family.

Edge case /family view on a big family; try to adopt yourself or an ancestor.

Expected Listing many members does not ping them all. Adopting yourself or one of your own ancestors is refused (no family-tree loops).

/pet

Action /pet adopt species: pick one, then /pet feed and /pet status.

Expected Adopting costs Rokda and creates one pet. Feeding costs Rokda, fills hunger, and the first feed of the day pays a companion bonus. Status shows hunger dropping over time.

Edge case Adopt a second pet; feed with no pet.

Expected A second adopt is refused (one pet per member); feeding with no pet prompts you to adopt first, with no error.

/rep

Action /rep give user:@someone, then /rep check and /rep leaderboard.

Expected The target's rep goes up by 1. Check shows a member's rep; the leaderboard ranks the most-repped members.

Edge case Give rep twice in a day; rep yourself.

Expected The second give is refused with a cooldown timer; repping yourself is refused.

Music (Last.fm)

/fm set & /fm np

Action /fm set username:yourLastfm, play something, then /fm np (or .fm).

Expected Shows now-playing with current + previous track and scrobble counts.

/fm top & /fm whoknows

Action /fm top type:artists; with a couple members linked, /fm whoknows artist:...

Expected Top list for the period; whoknows ranks linked server members by plays for that artist.

Fun & Utility Extras

/define & /gif

Action /define word:serendipity; /gif search:cat then hit 🔀 Another.

Expected A definition embed; a GIF that reshuffles on the button. (Both also work as .define / prefix.)

/help

Action /help

Expected An embed listing every command grouped by category.