Commit v.2025

This commit is contained in:
2025-06-17 13:17:17 +02:00
parent d16693c85b
commit efae805ae1
50 changed files with 2123 additions and 0 deletions

View File

@ -0,0 +1,13 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "Clients/DTFluxHttpClient.h"
FDTFluxHttpClient::FDTFluxHttpClient()
{
}
FDTFluxHttpClient::~FDTFluxHttpClient()
{
}

View File

@ -0,0 +1,141 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "Clients/DTFluxWebSocketClient.h"
#include "DTFluxNetworkModule.h"
#include "IWebSocket.h"
#include "WebSocketsModule.h"
#include "Utils/WebSocketStatusCode.h"
int32 FDTFluxWebSocketClient::LastId = 0;
FName FDTFluxWebSocketClient::DefaultId = FName("DTFluxWsClient");
FDTFluxWebSocketClient::FDTFluxWebSocketClient()
{
ClientId = FName("DTFluxWsClient_" + FDTFluxWebSocketClient::LastId);
FDTFluxWebSocketClient::LastId++;
}
void FDTFluxWebSocketClient::Connect()
{
Ws = FWebSocketsModule::Get().CreateWebSocket(WsAddress);
if(Ws.IsValid())
{
Bind_Internal();
UE_LOG(logDTFluxNetwork, Warning, TEXT("Connecting"))
Ws->Connect();
}
}
void FDTFluxWebSocketClient::Reconnect()
{
if(Ws.IsValid())
{
if(Ws->IsConnected())
{
Ws->Close();
Ws->Connect();
return;
}
UE_LOG(logDTFluxNetwork, Warning, TEXT("Connecting"))
Ws->Connect();
return;
}
UE_LOG(logDTFluxNetwork, Error, TEXT("Undelying IWebSocket is Invalid, Cannot Connect !!!"))
}
void FDTFluxWebSocketClient::Disconnect()
{
if(Ws.IsValid())
{
if(Ws->IsConnected())
{
EWebSocketCloseCode ReasonCode = EWebSocketCloseCode::Normal;
Ws->Close(static_cast<int32>(ReasonCode), FString("Normal Disconnect, BYE !!!"));
}
}
}
FDTFluxWsClientError FDTFluxWebSocketClient::GetError()
{
FDTFluxWsClientError Error;
if(Errors.Num() > 0)
{
return Errors.Pop(EAllowShrinking::Yes);
}
return FDTFluxWsClientError::CreateNoError(ClientId);
}
void FDTFluxWebSocketClient::ClearErrors()
{
Errors.Empty();
}
void FDTFluxWebSocketClient::AddError(const FDTFluxWsClientError Error)
{
Errors.Add(Error);
}
void FDTFluxWebSocketClient::Send(const FString& Message) const
{
Ws->Send(Message);
}
void FDTFluxWebSocketClient::Bind_Internal()
{
Ws->OnConnected().AddRaw(this, &FDTFluxWebSocketClient::OnConnected_Internal);
Ws->OnClosed().AddRaw(this, &FDTFluxWebSocketClient::OnClientClosed_Internal);
Ws->OnConnectionError().AddRaw(this, &FDTFluxWebSocketClient::OnClientError_Internal);
Ws->OnMessage().AddRaw(this, &FDTFluxWebSocketClient::OnClientReceiveMessage_Internal);
Ws->OnBinaryMessage().AddRaw(this, &FDTFluxWebSocketClient::OnClientReceiveBinaryMessage_Internal);
Ws->OnMessageSent().AddRaw(this, &FDTFluxWebSocketClient::OnMessageSent_Internal);
Ws->OnRawMessage().AddRaw(this, &FDTFluxWebSocketClient::OnClientReceiveRawMessage_Internal);
}
void FDTFluxWebSocketClient::OnConnected_Internal()
{
DTFluxWsClientConnectedEvent.Broadcast();
}
void FDTFluxWebSocketClient::OnClientClosed_Internal(int32 StatusCode, const FString& Reason, bool bWasClean)
{
DTFluxWsClientClosedEvent.Broadcast(StatusCode, Reason, bWasClean);
}
void FDTFluxWebSocketClient::OnClientError_Internal(const FString& ErrorMessage)
{
DTFluxWsClientConnectionErrorEvent.Broadcast(ErrorMessage);
}
void FDTFluxWebSocketClient::OnClientReceiveMessage_Internal(const FString& Message)
{
DTFluxWsClientMessageEvent.Broadcast(Message);
}
void FDTFluxWebSocketClient::OnClientReceiveBinaryMessage_Internal(const void* Data, SIZE_T Size, bool bIsLastFragment)
{
DTFluxWsClientBinaryMessageEvent.Broadcast(Data,Size, bIsLastFragment);
}
void FDTFluxWebSocketClient::OnClientReceiveRawMessage_Internal(const void* Data, SIZE_T Size, SIZE_T BytesRemaining)
{
DTFluxWsClientRawMessageEvent.Broadcast(Data, Size, BytesRemaining);
}
void FDTFluxWebSocketClient::OnMessageSent_Internal(const FString& MessageString)
{
DTFluxWsClientMessageSentEvent.Broadcast(MessageString);
}
void FDTFluxWebSocketClient::SendMessage_internal(const FString& Message)
{
if(Ws.IsValid() && Ws->IsConnected())
{
Ws->Send(Message);
}
}

