2 Commits

Author SHA1 Message Date
Norman Lansing
102a514afa Lesson 66 - Displaying Fleet Data 2026-03-30 21:39:09 -04:00
Norman Lansing
41d61d883a Lesson 65 - ListFleets Callback 2026-03-30 17:30:24 -04:00
8 changed files with 113 additions and 34 deletions

View File

@@ -5,13 +5,12 @@
#include "HttpModule.h" #include "HttpModule.h"
#include "JsonObjectConverter.h" #include "JsonObjectConverter.h"
#include "Data/API/APIData.h" #include "Data/API/APIData.h"
#include "DedicatedServers/DedicatedServers.h"
#include "GameplayTags/DedicatedServerTags.h" #include "GameplayTags/DedicatedServerTags.h"
#include "Interfaces/IHttpResponse.h" #include "Interfaces/IHttpResponse.h"
#include "UI/HTTP/HTTPRequestTypes.h" #include "UI/HTTP/HTTPRequestTypes.h"
void UAPITestManager::ListFleetsButtonClicked() void UAPITestManager::ListFleets()
{ {
check(APIData); check(APIData);
@@ -24,50 +23,26 @@ void UAPITestManager::ListFleetsButtonClicked()
Request->SetVerb("GET"); Request->SetVerb("GET");
Request->SetHeader("Content-Type", "application/json"); Request->SetHeader("Content-Type", "application/json");
Request->ProcessRequest(); Request->ProcessRequest();
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, "List Fleets Request Made");
} }
void UAPITestManager::ListFleets_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) void UAPITestManager::ListFleets_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{ {
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, "List Fleets Response Received");
TSharedPtr<FJsonObject> JsonObject; TSharedPtr<FJsonObject> JsonObject;
TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(Response->GetContentAsString()); TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(Response->GetContentAsString());
if (FJsonSerializer::Deserialize(JsonReader, JsonObject)) if (FJsonSerializer::Deserialize(JsonReader, JsonObject))
{ {
if (JsonObject->HasField(TEXT("errorType")) || JsonObject->HasField(TEXT("errorMessage"))) if (ContainsErrors(JsonObject))
{ {
FString ErrorType = JsonObject->HasField(TEXT("errorType")) ? JsonObject->GetStringField(TEXT("errorType")) : FString("Unknown Error"); OnListFleetsResponseReceived.Broadcast(FDSListFleetsResponse(), false);
FString ErrorMessage = JsonObject->HasField(TEXT("errorMessage")) ? JsonObject->GetStringField(TEXT("errorMessage")) : FString("Unknown Error Message");
UE_LOGFMT(LogDedicatedServers, Error, "Error Type: {ErrorType}", ErrorType);
UE_LOGFMT(LogDedicatedServers, Error, "Error Message: {ErrorMessage}", ErrorMessage);
return; return;
} }
if (JsonObject->HasField(TEXT("$fault"))) DumpMetadata(JsonObject);
{
FString ErrorType = JsonObject->HasField(TEXT("name")) ? JsonObject->GetStringField(TEXT("name")) : FString("Unknown Error");
UE_LOGFMT(LogDedicatedServers, Error, "Error Type: {ErrorType}", ErrorType);
return;
}
if (JsonObject->HasField(TEXT("$metadata")))
{
TSharedPtr<FJsonObject> MetaDataJsonObject = JsonObject->GetObjectField(TEXT("$metadata"));
FDSMetaData DSMetaData;
FJsonObjectConverter::JsonObjectToUStruct(MetaDataJsonObject.ToSharedRef(), &DSMetaData);
DSMetaData.Dump();
}
FDSListFleetsResponse ListFleetsResponse; FDSListFleetsResponse ListFleetsResponse;
FJsonObjectConverter::JsonObjectToUStruct(JsonObject.ToSharedRef(), &ListFleetsResponse); FJsonObjectConverter::JsonObjectToUStruct(JsonObject.ToSharedRef(), &ListFleetsResponse);
OnListFleetsResponseReceived.Broadcast(ListFleetsResponse, true);
ListFleetsResponse.Dump(); ListFleetsResponse.Dump();
} }
} }

