Integration

Discord bot

The Stintsmith bot brings race signups, results, leaderboards, and PBs into your team’s Discord server. One bot per Discord server is bound to one portal team.

1. Invite the bot

Copy the URL below into a browser, replace YOUR_CLIENT_ID with the client id you’ll find under /settings/integrations, and pick the server. You need Manage Server in Discord for the invite to take.

https://discord.com/api/oauth2/authorize?client_id=YOUR_CLIENT_ID&permissions=84992&scope=bot%20applications.commands

Scopes requested: bot, applications.commands. Nothing else.

2. Channel permissions

The bot needs the following per-channel permissions in any channel you want it to read or post in:

  • View Channel
  • Send Messages
  • Embed Links
  • Read Message History

The default invite grants these in every channel; if your server uses per-channel overrides, add the bot’s role explicitly. The bot never asks for Manage Server, Manage Roles, or DM permissions.

3. Bind the server to a team

From the portal, /settings/integrations → Discord → Add server. Pick the Discord server from the list (the bot must already be in it) and confirm. From now on the bot serves data scoped to this team only.

Each member of the Discord server can link their own portal account via /link — the bot DMs a one-time URL that signs them in. Once linked, slash-command responses are scoped to the calling user’s portal identity.

4. Notification channels

Configure per-event channel routing under /settings/integrations → Discord → Notifications. For each event type (lap.uploaded, lap.pb_set, race.results_posted, …), pick a channel from the dropdown. Responses are silent (no @everyone) by default.

Slash commands

/race signup race:<name>

Sign yourself up for an upcoming race. Reply is ephemeral.

/race signup race:Le Mans 24h

/race results race:<name>

Post-race finishing order with best lap + total time.

/race results race:Spa 6h

/leaderboard layout:<track> class:<carClass>

Show the team-internal top-10 for a given layout + class.

/leaderboard layout:Le Mans (Bugatti) class:Hypercar

/pb [layout:<track>] [class:<carClass>]

Your personal best on a layout, or your best across all layouts.

/pb layout:Spa class:LMP2

/team standings

Per-driver totals for the active championship.

/team standings

Privacy & ephemerality

Any reply that contains personal data (your PB, your signups, your standings) is delivered ephemerally — only you see it. Cross-team queries return a not found response with the same shape as “truly doesn’t exist” — the bot never confirms the existence of resources outside the calling server’s bound team.