Activity Reference
Use Set Discord Activity with FDiscordPresenceActivity when the convenience nodes do not expose enough control.
Update Semantics
Activity updates are asynchronous:
Set Discord Activitystores the latest requested activity.- If DiscordPulse is not initialized, the node returns
Queued. - DiscordPulse publishes the queued activity automatically when initialization succeeds.
- Once initialized, the plugin submits the activity directly through the local Discord client without waiting for an authenticated connection or
Ready. - Discord later accepts or rejects the update through a callback.
On Discord Activity Updatedfires on success.On Discord Errorfires on failure.
An immediate Success does not prove Discord displayed the activity.
Queued is not an error; it means the latest activity is waiting for
Initialize Discord Presence.
Get Current Discord Activity returns the last activity accepted by Discord, not simply the latest requested activity.
Activity Fields
| Field | Purpose | Notes |
|---|---|---|
Details | Primary activity text | Discord limit: 128 UTF-8 bytes |
State | Secondary activity text | Discord limit: 128 UTF-8 bytes |
LargeImageKey | Large uploaded asset key or supported image URL | Use the saved lowercase portal key |
LargeImageText | Large-image hover text | Discord limit: 128 UTF-8 bytes |
SmallImageKey | Small uploaded asset key | Usually a Discord portal asset key |
SmallImageText | Small-image hover text | Discord limit: 128 UTF-8 bytes |
StartTimestamp | Unix timestamp used for elapsed time | Use Get Discord Unix Timestamp Now |
EndTimestamp | Unix timestamp used for countdown/end time | Use 0 to omit |
PartyId | Stable party or lobby identifier | Recommended for joinable activities |
PartySize | Current party size | Negative values are clamped to 0 |
PartyMax | Maximum party size | Negative values are clamped to 0 |
JoinSecret | Opaque secret delivered to joining users | Makes the party public in the submitted activity |
Button1Label, Button1Url | First activity button | Both values are required |
Button2Label, Button2Url | Second activity button | Both values are required |
ActivityType | Playing, Streaming, Listening, or Watching | Most games should use Playing |
Migration-Only Fields
These fields remain in the struct for compatibility but are not published by the current Social SDK integration:
| Field | Behavior |
|---|---|
SpectateSecret | Ignored and logged as a warning |
MatchSecret | Ignored and logged as a warning |
Is Instance | Ignored and logged at verbose level |
Simple Activity
Details = "Playing My Game"
State = "Main Menu"Equivalent convenience node:
Set Simple Presence("Playing My Game", "Main Menu")Images
Upload Rich Presence assets for the same Discord application used by Initialize Discord Presence.
LargeImageKey = "game_logo"
LargeImageText = "My Game"
SmallImageKey = "rank_gold"
SmallImageText = "Gold Rank"Rules:
- Use the saved asset key, not the display name.
- Discord saves uploaded keys in lowercase.
- Newly uploaded assets may need time to propagate.
- First prove simple presence works before testing images.
Timestamps
Elapsed time:
StartTimestamp = Get Discord Unix Timestamp Now
EndTimestamp = 0Countdown:
StartTimestamp = 0
EndTimestamp = future Unix timestampIf both timestamps are 0, no timer is submitted.
Parties And Join Secrets
PartyId = "lobby-eu-42"
PartySize = 2
PartyMax = 4
JoinSecret = "opaque-join-token"Use a stable PartyId for the lobby lifetime. Keep JoinSecret opaque and validate it in your own matchmaking or session system.
A useful joinable activity should have:
- Non-empty
PartyId PartySizelower thanPartyMax- Non-empty
JoinSecret
See Invites And Join Requests.
Buttons
DiscordPulse supports up to two activity buttons:
Button1Label = "Wishlist"
Button1Url = "https://store.steampowered.com/app/your_app"
Button2Label = "Community"
Button2Url = "https://discord.gg/your_invite"If only a label or only a URL is supplied, DiscordPulse ignores the incomplete button and logs a warning. Discord decides which client surfaces display activity buttons.
Recommended Update Strategy
Publish only when meaningful state changes:
Main Menu Opened -> Set Presence For Main Menu
Level Loaded -> Set Presence For Level
Match Started -> Set Discord Activity with party and timestamp
Match Updated -> Set Discord Activity with new party state
Match Ended -> Set Simple Presence or Clear PresenceDo not update presence every frame.