Files
UnrealEngine/Engine/Plugins/Online/OnlineSubsystemFacebook/Source/Private/OnlineFriendsFacebookCommon.h
2025-05-18 13:04:45 +08:00

199 lines
6.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Interfaces/OnlineFriendsInterface.h"
#include "Interfaces/OnlinePresenceInterface.h"
#include "OnlineSubsystemFacebookTypes.h"
#include "OnlineJsonSerializer.h"
#include "Http.h"
#include "OnlineSubsystemFacebookPackage.h"
class FOnlineSubsystemFacebook;
/** Details about a friend */
#define FRIEND_FIELD_ID "id"
#define FRIEND_FIELD_NAME "name"
#define FRIEND_FIELD_FIRSTNAME "first_name"
#define FRIEND_FIELD_LASTNAME "last_name"
#define FRIEND_FIELD_PICTURE "picture"
/**
* Info associated with an online friend on the Facebook service
*/
class FOnlineFriendFacebook :
public FOnlineFriend,
public FJsonSerializable
{
public:
// FOnlineUser
virtual FUniqueNetIdRef GetUserId() const override;
virtual FString GetRealName() const override;
virtual FString GetDisplayName(const FString& Platform = FString()) const override;
virtual bool GetUserAttribute(const FString& AttrName, FString& OutAttrValue) const override;
// FOnlineFriend
virtual EInviteStatus::Type GetInviteStatus() const override;
virtual const FOnlineUserPresence& GetPresence() const override;
// FOnlineFriendFacebook
/**
* Init/default constructor
*/
FOnlineFriendFacebook(const FString& InUserId=TEXT(""))
: UserIdPtr(FUniqueNetIdFacebook::Create(InUserId))
{
}
/**
* Destructor
*/
virtual ~FOnlineFriendFacebook()
{
}
/**
* Parse Json friend request data
*
* @param JsonObject a json payload from a friend request
*/
bool Parse(const TSharedPtr<FJsonObject>& JsonObject);
private:
/**
* Get account data attribute
*
* @param Key account data entry key
* @param OutVal [out] value that was found
*
* @return true if entry was found
*/
inline bool GetAccountData(const FString& Key, FString& OutVal) const
{
const FString* FoundVal = AccountData.Find(Key);
if (FoundVal != NULL)
{
OutVal = *FoundVal;
return true;
}
return false;
}
/** User Id */
FString UserIdStr;
/** User Id represented as a FUniqueNetId */
FUniqueNetIdRef UserIdPtr;
/** Profile picture */
FUserOnlineFacebookPicture Picture;
/** Any addition account data associated with the friend */
FJsonSerializableKeyValueMap AccountData;
/** @temp presence info */
FOnlineUserPresence Presence;
// FJsonSerializable
BEGIN_ONLINE_JSON_SERIALIZER
ONLINE_JSON_SERIALIZE(FRIEND_FIELD_ID, UserIdStr);
ONLINE_JSON_SERIALIZE_OBJECT_SERIALIZABLE(FRIEND_FIELD_PICTURE, Picture);
ONLINE_JSON_SERIALIZE_SIMPLE_COPY(AccountData);
END_ONLINE_JSON_SERIALIZER
/** Allow the FB friends to fill in our private members from it's callbacks */
friend class FOnlineFriendsFacebookCommon;
};
/**
* Facebook service implementation of the online friends interface
*/
class FOnlineFriendsFacebookCommon :
public IOnlineFriends
{
public:
// IOnlineFriends
virtual bool ReadFriendsList(int32 LocalUserNum, const FString& ListName, const FOnReadFriendsListComplete& Delegate = FOnReadFriendsListComplete()) override;
virtual bool DeleteFriendsList(int32 LocalUserNum, const FString& ListName, const FOnDeleteFriendsListComplete& Delegate = FOnDeleteFriendsListComplete()) override;
virtual bool SendInvite(int32 LocalUserNum, const FUniqueNetId& FriendId, const FString& ListName, const FOnSendInviteComplete& Delegate = FOnSendInviteComplete()) override;
virtual bool AcceptInvite(int32 LocalUserNum, const FUniqueNetId& FriendId, const FString& ListName, const FOnAcceptInviteComplete& Delegate = FOnAcceptInviteComplete()) override;
virtual bool RejectInvite(int32 LocalUserNum, const FUniqueNetId& FriendId, const FString& ListName) override;
virtual void SetFriendAlias(int32 LocalUserNum, const FUniqueNetId& FriendId, const FString& ListName, const FString& Alias, const FOnSetFriendAliasComplete& Delegate = FOnSetFriendAliasComplete()) override;
virtual void DeleteFriendAlias(int32 LocalUserNum, const FUniqueNetId& FriendId, const FString& ListName, const FOnDeleteFriendAliasComplete& Delegate = FOnDeleteFriendAliasComplete()) override;
virtual bool DeleteFriend(int32 LocalUserNum, const FUniqueNetId& FriendId, const FString& ListName) override;
virtual bool GetFriendsList(int32 LocalUserNum, const FString& ListName, TArray< TSharedRef<FOnlineFriend> >& OutFriends) override;
virtual TSharedPtr<FOnlineFriend> GetFriend(int32 LocalUserNum, const FUniqueNetId& FriendId, const FString& ListName) override;
virtual bool IsFriend(int32 LocalUserNum, const FUniqueNetId& FriendId, const FString& ListName) override;
virtual bool QueryRecentPlayers(const FUniqueNetId& UserId, const FString& Namespace) override;
virtual bool GetRecentPlayers(const FUniqueNetId& UserId, const FString& Namespace, TArray< TSharedRef<FOnlineRecentPlayer> >& OutRecentPlayers) override;
virtual void DumpRecentPlayers() const override;
virtual bool BlockPlayer(int32 LocalUserNum, const FUniqueNetId& PlayerId) override;
virtual bool UnblockPlayer(int32 LocalUserNum, const FUniqueNetId& PlayerId) override;
virtual bool QueryBlockedPlayers(const FUniqueNetId& UserId) override;
virtual bool GetBlockedPlayers(const FUniqueNetId& UserId, TArray< TSharedRef<FOnlineBlockedPlayer> >& OutBlockedPlayers) override;
virtual void DumpBlockedPlayers() const override;
// FOnlineFriendsFacebook
/**
* Constructor
*
* @param InSubsystem Facebook subsystem being used
*/
FOnlineFriendsFacebookCommon(FOnlineSubsystemFacebook* InSubsystem);
/**
* Destructor
*/
virtual ~FOnlineFriendsFacebookCommon();
PACKAGE_SCOPE:
/** For accessing identity/token info of user logged in */
FOnlineSubsystemFacebook* FacebookSubsystem;
/** List of online friends */
struct FOnlineFriendsList
{
TArray< TSharedRef<FOnlineFriendFacebook> > Friends;
};
/** Cached friends list from last call to ReadFriendsList for each local user */
TMap<int, FOnlineFriendsList> FriendsMap;
private:
/**
* Should use the initialization constructor instead
*/
FOnlineFriendsFacebookCommon() = delete;
/**
* Delegate called when a user /me request from Facebook is complete
*/
void QueryFriendsList_HttpRequestComplete(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded, FOnReadFriendsListComplete Delegate);
/** Config based url for querying friends list */
FString FriendsUrl;
/** Config based list of fields to use when querying friends list */
TArray<FString> FriendsFields;
/** Info used to send request to register a user */
struct FPendingFriendsQuery
{
FPendingFriendsQuery(int32 InLocalUserNum=0)
: LocalUserNum(InLocalUserNum)
{
}
/** local index of user making the request */
int32 LocalUserNum;
};
/** List of pending Http requests for user registration */
TMap<class IHttpRequest*, FPendingFriendsQuery> FriendsQueryRequests;
};
typedef TSharedPtr<FOnlineFriendsFacebookCommon, ESPMode::ThreadSafe> FOnlineFriendsFacebookCommonPtr;