Skip to content

Discord Integration

Connect your Discord server to PulseCAD for notifications, slash commands, account linking, and automatic CAD-role → Discord-role sync. Configure it all in Admin → Discord.

Setup

  1. Click Add the bot and connect your server. Discord asks which server to add PulseCAD to, and lists only servers where you hold Manage Server; pick yours and Authorize. You land back in CAD with the server already connected; there is no ID to copy and nothing to link.
    • The invite asks for Manage Roles, View Channels, Send Messages, and Embed Links. Role sync needs Manage Roles.
  2. Choose a Notify channel and Save, then Send test message to confirm the bot can post.
  3. On a multi-server community you can optionally set per-server channels so each game server's calls and BOLOs route to their own channel.
  4. Map your Rank Mappings (below), Save, and Sync Roles Now.

Connecting by hand instead

You can still type a Server (Guild) ID in directly, but that route has to prove you administer the server some other way, so it requires your own CAD account to be linked to Discord first; link it in Admin → Discord → Community & account (Generate Link Code, then /link <code> in Discord), and that Discord account needs Manage Server in the server you are connecting. The button above avoids all of this, so prefer it unless you are editing a connection you already have.

To get the Guild ID: in Discord, open User Settings → Advanced → Developer Mode, then right-click your server icon and Copy Server ID. Right-click a channel and Copy Channel ID for the notify channel.

One server, one community

A Discord server can be connected to exactly one PulseCAD community. If it is already connected somewhere else, connecting is refused; disconnect it there first.

A live status banner at the top of the panel tells you the bot's health:

Banner Meaning
Bot offline The pulsecad-bot process isn't running.
Online, but not in your server Use Invite the PulseCAD bot.
In server, but missing Manage Roles Role sync won't work; fix the bot's permissions.
Online … Manage Roles OK Everything's healthy.

Guild → community

Each Discord server maps to exactly one community via its Guild ID, so the bot knows which community to act on. If the bot is removed from a server, the link is cleared automatically; re-invite to restore it.

Slash commands

Members run these in your linked Discord server.

Lookup (public replies)

Command What it does
/units List on-duty units (callsign, department, status).
/calls List active & pending calls.
/onduty Show how many units are on duty.
/unit <callsign> Look up a single unit by callsign.

Account (private replies)

Command What it does
/link <code> Link your Discord account to CAD (code from CAD → Admin → Discord).
/me Show your CAD link and on/off-duty status.

Interactive / write commands

Command What it does
/call <nature> [location] [priority] File a pending call to dispatch.
/bolo <title> [plate] Create a BOLO.
/duty on <callsign> [department] Go on duty.
/duty off Go off duty.

Notification embeds also carry buttons: Attach me on a new-call embed pulls your on-duty unit onto the call, and Sign / Deny on a warrant embed let court staff act without opening the CAD.

Link first

Write commands and /me require a linked account. If someone hasn't linked, the bot tells them to run /link with a code from CAD → Admin → Discord → Link your account.

Notifications

Choose which CAD events post to Discord in the Notifications matrix (the right column of the Discord panel). Each event has its own enable toggle, an optional channel override, and an optional ping.

Event Default
New call On (with a priority threshold)
New BOLO On
Panic / officer needs help On
Unit on duty Off
Unit off duty Off
New warrant Off
Shift summary (periodic) Off
Roster sync summary On
ER:LC mod call On
ER:LC officer-involved kill Off
  • Channel: leave blank to use the per-server channel (if set) or the default Notify Channel.
  • Ping: a role ID, or the literal here / everyone.
  • New call adds a priority dropdown (P1 only / P1-P2 / P1-P3 / All calls) so you don't get pinged for low-priority calls.
  • Shift summary adds an Every N hours interval.
  • The ER:LC events are relevant to ER:LC (Roblox / Liberty County) communities and fire from that platform's mod-call and officer-involved-kill events.

Fallback webhook

Under the matrix, set a Fallback webhook (a Discord channel webhook URL, stored encrypted). If the bot ever goes offline, calls, BOLOs, and panic alerts post through the webhook instead, so critical alerts are never lost. Create one in Discord under Edit Channel → Integrations → Webhooks.

Role sync

PulseRoster owns Discord roles when it is linked

