-
Notifications
You must be signed in to change notification settings - Fork 0
Slash Commands
SquishyBot registers 8 slash commands and 1 right-click context menu (src/bot/registerCommands.ts). All responses are ephemeral.
Self-service editing lives under /settings (profile, birthday, game prefs, staff role) rather than as separate top-level commands, to keep the global command list short. /help is the discovery surface and routes those edits to /settings.
Who: Everyone What: User-facing help panel + bot status
Shows live status (active auto channels, hubs) and a select menu of feature explainers: 🔊 Auto Voice Channels, 🎛️ Voice Control Panel, 🎮 Games & LFG, 🎲 Game Night, 📝 Staff Requests, 🐛 Bug & Feature Reports, and 🛡️ Admin Tools (only shown to sudo). Each section has a Back button. Quick-link footer points members at /settings, /games, /play, /voice, and /report.
The Staff Requests section explains the flow but routes the actual request to
/settings → Staff Role— there is no standalone staff command.
Who: Everyone What: Self-service editor for the caller's own bot settings
Three buttons:
-
Profile & Birthday (
settings:profile) — opens the shared profile editor in self mode: display name, birthday (month + day), Birthday pings toggle, Show year toggle. Staff fields and real name are sudo-only and not shown here. -
Game Prefs (
settings:games) — opens the/gamesview/ping toggle UI for the caller. -
Staff Role (
settings:staff_role) — request a staff role (picker → modal → approval thread) or remove one you hold. See Staff Roles for the full flow.
The boolean toggles use the status-flip convention — the label/color show the current state, not the action you're about to take (same as the voice panel's Locked/Visible buttons and the /games view/pings buttons). Every edit is logged with editor + target + mode + fields touched.
Who: Anyone currently in an auto voice channel (owner / host / sudo for the mutating actions) What: Opens the voice control panel
Gives you an ephemeral copy of your channel's control panel from anywhere, and refreshes the persistent panel in the private text channel. Errors if you're not in an auto voice channel. See Auto Voice Channels for what every button does.
Who: Everyone What: Pick which games you want View access and LFG pings for
Lists every visible, non-archived game. Each row has two buttons — View (assigns the game's view role) and Pings (assigns the LFG ping role). Toggling immediately adds/removes the matching Discord role. Self-mode UI; sudo can do this on a member's behalf via right-click → Manage → Game Prefs (same editor, mode='sudo').
Who: Everyone What: Post an LFG message + join button in the game's channel
Options:
-
game(required) — autocompletes by name or alias. -
message(optional) — a note rendered as a quoted block on the panel (markdown allowed; mentions stay parse-disabled so the text can't fire pings). -
ping(optional, defaulttrue) — whenfalse, the game's role isn't mentioned and is dropped fromallowedMentions.roles, so you can post a notice without buzzing everyone. -
force(sudo only) — bypass the cooldown.
Posts a Components V2 message in the game's configured channel with a 🎮 I want to play! button (toggles the clicker in/out of the player list), plus a second row with ❔ Help and 🔔 Notify Toggle (joins/leaves the game's ping role; hidden when the game has no ping_role_id). The host (whoever ran /play) is locked in — they delete the message to cancel.
Per-(user, game) cooldown is 30 minutes (in-memory). allowedMentions whitelists only the host and the ping role, so @everyone/@here are never resolved. State is held in-memory keyed by message ID; on restart the player list is re-derived from the <@id> mentions in the existing message, so posts keep working. The same flow is exposed to botpanel as the play.post RPC verb.
Who: Everyone What: File a bug or feature request, reviewed by the bot owner before it lands on GitHub
Opens a modal: Title, Type (bug / feature / question), Description, optional Steps to reproduce. On submit, the bot DMs the bot owner with the full report and four review buttons:
- ✅ Approve + Notify — file issue, DM the reporter the URL
- ✅ Approve, Silent — file issue, no DM
- ❌ Reject + Notify — drop, DM reporter it was reviewed and not filed
- ❌ Reject, Silent — drop, no DM
Approve/Reject gate on the dynamic bot-owner check. Requires GITHUB_TOKEN (PAT with Issues: Read & Write) and GITHUB_REPO (owner/name); replies with a friendly "not configured" error if missing. Every submission is logged to report_log.
Who: Everyone What: Pick a curated color role
Feature-flagged off by default (feature.color_roles, toggle in /sudo → Settings → Debug). When on and color roles are configured (/sudo → Settings → Color Roles), lists them in a select; picking one removes any other curated color role you hold and adds the pick (one-color-at-a-time). When off, replies that color roles are disabled. Sudo can apply/clear a color on any member from botpanel via the color.assign RPC verb.
Who: Sudo users — SUDO_ROLE_IDS / SUDO_USER_IDS, plus anyone added at runtime via Settings → Sudo Users
What: Admin management panel (select menu)
Options:
- ⚙️ Settings — runtime config editor (see below)
- 👤 Manage user — pick a member; opens the same panel as right-click → Manage
- 🎲 Game Night — schedule a Game Night announcement (modal: game + when + notes)
- 🔊 Active voice channels — list all current auto channels
- 👤 Force owner transfer — reassign an auto-channel's owner (bypasses claim/grace)
- 🪐 Hub channels — list registered hubs (and the Lockdown panel)
- 🧹 Force cleanup — delete empty/orphaned channels
- 📥 Pending approvals — view pending staff requests
- 🔧 Run reconciler — repair channels and rebuild DB state
- 🔁 Restart instructions — VPS management commands
Every sub-panel has a 🏠 Back to /sudo button.
- Sudo runs
/sudofrom the channel they want the announcement in, then picks 🎲 Game Night. A modal opens: game (resolved against the catalog), when (free text), notes (optional). - On submit the bot posts a Components V2 announcement in that same channel, pinging the game's
ping_role_idif set. - Members RSVP with three buttons (✅ Joining · 🤔 Might join · ❌ Not joining) — clicking the current state again clears it.
- Members declare ownership (👍 I own it · 🛒 I don't own it). The 🛒 list surfaces who to gift the game to (the server buys copies for non-owners on Game Night).
- ✖️ Cancel is visible to the host and any sudo; it deletes the message.
- State per announcement is in-memory (keyed by message ID) with parse-from-message recovery on cache miss, so live announcements survive restarts.
A nested panel for editing values that would otherwise come from .env, without a restart. Each field shows whether the live value is from env or a DB override; Reset clears the override and falls back to env. Persistence: bot_settings (key/value), sudo_users, and the various feature tables. Most rows are also driven by botpanel over the RPC bus.
| Category | What it manages |
|---|---|
| 🛡️ Sudo Users | Add member · remove a runtime-added sudo (env-listed sudos can't be removed here) |
| 📺 Channels | Log · Admin · Birthday · Staff approval thread · Welcome · Goodbye |
| 🔊 Voice |
voice.cleanup_delay_ms · voice.owner_grace_ms · channel.auto_voice_category (category picker) |
| 🪐 Hub Channels | Add / unregister hubs · per-hub defaults (template / manual name / user limit) · 🚨 Lockdown (per-hub + server-wide) |
| 🧵 Auto Threads | Add / remove channels · per-channel name template + archive duration. Backed by auto_thread_channels. |
| 🎮 Games | Full catalog editor (name / aliases / sort / view-role / ping-role / channel / visibility / archive / delete) · Add Game with auto-provision (channel + view role + ping role) · games category |
| 👤 User Profiles | Member picker → full profile editor (all fields, including staff fields). Same editor as Manage → Edit Profile. |
| 🎭 Auto Roles | Roles applied to every new member on join (gated by feature.auto_role_on_join, default off). auto_join_roles. |
| 🎨 Color Roles | Curated color-role list for /color (gated by feature.color_roles, default off). color_roles. |
| 💬 Reaction Roles | Create/delete reaction-role messages (emoji=role mappings; optional expiry for temporary game-night roles). reaction_role_messages / _mappings. |
| 📡 Social Feeds | Add/edit RSS-backed feeds reposted into a channel (label, source URL, channel, items-per-poll cap). social_feeds. |
| 🗄️ Archive | Opt-in categories + archive/unarchive channels. archive_eligible_categories / archived_channels. |
| 👋 Welcome / Goodbye | Channel + template for join/leave messages (tokens {user} {server} {member_count} {account_age}). |
| 🐞 Debug (bot-owner gated) | Feature flags · force-clear caches · orphan-resource scan · settings audit log. See Bot Owner. |
Who: Sudo What: User management context menu
Right-click any member → Apps → Manage. Shows their roles, voice channel, and owned auto channel. Buttons: Edit Profile (same editor as /sudo → Settings → User Profiles, target pre-set), Game Prefs (same editor as /games, mode='sudo'), View Channel Panel + Disconnect from Voice (when in voice), and View Staff Request History.
| Event | What happens |
|---|---|
| Message in an auto-thread channel | A non-bot, non-system message in any auto_thread_channels channel gets a public thread ({author} — {first line}, 100-char cap, per-channel template/archive overrides). Requires the MessageContent privileged intent. Gated by feature.auto_threads. |
| Reaction add/remove on a watched message | Toggles the mapped role on the reacting member (reaction_role_messages). |
| Member joins the guild | Re-applies persisted game prefs; posts a welcome message if welcome.enabled; applies auto-join roles if feature.auto_role_on_join. |
| Member leaves | Posts a goodbye message if goodbye.enabled. |
| Daily birthday tick | Every minute the scheduler checks the wall clock; at birthday.target_hour (default 9) — once per day (birthday.last_run_date) — it pings members whose birthday is today and who haven't opted out, in channel.birthday. Feb 29 → Feb 28 in non-leap years. Gated by feature.birthday_pings. |
| Social-feed poll | Every ~30 min the poller fetches each enabled feed, dedupes by last_seen_id, and reposts new items oldest-first. Gated by feature.social_poller. |
The request entry point is /settings → Staff Role. See the dedicated Staff Roles page for the picker → modal → approval-thread → grant flow, the 7-role registry, and /sudo → Settings → Staff Roles provisioning.