View File

@@ -3,9 +3,14 @@
#include "UI/APITest/APITestOverlay.h" #include "UI/APITest/APITestOverlay.h"
#include "Blueprint/WidgetLayoutLibrary.h"
#include "Components/Button.h" #include "Components/Button.h"
#include "Components/ScrollBox.h"
#include "Components/TextBlock.h"
#include "UI/API/ListFleets/FleetId.h"
#include "UI/API/ListFleets/ListFleetsBox.h" #include "UI/API/ListFleets/ListFleetsBox.h"
#include "UI/APITest/APITestManager.h" #include "UI/APITest/APITestManager.h"
#include "UI/HTTP/HTTPRequestTypes.h"
void UAPITestOverlay::NativeConstruct() void UAPITestOverlay::NativeConstruct()
{ {
@@ -16,6 +21,39 @@ void UAPITestOverlay::NativeConstruct()
check(ListFleetsBox) check(ListFleetsBox)
check(ListFleetsBox->Button_ListFleets) check(ListFleetsBox->Button_ListFleets)
ListFleetsBox->Button_ListFleets->OnClicked.AddDynamic(APITestManager, &UAPITestManager::ListFleetsButtonClicked); ListFleetsBox->Button_ListFleets->OnClicked.AddDynamic(this, &UAPITestOverlay::ListFleetsButtonClicked);
}
void UAPITestOverlay::ListFleetsButtonClicked()
{
check (APITestManager)
APITestManager->OnListFleetsResponseReceived.AddDynamic(this, &UAPITestOverlay::OnListFleetsResponseReceived);
APITestManager->ListFleets();
ListFleetsBox->Button_ListFleets->SetIsEnabled(false);
}
void UAPITestOverlay::OnListFleetsResponseReceived(const FDSListFleetsResponse& ListFleetsResponse, bool bWasSuccessful)
{
if (APITestManager->OnListFleetsResponseReceived.IsAlreadyBound(this, &UAPITestOverlay::OnListFleetsResponseReceived))
{
APITestManager->OnListFleetsResponseReceived.RemoveDynamic(this, &UAPITestOverlay::OnListFleetsResponseReceived);
}
ListFleetsBox->ScrollBox_ListFleets->ClearChildren();
check(FleetIdWidgetClass);
if (bWasSuccessful)
{
for (const FString& FleetId : ListFleetsResponse.FleetIds)
{
UFleetId* FleetIdWidget = CreateWidget<UFleetId>(this, FleetIdWidgetClass);
FleetIdWidget->TextBlock_FleetId->SetText(FText::FromString(FleetId));
ListFleetsBox->ScrollBox_ListFleets->AddChild(FleetIdWidget);
}
}
else
{
UFleetId* FleetIdWidget = CreateWidget<UFleetId>(this, FleetIdWidgetClass);
FleetIdWidget->TextBlock_FleetId->SetText(FText::FromString("Something went wrong!"));
ListFleetsBox->ScrollBox_ListFleets->AddChild(FleetIdWidget);
}
ListFleetsBox->Button_ListFleets->SetIsEnabled(true);
} }

View File

