C++ API
Include:
#include "DiscordPresenceSubsystem.h"The public runtime API is exposed by UDiscordPresenceSubsystem.
Public Subsystem Methods
Every Blueprint node maps directly to a public C++ method.
Initialization And Status
| Method | Purpose |
|---|---|
InitializeDiscordPresence | Loads the SDK, creates the client, starts callbacks, and connects |
ShutdownDiscordPresence | Disconnects, stops callbacks, and releases SDK state |
RestartDiscordPresence | Restarts the Discord session with supplied IDs and options |
IsDiscordPresenceInitialized | Checks whether a valid SDK client exists |
IsDiscordRunning | Returns the best-known Discord state |
GetLastDiscordError | Returns the latest readable error |
GetLastDiscordResult | Returns the latest structured result |
GetLastDiscordErrorCode | Returns the latest SDK or native error code |
Activities And Convenience
| Method | Purpose |
|---|---|
SetDiscordActivity | Submits a full activity |
UpdateDiscordActivity | Alias for SetDiscordActivity |
ClearDiscordActivity | Clears the desired, cached, and displayed activity |
ResetDiscordActivity | Resets cached activity and clears Discord when initialized |
GetCurrentDiscordActivity | Returns the last activity accepted by Discord |
SetSimplePresence | Publishes details and state |
SetPresenceWithImages | Publishes text and image assets |
SetPresenceWithTime | Publishes text with optional elapsed time |
SetPresenceForMainMenu | Publishes the built-in main-menu activity |
SetPresenceForLevel | Publishes a level activity with elapsed time |
SetPresenceForMatch | Publishes mode, player counts, party values, and elapsed time |
ClearPresence | Alias for ClearDiscordActivity |
Invites And Utilities
| Method | Purpose |
|---|---|
RespondToDiscordJoinRequest | Accepts or locally dismisses a pending join request |
GetDiscordUnixTimestampNow | Returns the current UTC Unix timestamp |
Advanced Module API
FDiscordPulseModule publicly exposes:
| Method | Purpose |
|---|---|
LoadDiscordSocialSDK | Loads or retains the Discord Social SDK runtime |
UnloadDiscordSocialSDK | Releases one module-owned SDK load reference |
IsDiscordSocialSDKLoaded | Checks whether the runtime library is loaded |
GetDiscordSocialSDKBinaryPath | Returns the resolved platform runtime path |
Normal game code should use UDiscordPresenceSubsystem. The subsystem manages
module loading and unloading automatically. Direct module calls are intended
only for advanced integrations that fully understand the SDK lifetime.
UDiscordPresenceSubsystem::Initialize and Deinitialize, plus
FDiscordPulseModule::StartupModule and ShutdownModule, are engine-managed
lifecycle overrides. Do not call them manually.
HandleActivityJoin, HandleActivitySpectate, and
HandleActivityJoinRequest are public callback bridges used by DiscordPulse
internally. Normal game code should bind the corresponding events instead of
calling these helpers.
Module Dependency
Game modules that include DiscordPulse public types need the plugin dependency:
PublicDependencyModuleNames.Add("DiscordPulse");Use a private dependency when DiscordPulse types are used only in private implementation files.
Get The Subsystem
From a Game Instance:
UDiscordPresenceSubsystem* Discord =
GetSubsystem<UDiscordPresenceSubsystem>();From an object with world access:
UGameInstance* GameInstance = GetWorld() ? GetWorld()->GetGameInstance() : nullptr;
UDiscordPresenceSubsystem* Discord =
GameInstance ? GameInstance->GetSubsystem<UDiscordPresenceSubsystem>() : nullptr;Do not keep a raw subsystem pointer beyond the owning Game Instance lifetime.
Initialize From A Game Instance
Code after Super::Init() can safely fetch Game Instance Subsystems:
void UMyGameInstance::Init()
{
Super::Init();
if (UDiscordPresenceSubsystem* Discord = GetSubsystem<UDiscordPresenceSubsystem>())
{
const EDiscordPresenceResult Result =
Discord->InitializeDiscordPresence(TEXT("123456789012345678"));
if (Result == EDiscordPresenceResult::Success)
{
Discord->SetSimplePresence(TEXT("Playing My Game"), TEXT("Main Menu"));
}
}
}This differs from Blueprint Game Instance Event Init, which runs before subsystem creation in UE 5.7.
Initialize From A Player Controller
For multiplayer games, initialize only on the local controller:
void AMyPlayerController::BeginPlay()
{
Super::BeginPlay();
if (!IsLocalController())
{
return;
}
UGameInstance* GameInstance = GetGameInstance();
if (UDiscordPresenceSubsystem* Discord =
GameInstance ? GameInstance->GetSubsystem<UDiscordPresenceSubsystem>() : nullptr)
{
Discord->InitializeDiscordPresence(TEXT("123456789012345678"));
Discord->SetSimplePresence(TEXT("Playing My Game"), TEXT("Main Menu"));
}
}Submit A Full Activity
FDiscordPresenceActivity Activity;
Activity.Details = TEXT("In a Match");
Activity.State = TEXT("Round 3");
Activity.LargeImageKey = TEXT("game_logo");
Activity.StartTimestamp = UDiscordPresenceSubsystem::GetDiscordUnixTimestampNow();
Activity.PartyId = TEXT("lobby-eu-42");
Activity.PartySize = 2;
Activity.PartyMax = 4;
Activity.JoinSecret = TEXT("opaque-join-token");
const EDiscordPresenceResult Result = Discord->SetDiscordActivity(Activity);SetDiscordActivity submits an asynchronous update. Check the immediate result for local failures and bind events for the final SDK response.
Bind Events
Dynamic multicast events can be bound with AddDynamic:
Discord->OnDiscordError.AddDynamic(this, &UMyGameInstance::HandleDiscordError);
Discord->OnDiscordActivityUpdated.AddDynamic(this, &UMyGameInstance::HandleActivityUpdated);Handlers must be UFUNCTION() methods with matching signatures:
UFUNCTION()
void HandleDiscordError(
EDiscordPresenceResult Result,
int32 ErrorCode,
const FString& ErrorMessage);
UFUNCTION()
void HandleActivityUpdated(const FDiscordPresenceActivity& Activity);Shutdown
Normal Game Instance destruction shuts DiscordPulse down automatically.
Manual shutdown is useful for logout or account switching:
Discord->ShutdownDiscordPresence();