Activities

Activity Reference

Use Set Discord Activity with FDiscordPresenceActivity when the convenience nodes do not expose enough control.

Update Semantics

Activity updates are asynchronous:

  1. Set Discord Activity checks that DiscordPulse is initialized.
  2. The plugin builds and submits a Discord activity.
  3. The node immediately returns a local result.
  4. Discord later accepts or rejects the update through a callback.
  5. On Discord Activity Updated fires on success.
  6. On Discord Error fires on failure.

An immediate Success does not prove Discord displayed the activity.

Get Current Discord Activity returns the last activity accepted by Discord, not simply the latest requested activity.

Activity Fields

FieldPurposeNotes
DetailsPrimary activity textDiscord limit: 128 UTF-8 bytes
StateSecondary activity textDiscord limit: 128 UTF-8 bytes
LargeImageKeyLarge uploaded asset key or supported image URLUse the saved lowercase portal key
LargeImageTextLarge-image hover textDiscord limit: 128 UTF-8 bytes
SmallImageKeySmall uploaded asset keyUsually a Discord portal asset key
SmallImageTextSmall-image hover textDiscord limit: 128 UTF-8 bytes
StartTimestampUnix timestamp used for elapsed timeUse Get Discord Unix Timestamp Now
EndTimestampUnix timestamp used for countdown/end timeUse 0 to omit
PartyIdStable party or lobby identifierRecommended for joinable activities
PartySizeCurrent party sizeNegative values are clamped to 0
PartyMaxMaximum party sizeNegative values are clamped to 0
JoinSecretOpaque secret delivered to joining usersMakes the party public in the submitted activity
Button1Label, Button1UrlFirst activity buttonBoth values are required
Button2Label, Button2UrlSecond activity buttonBoth values are required
ActivityTypePlaying, Streaming, Listening, or WatchingMost 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:

FieldBehavior
SpectateSecretIgnored and logged as a warning
MatchSecretIgnored and logged as a warning
Is InstanceIgnored 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 = 0

Countdown:

StartTimestamp = 0
EndTimestamp = future Unix timestamp

If 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
  • PartySize lower than PartyMax
  • 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 Presence

Do not update presence every frame.