@@ -2,3 +2,47 @@
#include "UI/HTTP/HTTPRequestManager.h" #include "UI/HTTP/HTTPRequestManager.h"
#include "JsonObjectConverter.h"
#include "DedicatedServers/DedicatedServers.h"
#include "UI/HTTP/HTTPRequestTypes.h"
bool UHTTPRequestManager::ContainsErrors(TSharedPtr<FJsonObject> JsonObject, bool bLogErrors)
{
if (JsonObject->HasField(TEXT("errorType")) || JsonObject->HasField(TEXT("errorMessage")))
{
FString ErrorType = JsonObject->HasField(TEXT("errorType")) ? JsonObject->GetStringField(TEXT("errorType")) : FString("Unknown Error");
FString ErrorMessage = JsonObject->HasField(TEXT("errorMessage")) ? JsonObject->GetStringField(TEXT("errorMessage")) : FString("Unknown Error Message");
if (bLogErrors)
{
UE_LOGFMT(LogDedicatedServers, Error, "Error Type: {ErrorType}", ErrorType);
UE_LOGFMT(LogDedicatedServers, Error, "Error Message: {ErrorMessage}", ErrorMessage);
}
return true;
}
if (JsonObject->HasField(TEXT("$fault")))
{
FString ErrorType = JsonObject->HasField(TEXT("name")) ? JsonObject->GetStringField(TEXT("name")) : FString("Unknown Error");
if (bLogErrors)
{
UE_LOGFMT(LogDedicatedServers, Error, "Error Type: {ErrorType}", ErrorType);
}
return true;
}
return false;
}
void UHTTPRequestManager::DumpMetadata(TSharedPtr<FJsonObject> JsonObject)
{
if (JsonObject->HasField(TEXT("$metadata")))
{
TSharedPtr<FJsonObject> MetaDataJsonObject = JsonObject->GetObjectField(TEXT("$metadata"));
FDSMetaData DSMetaData;
FJsonObjectConverter::JsonObjectToUStruct(MetaDataJsonObject.ToSharedRef(), &DSMetaData);
DSMetaData.Dump();
}
}

View File

@@ -7,6 +7,9 @@
#include "UI/HTTP/HTTPRequestManager.h" #include "UI/HTTP/HTTPRequestManager.h"
#include "APITestManager.generated.h" #include "APITestManager.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnListFleetsResponseReceived, const FDSListFleetsResponse&, ListFleetsResponse, bool, bWasSuccessful);
/** /**
* *
*/ */
@@ -18,7 +21,10 @@ class DEDICATEDSERVERS_API UAPITestManager : public UHTTPRequestManager
public: public:
UFUNCTION() UFUNCTION()
void ListFleetsButtonClicked(); void ListFleets();
UPROPERTY()
FOnListFleetsResponseReceived OnListFleetsResponseReceived;
void ListFleets_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful); void ListFleets_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
}; };

View File

@@ -8,6 +8,9 @@
class UListFleetsBox; class UListFleetsBox;
class UAPITestManager; class UAPITestManager;
struct FDSListFleetsResponse;
class UFleetId;
/** /**
* *
*/ */
@@ -21,6 +24,9 @@ public:
UPROPERTY(EditDefaultsOnly) UPROPERTY(EditDefaultsOnly)
TSubclassOf<UAPITestManager> APITestManagerClass; TSubclassOf<UAPITestManager> APITestManagerClass;
UPROPERTY(EditDefaultsOnly)
TSubclassOf<UFleetId> FleetIdWidgetClass;
protected: protected:
virtual void NativeConstruct() override; virtual void NativeConstruct() override;
@@ -33,4 +39,10 @@ private:
UPROPERTY() UPROPERTY()
TObjectPtr<UAPITestManager> APITestManager; TObjectPtr<UAPITestManager> APITestManager;
UFUNCTION()
void ListFleetsButtonClicked();
UFUNCTION()
void OnListFleetsResponseReceived(const FDSListFleetsResponse& ListFleetsResponse, bool bWasSuccessful);
}; };

View File

@@ -7,6 +7,7 @@
#include "HTTPRequestManager.generated.h" #include "HTTPRequestManager.generated.h"
class UAPIData; class UAPIData;
class FJsonObject;
/** /**
* *
@@ -20,4 +21,7 @@ protected:
UPROPERTY(EditDefaultsOnly) UPROPERTY(EditDefaultsOnly)
TObjectPtr<UAPIData> APIData; TObjectPtr<UAPIData> APIData;
bool ContainsErrors(TSharedPtr<FJsonObject> JsonObject, bool bLogErrors = true);
void DumpMetadata(TSharedPtr<FJsonObject> JsonObject);
}; };