Player Shop — Moderator Guide

Overview

The Player Shop is a full game economy you run without touching a spreadsheet: currencies, priced items, hidden black markets, lootboxes, betting events, auctions, and optional income systems — all controlled from Discord commands plus a private web dashboard.

Everything works standalone or alongside a running game. While a game is running with an active-player role configured, only players holding that role can use the shop; with no game running, the shop is open to everyone.

Two-server setups: all shop data is keyed to the chat server. During a game, players must use shop commands from the chat server — the active-player role lives there and can never match on the role server.


Getting started

  1. /shopadmin open — opens your shop (creates it the first time; you can name it).
  2. /shopadmin currency create — make a currency, e.g. Gold with the 🪙 emoji.
  3. /shopadmin item add — stock an item with a price. Leave stock empty for unlimited.
  4. /shopadmin grant — give players some pocket money.

Players then use /shop to browse and buy, and /bag to see what they hold.

/shopadmin subcommand reference

Every subcommand requires the server's moderator role. Names that take a currency, item, shop, auction or event autocomplete as you type.

┌──────────────────────────┬──────────────────────────────────────┬──────────────────────────────────────────────────┐
│ Subcommand               │ Options                              │ What it does                                     │
├──────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────────────────┤
│ open                     │ [name]                               │ Open a shop (creates it if new; a new name       │
│                          │                                      │ creates a second shop, e.g. Black Market)        │
│ close                    │ [name]                               │ Close a shop; balances and inventories are kept  │
│ currency create          │ name [emoji] [transferable]          │ Create a currency (transferable defaults to True)│
│ grant                    │ currency amount [player] [role]      │ Give currency, or remove it with a negative      │
│                          │                                      │ amount; pick one player or a whole role          │
│ loan                     │ asset debt player amount             │ Grant equal asset and debt in one action;        │
│                          │                                      │ negative amount = repayment                      │
│ scale                    │ currency factor [player] [role]      │ Multiply balances by a factor (e.g. 1.15         │
│                          │ [everyone]                           │ interest); target a player, a role, or everyone  │
│ item add                 │ name price currency [stock] [emoji]  │ Add a simple item to the open shop (omit stock   │
│                          │ [description] [shop]                 │ for unlimited)                                   │
│ item stock               │ item quantity                        │ Set an item's stock to an exact quantity         │
│ give                     │ player item [quantity]               │ Put an item into a player's bag (default 1)      │
│ take                     │ player item [quantity]               │ Take an item out of a player's bag (default 1)   │
│ tag                      │ player tag                           │ Give a player a visibility tag                   │
│ untag                    │ player tag                           │ Remove a visibility tag                          │
│ dashboard                │                                      │ Private link to the shop dashboard (5 minutes)   │
│ storefront               │ shop                                 │ Post the live public storefront in this channel  │
│ leaderboard              │ [currency] [item] [number]           │ Post the top holders (default 10, max 25); pick  │
│                          │                                      │ exactly one of currency or item                  │
│ logchannel               │ [channel]                            │ Set the shop log channel; omit to turn off       │
│ betchannel               │ [channel]                            │ Set the bet log channel; omit to turn off        │
│ module                   │ module enabled                       │ Turn Activity income, Time income or Theft on or │
│                          │                                      │ off (numbers are set on the dashboard first)     │
│ trading                  │ enabled                              │ Turn /trade on or off (off by default)           │
│ auction post             │ auction                              │ Post an auction's bidding embed in this channel  │
│ event post               │ event                                │ Post an event's betting embed in this channel    │
└──────────────────────────┴──────────────────────────────────────┴──────────────────────────────────────────────────┘

Shop data is keyed to the chat server, so every subcommand works the same whether you run it in the chat server or the role server.

Emoji on currencies and items


The dashboard

/shopadmin dashboard links you to a private, phone-friendly web page (moderator role required — checked server-side on every request). Four tabs, and the page remembers which one you're on across refreshes:

The Stock tab also shows each shop's running profit per currency (money taken in from buys minus paid out in sell-backs), derived from the ledger.


Money rules


Visibility: hidden shops and items

Gate any item — or an entire shop — behind rules, ANDed together:

Rules fail closed: a rule that can't be answered (no game running) hides the item. A hidden shop or item is indistinguishable from one that doesn't exist — browsing, buying, /trade name lookups, and autocomplete all answer as if it were never there.

Multiple shops can be open at once: a public general store, a mafia-only black market, a secret shop revealed by a breadcrumb hunt. Players who can see several shops get a picker; players who can see one go straight in.


Perishable items

Give any item an expiry from its dashboard card: a number of minutes, hours, or days from the moment you save (700 minutes is fine). Past that instant the item dies everywhere at once — it can't be bought, sold, traded, or opened, its held effects stop counting immediately, and within a minute a sweep archives it and removes every copy from every bag (each disappearance is ledgered). The clock is stored on the item itself, so bot restarts change nothing. The item card shows the current death date and a Clear expiry button to lift it.


Lootboxes

Mark an item as a lootbox and fill it with weighted entries on the dashboard. Buying one rolls per unit and delivers the prize instead of the box (with a big reveal); a lootbox can also contain other lootboxes, opened one level per action from /bag. Rolls and their weight snapshots are ledgered. Archiving a lootbox is the kill switch — even already-owned copies can no longer be opened.


Player trading

/trade lets players swap items and currency with each other — off by default. Turn it on per server with /shopadmin trading enabled:True (and off again with enabled:False) or the dashboard toggle. Non-transferable currencies (Debt) can never change hands in either direction. Offers are public messages with Accept/Decline buttons; the swap happens atomically when the target accepts, and both sides are re-verified at that moment. Offers expire after 20 minutes (survives bot restarts — the clock is the offer's own timestamp): the posted message updates and stale accepts are refused.


Storefront, leaderboards, logs


Economy modules

Optional income systems, all off by default. Set the numbers (currency, amounts, cooldowns, odds) on the dashboard's Modules card first; then switch each module on or off there or with /shopadmin module. The command refuses to enable a module that has never been configured.

Activity income

Pay players for chatting. Two flavors:

Time income

A steady wage: X currency every Y hours, paid by a background job to eligible players.

Theft

Enable /steal and players can rob each other. You configure the success chance, how much a successful heist takes (flat or percentage), the penalty for getting caught, and whether victims are told who robbed them.

Item stat effects

Items can bend those rules for their owner: income bonuses, better steal odds, lighter penalties. Effects apply once per item type no matter how many copies are owned — sell a Lucky Coin or a Ski Mask. Per-player overrides are also available on the Players tab.


Betting events

Create an event on the dashboard's Events tab: a name, a currency, and outcomes with fractional odds (3:1 pays three-to-one profit plus the stake back). Post it to a channel; players bet through buttons with preset amounts. One bet per player — a new bet refunds the old stake first, so misclicks are always recoverable while betting is open.

Lock to pause betting (the embed's totals stay live), resolve to pay winners automatically, or cancel to refund every stake in full. Closures, payouts, and refunds all post to the bet-log channel.


Auctions

Also on the Events tab: auction an item — or any prize you can type — with a starting bid and increment. The posted embed has one Bid button that always takes the current price. Money is escrowed: debited while a player is winning, refunded the moment they're outbid. Close manually or set a deadline, optionally with anti-snipe extension (late bids push the deadline out). A per-auction option shows bidders by name or keeps them anonymous. The prize is minted for the winner — shop stock is untouched.

Two optional twists:


Data lifecycle