Skip to content

Slash Commands

Jason Tucker edited this page Jun 5, 2026 · 13 revisions

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.

/help

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.

/settings

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 /games view/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.

/voice

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.

/games

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').

/play

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, default true) — when false, the game's role isn't mentioned and is dropped from allowedMentions.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.

/report

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.

/color

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.

/sudo

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.

Game Night flow

  1. Sudo runs /sudo from the channel they want the announcement in, then picks 🎲 Game Night. A modal opens: game (resolved against the catalog), when (free text), notes (optional).
  2. On submit the bot posts a Components V2 announcement in that same channel, pinging the game's ping_role_id if set.
  3. Members RSVP with three buttons (✅ Joining · 🤔 Might join · ❌ Not joining) — clicking the current state again clears it.
  4. 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).
  5. ✖️ Cancel is visible to the host and any sudo; it deletes the message.
  6. State per announcement is in-memory (keyed by message ID) with parse-from-message recovery on cache miss, so live announcements survive restarts.

Settings sub-panel

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.

Right-click → Manage

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.

Automatic events

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.

Staff request flow

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.

Clone this wiki locally