OLS/Plugins/CommonUser/Source/CommonUser/Private/CommonUserBasicPresence.cpp
LongLy 7415b74e8f Added CommonUser Plugins.
Implemented GameplayStackTags
2025-01-13 15:36:08 -07:00

120 lines
3.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "CommonUserBasicPresence.h"
#include "CommonSessionSubsystem.h"
#include "Engine/GameInstance.h"
#include "Engine/LocalPlayer.h"
#include "CommonUserTypes.h"
#if COMMONUSER_OSSV1
#include "OnlineSubsystemUtils.h"
#include "Interfaces/OnlinePresenceInterface.h"
#else
#include "Online/OnlineServicesEngineUtils.h"
#include "Online/Presence.h"
#endif
DECLARE_LOG_CATEGORY_EXTERN(LogUserBasicPresence, Log, All);
DEFINE_LOG_CATEGORY(LogUserBasicPresence);
UCommonUserBasicPresence::UCommonUserBasicPresence()
{
}
void UCommonUserBasicPresence::Initialize(FSubsystemCollectionBase& Collection)
{
UCommonSessionSubsystem* CommonSession = Collection.InitializeDependency<UCommonSessionSubsystem>();
if(ensure(CommonSession))
{
CommonSession->OnSessionInformationChangedEvent.AddUObject(this, &UCommonUserBasicPresence::OnNotifySessionInformationChanged);
}
}
void UCommonUserBasicPresence::Deinitialize()
{
}
FString UCommonUserBasicPresence::SessionStateToBackendKey(ECommonSessionInformationState SessionStatus)
{
switch (SessionStatus)
{
case ECommonSessionInformationState::OutOfGame:
return PresenceStatusMainMenu;
break;
case ECommonSessionInformationState::Matchmaking:
return PresenceStatusMatchmaking;
break;
case ECommonSessionInformationState::InGame:
return PresenceStatusInGame;
break;
default:
UE_LOG(LogUserBasicPresence, Error, TEXT("UCommonUserBasicPresence::SessionStateToBackendKey: Found unknown enum value %d"), (uint8)SessionStatus);
return TEXT("Unknown");
break;
}
}
void UCommonUserBasicPresence::OnNotifySessionInformationChanged(ECommonSessionInformationState SessionStatus, const FString& GameMode, const FString& MapName)
{
if (bEnableSessionsBasedPresence && !GetGameInstance()->IsDedicatedServerInstance())
{
// trim the map name since its a URL
FString MapNameTruncated = MapName;
if (!MapNameTruncated.IsEmpty())
{
int LastIndexOfSlash = 0;
MapNameTruncated.FindLastChar('/', LastIndexOfSlash);
MapNameTruncated = MapNameTruncated.RightChop(LastIndexOfSlash + 1);
}
#if COMMONUSER_OSSV1
IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld());
if(OnlineSub)
{
IOnlinePresencePtr Presence = OnlineSub->GetPresenceInterface();
if(Presence)
{
FOnlineUserPresenceStatus UpdatedPresence;
UpdatedPresence.State = EOnlinePresenceState::Online; // We'll only send the presence update if the user has a valid UniqueNetId, so we can assume they are Online
UpdatedPresence.StatusStr = *SessionStateToBackendKey(SessionStatus);
UpdatedPresence.Properties.Emplace(PresenceKeyGameMode, GameMode);
UpdatedPresence.Properties.Emplace(PresenceKeyMapName, MapNameTruncated);
for (const ULocalPlayer* LocalPlayer : GetGameInstance()->GetLocalPlayers())
{
if (LocalPlayer && LocalPlayer->GetPreferredUniqueNetId().GetUniqueNetId() != nullptr)
{
Presence->SetPresence(*LocalPlayer->GetPreferredUniqueNetId().GetUniqueNetId(), UpdatedPresence);
}
}
}
}
#else
UE::Online::IOnlineServicesPtr OnlineServices = UE::Online::GetServices(GetWorld());
check(OnlineServices);
UE::Online::IPresencePtr Presence = OnlineServices->GetPresenceInterface();
if(Presence)
{
for (const ULocalPlayer* LocalPlayer : GetGameInstance()->GetLocalPlayers())
{
if (LocalPlayer && LocalPlayer->GetPreferredUniqueNetId().IsV2())
{
UE::Online::FPartialUpdatePresence::Params UpdateParams;
UpdateParams.LocalAccountId = LocalPlayer->GetPreferredUniqueNetId().GetV2();
UpdateParams.Mutations.StatusString.Emplace(*SessionStateToBackendKey(SessionStatus));
UpdateParams.Mutations.UpdatedProperties.Emplace(PresenceKeyGameMode, GameMode);
UpdateParams.Mutations.UpdatedProperties.Emplace(PresenceKeyMapName, MapNameTruncated);
Presence->PartialUpdatePresence(MoveTemp(UpdateParams));
}
}
}
#endif
}
}