// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Delegates/Delegate.h" #include "Online/CoreOnlineFwd.h" #include "OnlineKeyValuePair.h" struct FDateTime; struct FTimespan; ONLINESUBSYSTEM_API DECLARE_LOG_CATEGORY_EXTERN(LogOnlineTournament, Display, All); #define UE_LOG_ONLINE_TOURNAMENT(Verbosity, Format, ...) \ { \ UE_LOG(LogOnlineTournament, Verbosity, TEXT("%s%s"), ONLINE_LOG_PREFIX, *FString::Printf(Format, ##__VA_ARGS__)); \ } #define UE_CLOG_ONLINE_TOURNAMENT(Conditional, Verbosity, Format, ...) \ { \ UE_CLOG(Conditional, LogOnlineTournament, Verbosity, TEXT("%s%s"), ONLINE_LOG_PREFIX, *FString::Printf(Format, ##__VA_ARGS__)); \ } struct FOnlineError; /** UniqueNetId of a tournament */ using FOnlineTournamentId = FUniqueNetId; using FOnlineTournamentIdRef = FUniqueNetIdRef; using FOnlineTournamentIdPtr = FUniqueNetIdPtr; /** UniqueNetId of a match in a tournament */ using FOnlineTournamentMatchId = FUniqueNetId; using FOnlineTournamentMatchIdRef = FUniqueNetIdRef; using FOnlineTournamentMatchIdPtr = FUniqueNetIdPtr; /** UniqueNetId of a participant (Player or team) in a tournament */ using FOnlineTournamentParticipantId = FUniqueNetId; using FOnlineTournamentParticipantIdRef = FUniqueNetIdRef; using FOnlineTournamentParticipantIdPtr = FUniqueNetIdPtr; /** UniqueNetId of a team in a tournament */ using FOnlineTournamentTeamId = FUniqueNetId; using FOnlineTournamentTeamIdRef = FUniqueNetIdRef; using FOnlineTournamentTeamIdPtr = FUniqueNetIdPtr; /** * What format the tournament is being run as */ enum class EOnlineTournamentFormat : uint8 { /** The tournament is being run in the single elimination format */ SingleElimination, /** The tournament is being run in the double elimination format */ DoubleElimination, /** The tournament is being run in the swiss format */ Swiss, /** The tournament is being run in the round-robin format */ RoundRobin, /** The tournament is being run in a custom format */ Custom }; inline void LexFromString(TOptional& Format, const TCHAR* const String) { if (FCString::Stricmp(String, TEXT("SingleElimination")) == 0) { Format = EOnlineTournamentFormat::SingleElimination; } else if (FCString::Stricmp(String, TEXT("DoubleElimination")) == 0) { Format = EOnlineTournamentFormat::DoubleElimination; } else if (FCString::Stricmp(String, TEXT("Swiss")) == 0) { Format = EOnlineTournamentFormat::Swiss; } else if (FCString::Stricmp(String, TEXT("RoundRobin")) == 0) { Format = EOnlineTournamentFormat::RoundRobin; } else if (FCString::Stricmp(String, TEXT("Custom")) == 0) { Format = EOnlineTournamentFormat::Custom; } else { Format = TOptional(); } } inline FString LexToString(const EOnlineTournamentFormat Format) { switch (Format) { case EOnlineTournamentFormat::SingleElimination: return TEXT("SingleElimination"); case EOnlineTournamentFormat::DoubleElimination: return TEXT("DoubleElimination"); case EOnlineTournamentFormat::Swiss: return TEXT("Swiss"); case EOnlineTournamentFormat::RoundRobin: return TEXT("RoundRobin"); case EOnlineTournamentFormat::Custom: return TEXT("Custom"); } checkNoEntry(); return FString(); } /** * What state the tournament is currently in */ enum class EOnlineTournamentState : uint8 { /** The tournament has been created, but participants may not be registered yet */ Created, /** The tournament is now open for registration */ OpenRegistration, /** The tournament registration has now closed, but the tournament has not started yet */ ClosedRegistration, /** The tournament is now in progress */ InProgress, /** The tournament has now finished and all results are finalized */ Finished, /** The tournament was cancelled */ Cancelled }; inline void LexFromString(TOptional& State, const TCHAR* const String) { if (FCString::Stricmp(String, TEXT("Created")) == 0) { State = EOnlineTournamentState::Created; } else if (FCString::Stricmp(String, TEXT("OpenRegistration")) == 0) { State = EOnlineTournamentState::OpenRegistration; } else if (FCString::Stricmp(String, TEXT("ClosedRegistration")) == 0) { State = EOnlineTournamentState::ClosedRegistration; } else if (FCString::Stricmp(String, TEXT("InProgress")) == 0) { State = EOnlineTournamentState::InProgress; } else if (FCString::Stricmp(String, TEXT("Finished")) == 0) { State = EOnlineTournamentState::Finished; } else if (FCString::Stricmp(String, TEXT("Cancelled")) == 0) { State = EOnlineTournamentState::Cancelled; } else { State = TOptional(); } } inline FString LexToString(const EOnlineTournamentState State) { switch (State) { case EOnlineTournamentState::Created: return TEXT("Created"); case EOnlineTournamentState::OpenRegistration: return TEXT("OpenRegistration"); case EOnlineTournamentState::ClosedRegistration: return TEXT("ClosedRegistration"); case EOnlineTournamentState::InProgress: return TEXT("InProgress"); case EOnlineTournamentState::Finished: return TEXT("Finished"); case EOnlineTournamentState::Cancelled: return TEXT("Cancelled"); } checkNoEntry(); return FString(); } /** * What participant format does this tournament support? */ enum class EOnlineTournamentParticipantType : uint8 { /** The tournament has individual players facing each other */ Individual, /** The tournament has teams facing other teams */ Team }; inline void LexFromString(TOptional& State, const TCHAR* const String) { if (FCString::Stricmp(String, TEXT("Individual")) == 0) { State = EOnlineTournamentParticipantType::Individual; } else if (FCString::Stricmp(String, TEXT("Team")) == 0) { State = EOnlineTournamentParticipantType::Team; } else { State = TOptional(); } } inline FString LexToString(const EOnlineTournamentParticipantType ParticipantType) { switch (ParticipantType) { case EOnlineTournamentParticipantType::Individual: return TEXT("Individual"); case EOnlineTournamentParticipantType::Team: return TEXT("Team"); } checkNoEntry(); return FString(); } /** * Filters to use when querying for tournament information. * * Some of these fields may be required, depending on the backing online system. Some fields * may not be specified if other fields are specified, depending on the backing online system. */ struct FOnlineTournamentQueryFilter { /** What direction to sort these results by (useful when specifying limits and offsetts)*/ enum class EOnlineTournamentSortDirection : uint8 { /** Results will be sorted in Ascending order */ Ascending, /** Results will be sorted in Descending order */ Descending }; /** Filter tournament information that does not match this participant type */ TOptional ParticipantType; /** Filter tournament information that does not match this tournament format */ TOptional Format; /** Only include tournament information that includes this team (on team tournaments) */ TOptional TeamId; /** Only include tournament information that includes this player */ TOptional PlayerId; /** Limit the results to this many entries */ TOptional Limit; /** Start the results this many entries in */ TOptional Offset; /** Sort the results in this direction */ TOptional SortDirection; }; /** * Details about a participant and their current score */ struct FOnlineTournamentScore { virtual ~FOnlineTournamentScore() = default; FOnlineTournamentScore(const FOnlineTournamentParticipantIdRef& InParticipantId, const EOnlineTournamentParticipantType InParticipantType, const FVariantData& InScore) : ParticipantId(InParticipantId) , ParticipantType(InParticipantType) , Score(InScore) { } /** The ParticipantId who achieved Score */ FOnlineTournamentParticipantIdRef ParticipantId; /** The type of participant this is */ EOnlineTournamentParticipantType ParticipantType; /** The score for this participant */ FVariantData Score; }; /** * The results of a match */ struct FOnlineTournamentMatchResults { struct FOnlineTournamentScreenshotData { FOnlineTournamentScreenshotData(const FString& InScreenshotFormat, const TArray& InScreenshotData) : ScreenshotFormat(InScreenshotFormat) , ScreenshotData(InScreenshotData) { } FOnlineTournamentScreenshotData(FString&& InScreenshotFormat, TArray&& InScreenshotData) : ScreenshotFormat(MoveTemp(InScreenshotFormat)) , ScreenshotData(MoveTemp(InScreenshotData)) { } /** The format of the screenshot stored in ScreenshotData */ FString ScreenshotFormat; /** Raw bytes of a screenshot in the ScreenshotFormat format */ TArray ScreenshotData; }; /** Score data to submit */ TArray ScoresToSubmit; /** Optiona notes about a score */ TOptional Notes; /** Optional screenshot data for proof of a score */ TOptional Screenshot; }; /** * The details of a team in a tournament */ struct IOnlineTournamentTeamDetails : public TSharedFromThis { virtual ~IOnlineTournamentTeamDetails() = default; /** Get the TeamId of this team */ virtual FOnlineTournamentTeamIdRef GetTeamId() const = 0; /** Get the player ids of this team (if they are known) */ virtual TOptional> GetPlayerIds() const = 0; /** Get the display name of this Team */ virtual FString GetDisplayName() const = 0; /** Get an attribute for this team (varies by online platform) */ virtual TOptional GetAttribute(const FName AttributeName) const = 0; }; /** * Filters to use when querying for participant information. */ struct FOnlineTournamentParticipantQueryFilter { FOnlineTournamentParticipantQueryFilter(const EOnlineTournamentParticipantType InParticipantType) : ParticipantType(InParticipantType) { } EOnlineTournamentParticipantType ParticipantType; TOptional Limit; TOptional Offset; }; enum class EOnlineTournamentParticipantState : uint8 { /** The participant has registered for the upcoming event */ Registered, /** The participant has checked into the event and are ready to play */ CheckedIn, /** The participant was present for the past event */ Present, /** The participant was not present for the past event */ Absent }; inline void LexFromString(TOptional& State, const TCHAR* const String) { if (FCString::Stricmp(String, TEXT("Registered")) == 0) { State = EOnlineTournamentParticipantState::Registered; } else if (FCString::Stricmp(String, TEXT("CheckedIn")) == 0) { State = EOnlineTournamentParticipantState::CheckedIn; } else if (FCString::Stricmp(String, TEXT("Present")) == 0) { State = EOnlineTournamentParticipantState::Present; } else if (FCString::Stricmp(String, TEXT("Absent")) == 0) { State = EOnlineTournamentParticipantState::Absent; } else { State = TOptional(); } } inline FString LexToString(const EOnlineTournamentParticipantState ParticipantType) { switch (ParticipantType) { case EOnlineTournamentParticipantState::Registered: return TEXT("Registered"); case EOnlineTournamentParticipantState::CheckedIn: return TEXT("CheckedIn"); case EOnlineTournamentParticipantState::Present: return TEXT("Present"); case EOnlineTournamentParticipantState::Absent: return TEXT("Absent"); } checkNoEntry(); return FString(); } /** * The tournament-specific details of a participant in a tournament */ struct IOnlineTournamentParticipantDetails : public TSharedFromThis { virtual ~IOnlineTournamentParticipantDetails() = default; /** Get the Tournament ID this participant is from */ virtual FOnlineTournamentIdRef GetTournamentId() const = 0; /** Get the Player ID of this tournament participant (if applicable) */ virtual FUniqueNetIdPtr GetPlayerId() const = 0; /** Get the Team ID of this tournament participant (if applicable) */ virtual FOnlineTournamentTeamIdPtr GetTeamId() const = 0; /** Get the display name of this participant */ virtual const FString& GetDisplayName() const = 0; /** Get the current state of the tournament participant */ virtual EOnlineTournamentParticipantState GetState() const = 0; /** Get the current position of this tournament participant (if applicable) */ virtual TOptional GetPosition() const = 0; /** Get the current score of this tournament participant (if applicable) */ virtual TOptional GetScore() const = 0; /** Get meta-data for this participant (varies based on online platform) */ virtual TOptional GetAttribute(const FName AttributeName) const = 0; }; /** * States this match can be in */ enum class EOnlineTournamentMatchState : uint8 { Created, InProgress, Finished }; inline void LexFromString(TOptional& State, const TCHAR* const String) { if (FCString::Stricmp(String, TEXT("Created")) == 0) { State = EOnlineTournamentMatchState::Created; } else if (FCString::Stricmp(String, TEXT("InProgress")) == 0) { State = EOnlineTournamentMatchState::InProgress; } else if (FCString::Stricmp(String, TEXT("Finished")) == 0) { State = EOnlineTournamentMatchState::Finished; } else { State = TOptional(); } } inline FString LexToString(const EOnlineTournamentMatchState ParticipantType) { switch (ParticipantType) { case EOnlineTournamentMatchState::Created: return TEXT("Created"); case EOnlineTournamentMatchState::InProgress: return TEXT("InProgress"); case EOnlineTournamentMatchState::Finished: return TEXT("Finished"); } checkNoEntry(); return FString(); } /** * The details of a match */ struct IOnlineTournamentMatchDetails : public TSharedFromThis { virtual ~IOnlineTournamentMatchDetails() = default; /** Get the MatchId for this match*/ virtual FOnlineTournamentMatchIdRef GetMatchId() const = 0; /** Get the type of participants for this match */ virtual EOnlineTournamentParticipantType GetParticipantType() const = 0; /** Get the current state of this match */ virtual EOnlineTournamentMatchState GetMatchState() const = 0; /** Get the bracket of this match */ virtual TOptional GetBracket() const = 0; /** Get the round of this match */ virtual TOptional GetRound() const = 0; /** Get the start time of this match in UTC */ virtual TOptional GetStartDateUTC() const = 0; /** Get the array of participants for this match */ virtual TArray> GetParticipants() const = 0; /** Get meta-data for this match (varies based on online platform) */ virtual TOptional GetAttribute(const FName AttributeName) const = 0; }; /** * The details of a tournament */ struct IOnlineTournamentDetails : public TSharedFromThis { virtual ~IOnlineTournamentDetails() = default; /** Get the Tournament ID for this tournament */ virtual FOnlineTournamentIdRef GetTournamentId() const = 0; /** Get the Title for this tournament */ virtual const FString& GetTitle() const = 0; /** Get the Description for this tournament */ virtual const FString& GetDescription() const = 0; /** Get the current state of this tournament */ virtual EOnlineTournamentState GetState() const = 0; /** Get the the format of this tournament */ virtual EOnlineTournamentFormat GetFormat() const = 0; /** Get the type of participants that are involved in this tournament */ virtual EOnlineTournamentParticipantType GetParticipantType() const = 0; /** Get the list of Participant IDs for this tournament if known */ virtual const TArray>& GetParticipants() const = 0; /** Get the registration start time of this tournament in UTC */ virtual TOptional GetRegistrationStartDateUTC() const = 0; /** Get the registration end time of this tournament in UTC */ virtual TOptional GetRegistrationEndDateUTC() const = 0; /** Get the start time of this tournament in UTC */ virtual TOptional GetStartDateUTC() const = 0; /** Get the check-in time of this tournament in UTC */ virtual TOptional GetCheckInTimespan() const = 0; /** Get the end time of this tournament in UTC */ virtual TOptional GetEndDateUTC() const = 0; /** Get the last time in UTC this tournament's details were updated */ virtual TOptional GetLastUpdatedDateUTC() const = 0; /** Does this tournament require a premium subscription to participate in? */ virtual TOptional RequiresPremiumSubscription() const = 0; /** Get meta-data for this tournament (varies based on online platform) */ virtual TOptional GetAttribute(const FName AttributeName) const = 0; }; /** * A delegate for when a tournament list has finished being queried. * * @param ResultStatus The result of the query * @param TournamentIds An optional array of Tournament IDs */ DECLARE_DELEGATE_TwoParams(FOnlineTournamentQueryTournamentListComplete, const FOnlineError& /*ResultStatus*/, const TOptional>& /*TournamentIds*/); /** * A delegate for when tournament details have finished being queried. * * @param ResultStatus The result of the query * @param TournamentDetails An optional array of Tournament Details */ DECLARE_DELEGATE_TwoParams(FOnlineTournamentQueryTournamentDetailsComplete, const FOnlineError& /*ResultStatus*/, const TOptional>>& /*TournamentDetails*/); /** * A delegate for when a match list has finished being queried. * * @param ResultStatus The result of the query * @param MatchIds An optional array of Match Ids */ DECLARE_DELEGATE_TwoParams(FOnlineTournamentQueryMatchListComplete, const FOnlineError& /*ResultStatus*/, const TOptional>& /*MatchIds*/); /** * A delegate for when match details have finished being queried. * * @param ResultStatus The result of the query * @param MatchDetails An optional array of Match Details */ DECLARE_DELEGATE_TwoParams(FOnlineTournamentQueryMatchDetailsComplete, const FOnlineError& /*ResultStatus*/, const TOptional>>& /*MatchDetails*/); /** * A delegate for when participant lists have finished being queried. * * @param ResultStatus The result of the query * @param TotalResults Total possible results there are to be queried * @param ParticipantList An optional array of Participant Details */ DECLARE_DELEGATE_ThreeParams(FOnlineTournamentQueryParticipantListComplete, const FOnlineError& /*ResultStatus*/, const TOptional /*TotalResults*/, const TOptional>>& /*ParticipantList*/); /** * A delegate for when team details have finished being queried. * * @param ResultStatus The result of the query * @param TeamDetails An optional array of Team Details */ DECLARE_DELEGATE_TwoParams(FOnlineTournamentQueryTeamDetailsComplete, const FOnlineError& /*ResultStatus*/, const TOptional>>& /*TeamDetails*/); /** * A delegate for when match results have finished being submitted. * * @param ResultStatus The result of the query */ DECLARE_DELEGATE_OneParam(FOnlineTournamentSubmitMatchResultsComplete, const FOnlineError& /*ResultStatus*/); using FAdditionalMetaDataMap = TMap; /** * A delegate for when a tournament has been joined * * @param UserId The user who joined the tournament * @param TournamentId The ID of the tournament joined * @param AdditonalData A map of additional platform-specific data that was provided when this event was triggered */ DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnOnlineTournamentTournamentJoined, const FUniqueNetIdRef /*UserId*/, const FOnlineTournamentIdRef /*TournamentId*/, const FAdditionalMetaDataMap& /*AdditionalData*/); using FOnOnlineTournamentTournamentJoinedDelegate = FOnOnlineTournamentTournamentJoined::FDelegate; /** * A delegate for when a tournament has been joined * * @param UserId The user who joined the tournament * @param MatchId The ID of the match joined * @param AdditonalData A map of additional platform-specific data that was provided when this event was triggered */ DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnOnlineTournamentMatchJoined, const FUniqueNetIdRef /*UserId*/, const FOnlineTournamentMatchIdRef /*MatchId*/, const FAdditionalMetaDataMap& /*AdditionalData*/); using FOnOnlineTournamentMatchJoinedDelegate = FOnOnlineTournamentMatchJoined::FDelegate; /** * Interface to handle requesting and submitting information related to tournaments */ class IOnlineTournament : public TSharedFromThis { public: virtual ~IOnlineTournament() = default; /** * Query a list of tournaments available for a user using specified filters. * * @param UserId The User to query tournaments as * @param QueryFilter The filter to user to include/exclude tournaments from the list. One or more options MAY be required, depending on the online platform. * @param Delegate A delegate that is called when our tournament list query is complete */ virtual void QueryTournamentList(const FUniqueNetIdRef UserId, const FOnlineTournamentQueryFilter& QueryFilter, const FOnlineTournamentQueryTournamentListComplete& Delegate) = 0; /** * Get a list of all Tournament IDs that have been queried by the specified user. * * @param UserId A User who previously queried tournaments * @return If previously queried by this user, an array of results from the query. */ virtual TArray GetTournamentList(const FUniqueNetIdRef UserId) const = 0; /** * Query tournament details from the perspective of the specified user. * * @param UserId A User to query tournament details as * @param TournamentIds An array of Tournament IDs to get more information about * @param Delegate A delegate that is called when our tournament details query is complete */ virtual void QueryTournamentDetails(const FUniqueNetIdRef UserId, const TArray& TournamentIds, const FOnlineTournamentQueryTournamentDetailsComplete& Delegate) = 0; /** * Get a tournament details result for a tournament that had been previously queried by the specified user. * * @param UserId A User who previously queried the tournament * @param TournamentId The Tournament ID that previously had details queried by UserId * @return If this tournament was previously queried by this user, the result from the query. */ virtual TSharedPtr GetTournamentDetails(const FUniqueNetIdRef UserId, const FOnlineTournamentIdRef TournamentId) const = 0; /** * Get tournament detail results for specified tournaments that have been previously queried by the specified user. * * @param UserId A User who previously queried tournaments * @param TournamentId The Tournament ID that previously had details queried by UserId * @return If tournaments have been previously queried by this user, any matching tournaments from the results are of those queries. */ virtual TArray> GetTournamentDetails(const FUniqueNetIdRef UserId, const TArray& TournamentIds) const = 0; /** * Query a list of matches for a tournament from the perspective of the specified user. * * @param UserId A User to query match details as * @param TournamentId The Tournament ID to get Match IDs from * @param Delegate A delegate that is called when our match list query is complete */ virtual void QueryMatchList(const FUniqueNetIdRef UserId, const FOnlineTournamentIdRef TournamentId, const FOnlineTournamentQueryMatchListComplete& Delegate) = 0; /** * Get match detail results for that have been previously queried by the specified user. * * @param UserId A User who previously queried match results * @param TournamentId The Tournament ID that previously had match results queried by UserId * @return If tournaments have been previously queried by this user, all results of those queries. */ virtual TArray GetMatchList(const FUniqueNetIdRef UserId, const FOnlineTournamentIdRef TournamentId) const = 0; /** * Query match details for a tournament from the perspective of the specified user. * * @param UserId The User to query match details * @param MatchId The Match IDs to get more information about * @param Delegate A delegate that is called when our match details query is complete */ virtual void QueryMatchDetails(const FUniqueNetIdRef UserId, const TArray& MatchIds, const FOnlineTournamentQueryMatchDetailsComplete& Delegate) = 0; /** * Get a match's details that have been previously queried by the specified user. * * @param UserId A User who previously queried the match * @param MatchId The Match ID that previously had details queried by UserId * @return If this match has been previously queried by this user, the result is of that query. */ virtual TSharedPtr GetMatchDetails(const FUniqueNetIdRef UserId, const FOnlineTournamentMatchIdRef MatchId) const = 0; /** * Get match details that have been previously queried by the specified user. * * @param UserId A User who previously queried matches * @param MatchIds Match ids that previously had details queried by UserId * @return If matches have been previously queried by this user, any matching matches from the results are of those queries. */ virtual TArray> GetMatchDetails(const FUniqueNetIdRef UserId, const TArray& MatchIds) const = 0; /** * Query a list of participants for a tournament from the perspective of the specified user. * * It is valid to request Team IDs or Player IDs from a Team tournament, and it is only valid to request Player IDs from an Individual tournament. * * @param UserId A User to query Participant IDs as * @param TournamentId The Tournament ID to get Participant IDs from * @param QueryFilter Filter to use to query participants. * @param Delegate A delegate that is called when our match list query is complete */ virtual void QueryParticipantList(const FUniqueNetIdRef UserId, const FOnlineTournamentIdRef TournamentId, const FOnlineTournamentParticipantQueryFilter& QueryFilter, const FOnlineTournamentQueryParticipantListComplete& Delegate) = 0; /** * Get Participant details that have been previously queried by the specified user. * * @param UserId A User who previously queried participants * @param TournamentId The Tournament ID that previously had participants queried by UserId * @param ParticipantType The type of IDs to return from this tournament. This type must have been previously queried. * @return If results have previously previously been queried by this user, the results of that query. */ virtual TArray> GetParticipantList(const FUniqueNetIdRef UserId, const FOnlineTournamentIdRef TournamentId, const EOnlineTournamentParticipantType ParticipantType) const = 0; /** * Query team details from the perspective of the specified user. * * @param UserId A User to query team details as * @param TeamId The Team IDs to get more information about * @param Delegate A delegate that is called when our team details query is complete */ virtual void QueryTeamDetails(const FUniqueNetIdRef UserId, const TArray& TeamIds, const FOnlineTournamentQueryTeamDetailsComplete& Delegate) = 0; /** * Get a teams's details that have been previously queried by the specified user. * * @param UserId A User who previously queried the team * @param TeamId The Team ID that previously had details queried by UserId * @return If this team has been previously queried by this user, the result is of that query. */ virtual TSharedPtr GetTeamDetails(const FUniqueNetIdRef UserId, const FOnlineTournamentTeamIdRef TeamId) const = 0; /** * Get team details that have been previously queried by the specified user. * * @param UserId A User who previously queried teams * @param TeamIds The Team ID that previously had details queried by UserId * @return If teams have been previously queried by this user, any matching teams from the results are of those queries. */ virtual TArray> GetTeamDetails(const FUniqueNetIdRef UserId, const TArray& TeamIds) const = 0; /** * Submit match results for a tournament match. * * @param UserId The User to report match results for * @param MatchId The Match Id to report match results for * @param MatchResults The results of the match * @param Delegate A delegate that is called when our match stats submissions is complete */ virtual void SubmitMatchResults(const FUniqueNetIdRef UserId, const FOnlineTournamentMatchIdRef MatchId, const FOnlineTournamentMatchResults& MatchResults, const FOnlineTournamentSubmitMatchResultsComplete& Delegate) = 0; /** * Register for updates when a tournament has been joined * * @param Delegate Delegate to be called when a tournament has been joined */ virtual FDelegateHandle AddOnOnlineTournamentTournamentJoined(const FOnOnlineTournamentTournamentJoinedDelegate& Delegate) = 0; /** * Unregister for tournament join updates using a previously-registered delegate handle * * @param DelegateHandle Delegate handle that was previously registered */ virtual void RemoveOnOnlineTournamentTournamentJoined(const FDelegateHandle& DelegateHandle) = 0; /** * Register for updates when a tournament match has been joined * * @param Delegate Delegate to be called when a tournament match has been joined */ virtual FDelegateHandle AddOnOnlineTournamentMatchJoinedDelegate(const FOnOnlineTournamentMatchJoinedDelegate& Delegate) = 0; /** * Unregister for tournament match join updates using a previously-registered delegate handle * * @param DelegateHandle Delegate handle that was previously registered */ virtual void RemoveOnOnlineTournamentMatchJoinedDelegate(const FDelegateHandle& DelegateHandle) = 0; #if !UE_BUILD_SHIPPING /** Print all cached tournament information into the logs */ virtual void DumpCachedTournamentInfo(const FUniqueNetIdRef UserId) const = 0; /** Print all cached match information into the logs */ virtual void DumpCachedMatchInfo(const FUniqueNetIdRef UserId) const = 0; /** Print all cached participant information into the logs */ virtual void DumpCachedParticipantInfo(const FUniqueNetIdRef UserId) const = 0; /** Print all cached team information into the logs */ virtual void DumpCachedTeamInfo(const FUniqueNetIdRef UserId) const = 0; #endif // !UE_BUILD_SHIPPING };