C++ API

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

MethodPurpose
InitializeDiscordPresenceLoads the SDK, creates the client, starts callbacks, and connects
ShutdownDiscordPresenceDisconnects, stops callbacks, and releases SDK state
RestartDiscordPresenceRestarts the Discord session with supplied IDs and options
IsDiscordPresenceInitializedChecks whether a valid SDK client exists
IsDiscordRunningReturns the best-known Discord state
GetLastDiscordErrorReturns the latest readable error
GetLastDiscordResultReturns the latest structured result
GetLastDiscordErrorCodeReturns the latest SDK or native error code

Activities And Convenience

MethodPurpose
SetDiscordActivitySubmits a full activity
UpdateDiscordActivityAlias for SetDiscordActivity
ClearDiscordActivityClears the desired, cached, and displayed activity
ResetDiscordActivityResets cached activity and clears Discord when initialized
GetCurrentDiscordActivityReturns the last activity accepted by Discord
SetSimplePresencePublishes details and state
SetPresenceWithImagesPublishes text and image assets
SetPresenceWithTimePublishes text with optional elapsed time
SetPresenceForMainMenuPublishes the built-in main-menu activity
SetPresenceForLevelPublishes a level activity with elapsed time
SetPresenceForMatchPublishes mode, player counts, party values, and elapsed time
ClearPresenceAlias for ClearDiscordActivity

Invites And Utilities

MethodPurpose
RespondToDiscordJoinRequestAccepts or locally dismisses a pending join request
GetDiscordUnixTimestampNowReturns the current UTC Unix timestamp

Advanced Module API

FDiscordPulseModule publicly exposes:

MethodPurpose
LoadDiscordSocialSDKLoads or retains the Discord Social SDK runtime
UnloadDiscordSocialSDKReleases one module-owned SDK load reference
IsDiscordSocialSDKLoadedChecks whether the runtime library is loaded
GetDiscordSocialSDKBinaryPathReturns 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();