If your community is linked to PulseRoster, CAD does not add or remove any Discord role; the roster does, from its own rank mappings. The cards below still save, but nothing is applied, and Sync Roles Now is disabled. Set your Discord roles up in PulseRoster instead.

Only one system may write a server's roles. The roster changes them surgically: a promotion swaps that member's old rank role for the new one and touches nothing else. CAD works the opposite way: it decides the full set of mapped roles a member should hold and makes their roles match, so it also removes a mapped role somebody granted by hand in Discord, having no way to tell that grant apart from one of its own. Run both against one server and a change in either takes roles off people nobody meant to touch.

Everything below is for communities running PulseCAD without PulseRoster. Disconnect the roster and CAD takes over again, with your mappings intact.

Map each CAD role (owner, admin, supervisor, member, readonly) to a Discord role ID in the Rank Mappings card. Auto-match by name fills them in from your server's existing role names, which you can then adjust.

  • A member's CAD role is reflected as the mapped Discord role; other managed roles are removed.
  • Changes sync automatically when you change a member's role.
  • Run Sync Roles Now after editing the mapping or after bulk role changes. It reports how many members synced, failed, and are linked.

Rank roles are mutually exclusive

A member holds the Discord role for their current CAD role and none of the others you mapped here. If your server has a role everyone keeps (a general "Member" role, for example) alongside staff roles, it belongs in Base role below, not here; mapped as a rank, it comes off the moment someone is promoted above that CAD role. Map only the roles that genuinely track a member's rank.

Base role

Base role is one Discord role that every member of the community holds, whatever their CAD access level. Sync grants it and never takes it back until they leave the community, so it is never traded against a rank the way the access-level roles are.

This is where a general "Member" role belongs: the one everyone in your server keeps and that gates your public channels. Leave it unset if you don't have one.

Department roles

In the Department roles card, map each CAD department to a Discord role. A member holds it when any of these is true:

  • they hold a department role in that department (Admin → Members, or a permission key that grants one);
  • their PulseRoster assignments place them in it;
  • they are on duty as that department right now.

Departments a member is not in have their mapped role removed, so the card is a live picture of who is in which department.

What role sync never touches

Only the roles you have mapped in these two cards are managed. Every other Discord role a member holds is left exactly as it is.

Requirements

Role sync requires the bot to have Manage Roles, and the PulseCAD bot's own role must sit above every role you mapped in your server's role list (Server Settings → Roles). Discord will not let a bot add or remove a role positioned at or above its own, and a mapped role sitting above the bot is the usual reason a sync reports failures.

Discord roles that grant CAD access

This is the opposite direction, and it is configured separately: Discord → CAD. Map a Discord role to a CAD department role and, optionally, a CAD access level, and anyone holding that Discord role gets that access in CAD automatically. It is how a community that already runs its departments out of Discord roles avoids handing out the same thing twice.

It works whichever way round things happen:

  • someone is given the Discord role while they already have a CAD account;
  • someone who already holds the Discord role signs in with Discord, links their Discord account, or joins your community in CAD.

Losing the Discord role takes back exactly what that role granted, and nothing else. CAD records what it gave you, so a department role an admin granted you by hand, or one that came from PulseRoster, survives. Access levels only ever go up: a Discord role can raise someone to supervisor, but never lowers an owner or an admin who was promoted some other way.

Use Sync now in Admin → Discord after you first set the mapping up, or after changing it; it walks every member of the server and applies the rules in one pass. After that it keeps itself current.

Requires the Server Members Intent

Reading your server's member list is a privileged Discord permission. It is on by default for the PulseCAD bot; if Sync now reports a fetch failure, that is what to check.

There are three ways to connect a personal Discord account:

  • Continue with Discord on the login page (OAuth): creates or links your account and stores your Discord identity.
  • Link with Discord on your Account page.
  • Generate Link Code in Admin → Discord → Link your account, then run /link <code> in Discord (codes expire after 10 minutes).

Linking sets you up for role sync and in-game identity. There's also a Community Discord invite URL field whose value appears as a Discord button on your community Hub (leave it blank to hide it).

Court notifications are separate

The Court module has its own Court channel ID (set on the Court tab) for approval buttons, verdicts, and court-date reminders, independent of the notification matrix above.