View File

@ -0,0 +1,19 @@
#include "DTFluxNetworkModule.h"
#define LOCTEXT_NAMESPACE "FDTFluxNetworkModule"
DTFLUXNETWORK_API DEFINE_LOG_CATEGORY(logDTFluxNetwork);
void FDTFluxNetworkModule::StartupModule()
{
}
void FDTFluxNetworkModule::ShutdownModule()
{
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FDTFluxNetworkModule, DTFluxNetwork)

View File

@ -0,0 +1,176 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "Subsystems/DTFluxNetworkSubsystem.h"
#include "DTFluxCoreModule.h"
#include "DTFluxNetworkModule.h"
#include "DTFluxNetworkSettings.h"
#include "Clients/DTFluxHttpClient.h"
#include "Clients/DTFluxWebSocketClient.h"
void UFDTFluxNetworkSubsystem::Connect()
{
WsClient->SetAddress(ConstructWsAddress(WsSettings.Address, WsSettings.Path, WsSettings.Port));
WsClient->Connect();
}
void UFDTFluxNetworkSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
FDTFluxCoreModule& DTFluxCore = FModuleManager::Get().LoadModuleChecked<FDTFluxCoreModule>("DTFluxCore");
FString StatusString = UEnum::GetValueAsString(WsStatus);
UE_LOG(logDTFluxNetwork, Log, TEXT("Status is %s"), *StatusString);
UDTFluxNetworkSettings* NetworkSettings = GetMutableDefault<UDTFluxNetworkSettings>();
UDTFluxNetworkSettings::GetWebSocketSettings(NetworkSettings, WsSettings);
UDTFluxNetworkSettings::GetHTTPSettings(NetworkSettings, HttpSettings);
WsClient = MakeShareable<FDTFluxWebSocketClient>(new FDTFluxWebSocketClient());
HttpClient = MakeShareable<FDTFluxHttpClient>(new FDTFluxHttpClient());
RegisterWebSocketEvents();
RegisterHttpEvents();
#if WITH_EDITOR
NetworkSettings->OnDTFluxWebSocketSettingsChanged.AddUFunction(this, FName("WsSettingsChanged"));
NetworkSettings->OnDTFluxHttpSettingsChanged.AddUFunction(this, FName("HttpSettingsChanged"));
#endif
if(WsSettings.bShouldConnectAtStartup)
{
WsClient->SetAddress(ConstructWsAddress(WsSettings.Address, WsSettings.Path, WsSettings.Port));
WsClient->Connect();
}
}
void UFDTFluxNetworkSubsystem::Deinitialize()
{
Super::Deinitialize();
}
void UFDTFluxNetworkSubsystem::WsSettingsChanged(const FDTFluxWsSettings& NewWsSettings)
{
// TODO Implement a ClientSelector To retrieve impacted WsClients and populate changes or maybe create a delegate
bool bNeedsReload = WsSettings != NewWsSettings;
WsSettings = NewWsSettings;
// UE_LOG(logDTFluxNetwork, Warning, TEXT("WSocket Settings Changed \n\t Address : %s Path : %s Port : %i\n\tbShouldConnectAtStatup : %s, bShouldAutoReconnectOnClosed %s, bShouldAutoReconnectOnError %s"),
// *NewWsSettings.Address, *NewWsSettings.Path, NewWsSettings.Port,
// NewWsSettings.bShouldConnectAtStartup ? TEXT("True") : TEXT("False"),
// NewWsSettings.bShouldAutoReconnectOnClosed ? TEXT("True") : TEXT("False"),
// NewWsSettings.bShouldAutoReconnectOnError ? TEXT("True") : TEXT("False") );
if( bNeedsReload || WsSettings.bShouldConnectAtStartup)
{
UE_LOG(logDTFluxNetwork, Warning, TEXT("WSocket Settings needs Reloding client"))
ReconnectWs(FName("Ws_Client_0"));
}
}
void UFDTFluxNetworkSubsystem::HttpSettingsChanged(const FDTFluxHttpSettings& NewHttpSettings)
{
// TODO Implement a ClientSelector To retrieve impacted HttpClients and populate changes or maybe create a delegate
HttpSettings = NewHttpSettings;
}
void UFDTFluxNetworkSubsystem::ReconnectWs(const FName WsClientId)
{
FString NewAddress = ConstructWsAddress(WsSettings.Address, WsSettings.Path, WsSettings.Port);
WsClient->SetAddress(NewAddress);
WsClient->Reconnect();
}
void UFDTFluxNetworkSubsystem::ReconnectHttp(const FName WsClientId)
{
}
void UFDTFluxNetworkSubsystem::RegisterWebSocketEvents()
{
OnWsConnectedEventDelegateHandle =
WsClient->RegisterConnectedEvent().AddUObject(this, &UFDTFluxNetworkSubsystem::OnWebSocketConnected_Subsystem);
OnWsConnectionErrorEventDelegateHandle =
WsClient->RegisterConnectionError()
.AddUObject(this, &UFDTFluxNetworkSubsystem::OnWebSocketConnectionError_Subsystem);
OnWsClosedEventDelegateHandle =
WsClient->RegisterClosedEvent()
.AddUObject(this, &UFDTFluxNetworkSubsystem::OnWebSocketClosedEvent_Subsystem);
OnWsMessageEventDelegateHandle =
WsClient->RegisterMessageEvent()
.AddUObject(this, &UFDTFluxNetworkSubsystem::OnWebSocketMessageEvent_Subsystem);
OnWsMessageSentEventDelegateHandle =
WsClient->RegisterMessageSentEvent()
.AddUObject(this, &UFDTFluxNetworkSubsystem::OnWebSocketMessageSentEvent_Subsystem);
}
void UFDTFluxNetworkSubsystem::RegisterHttpEvents()
{
}
void UFDTFluxNetworkSubsystem::UnregisterWebSocketEvents()
{
if(OnWsConnectedEventDelegateHandle.IsValid())
{
WsClient->UnregisterConnectedEvent().Remove(OnWsConnectedEventDelegateHandle);
}
if(OnWsConnectionErrorEventDelegateHandle.IsValid())
{
WsClient->UnregisterConnectionError();
}
if(OnWsClosedEventDelegateHandle.IsValid())
{
WsClient->UnregisterClosedEvent();
}
if(OnWsMessageEventDelegateHandle.IsValid())
{
WsClient->UnregisterMessageEvent();
}
if(OnWsMessageSentEventDelegateHandle.IsValid())
{
WsClient->UnregisterRawMessageEvent();
}
}
void UFDTFluxNetworkSubsystem::UnregisterHttpEvents()
{
}
void UFDTFluxNetworkSubsystem::OnWebSocketConnected_Subsystem()
{
OnWebSocketConnected.Broadcast();
UE_LOG(logDTFluxNetwork, Warning, TEXT("Ws Is Connected with %s"), *WsClient->GetAddress())
}
void UFDTFluxNetworkSubsystem::OnWebSocketConnectionError_Subsystem(const FString& Error)
{
UE_LOG(logDTFluxNetwork, Warning, TEXT("Ws Error with %s : %s"), *WsClient->GetAddress(), *Error);
if(WsSettings.bShouldAutoReconnectOnError)
{
WsClient->Reconnect();
}
}
void UFDTFluxNetworkSubsystem::OnWebSocketClosedEvent_Subsystem(int32 StatusCode, const FString& Reason, bool bWasClean)
{
UE_LOG(logDTFluxNetwork, Warning, TEXT("Ws Error with %s :\n Reason : %s \tStatusCode : %i, bWasClean : %s"),
*WsClient->GetAddress(), *Reason, StatusCode, bWasClean ? TEXT("True") : TEXT("False"));
}
void UFDTFluxNetworkSubsystem::OnWebSocketMessageEvent_Subsystem(const FString& MessageString)
{
UE_LOG(logDTFluxNetwork, Warning, TEXT("Ws %s :\nMessage Received : %s"), *WsClient->GetAddress(), *MessageString);
//Do Something With the message
}
void UFDTFluxNetworkSubsystem::OnWebSocketMessageSentEvent_Subsystem(const FString& MessageSent)
{
UE_LOG(logDTFluxNetwork, Warning, TEXT("Ws %s :\nMessage Sent: %s"), *WsClient->GetAddress(), *MessageSent);
}
FString UFDTFluxNetworkSubsystem::ConstructWsAddress(const FString& Address, const FString& Path, const int& Port)
{
FString NewAddress;
if( !Address.Contains("ws://") && !Address.Contains("wss://"))
{
NewAddress += FString("ws://");
}
NewAddress +=Address + FString(":") + FString::FromInt(Port) + Path;
return NewAddress;
// UE_LOG(logDTFluxNetwork, Log, TEXT("NewAddress : %s"), *NewAddress);
}