5#include "VaRest/Public/VaRestSubsystem.h"
9#include "HeadMountedDisplayFunctionLibrary.h"
10#include "GenericPlatform/GenericPlatformMisc.h"
14#define Log(pmt, ...) UE_LOG(LogApexAPI, Log, TEXT(pmt), ##__VA_ARGS__)
15#define Warn(pmt, ...) UE_LOG(LogApexAPI, Warning, TEXT(pmt), ##__VA_ARGS__)
16#define Error(pmt, ...) UE_LOG(LogApexAPI, Error, TEXT(pmt), ##__VA_ARGS__)
17#define Fatal(pmt, ...) UE_LOG(LogApexAPI, Fatal, TEXT(pmt), ##__VA_ARGS__)
21 , ApexSettings(nullptr)
22 , LaunchToken(TEXT(
""))
39 Fatal(
"No URL available. Please set the Server URI in the settings.");
43 URL.RemoveFromEnd(
"/");
44 if (!
URL.Contains(
"https://"))
46 if (
URL.Contains(
"http://"))
48 URL =
URL.Replace(TEXT(
"http://"), TEXT(
""));
51 URL.InsertAt(0,
"https://");
63 FString URLBody, URLScheme;
92 Super::Initialize(Collection);
99 DeviceModel = UHeadMountedDisplayFunctionLibrary::GetHMDDeviceName().ToString();
101 if (
DeviceModel.Equals(
"None", ESearchCase::IgnoreCase))
105 DeviceId = FGenericPlatformMisc::GetDeviceId();
108 DeviceId = FGenericPlatformMisc::GetDeviceMakeAndModel();
119 ApexSocket->OnApexAuthenticateComplete().AddLambda([&](UVaRestJsonObject* LoginJsonObject) ->
void {
HandleLogin(LoginJsonObject); });
132 Log(
"Failed to find token.");
135 FString PassedLaunchToken;
136 if (FParse::Value(FCommandLine::Get(), TEXT(
"-PIXO_TOKEN="), PassedLaunchToken))
138 Log(
"Token found: %s.", *PassedLaunchToken);
161 Warn(
"Web Socket already connected.");
176 UVaRestRequestJSON* Request =
VaRestSubsystem->ConstructVaRestRequestExt(EVaRestRequestVerb::GET, EVaRestRequestContentType::none);
177 FString RequestURL =
URL +
"/ping";
178 Request->SetURL(RequestURL);
180 Request->OnStaticRequestComplete.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnPingComplete(Request); });
181 Request->OnStaticRequestFail.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnPingFail(Request); });
183 Request->ExecuteProcessRequest();
188 Log(
"On Ping Completed!");
195 Log(
"On Ping Failed!");
197 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
200 APEXFailedRequest.
FromJsonObject(ResponseObject->GetRootObject());
209 UVaRestRequestJSON* Request =
VaRestSubsystem->ConstructVaRestRequestExt(EVaRestRequestVerb::GET, EVaRestRequestContentType::none);
210 FString RequestURL =
URL +
"/v2/auth/validate-signature";
213 RequestURL = RequestURL.Replace(TEXT(
"modules."), TEXT(
""));
215 Request->SetURL(RequestURL);
216 Request->SetHeader(
"Authorization: Bearer",
LaunchToken);
218 Request->OnStaticRequestComplete.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnLoginComplete(Request); });
219 Request->OnStaticRequestFail.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnLoginFail(Request); });
221 Request->ExecuteProcessRequest();
229void UApexAPI::Login(
const FString& InUserName,
const FString& InPassword,
bool bShouldLogout)
236 UVaRestRequestJSON* Request =
VaRestSubsystem->ConstructVaRestRequestExt(EVaRestRequestVerb::POST, EVaRestRequestContentType::json);
237 FString RequestURL =
URL +
"/login";
238 Request->SetURL(RequestURL);
240 UVaRestJsonObject* LoginJson =
VaRestSubsystem->ConstructVaRestJsonObject();
241 LoginJson->SetField(
"login",
VaRestSubsystem->ConstructJsonValueString(InUserName));
242 LoginJson->SetField(
"password",
VaRestSubsystem->ConstructJsonValueString(InPassword));
244 Request->SetRequestObject(LoginJson);
246 Request->OnStaticRequestComplete.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnLoginComplete(Request); });
247 Request->OnStaticRequestFail.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnLoginFail(Request); });
249 Request->ExecuteProcessRequest();
265 bool FailedResponse =
true;
266 if (Request->GetResponseCode() == 200)
268 if (!Request->GetResponseObject()->GetRootObject()->HasField(
"Error"))
270 FailedResponse =
false;
283 Log(
"Login failed with response code %i", Request->GetResponseCode());
285 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
288 APEXFailedRequest.
FromJsonObject(ResponseObject->GetRootObject());
297 Log(
"Login Completed!");
300 Warn(
"Replacing the current login.");
311 if (RootJsonObject->HasField(
"User"))
313 return RootJsonObject->GetObjectField(
"User").ToSharedRef();
316 return RootJsonObject;
321 const UVaRestRequestJSON* DummyRequestJSON =
VaRestSubsystem->ConstructVaRestRequest();
333 APEXFailedRequest.
Error =
true;
334 APEXFailedRequest.
Message =
"No user currently logged in.";
336 UVaRestJsonObject* ResponseObject = DummyRequestJSON->GetResponseObject();
337 ResponseObject->SetBoolField(
"Error", APEXFailedRequest.
Error);
338 ResponseObject->SetStringField(
"Message", APEXFailedRequest.
Message);
347 bool FailedResponse =
true;
348 if (Request->GetResponseCode() == 200)
350 if (!Request->GetResponseObject()->GetRootObject()->HasField(
"Error"))
365 Log(
"Logout failed with response code %i", Request->GetResponseCode());
367 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
370 APEXFailedRequest.
FromJsonObject(ResponseObject->GetRootObject());
378 UVaRestRequestJSON* Request =
VaRestSubsystem->ConstructVaRestRequestExt(EVaRestRequestVerb::GET, EVaRestRequestContentType::none);
380 FString OptionalParameters = TEXT(
"");
382 if (!SerialNumber.IsEmpty())
384 OptionalParameters =
"?serial=" + SerialNumber;
385 Log(
"Serial number: %s", *SerialNumber);
388 FStringFormatOrderedArguments FormatArguments;
389 FormatArguments.Add(FStringFormatArg(
URL));
391 FormatArguments.Add(FStringFormatArg(InModuleId));
392 FormatArguments.Add(FStringFormatArg(OptionalParameters));
394 FString AccessURL = FString::Format(TEXT(
"{0}/access/user/{1}/module/{2}{3}"), FormatArguments);
395 Request->SetURL(AccessURL);
398 Request->OnStaticRequestComplete.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnUserVerificationComplete(Request); });
399 Request->OnStaticRequestFail.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnUserVerificationFail(Request); });
401 Request->ExecuteProcessRequest();
406 bool FailedResponse =
true;
407 if (Request->GetResponseCode() == 200)
409 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
410 if (!ResponseObject->GetRootObject()->HasField(
"error"))
412 Log(
"User Verification Completed!");
414 if (ResponseObject->HasField(
"access"))
416 FailedResponse = !ResponseObject->GetBoolField(
"access");
419 if (FailedResponse ==
false)
435 Log(
"User module access verification failed with response code %i", Request->GetResponseCode());
437 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
439 if (Request->GetResponseCode() == 200)
441 if (ResponseObject->GetRootObject()->HasField(
"access"))
443 APEXFailedRequest.
Error =
true;
444 APEXFailedRequest.
Message =
"User does not have access to this module.";
448 APEXFailedRequest.
FromJsonObject(ResponseObject->GetRootObject());
460 Error(
"Cannot join session with no active login.");
464 if (!InScenarioId.IsEmpty())
475 Error(
"Session is already in progress. The previous session didn't complete or a new session was started during an active session.");
496 Activity.
ID = FString::Format(TEXT(
"https://pixovr.com/xapi/objects/{0}/{1}"), IdFormat);
504 if (!InContextExtension.
IsEmpty())
506 ContextExtension.
Clone(InContextExtension);
509 Context.Extensions = ContextExtension;
511 Context.Extensions.AddString(
"device_id",
DeviceId);
512 Context.Extensions.AddString(
"device_model",
DeviceModel);
516 Context.Extensions.AddString(
"multiplayer",
"true");
519 Statement.
Actor = Actor;
520 Statement.
Verb = Verb;
521 Statement.
Target = Activity;
532 UVaRestRequestJSON* Request =
VaRestSubsystem->ConstructVaRestRequestExt(EVaRestRequestVerb::POST, EVaRestRequestContentType::json);
533 FString RequestURL =
URL +
"/event";
534 Request->SetURL(RequestURL);
537 UVaRestJsonObject* JoinSessionJson =
VaRestSubsystem->ConstructVaRestJsonObject();
538 JoinSessionJson->SetRootObject(JoinData.
ToJsonObject());
540 Request->SetRequestObject(JoinSessionJson);
542 Request->OnStaticRequestComplete.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnJoinSessionComplete(Request); });
543 Request->OnStaticRequestFail.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnJoinSessionFail(Request); });
545 Request->ExecuteProcessRequest();
552 Log(
"Session was successfully joined.");
553 if (Request->GetResponseCode() == 200)
555 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
569 Log(
"Failed to join session. %d", Request->GetResponseCode());
573 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
576 APEXFailedRequest.
FromJsonObject(ResponseObject->GetRootObject());
586 Error(
"Cannot complete session with no active login.");
592 Error(
"No current session in progress.");
621 Context.Extensions.AddString(
"device_id",
DeviceId);
622 Context.Extensions.AddString(
"device_model",
DeviceModel);
638 Statement.
Actor = Actor;
639 Statement.
Verb = Verb;
640 Statement.
Target = Activity;
642 Statement.
Result = Result;
653 UVaRestRequestJSON* Request =
VaRestSubsystem->ConstructVaRestRequestExt(EVaRestRequestVerb::POST, EVaRestRequestContentType::json);
654 FString RequestURL =
URL +
"/event";
655 Request->SetURL(RequestURL);
658 UVaRestJsonObject* CompleteSessionJson =
VaRestSubsystem->ConstructVaRestJsonObject();
659 CompleteSessionJson->SetRootObject(SessionData.
ToJsonObject());
661 Request->SetRequestObject(CompleteSessionJson);
663 Request->OnStaticRequestComplete.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnCompleteSessionComplete(Request); });
664 Request->OnStaticRequestFail.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnCompleteSessionFail(Request); });
666 Request->ExecuteProcessRequest();
673 Log(
"Session complete!");
682 Warn(
"Failed to complete session. %d", Request->GetResponseCode());
684 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
687 APEXFailedRequest.
FromJsonObject(ResponseObject->GetRootObject());
698 Error(
"Cannot complete session with no active login.");
704 Error(
"No current session in progress.");
710 Error(
"No event data to send.");
716 Warn(
"Actor data should not be filled out.");
721 Error(
"Verb missing from eventStatement.");
725 if (EventStatement.
Verb.
ID.IsEmpty())
727 Error(
"Verb ID missing from eventStatement.");
733 Error(
"Object (target) missing from eventStatement.");
755 UVaRestRequestJSON* Request =
VaRestSubsystem->ConstructVaRestRequestExt(EVaRestRequestVerb::POST, EVaRestRequestContentType::json);
756 FString RequestURL =
URL +
"/event";
757 Request->SetURL(RequestURL);
760 UVaRestJsonObject* CompleteSessionJson =
VaRestSubsystem->ConstructVaRestJsonObject();
761 CompleteSessionJson->SetRootObject(Event.
ToJsonObject());
763 Request->SetRequestObject(CompleteSessionJson);
765 Request->OnStaticRequestComplete.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnSendSessionEventComplete(Request); });
766 Request->OnStaticRequestFail.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnSendSessionEventFail(Request); });
768 Request->ExecuteProcessRequest();
775 Log(
"Session event was sent successfully.");
782 Warn(
"Failed to send session event. %d", Request->GetResponseCode());
784 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
787 APEXFailedRequest.
FromJsonObject(ResponseObject->GetRootObject());
805 return FetchTopTen(UserId, -1.f, Scenario, OrgUnit);
810 return FetchTopTen(-1, TimePriorToToday, Scenario, OrgUnit);
817 Error(
"Cannot complete session with no active login.");
821 UVaRestRequestJSON* Request =
VaRestSubsystem->ConstructVaRestRequestExt(EVaRestRequestVerb::GET, EVaRestRequestContentType::none);
822 FString URLFormat =
"{url}/analytics/top10/module/{moduleId}";
823 FStringFormatNamedArguments FormatArguments;
827 URLFormat +=
"/user/{userId}";
830 FString DataQueryFormat =
"?";
832 if (!Scenario.IsEmpty())
834 DataQueryFormat +=
"scenario={moduleId}/{scenario}&";
837 if (TimePriorToToday > 0.0f)
839 DataQueryFormat +=
"dateRange={dateRange}&";
844 DataQueryFormat +=
"orgUnit={orgUnit}&";
847 if (DataQueryFormat.EndsWith(
"&"))
849 DataQueryFormat.RemoveFromEnd(
"&");
852 URLFormat += DataQueryFormat;
854 FormatArguments.Add(
"url", FStringFormatArg(
URL));
855 FormatArguments.Add(
"moduleId", FStringFormatArg(
LoadedModuleId));
856 FormatArguments.Add(
"userId", FStringFormatArg(UserId));
857 FormatArguments.Add(
"dateRange", FStringFormatArg(TimePriorToToday));
858 FormatArguments.Add(
"scenario", FStringFormatArg(Scenario));
859 FormatArguments.Add(
"orgUnit", FStringFormatArg(OrgUnit));
860 FString AnalyticsURL = FString::Format(*URLFormat, FormatArguments);
861 Request->SetURL(AnalyticsURL);
864 Request->OnStaticRequestComplete.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnTopTenComplete(Request); });
865 Request->OnStaticRequestFail.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
OnTopTenFail(Request); });
867 Request->ExecuteProcessRequest();
874 bool FailedResponse =
true;
875 if (Request->GetResponseCode() == 200)
877 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
878 if (ResponseObject->HasField(
"error"))
880 if (UVaRestJsonValue* ErrorField = ResponseObject->GetField(
"error"))
882 if (ErrorField->GetType() == EVaJson::Boolean && !ErrorField->AsBool())
884 Log(
"Successfully fetched top ten data!");
887 FailedResponse =
false;
890 FetchedTopTenData.
FromJsonObject(ResponseObject->GetRootObject());
907 Log(
"Fetch Top Ten failed with response code %i", Request->GetResponseCode());
909 UVaRestJsonObject* ResponseObject = Request->GetResponseObject();
912 APEXFailedRequest.
FromJsonObject(ResponseObject->GetRootObject());
922 Error(
"Trying to send heartbeat without a valid session.");
929 UVaRestRequestJSON* Request =
VaRestSubsystem->ConstructVaRestRequestExt(EVaRestRequestVerb::POST, EVaRestRequestContentType::json);
930 FString RequestURL =
URL.Replace(TEXT(
"modules."), TEXT(
"")) +
"/heartbeat/pulse";
931 Request->SetURL(RequestURL);
934 UVaRestJsonObject* HeartbeatJson =
VaRestSubsystem->ConstructVaRestJsonObject();
935 HeartbeatJson->SetRootObject(HeartbeatEvent.
ToJsonObject());
937 Request->SetRequestObject(HeartbeatJson);
939 Request->OnStaticRequestComplete.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
Log(
"Heartbeat sent.") });
940 Request->OnStaticRequestFail.AddLambda([&](UVaRestRequestJSON* Request) ->
void {
Log(
"Failed to send heartbeat.") });
942 Request->ExecuteProcessRequest();
DEFINE_LOG_CATEGORY_STATIC(LogApexAPI, Log, All)
static bool IsAvailable()
UApexSDKSettings * GetSettings() const
static FApexSDKModule & Get()
bool SendSessionEvent(const FXAPIStatement &InStatement)
UFUNCTION(BlueprintCallable, Category = "Apex|API")
bool FetchTopTenByTimeRange(float TimePriorToToday, FString Scenario, int OrgUnit)
UFUNCTION(BlueprintCallable, Category = "Apex|API")
void OnLogoutComplete(const class UVaRestRequestJSON *Request)
bool IsLoggedIn()
UFUNCTION(BlueprintPure, BlueprintCallable, Category = "Apex|API")
void Login(const FString &InUserName, const FString &InPassword, bool bShouldLogout=true)
UFUNCTION(BlueprintCallable, Category = "Apex|API")
bool bWebSocketEnabled
UPROPERTY(BlueprintReadOnly)
bool CompleteSession(const FSessionData &InSessionData)
UFUNCTION(BlueprintCallable, Category = "Apex|API")
class UVaRestSubsystem * VaRestSubsystem
FOnStaticApexRequestFail OnStaticRequestFail
bool JoinSession(FString InScenarioId, const FXAPIExtension &InContextExtension, bool bIsMultiplayer=false)
UFUNCTION(BlueprintCallable, Category = "Apex|API")
FString Platform
UPROPERTY(BlueprintReadOnly)
void Ping()
UFUNCTION(BlueprintCallable, Category = "Apex|API")
class UPixoLauncherSubsystem * LauncherSubsystem
bool FetchTopTenByUser(int UserId, FString Scenario, int OrgUnit)
UFUNCTION(BlueprintCallable, Category = "Apex|API", meta=(DisplayName = "Fetch Top Ten By User"))
FOnStaticApexRequestComplete OnStaticRequestComplete
void OnTopTenFail(const class UVaRestRequestJSON *Request)
FOnStaticApexAuthCodeRetrieved OnStaticAuthorizationCodeRetrieved
void OnLoginComplete(const class UVaRestRequestJSON *Request)
void OnJoinSessionComplete(const class UVaRestRequestJSON *Request)
bool IsWebSocketConnected()
UFUNCTION(BlueprintCallable, Category = "Apex|API")
FOnApexRequestComplete OnRequestComplete
UPROPERTY(BlueprintAssignable, Category = "Apex|Event")
void HandleLogin(class UVaRestJsonObject *LoginJsonObject)
void ConnectWebSocketService()
UFUNCTION(BlueprintCallable, Category = "Apex|API", meta = (Tooltip = "This function only needs to be...
FTimerHandle HeartbeatHandle
bool HasLaunchAuthToken()
UFUNCTION(BlueprintPure, BlueprintCallable, Category = "Apex|API")
FGuid CurrentSessionGuid
UPROPERTY(BlueprintReadOnly)
void OnJoinSessionFail(const class UVaRestRequestJSON *Request)
FString ModuleVersion
UPROPERTY(BlueprintReadOnly)
FOnApexTopTenDataFail OnFetchTopTenFail
UPROPERTY(BlueprintAssignable, Category = "Apex|Event")
FOnApexWebSocketConnectFailed OnWebSocketConnectFailed
UPROPERTY(BlueprintAssignable, Category = "Apex|Event")
FOnApexRequestFail OnRequestFail
UPROPERTY(BlueprintAssignable, Category = "Apex|Event")
void SetupModuleSettings()
FOnApexWebSocketConnected OnWebSocketConnected
UPROPERTY(BlueprintAssignable, Category = "Apex|Event")
void OnSendSessionEventFail(const class UVaRestRequestJSON *Request)
void OnPingFail(const class UVaRestRequestJSON *Request)
void FilloutLaunchToken()
UFUNCTION(BlueprintCallable, Category = "Apex|API")
void OnLogoutFail(const class UVaRestRequestJSON *Request)
void OnSendSessionEventComplete(const class UVaRestRequestJSON *Request)
FOnStaticApexWebSocketDisconnected OnStaticWebSocketDisconnected
void RequestAuthorizationCode()
UFUNCTION(BlueprintCallable, Category = "Apex|API")
FOnApexTopTenDataComplete OnFetchTopTenComplete
UPROPERTY(BlueprintAssignable, Category = "Apex|Event")
virtual void Initialize(FSubsystemCollectionBase &Collection) override
void Logout()
UFUNCTION(BlueprintCallable, Category = "Apex|API")
FString WebSocketURL
The API Websocket URL.
FString ScenarioId
UPROPERTY(BlueprintReadOnly)
FOnStaticApexTopTenDataFail OnStaticFetchTopTenFail
TUniquePtr< ApexWebSocket > ApexSocket
FUserSessionData CurrentActiveLogin
UPROPERTY(BlueprintReadOnly)
void VerifyModuleAccess(int InModuleId)
UFUNCTION(BlueprintCallable, Category = "Apex|API")
bool FetchTopTen(FString Scenario, int OrgUnit)
UFUNCTION(BlueprintCallable, Category = "Apex|API")
class UApexSDKSettings * ApexSettings
FOnStaticApexTopTenDataComplete OnStaticFetchTopTenComplete
void OnUserVerificationComplete(const class UVaRestRequestJSON *Request)
FString DeviceModel
UPROPERTY(BlueprintReadOnly)
FOnApexAuthCodeRetrieved OnAuthorizationCodeRetrieved
UPROPERTY(BlueprintAssignable, Category = "Apex|Event")
void OnTopTenComplete(const class UVaRestRequestJSON *Request)
void OnPingComplete(const class UVaRestRequestJSON *Request)
TSharedRef< FJsonObject > GetUserJsonObject(TSharedRef< FJsonObject > &RootJsonObject)
int LoadedModuleId
UPROPERTY(BlueprintReadWrite, Meta=(DisplayName="Module Id"))
void LoginWithAuthToken()
UFUNCTION(BlueprintCallable, Category = "Apex|API")
FOnApexWebSocketDisconnected OnWebSocketDisconnected
UPROPERTY(BlueprintAssignable, Category = "Apex|Event")
FString DeviceId
UPROPERTY(BlueprintReadOnly)
void OnUserVerificationFail(const class UVaRestRequestJSON *Request)
void OnLoginFail(const class UVaRestRequestJSON *Request)
bool bSessionInProgress
UPROPERTY(BlueprintReadOnly)
void OnCompleteSessionFail(const class UVaRestRequestJSON *Request)
FOnStaticApexWebSocketConnectFailed OnStaticWebSocketConnectFailed
FOnStaticApexWebSocketConnected OnStaticWebSocketConnected
void OnCompleteSessionComplete(const class UVaRestRequestJSON *Request)
bool FetchTopTenByCurrentUser(FString Scenario)
UFUNCTION(BlueprintCallable, Category = "Apex|API", meta = (DisplayName = "Fetch Top Ten By User"))
bool CheckModuleVersion()
FString ModuleVersion
UPROPERTY(Config, EditAnywhere, Category = "Apex", meta = (DisplayName = "Module Version"))
int ModuleId
UPROPERTY(Config, EditAnywhere, Category = "Apex", meta = (DisplayName = "Module ID"))
FString ServerURI
UPROPERTY(Config, EditAnywhere, Category = "Apex")
UCLASS(BlueprintType, Blueprintable, DisplayName = "PixoVR Launcher")
FString GetDeviceSerialNumber()
UFUNCTION(BlueprintCallable, Category = "PixoVR|Launcher")
FString GetApplicationExtra(const FString &ExtraKey)
UFUNCTION(BlueprintCallable, Category = "PixoVR|Launcher")
static const FString PIXOVR_SESSION_JOINED
static const FString PIXOVR_SESSION_EVENT
static const FString PIXOVR_SESSION_COMPLETE
static const FString MODULE_IDS
static const FString COMPLETED_SESSION
static const FString JOINED_SESSION
FString Message
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Failed Request")
bool Error
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Failed Request")
virtual void FromJsonObject(const TSharedPtr< FJsonObject > &JObject) override
FString Uuid
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Complete Session")
int ModuleId
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Complete Session")
FString DeviceId
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Complete Session")
FXAPIStatement JsonData
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Complete Session")
FString EventType
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Complete Session")
virtual TSharedPtr< FJsonObject > ToJsonObject() const override
virtual TSharedPtr< FJsonObject > ToJsonObject() const override
int SessionId
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PixoVR|Hearbeat Event")
virtual TSharedPtr< FJsonObject > ToJsonObject() const
FString IpAddress
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Join Session")
FString DeviceId
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Join Session")
int ModuleId
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Join Session")
FXAPIStatement JsonData
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Join Session")
FString Uuid
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Join Session")
FString EventType
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Join Session")
virtual void FromJsonObject(const TSharedPtr< FJsonObject > &JObject) override
int SessionId
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PixoVR|Platform|Session")
bool Complete
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Data")
float Score
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Data")
float ScoreMin
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Data")
float ScoreScaled
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Data")
float ScoreMax
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Data")
int Duration
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Data")
FXAPIExtension AdditionalContextData
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Data")
FXAPIExtension AdditionalResultData
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Data")
bool Success
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Data")
virtual TSharedPtr< FJsonObject > ToJsonObject() const override
FString DeviceId
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Event")
FXAPIStatement JsonData
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Event")
int ModuleId
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Event")
FString EventType
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Event")
FString Uuid
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|Session Event")
virtual void FromJsonObject(const TSharedPtr< FJsonObject > &JObject) override
virtual void FromJsonObject(const TSharedPtr< FJsonObject > &JObject) override
int ID
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|User Session Data")
FString FirstName
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|User Session Data")
int OrgUnit
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|User Session Data")
FString Email
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|User Session Data")
FString LastName
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|User Session Data")
FString SessionToken
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|User Session Data")
FString ID
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Activity")
virtual bool IsEmpty() const override
virtual bool IsEmpty() const override
FString MBox
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Agent")
FString Name
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Agent")
FString Revision
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Context")
FGuid Registration
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Context")
FXAPIExtension Extensions
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Context")
FString Platform
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Context")
void Clone(const FXAPIExtension &InExtension)
TSharedPtr< FJsonValue > & AddString(FString InKey, const FString &InValue)
TSharedPtr< FJsonValue > & AddCustomString(FString InKey, const FString &InValue)
virtual bool IsEmpty() const override
FString Add(FString InLanguage, FString InValue)
TOptional< FTimespan > Duration
FXAPIScore Score
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Result")
TOptional< bool > Success
TOptional< bool > Completion
FXAPIExtension Extensions
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Result")
FOptionalFloat Max
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Score")
FOptionalFloat Min
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Score")
FOptionalFloat Scaled
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Score")
FOptionalFloat Raw
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Score")
FXAPIAgent Actor
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Statement")
FXAPIResult Result
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Statement")
FXAPIContext Context
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Statement")
FXAPIVerb Verb
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Statement")
FXAPIActivity Target
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Statement")
virtual bool IsEmpty() const override
FString ID
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Verb")
FXAPILanguageMap Display
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Apex|XAPI|Verb")
virtual bool IsEmpty() const override