// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #if WITH_TENCENT_RAIL_SDK #include "RailSDK.h" #include "RailSdkWrapper.h" #include "OnlineAsyncTaskManager.h" #include "Interfaces/OnlineFriendsInterface.h" #include "Interfaces/OnlinePresenceInterface.h" #include "Interfaces/OnlinePurchaseInterface.h" #include "OnlineSubsystemTencentTypes.h" #include "OnlineError.h" #include "OnlineJsonSerializer.h" class FOnlineSubsystemTencent; class FUniqueNetIdRail; class FOnlineUserInfoTencent; typedef TSharedRef FOnlineStoreOfferRef; /** Timeout failsafe in case Tencent tasks/events don't get a callback */ #if UE_BUILD_SHIPPING #define ASYNC_RAIL_TASK_TIMEOUT 20.0 #else #define ASYNC_RAIL_TASK_TIMEOUT 80.0 #endif /** * Base class that holds a delegate to fire when a given async task is complete */ class FOnlineAsyncTaskRail : public FOnlineAsyncTaskBasic, public rail::IRailEvent { public: FOnlineAsyncTaskRail() = delete; FOnlineAsyncTaskRail(FOnlineSubsystemTencent* InSubsystem, TSet InRegisteredRailEvents) : FOnlineAsyncTaskBasic(InSubsystem) , RegisteredRailEvents(InRegisteredRailEvents) { } virtual ~FOnlineAsyncTaskRail() = default; //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void Tick() override; //~ End FOnlineAsyncTask interface protected: /** * Convert a raw Rail result into something resembling an FOnlineError * * @param InResult any rail result * @param OutOnlineError the converted error result */ void ParseRailResult(rail::RailResult InResult, FOnlineError& OutOnlineError) const; /** * Parse a Rail event into something resembling an FOnlineError * * @param InResult any rail event * @param OutOnlineError the converted error result */ void ParseRailResult(const rail::EventBase* InResult, FOnlineError& OutOnlineError) const; /** * Can this task timeout? * Most tasks are able to timeout. */ bool bCanTimeout = true; // Events registered with this task TSet RegisteredRailEvents; }; class FOnlineAsyncEventRail : public FOnlineAsyncEvent { public: FOnlineAsyncEventRail() = delete; FOnlineAsyncEventRail(FOnlineSubsystemTencent* InSubsystem) : FOnlineAsyncEvent(InSubsystem) { } virtual ~FOnlineAsyncEventRail() = default; /** * Convert a raw Rail result into something resembling an FOnlineError * * @param InResult any rail result * @param OutOnlineError the converted error result */ void ParseRailResult(rail::RailResult InResult, FOnlineError& OutOnlineError) const; /** * Parse a Rail event into something resembling an FOnlineError * * @param InResult any rail event * @param OutOnlineError the converted error result */ void ParseRailResult(const rail::EventBase* InResult, FOnlineError& OutOnlineError) const; }; class FOnlineAsyncTaskRailAcquireSessionTicket : public FOnlineAsyncTaskRail { public: DECLARE_DELEGATE_TwoParams(FCompletionDelegate, const FOnlineError& /*Result*/, const FString& /*SessionTicket*/); FOnlineAsyncTaskRailAcquireSessionTicket() = delete; FOnlineAsyncTaskRailAcquireSessionTicket(FOnlineSubsystemTencent* InSubsystem, rail::RailID InPlayerId, const FCompletionDelegate& InCompletionDelegate) : FOnlineAsyncTaskRail(InSubsystem, {rail::kRailEventSessionTicketGetSessionTicket}) , PlayerId(InPlayerId) , CompletionDelegate(InCompletionDelegate) { } virtual ~FOnlineAsyncTaskRailAcquireSessionTicket() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailAcquireSessionTicket OnlineError: %s"), *OnlineError.ToLogString()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID EventId, rail::EventBase* Param) override; //~ End IRailEvent interface protected: void OnRailGetSessionTicket(const rail::rail_event::AcquireSessionTicketResponse* SessionTicketResponse); /** Player id we are obtaining the auth session for */ rail::RailID PlayerId; /** The result */ FOnlineError OnlineError; /** The acquired session ticket */ FString SessionTicket; /** Function to fire when complete */ FCompletionDelegate CompletionDelegate; }; /** * Result structure after opening/closing a floating window */ struct FFloatingWindowTaskResult { FFloatingWindowTaskResult() : bOpened(false) { } /** Error information */ FOnlineError Error; /** State of the floating window */ bool bOpened; }; class FOnlineAsyncTaskRailShowFloatingWindow : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailShowFloatingWindow() = delete; FOnlineAsyncTaskRailShowFloatingWindow(FOnlineSubsystemTencent* InSubsystem, rail::EnumRailWindowType InWindowType) : FOnlineAsyncTaskRail(InSubsystem, {rail::kRailEventShowFloatingWindow}) , WindowType(InWindowType) { } virtual ~FOnlineAsyncTaskRailShowFloatingWindow() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailShowFloatingWindow bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailShowFloatingWindow(rail::rail_event::ShowFloatingWindowResult* param); /** Result of the task */ FFloatingWindowTaskResult TaskResult; /** Type of window to open */ rail::EnumRailWindowType WindowType; }; /** * Result structure after setting user metadata / presence */ struct FSetUserMetadataTaskResult { /** Error information */ FOnlineError Error; /** Key/Value pairs in string form used with this task */ TMap FinalData; }; /** * Delegate fired when FOnlineAsyncTaskRailSetUserMetadata completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailSetUserMetadataComplete, const FSetUserMetadataTaskResult& /*Result*/); class FOnlineAsyncTaskRailSetUserMetadata : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailSetUserMetadata() = delete; FOnlineAsyncTaskRailSetUserMetadata(FOnlineSubsystemTencent* InSubsystem, const FMetadataPropertiesRail& InMetdata, const FOnOnlineAsyncTaskRailSetUserMetadataComplete& InCompletionDelegate) : FOnlineAsyncTaskRail(InSubsystem, {rail::kRailEventFriendsSetMetadataResult}) , Metadata(InMetdata) , CompletionDelegate(InCompletionDelegate) { } virtual ~FOnlineAsyncTaskRailSetUserMetadata() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailSetUserMetadata bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: /** * Given an input of local metadata, populate a list of key value pairs for consumption by RailSDK * * @param InMetadata local metadata to convert to RailSDK * @param OutFinalData map of data in final format * @param OutRailKeyValuePairs list of keys and their values */ virtual bool GenerateRailMetadata(FMetadataPropertiesRail& InMetadata, TMap& OutFinalData, rail::RailArray& OutRailKeyValuePairs); void OnRailEventFriendsSetMetadataResult(const rail::rail_event::RailFriendsSetMetadataResult* MetadataResult); /** Input metadata information */ FMetadataPropertiesRail Metadata; /** Output presence result */ FSetUserMetadataTaskResult TaskResult; /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailSetUserMetadataComplete CompletionDelegate; }; /** * Builds on FOnlineAsyncTaskRailSetUserMetadata to provide the ability to dynamically store multiple keys * by storing an additional key with a list of the others */ class FOnlineAsyncTaskRailSetUserPresence : public FOnlineAsyncTaskRailSetUserMetadata { public: FOnlineAsyncTaskRailSetUserPresence() = delete; FOnlineAsyncTaskRailSetUserPresence(FOnlineSubsystemTencent* InSubsystem, const FMetadataPropertiesRail& InMetdata, const FOnOnlineAsyncTaskRailSetUserMetadataComplete& InCompletionDelegate) : FOnlineAsyncTaskRailSetUserMetadata(InSubsystem, InMetdata, InCompletionDelegate) { } virtual ~FOnlineAsyncTaskRailSetUserPresence() { } //~ Begin FOnlineAsyncTask interface virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailSetUserPresence bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface protected: //~ Begin FOnlineAsyncTaskRailSetUserMetadata interface virtual bool GenerateRailMetadata(FMetadataPropertiesRail& InMetadata, TMap& OutFinalData, rail::RailArray& OutRailKeyValuePairs) override; //~ End FOnlineAsyncTaskRailSetUserMetadata interface }; class FOnlineAsyncTaskRailSetSessionMetadata : public FOnlineAsyncTaskRailSetUserMetadata { public: FOnlineAsyncTaskRailSetSessionMetadata() = delete; FOnlineAsyncTaskRailSetSessionMetadata(FOnlineSubsystemTencent* InSubsystem, const FMetadataPropertiesRail& InMetdata, const FOnOnlineAsyncTaskRailSetUserMetadataComplete& InCompletionDelegate) : FOnlineAsyncTaskRailSetUserMetadata(InSubsystem, InMetdata, InCompletionDelegate) { } virtual ~FOnlineAsyncTaskRailSetSessionMetadata() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailSetSessionMetadata bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface }; DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailSetInviteCommandlineComplete, const FSetUserMetadataTaskResult& /*Result*/); class FOnlineAsyncTaskRailSetInviteCommandline : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailSetInviteCommandline() = delete; FOnlineAsyncTaskRailSetInviteCommandline(FOnlineSubsystemTencent* InSubsystem, const FString& InCmdline, const FOnOnlineAsyncTaskRailSetInviteCommandlineComplete& InCompletionDelegate) : FOnlineAsyncTaskRail(InSubsystem, {rail::kRailEventFriendsSetMetadataResult}) , Cmdline(InCmdline) , CompletionDelegate(InCompletionDelegate) { } virtual ~FOnlineAsyncTaskRailSetInviteCommandline() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailSetCommandline bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventFriendsSetMetadataResult(const rail::rail_event::RailFriendsSetMetadataResult* MetadataResult); /** Command line to store with the backend */ FString Cmdline; /** Output result of this call */ FSetUserMetadataTaskResult TaskResult; /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailSetInviteCommandlineComplete CompletionDelegate; }; /** * Result structure after getting user metadata / presence */ struct FGetUserMetadataTaskResult { /** Error information */ FOnlineError Error; /** User whose presence was retrieved */ FUniqueNetIdRailPtr UserId; /** Retrieved presence information */ FMetadataPropertiesRail Metadata; }; /** * Delegate fired when FOnlineAsyncTaskRailGetUserMetadata completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailGetUserMetadataComplete, const FGetUserMetadataTaskResult& /*Result*/); class FOnlineAsyncTaskRailGetUserMetadata : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailGetUserMetadata() = delete; FOnlineAsyncTaskRailGetUserMetadata(FOnlineSubsystemTencent* InSubsystem, const FUniqueNetIdRail& InUserId, const TArray& InMetadataKeys, const FOnOnlineAsyncTaskRailGetUserMetadataComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailGetUserMetadata(); //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override; //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: /** * Retrieve a list of metadata key value pairs * * @param InMetadata list of keys to retrieve from the user specified by this task */ rail::RailResult QueryMetadata(const TArray& InMetadata); virtual void OnRailEventFriendsGetMetadataResult(const rail::rail_event::RailFriendsGetMetadataResult* MetadataResult); /** User to query presence for */ rail::RailID RailUserId; /** Presence retrieved for this user */ TArray MetadataKeys; /** Output result from the task */ FGetUserMetadataTaskResult TaskResult; /** Delegate to fire when this task is completed */ FOnOnlineAsyncTaskRailGetUserMetadataComplete CompletionDelegate; }; /** * Builds on FOnlineAsyncTaskRailGetUserMetadata to provide the ability to dynamically retrieve multiple keys * from an additional key with a list of the others */ class FOnlineAsyncTaskRailGetUserPresence : public FOnlineAsyncTaskRailGetUserMetadata { public: FOnlineAsyncTaskRailGetUserPresence() = delete; FOnlineAsyncTaskRailGetUserPresence(FOnlineSubsystemTencent* InSubsystem, const FUniqueNetIdRail& InUserId, const FOnOnlineAsyncTaskRailGetUserMetadataComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailGetUserPresence(); //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual FString ToString() const override; //~ End FOnlineAsyncTask interface protected: /** Has the list of keys been queried */ bool bKeysQueried; virtual void OnRailEventFriendsGetMetadataResult(const rail::rail_event::RailFriendsGetMetadataResult* MetadataResult) override; }; /** * Result structure after getting a user command line invite */ struct FGetInviteCommandLineTaskResult { /** Error information */ FOnlineError Error; /** User whose command line invite was retrieved */ FUniqueNetIdRailPtr UserId; /** Retrieved command line */ FString Commandline; }; DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailGetInviteCommandLineComplete, const FGetInviteCommandLineTaskResult& /*Result*/); class FOnlineAsyncTaskRailGetInviteCommandline : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailGetInviteCommandline() = delete; FOnlineAsyncTaskRailGetInviteCommandline(FOnlineSubsystemTencent* InSubsystem, const FUniqueNetIdRail& InUserId, const FOnOnlineAsyncTaskRailGetInviteCommandLineComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailGetInviteCommandline(); //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailGetInviteCommandline bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventFriendsGetInviteCommandLine(const rail::rail_event::RailFriendsGetInviteCommandLine* InviteResult); /** User to query presence for */ rail::RailID RailUserId; /** Output result from the task */ FGetInviteCommandLineTaskResult TaskResult; /** Delegate to fire when this task is completed */ FOnOnlineAsyncTaskRailGetInviteCommandLineComplete CompletionDelegate; }; /** * Result structure after getting a complete user invite */ struct FGetUserInviteTaskResult { /** Error information */ FOnlineError Error; /** User whose invite was retrieved */ FUniqueNetIdRailPtr UserId; /** Retrieved presence information */ FMetadataPropertiesRail Metadata; /** Retrieved presence information */ FString Commandline; }; DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailGetUserInviteComplete, const FGetUserInviteTaskResult& /*Result*/); class FOnlineAsyncTaskRailGetUserInvite : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailGetUserInvite() = delete; FOnlineAsyncTaskRailGetUserInvite(FOnlineSubsystemTencent* InSubsystem, const FUniqueNetIdRail& InUserId, const FOnOnlineAsyncTaskRailGetUserInviteComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailGetUserInvite(); //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailGetUserInvite Meta: %d CmdLine: %d"), static_cast(MetadataReceivedResult), static_cast(CommandLineResult)); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventFriendsGetMetadataResult(const rail::rail_event::RailFriendsGetMetadataResult* MetadataResult); void OnRailEventFriendsGetInviteCommandLine(const rail::rail_event::RailFriendsGetInviteCommandLine* InviteResult); /** Called when each event completes to check for total completion */ void OnEventComplete(); /** * Get the session invite keys out of the command line * * @param InviteCommandLine string containing a list of session invite related keys to retrieve from a remote user */ void RetrieveFromInviteCommandLine(const FString& InviteCommandline); /** Has the metadata callback fired */ bool bMetadataReceived; /** Result of the metadata callback */ rail::RailResult MetadataReceivedResult; /** Has the command line callback fired */ bool bCommandLineReceived; /** Result of the command line callback */ rail::RailResult CommandLineResult; /** User to query invite from (Inviter) */ rail::RailID RailUserId; /** Presence retrieved for this user used to build session search result */ TArray MetadataKeys; /** Output result from the task */ FGetUserInviteTaskResult TaskResult; /** Delegate to fire when this task is completed */ FOnOnlineAsyncTaskRailGetUserInviteComplete CompletionDelegate; }; class FOnlineAsyncTaskRailClearAllMetadata : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailClearAllMetadata() = delete; FOnlineAsyncTaskRailClearAllMetadata(FOnlineSubsystemTencent* InSubsystem, const FUniqueNetIdRail& InUserId); virtual ~FOnlineAsyncTaskRailClearAllMetadata(); //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailClearAllMetadata bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventFriendsClearAllMetadataResult(const rail::rail_event::RailFriendsClearMetadataResult* MetadataResult); /** User to clear metadata for */ rail::RailID RailUserId; FOnlineError TaskResult; }; /** * Delegate fired when FOnlineAsyncTaskRailAddFriend completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailAddFriendComplete, const FOnlineError& /*Result*/); class FOnlineAsyncTaskRailAddFriend : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailAddFriend() = delete; /** * Constructor * @param InSubsystem the owning subsystem * @param InUserId the rail id of the player you want to friend * @param InCompletionDelegate the delegate to trigger when this request has completed */ FOnlineAsyncTaskRailAddFriend(FOnlineSubsystemTencent* InSubsystem, const FUniqueNetIdRail& InUserId, const FOnOnlineAsyncTaskRailAddFriendComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailAddFriend(); //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailAddFriend bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventFriendsAddFriendResult(const rail::rail_event::RailFriendsAddFriendResult* AddFriendResult); /** User to friend */ rail::RailID RailUserId; /** The result of the add friend request */ FOnlineError TaskResult; /** Delegate to trigger on completion */ FOnOnlineAsyncTaskRailAddFriendComplete CompletionDelegate; }; /** * Result structure after getting users info */ struct FGetUsersInfoTaskResult { /** Error information */ FOnlineError Error; /** Users successfully queried */ TArray> UserInfos; }; /** * Delegate fired when FOnlineAsyncTaskRailGetUsersInfo completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailGetUsersInfoComplete, const FGetUsersInfoTaskResult& /*Result*/); class FOnlineAsyncTaskRailGetUsersInfo : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailGetUsersInfo() = delete; FOnlineAsyncTaskRailGetUsersInfo(FOnlineSubsystemTencent* InSubsystem, const TArray& InUserIds, const FOnOnlineAsyncTaskRailGetUsersInfoComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailGetUsersInfo() = default; //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailGetUsersInfo bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventUsersGetUsersInfo(const rail::rail_event::RailUsersInfoData* UsersInfoData); /** Request id counter so we can map rail responses to the correct requests */ static FThreadSafeCounter RequestIdCounter; /** Our request id */ int32 RequestId; /** User to get data for */ TArray UserIds; /** Result of the task */ FGetUsersInfoTaskResult TaskResult; /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailGetUsersInfoComplete CompletionDelegate; }; class FOnlineAsyncEventRailSystemStateChanged : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailSystemStateChanged() = delete; FOnlineAsyncEventRailSystemStateChanged(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::RailSystemStateChanged* InParams) : FOnlineAsyncEventRail(InSubsystem) , State(InParams ? InParams->state : rail::RailSystemState::kSystemStateUnknown) { } virtual ~FOnlineAsyncEventRailSystemStateChanged() = default; //~ Begin FOnlineAsyncTask interface virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailSystemStateChanged State: %s"), *LexToString(State)); } //~ End FOnlineAsyncTask interface protected: rail::RailSystemState State; }; class FOnlineAsyncEventRailShowFloatingWindow : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailShowFloatingWindow() = delete; FOnlineAsyncEventRailShowFloatingWindow(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::ShowFloatingWindowResult* InParams); virtual ~FOnlineAsyncEventRailShowFloatingWindow() { } //~ Begin FOnlineAsyncEvent interface virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailShowFloatingWindow Result: %s bWasOpened: %d"), *TaskResult.Error.ToLogString(), TaskResult.bOpened); } //~ End FOnlineAsyncEvent interface protected: /** Result of the task */ FFloatingWindowTaskResult TaskResult; }; struct FOnlineAsyncEventRailShowFloatingNotifyWindowPayload : public FOnlineJsonSerializable { public: /** Title of dialog to display*/ FString DialogTitle; /** Text of dialog to display */ FString DialogText; /** Text to display in OK button */ FString ButtonText; public: BEGIN_ONLINE_JSON_SERIALIZER ONLINE_JSON_SERIALIZE("title", DialogTitle); ONLINE_JSON_SERIALIZE("desc", DialogText); ONLINE_JSON_SERIALIZE("confirm_button", ButtonText); END_ONLINE_JSON_SERIALIZER }; class FOnlineAsyncEventRailShowFloatingNotifyWindow : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailShowFloatingNotifyWindow() = delete; FOnlineAsyncEventRailShowFloatingNotifyWindow(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::ShowNotifyWindow* InParams); virtual ~FOnlineAsyncEventRailShowFloatingNotifyWindow() { } //~ Begin FOnlineAsyncEvent interface virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailShowFloatingNotifyWindow")); } //~ End FOnlineAsyncEvent interface bool bShowAntiAddictionMessage; FOnlineAsyncEventRailShowFloatingNotifyWindowPayload Payload; }; class FOnlineAsyncEventRailInviteSent : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailInviteSent() = delete; FOnlineAsyncEventRailInviteSent(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::RailUsersNotifyInviter* InParams) : FOnlineAsyncEventRail(InSubsystem) , Result(InParams ? InParams->get_result() : rail::kErrorUnknown) , InviterId(InParams ? InParams->rail_id : rail::kInvalidRailId) , InviteeId(InParams ? InParams->invitee_id : rail::kInvalidRailId) , UserData(InParams ? InParams->user_data : rail::RailString()) { } virtual ~FOnlineAsyncEventRailInviteSent() { } //~ Begin FOnlineAsyncTask interface virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailInviteSent Inviter: %llu Invitee: %llu bWasSuccessful: %d"), InviterId.get_id(), InviteeId.get_id(), (Result == rail::kSuccess)); } //~ End FOnlineAsyncTask interface protected: /** Result of the invite sent event */ rail::RailResult Result; /** User id who sent the invite */ rail::RailID InviterId; /** User id who will receive the invite */ rail::RailID InviteeId; /** User data returned with the call */ rail::RailString UserData; }; class FOnlineAsyncEventRailInviteSentEx : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailInviteSentEx() = delete; FOnlineAsyncEventRailInviteSentEx(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::RailUsersInviteUsersResult* InParams) : FOnlineAsyncEventRail(InSubsystem) , Result(InParams ? InParams->get_result() : rail::kErrorUnknown) , InviteType(InParams ? InParams->invite_type : rail::kRailUsersInviteTypeGame) , UserData(InParams ? InParams->user_data : rail::RailString()) { } virtual ~FOnlineAsyncEventRailInviteSentEx() { } //~ Begin FOnlineAsyncTask interface virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailInviteSentEx bWasSuccessful: %d"), (Result == rail::kSuccess)); } //~ End FOnlineAsyncTask interface protected: /** Result of the invite sent event */ rail::RailResult Result; /** Type of invite */ rail::EnumRailUsersInviteType InviteType; /** User data returned with the call */ rail::RailString UserData; }; class FOnlineAsyncEventRailInviteResponse : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailInviteResponse() = delete; FOnlineAsyncEventRailInviteResponse(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::RailUsersRespondInvitation* InParams) : FOnlineAsyncEventRail(InSubsystem) , Result(InParams ? InParams->get_result() : rail::kErrorUnknown) , InviterId(InParams ? InParams->inviter_id : rail::kInvalidRailId) , InviteeId(InParams ? InParams->rail_id : rail::kInvalidRailId) , UserData(InParams ? InParams->user_data : rail::RailString()) , Response(InParams ? InParams->response : rail::kRailInviteResponseTypeUnknown) { } virtual ~FOnlineAsyncEventRailInviteResponse() { } //~ Begin FOnlineAsyncTask interface virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailInviteResponse Inviter: %llu Invitee: %llu bWasSuccessful: %d"), InviterId.get_id(), InviteeId.get_id(), (Result == rail::kSuccess)); } //~ End FOnlineAsyncTask interface protected: /** Result of the invite response event */ rail::RailResult Result; /** User id who sent the invite */ rail::RailID InviterId; /** User id who received the invite */ rail::RailID InviteeId; /** User data returned with the call */ rail::RailString UserData; /** Invitees response to the invite */ rail::EnumRailUsersInviteResponseType Response; }; class FOnlineAsyncEventRailJoinGameByUser : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailJoinGameByUser() = delete; FOnlineAsyncEventRailJoinGameByUser(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::RailPlatformNotifyEventJoinGameByUser* InParams) : FOnlineAsyncEventRail(InSubsystem) , Result(InParams ? InParams->get_result() : rail::kErrorUnknown) , UserToJoin(InParams ? InParams->rail_id_to_join : rail::kInvalidRailId) , CommandLine(InParams ? InParams->commandline_info : rail::RailString()) { } virtual ~FOnlineAsyncEventRailJoinGameByUser() { } //~ Begin FOnlineAsyncTask interface virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailJoinGameByUser RemoteUser: %llu Commandline: %s bWasSuccessful: %d"), UserToJoin.get_id(), ANSI_TO_TCHAR(CommandLine.c_str()), (Result == rail::kSuccess)); } //~ End FOnlineAsyncTask interface protected: /** Result of the invite response event */ rail::RailResult Result; /** Remote user to join */ rail::RailID UserToJoin; /** Commandline invite of remote user */ rail::RailString CommandLine; }; class FOnlineAsyncEventRailJoinGameResult : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailJoinGameResult() = delete; FOnlineAsyncEventRailJoinGameResult(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::RailUsersInviteJoinGameResult* InParams) : FOnlineAsyncEventRail(InSubsystem) , Result(InParams ? InParams->get_result() : rail::kErrorUnknown) , InviterId(InParams ? InParams->rail_id : rail::kInvalidRailId) , InviteeId(InParams ? InParams->invitee_id : rail::kInvalidRailId) , UserData(InParams ? InParams->user_data : rail::RailString()) , Response(InParams ? InParams->response_value : rail::kRailInviteResponseTypeUnknown) , InviteType(InParams ? InParams->invite_type : rail::kRailUsersInviteTypeGame) { } virtual ~FOnlineAsyncEventRailJoinGameResult() { } //~ Begin FOnlineAsyncTask interface virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailJoinGameResult Inviter: %llu Invitee: %llu bWasSuccessful: %d"), InviterId.get_id(), InviteeId.get_id(), (Result == rail::kSuccess)); } //~ End FOnlineAsyncTask interface protected: /** Result of the join game event */ rail::RailResult Result; /** User id who sent the invite */ rail::RailID InviterId; /** User id who received the invite */ rail::RailID InviteeId; /** User data returned with the call */ rail::RailString UserData; /** Invitees response to the invite */ rail::EnumRailUsersInviteResponseType Response; /** Type of invite sent */ rail::EnumRailUsersInviteType InviteType; }; class FOnlineAsyncEventRailFriendsListChanged : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailFriendsListChanged() = delete; FOnlineAsyncEventRailFriendsListChanged(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::RailFriendsListChanged* InParams) : FOnlineAsyncEventRail(InSubsystem) , UserId(InParams->rail_id) { } virtual ~FOnlineAsyncEventRailFriendsListChanged() = default; //~ Begin FOnlineAsyncTask interface virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailFriendsListChanged")); } //~ End FOnlineAsyncTask interface private: /** The user id whose list has changed */ rail::RailID UserId; }; class FOnlineAsyncEventRailFriendsOnlineStateChanged : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailFriendsOnlineStateChanged() = delete; FOnlineAsyncEventRailFriendsOnlineStateChanged(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::RailFriendsOnlineStateChanged* InParams) : FOnlineAsyncEventRail(InSubsystem) , OnlineState(InParams ? InParams->friend_online_state : rail::RailFriendOnLineState()) { } virtual ~FOnlineAsyncEventRailFriendsOnlineStateChanged() = default; //~ Begin FOnlineAsyncTask interface virtual void Finalize() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailFriendsOnlineStateChanged friend_rail_id=%llu, friend_online_state=%s, game_define_game_playing_state=%u"), OnlineState.friend_rail_id.get_id(), *LexToString(OnlineState.friend_online_state), OnlineState.game_define_game_playing_state); } //~ End FOnlineAsyncTask interface private: /** Data related to the online state change */ rail::RailFriendOnLineState OnlineState; }; class FOnlineAsyncEventRailFriendsMetadataChanged : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailFriendsMetadataChanged() = delete; FOnlineAsyncEventRailFriendsMetadataChanged(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::RailFriendsMetadataChanged* InParams); virtual ~FOnlineAsyncEventRailFriendsMetadataChanged() = default; //~ Begin FOnlineAsyncTask interface virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailFriendsMetadataChanged size: %d"), ChangedMetadata.Num()); } //~ End FOnlineAsyncTask interface private: /** Data related to the metadata change */ TUniqueNetIdMap ChangedMetadata; }; /** * Result structure after getting users presence */ struct FQueryUserPresenceTaskResult { FQueryUserPresenceTaskResult() : QueryCount(0) , SuccessCount(0) {} /** Error information */ FOnlineError Error; /** Number of completed queries */ int32 QueryCount; /** Number of successful queries */ int32 SuccessCount; }; /** * Query a list of friends presence to prime the presence cache */ class FOnlineAsyncTaskRailQueryFriendsPresence : public FOnlineAsyncTaskBasic { public: /** Delegate fired when this task completed */ DECLARE_DELEGATE_OneParam(FCompletionDelegate, const FQueryUserPresenceTaskResult& /*TaskResult*/); FOnlineAsyncTaskRailQueryFriendsPresence() = delete; FOnlineAsyncTaskRailQueryFriendsPresence(FOnlineSubsystemTencent* InSubsystem, TArray& InFriends, const FCompletionDelegate& InCompletionDelegate) : FOnlineAsyncTaskBasic(InSubsystem) , CompletionDelegate(InCompletionDelegate) , FriendsList(InFriends) { } virtual ~FOnlineAsyncTaskRailQueryFriendsPresence() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailQueryFriendsPresence bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface protected: /** Completion delegate to fire */ FCompletionDelegate CompletionDelegate; /** List of friends whose presence data is requested */ TArray FriendsList; /** Result of operation */ FQueryUserPresenceTaskResult TaskResult; }; /** * Result structure after sending an invite */ struct FSendInviteTaskResult { FSendInviteTaskResult() = delete; FSendInviteTaskResult(const FString& InInviteStr) : InviteStr(InInviteStr) { } /** Invite command line */ FString InviteStr; /** Error information */ FOnlineError Error; }; /** * Delegate fired when FOnlineAsyncTaskRailSendInvite completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailSendInviteComplete, const FSendInviteTaskResult& /*Result*/); /** * Send an invite to a list of friends * Contains a string with the various metadata keys to query relating to the invite */ class FOnlineAsyncTaskRailSendInvite : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailSendInvite() = delete; FOnlineAsyncTaskRailSendInvite(FOnlineSubsystemTencent* InSubsystem, const FString& InInviteStr, const TArray& InUserIds, const FOnOnlineAsyncTaskRailSendInviteComplete& InCompletionDelegate) : FOnlineAsyncTaskRail(InSubsystem, {rail::kRailEventUsersInviteUsersResult}) , UserIds(InUserIds) , CompletionDelegate(InCompletionDelegate) , TaskResult(InInviteStr) { } virtual ~FOnlineAsyncTaskRailSendInvite() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailSendInvite bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventFriendsSendInviteResult(const rail::rail_event::RailUsersInviteUsersResult* InviteResult); /** List of users to send invite to */ TArray UserIds; /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailSendInviteComplete CompletionDelegate; /** Task Result */ FSendInviteTaskResult TaskResult; }; /** * Result structure after retrieving details about an invite */ struct FGetInviteDetailsTaskResult { /** Error information */ FOnlineError Error; /** Invite Details */ FString InviteString; }; /** * Delegate fired when FOnlineAsyncTaskRailGetInviteDetails completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailGetInviteDetailsComplete, const FGetInviteDetailsTaskResult& /*Result*/); /** * Get the details related to an invite sent by a remote user */ class FOnlineAsyncTaskRailGetInviteDetails : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailGetInviteDetails() = delete; FOnlineAsyncTaskRailGetInviteDetails(FOnlineSubsystemTencent* InSubsystem, const FUniqueNetIdRail& InUserId, const FOnOnlineAsyncTaskRailGetInviteDetailsComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailGetInviteDetails() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailGetInviteDetails bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventFriendsGetInviteDetailsResult(const rail::rail_event::RailUsersGetInviteDetailResult* InviteDetails); /** User to query presence for */ rail::RailID RailUserId; /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailGetInviteDetailsComplete CompletionDelegate; /** Task Result */ FGetInviteDetailsTaskResult TaskResult; }; /** * Result structure containing details about friends playing games on the platform */ struct FQueryFriendPlayedGamesTaskResult { /** Error information */ FOnlineError Error; /** Friend queried */ FUniqueNetIdRailPtr FriendId; struct FRailGamePlayedInfo { /** Are we in a Rail Server (not implemented) */ bool bInServer; /** Are we in a Rail Room (not implemented) */ bool bInRoom; ///** Server Id */ //uint64 ServerId; ///** Room Id */ //uint64 RoomId; /** Id of the game being played */ rail::RailGameID GameId; /** Game state of the user */ rail::RailFriendPlayedGamePlayState GamePlayState; }; /** Array of games being played on the platform */ TArray GameInfos; }; /** * Delegate fired when FOnlineAsyncTaskRailQueryFriendPlayedGamesInfo completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailQueryFriendPlayedGamesComplete, const FQueryFriendPlayedGamesTaskResult& /*Result*/); /** * Get details about a friend playing games on the RailSDK * May contain an array of games information if the user has more than one open at the same time */ class FOnlineAsyncTaskRailQueryFriendPlayedGamesInfo : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailQueryFriendPlayedGamesInfo() = delete; FOnlineAsyncTaskRailQueryFriendPlayedGamesInfo(FOnlineSubsystemTencent* InSubsystem, const FUniqueNetIdRail& InUserId, const FOnOnlineAsyncTaskRailQueryFriendPlayedGamesComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailQueryFriendPlayedGamesInfo() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailQueryFriendPlayedGamesInfo bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventQueryFriendPlayedGamesResult(const rail::rail_event::RailFriendsQueryFriendPlayedGamesResult* PlayedGamesDetail); /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailQueryFriendPlayedGamesComplete CompletionDelegate; /** Task Result */ FQueryFriendPlayedGamesTaskResult TaskResult; }; /** * Result structure containing details reporting players that were played with */ struct FReportPlayedWithUsersTaskResult { /** Error information */ FOnlineError Error; /** Users reported */ TArray UsersReported; }; /** * Delegate fired when FOnlineAsyncTaskRailReportPlayedWithUsers completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailReportPlayedWithUsersComplete, const FReportPlayedWithUsersTaskResult& /*Result*/); /** * Report details about a players that have been seen over the course of a game */ class FOnlineAsyncTaskRailReportPlayedWithUsers : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailReportPlayedWithUsers() = delete; FOnlineAsyncTaskRailReportPlayedWithUsers(FOnlineSubsystemTencent* InSubsystem, const TArray& InUsersReported, const FOnOnlineAsyncTaskRailReportPlayedWithUsersComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailReportPlayedWithUsers() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailReportPlayedWithUsers bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventReportPlayedWithUsers(const rail::rail_event::RailFriendsReportPlayedWithUserListResult* PlayedGamesDetail); /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailReportPlayedWithUsersComplete CompletionDelegate; /** Task Result */ FReportPlayedWithUsersTaskResult TaskResult; }; /** * Result structure containing details of users last played with (not just friends) */ struct FQueryPlayedWithFriendsListTaskResult { /** Error information */ FOnlineError Error; /** Users reported */ TArray UsersPlayedWith; }; /** * Delegate fired when FOnlineAsyncTaskRailQueryPlayedWithFriendsList completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailQueryPlayedWithFriendsListComplete, const FQueryPlayedWithFriendsListTaskResult& /*Result*/); /** * Report details about users the local user has played with */ class FOnlineAsyncTaskRailQueryPlayedWithFriendsList : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailQueryPlayedWithFriendsList() = delete; FOnlineAsyncTaskRailQueryPlayedWithFriendsList(FOnlineSubsystemTencent* InSubsystem, const FOnOnlineAsyncTaskRailQueryPlayedWithFriendsListComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailQueryPlayedWithFriendsList() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailQueryPlayedWithFriendsList bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventPlayedWithFriendsList(const rail::rail_event::RailFriendsQueryPlayedWithFriendsListResult* PlayedFriendsList); /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailQueryPlayedWithFriendsListComplete CompletionDelegate; /** Task Result */ FQueryPlayedWithFriendsListTaskResult TaskResult; }; /** * Result structure containing details of the time a user was last seen */ struct FQueryPlayedWithFriendsTimeTaskResult { /** Error information */ FOnlineError Error; /** List of users to query */ TArray UserIds; /** Last seen info for a single player */ struct FRecentPlayers { FRecentPlayers() = delete; FRecentPlayers(const FUniqueNetIdRef InUserId, const FDateTime& InLastPlayed) : UserId(InUserId) , LastPlayed(InLastPlayed) { } FUniqueNetIdRef UserId; FDateTime LastPlayed; }; /** All users reported as being seen by this user */ TArray LastPlayedWithUsers; }; /** * Delegate fired when FOnlineAsyncTaskRailQueryPlayedWithFriendsList completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailQueryPlayedWithFriendsTimeComplete, const FQueryPlayedWithFriendsTimeTaskResult& /*Result*/); /** * Report details about users the local user has played with */ class FOnlineAsyncTaskRailQueryPlayedWithFriendsTime : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailQueryPlayedWithFriendsTime() = delete; FOnlineAsyncTaskRailQueryPlayedWithFriendsTime(FOnlineSubsystemTencent* InSubsystem, const TArray& InUserIds, const FOnOnlineAsyncTaskRailQueryPlayedWithFriendsTimeComplete& InCompletionDelegate); virtual ~FOnlineAsyncTaskRailQueryPlayedWithFriendsTime() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void Finalize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailQueryPlayedWithFriendsTime bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID event_id, rail::EventBase* param) override; //~ End IRailEvent interface protected: void OnRailEventPlayedWithFriendsTime(const rail::rail_event::RailFriendsQueryPlayedWithFriendsTimeResult* PlayedTimeResult); /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailQueryPlayedWithFriendsTimeComplete CompletionDelegate; /** Task Result */ FQueryPlayedWithFriendsTimeTaskResult TaskResult; }; /** * Result structure for requesting all receipts */ struct FRequestAllAssetsTaskResult { /** Error information */ FOnlineError Error; /** Purchase receipts */ FPurchaseReceipt PurchaseReceipt; }; /** * Delegate fired when FOnlineAsyncTaskRailQueryFriendPlayedGamesInfo completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailRequestAllAssetsComplete, const FRequestAllAssetsTaskResult& /*Result*/); class FOnlineAsyncTaskRailRequestAllAssets : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailRequestAllAssets() = delete; FOnlineAsyncTaskRailRequestAllAssets(FOnlineSubsystemTencent* InSubsystem, const FUniqueNetIdRef& InUserId, const FOnOnlineAsyncTaskRailRequestAllAssetsComplete& InCompletionDelegate) : FOnlineAsyncTaskRail(InSubsystem, {rail::kRailEventAssetsRequestAllAssetsFinished}) , UserId(InUserId) , CompletionDelegate(InCompletionDelegate) { } virtual ~FOnlineAsyncTaskRailRequestAllAssets() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailRequestAllAssets bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID EventId, rail::EventBase* Param) override; //~ End IRailEvent interface protected: void OnRailRequestAllAssetsFinished(const rail::rail_event::RequestAllAssetsFinished* AssetsResponse); /** User we are requesting assets for */ const FUniqueNetIdRef UserId; /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailRequestAllAssetsComplete CompletionDelegate; /** Task Result */ FRequestAllAssetsTaskResult TaskResult; }; class FOnlineAsyncEventRailAssetsChanged : public FOnlineAsyncEventRail { public: FOnlineAsyncEventRailAssetsChanged() = delete; FOnlineAsyncEventRailAssetsChanged(FOnlineSubsystemTencent* InSubsystem, const rail::rail_event::RailAssetsChanged* InParams); virtual ~FOnlineAsyncEventRailAssetsChanged() = default; //~ Begin FOnlineAsyncTask interface virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncEventRailAssetsChanged")); } //~ End FOnlineAsyncTask interface private: }; /** * Result structure for requesting all purchasable products */ struct FRequestAllPurchasableProductsTaskResult { /** Error information */ FOnlineError Error; /** Purchasable products */ TArray Offers; }; /** * Delegate fired when FOnlineAsyncTaskRailRequestAllPurchasableProducts completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailRequestAllPurchasableProductsComplete, const FRequestAllPurchasableProductsTaskResult& /*Result*/); class FOnlineAsyncTaskRailRequestAllPurchasableProducts : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailRequestAllPurchasableProducts() = delete; FOnlineAsyncTaskRailRequestAllPurchasableProducts(FOnlineSubsystemTencent* InSubsystem, const FOnOnlineAsyncTaskRailRequestAllPurchasableProductsComplete& InCompletionDelegate) : FOnlineAsyncTaskRail(InSubsystem, {rail::kRailEventInGamePurchaseAllPurchasableProductsInfoReceived}) , CompletionDelegate(InCompletionDelegate) { } virtual ~FOnlineAsyncTaskRailRequestAllPurchasableProducts() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailRequestAllPurchasableProducts bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID EventId, rail::EventBase* Param) override; //~ End IRailEvent interface protected: void OnRailRequestAllPurchasableProductsResponse(rail::rail_event::RailInGamePurchaseRequestAllPurchasableProductsResponse* Response); /** Result of the task */ FRequestAllPurchasableProductsTaskResult TaskResult; /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailRequestAllPurchasableProductsComplete CompletionDelegate; }; /** * Result structure for purchasing products */ struct FPurchaseProductsTaskResult { /** Error information */ FOnlineError Error; /** Purchase receipt, if successful */ TSharedPtr PurchaseReceipt; }; /** * Delegate fired when FOnlineAsyncTaskRailPurchaseProducts completes * * @param Result the result of the call */ DECLARE_DELEGATE_OneParam(FOnOnlineAsyncTaskRailPurchaseProductsComplete, const FPurchaseProductsTaskResult& /*Result*/); class FOnlineAsyncTaskRailPurchaseProducts : public FOnlineAsyncTaskRail { public: FOnlineAsyncTaskRailPurchaseProducts() = delete; FOnlineAsyncTaskRailPurchaseProducts(FOnlineSubsystemTencent* InSubsystem, const FUniqueNetIdRef& InUserId, const FPurchaseCheckoutRequest& InCheckoutRequest, const FOnOnlineAsyncTaskRailPurchaseProductsComplete& InCompletionDelegate) : FOnlineAsyncTaskRail(InSubsystem, {rail::kRailEventInGamePurchasePurchaseProductsToAssetsResult}) , UserId(InUserId) , CheckoutRequest(InCheckoutRequest) , CompletionDelegate(InCompletionDelegate) { // User will be in a dialog, allow the user to take their time. bCanTimeout = false; } virtual ~FOnlineAsyncTaskRailPurchaseProducts() { } //~ Begin FOnlineAsyncTask interface virtual void Initialize() override; virtual void TriggerDelegates() override; virtual FString ToString() const override { return FString::Printf(TEXT("FOnlineAsyncTaskRailPurchaseProducts bWasSuccessful: %d"), WasSuccessful()); } //~ End FOnlineAsyncTask interface //~ Begin IRailEvent interface virtual void OnRailEvent(rail::RAIL_EVENT_ID EventId, rail::EventBase* Param) override; //~ End IRailEvent interface protected: void OnRailPurchaseProductsToAssetsResult(rail::rail_event::RailInGamePurchasePurchaseProductsToAssetsResponse* Response); void HandlePurchaseProductsResult(const TOptional RailResult); /** User performing the purchase */ const FUniqueNetIdRef UserId; /** Items to purchase */ FPurchaseCheckoutRequest CheckoutRequest; /** Result of the task */ FPurchaseProductsTaskResult TaskResult; /** Delegate to fire on completion */ FOnOnlineAsyncTaskRailPurchaseProductsComplete CompletionDelegate; }; #endif // WITH_TENCENT_RAIL_SDK