Skip to content
UCIK Docs
Esc
↑↓navigate↵open⌘Jpreview
On this page

Show friends and presence

Show player profiles, relationships, and current game activity.

Configure Social providers and sign in to each service you want to query. Reading friends does not start a login. Use Get Crossplay Social Capabilities to hide unavailable actions.

Read friends

Read friends
Preparing your graph…

Loading the interactive viewer.

Game module dependencies: UCIKCore, BetideCore.

#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void ReadFriends(UGameInstance &GameInstance)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;

    Service->QueryFriends(
        true, FBetideCallback<TArray<FUCIK_Friend>>::CreateWeakLambda(
                  &GameInstance, [](const TBetideResult<TArray<FUCIK_Friend>> &Result) {
                      if (!Result.bOk)
                      {
                          UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                          return;
                      }
                      for (const FUCIK_Friend &Friend : Result.GetValue())
                          UE_LOG(LogUCIK, Log, TEXT("%s"), *Friend.DisplayName);
                  }));
}

Keep the returned provider handles for invites and profiles. A display name is not an ID. Bind On Friends Changed to refresh the list and On Friend Presence Changed for status updates.

Publish presence

Publish presence
Preparing your graph…

Loading the interactive viewer.

Game module dependencies: UCIKCore, BetideCore.

#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void PublishMenuPresence(UGameInstance &GameInstance)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;

    FUCIK_PresenceUpdate Presence;
    Presence.Status = EUCIK_PresenceStatus::Online;
    Presence.RichPresenceText = TEXT("Choosing a match");
    Service->SetPresence(
        Presence, FBetideCallback<TMap<FBetideProviderId, bool>>::CreateWeakLambda(
                      &GameInstance, [](const TBetideResult<TMap<FBetideProviderId, bool>> &Result) {
                          if (!Result.bOk)
                          {
                              UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                              return;
                          }
                          for (const TPair<FBetideProviderId, bool> &Receipt : Result.GetValue())
                              UE_LOG(LogUCIK, Log, TEXT("%s: %d"), *Receipt.Key.Value.ToString(),
                                     Receipt.Value);
                      }));
}

A presence write can succeed on only some providers. Check the returned map for every provider you require; failed providers may be absent.

Requests and profiles

Send a friend request
Send a friend request
Preparing your graph…

Loading the interactive viewer.

List incoming requests
List incoming requests
Preparing your graph…

Loading the interactive viewer.

List outgoing requests
List outgoing requests
Preparing your graph…

Loading the interactive viewer.

Accept a friend request
Accept a friend request
Preparing your graph…

Loading the interactive viewer.

Reject a friend request
Reject a friend request
Preparing your graph…

Loading the interactive viewer.

Read player profiles
Read player profiles
Preparing your graph…

Loading the interactive viewer.

Read player presence
Read player presence
Preparing your graph…

Loading the interactive viewer.

Game module dependencies: UCIKCore, BetideCore.

Send a friend request
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void SendFriendRequest(UGameInstance &GameInstance, const FUCIK_PlayerHandle &Player)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->SendFriendInvite(
        Player,
        FBetideCallback<bool>::CreateWeakLambda(&GameInstance, [](const TBetideResult<bool> &Result) {
            if (!Result.bOk)
            {
                UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                return;
            }
            UE_LOG(LogUCIK, Log, TEXT("Friend request operation completed: %d"), Result.GetValue());
        }));
}
Accept a friend request
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void AcceptFriendRequest(UGameInstance &GameInstance, const FUCIK_PlayerHandle &Player)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->AcceptFriendInvite(
        Player,
        FBetideCallback<bool>::CreateWeakLambda(&GameInstance, [](const TBetideResult<bool> &Result) {
            if (!Result.bOk)
            {
                UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                return;
            }
            UE_LOG(LogUCIK, Log, TEXT("Friend request operation completed: %d"), Result.GetValue());
        }));
}
Reject a friend request
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void RejectFriendRequest(UGameInstance &GameInstance, const FUCIK_PlayerHandle &Player)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->RejectFriendInvite(
        Player,
        FBetideCallback<bool>::CreateWeakLambda(&GameInstance, [](const TBetideResult<bool> &Result) {
            if (!Result.bOk)
            {
                UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                return;
            }
            UE_LOG(LogUCIK, Log, TEXT("Friend request operation completed: %d"), Result.GetValue());
        }));
}
List incoming requests
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void ReadIncomingRequests(UGameInstance &GameInstance)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->GetPendingFriendInvites(FBetideCallback<TArray<FUCIK_Friend>>::CreateWeakLambda(
        &GameInstance, [](const TBetideResult<TArray<FUCIK_Friend>> &Result) {
            if (!Result.bOk)
            {
                UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                return;
            }
            for (const FUCIK_Friend &Entry : Result.GetValue())
                UE_LOG(LogUCIK, Log, TEXT("%s"), *Entry.DisplayName);
        }));
}
List outgoing requests
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void ReadOutgoingRequests(UGameInstance &GameInstance)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->GetOutgoingFriendInvites(FBetideCallback<TArray<FUCIK_Friend>>::CreateWeakLambda(
        &GameInstance, [](const TBetideResult<TArray<FUCIK_Friend>> &Result) {
            if (!Result.bOk)
            {
                UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                return;
            }
            for (const FUCIK_Friend &Entry : Result.GetValue())
                UE_LOG(LogUCIK, Log, TEXT("%s"), *Entry.DisplayName);
        }));
}
Read player profiles
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void ReadPlayerProfiles(UGameInstance &GameInstance, const TArray<FUCIK_PlayerHandle> &Players)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->QueryPlayerProfiles(
        Players, FBetideCallback<TArray<FUCIK_PlayerProfile>>::CreateWeakLambda(
                     &GameInstance, [](const TBetideResult<TArray<FUCIK_PlayerProfile>> &Result) {
                         if (!Result.bOk)
                         {
                             UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                             return;
                         }
                         for (const FUCIK_PlayerProfile &Entry : Result.GetValue())
                             UE_LOG(LogUCIK, Log, TEXT("%s"), *Entry.DisplayName);
                     }));
}
Read player presence
#include "Engine/GameInstance.h"
#include "Social/UCIKSocialSubsystem.h"
#include "UCIKCore.h"

void ReadPlayerPresence(UGameInstance &GameInstance, const TArray<FUCIK_PlayerHandle> &Players)
{
    auto *Service = GameInstance.GetSubsystem<UUCIKSocialSubsystem>();
    if (!Service)
        return;
    Service->QueryPresence(
        Players, FBetideCallback<TArray<FUCIK_Presence>>::CreateWeakLambda(
                    &GameInstance, [](const TBetideResult<TArray<FUCIK_Presence>> &Result) {
                        if (!Result.bOk)
                        {
                            UE_LOG(LogUCIK, Warning, TEXT("%s"), *Result.Error.GetLogString());
                            return;
                        }
                        for (const FUCIK_Presence &Entry : Result.GetValue())
                            UE_LOG(LogUCIK, Log, TEXT("%s"), *Entry.RichPresenceText);
                    }));
}
Store differences

The available actions depend on the signed-in provider. A friends list does not imply support for sending friend requests. Avatars may be missing; supply your own fallback image.

Steam owns a separate startup login even when EOS is the primary Crossplay identity. One Steam account cannot represent multiple independent PIE clients; see testing.

Rich-presence text alone does not make a match joinable. Use party invites and the plugin’s published lobby/session destination.

Was this page helpful?