This commit is contained in:
briaguya 2025-04-28 06:07:30 +00:00 committed by GitHub
commit 3132e529cf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 194 additions and 68 deletions

View file

@ -1 +1 @@
libusb-dev libusb-1.0-0-dev libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev nlohmann-json3-dev libtinyxml2-dev libspdlog-dev ninja-build libusb-dev libusb-1.0-0-dev libsdl2-dev libwebsockets-dev libpng-dev libglew-dev nlohmann-json3-dev libtinyxml2-dev libspdlog-dev ninja-build

View file

@ -1 +1 @@
libsdl2 +universal libsdl2_net +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal libsdl2 +universal libwebsockets +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal

View file

@ -82,7 +82,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(VCPKG_TARGET_TRIPLET x64-windows-static) set(VCPKG_TARGET_TRIPLET x64-windows-static)
vcpkg_bootstrap() vcpkg_bootstrap()
vcpkg_install_packages(zlib bzip2 libzip libpng sdl2 sdl2-net glew glfw3 nlohmann-json tinyxml2 spdlog) vcpkg_install_packages(zlib bzip2 libzip libpng sdl2 libwebsockets glew glfw3 nlohmann-json tinyxml2 spdlog)
if (CMAKE_C_COMPILER_LAUNCHER MATCHES "ccache|sccache") if (CMAKE_C_COMPILER_LAUNCHER MATCHES "ccache|sccache")
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded) set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)

View file

@ -306,14 +306,16 @@ endif()
find_package(SDL2) find_package(SDL2)
set(SDL2-INCLUDE ${SDL2_INCLUDE_DIRS}) set(SDL2-INCLUDE ${SDL2_INCLUDE_DIRS})
set(BUILD_REMOTE_CONTROL 1)
if (BUILD_REMOTE_CONTROL) if (BUILD_REMOTE_CONTROL)
find_package(SDL2_net) find_package(libwebsockets)
if(NOT libwebsockets_FOUND)
if(NOT SDL2_net_FOUND) message(STATUS "libwebsockets not found. Disabling BUILD_REMOTE_CONTROL.")
message(STATUS "SDL2_net not found (it's possible the version installed is too old). Disabling BUILD_REMOTE_CONTROL.") # set(BUILD_REMOTE_CONTROL 0)
set(BUILD_REMOTE_CONTROL 0)
else() else()
set(SDL2-NET-INCLUDE ${SDL_NET_INCLUDE_DIRS}) if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
target_compile_definitions(${PROJECT_NAME} PRIVATE _WINSOCKAPI_)
endif()
endif() endif()
endif() endif()
@ -647,7 +649,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
"glu32;" "glu32;"
"SDL2::SDL2;" "SDL2::SDL2;"
"SDL2::SDL2main;" "SDL2::SDL2main;"
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:SDL2_net::SDL2_net-static>" "$<$<BOOL:${BUILD_REMOTE_CONTROL}>:websockets>"
"glfw;" "glfw;"
"winmm;" "winmm;"
"imm32;" "imm32;"
@ -697,7 +699,7 @@ else()
"libultraship;" "libultraship;"
"ZAPDLib;" "ZAPDLib;"
SDL2::SDL2 SDL2::SDL2
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:SDL2_net::SDL2_net>" "$<$<BOOL:${BUILD_REMOTE_CONTROL}>:websockets>"
${CMAKE_DL_LIBS} ${CMAKE_DL_LIBS}
Threads::Threads Threads::Threads
) )

View file

@ -11,9 +11,14 @@ void Network::Enable(const char* host, uint16_t port) {
return; return;
} }
if (SDLNet_ResolveHost(&networkAddress, host, port) == -1) { lws_context_creation_info info;
SPDLOG_ERROR("[Network] SDLNet_ResolveHost: {}", SDLNet_GetError()); lws_context* context;
} context = lws_create_context(&info);
// commented out because of SDL_net removal
// if (SDLNet_ResolveHost(&networkAddress, host, port) == -1) {
// SPDLOG_ERROR("[Network] SDLNet_ResolveHost: {}", SDLNet_GetError());
// }
isEnabled = true; isEnabled = true;
@ -48,7 +53,8 @@ void Network::OnDisconnected() {
void Network::SendDataToRemote(const char* payload) { void Network::SendDataToRemote(const char* payload) {
SPDLOG_DEBUG("[Network] Sending data: {}", payload); SPDLOG_DEBUG("[Network] Sending data: {}", payload);
SDLNet_TCP_Send(networkSocket, payload, strlen(payload) + 1); // commented out because of SDL_net removal
// SDLNet_TCP_Send(networkSocket, payload, strlen(payload) + 1);
} }
void Network::SendJsonToRemote(nlohmann::json payload) { void Network::SendJsonToRemote(nlohmann::json payload) {
@ -61,67 +67,71 @@ void Network::ReceiveFromServer() {
while (isEnabled) { while (isEnabled) {
while (!isConnected && isEnabled) { while (!isConnected && isEnabled) {
SPDLOG_TRACE("[Network] Attempting to make connection to server..."); SPDLOG_TRACE("[Network] Attempting to make connection to server...");
networkSocket = SDLNet_TCP_Open(&networkAddress); // commented out because of SDL_net removal
// networkSocket = SDLNet_TCP_Open(&networkAddress);
if (networkSocket) { // if (networkSocket) {
isConnected = true; // isConnected = true;
SPDLOG_INFO("[Network] Connection to server established!"); // SPDLOG_INFO("[Network] Connection to server established!");
OnConnected(); // OnConnected();
break; // break;
} // }
} }
SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(1); // commented out because of SDL_net removal
if (networkSocket) { // SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(1);
SDLNet_TCP_AddSocket(socketSet, networkSocket); // if (networkSocket) {
} // SDLNet_TCP_AddSocket(socketSet, networkSocket);
// }
// Listen to socket messages // Listen to socket messages
while (isConnected && networkSocket && isEnabled) { // commented out because of SDL_net removal
// we check first if socket has data, to not block in the TCP_Recv // while (isConnected && networkSocket && isEnabled) {
int socketsReady = SDLNet_CheckSockets(socketSet, 0); // // we check first if socket has data, to not block in the TCP_Recv
// int socketsReady = SDLNet_CheckSockets(socketSet, 0);
if (socketsReady == -1) { // if (socketsReady == -1) {
SPDLOG_ERROR("[Network] SDLNet_CheckSockets: {}", SDLNet_GetError()); // SPDLOG_ERROR("[Network] SDLNet_CheckSockets: {}", SDLNet_GetError());
break; // break;
} // }
if (socketsReady == 0) { // if (socketsReady == 0) {
continue; // continue;
} // }
char remoteDataReceived[512]; // char remoteDataReceived[512];
memset(remoteDataReceived, 0, sizeof(remoteDataReceived)); // memset(remoteDataReceived, 0, sizeof(remoteDataReceived));
int len = SDLNet_TCP_Recv(networkSocket, &remoteDataReceived, sizeof(remoteDataReceived)); // int len = SDLNet_TCP_Recv(networkSocket, &remoteDataReceived, sizeof(remoteDataReceived));
if (!len || !networkSocket || len == -1) { // if (!len || !networkSocket || len == -1) {
SPDLOG_ERROR("[Network] SDLNet_TCP_Recv: {}", SDLNet_GetError()); // SPDLOG_ERROR("[Network] SDLNet_TCP_Recv: {}", SDLNet_GetError());
break; // break;
} // }
HandleRemoteData(remoteDataReceived); // HandleRemoteData(remoteDataReceived);
receivedData.append(remoteDataReceived, len); // receivedData.append(remoteDataReceived, len);
// Proess all complete packets // // Proess all complete packets
size_t delimiterPos = receivedData.find('\0'); // size_t delimiterPos = receivedData.find('\0');
while (delimiterPos != std::string::npos) { // while (delimiterPos != std::string::npos) {
// Extract the complete packet until the delimiter // // Extract the complete packet until the delimiter
std::string packet = receivedData.substr(0, delimiterPos); // std::string packet = receivedData.substr(0, delimiterPos);
// Remove the packet (including the delimiter) from the received data // // Remove the packet (including the delimiter) from the received data
receivedData.erase(0, delimiterPos + 1); // receivedData.erase(0, delimiterPos + 1);
HandleRemoteJson(packet); // HandleRemoteJson(packet);
// Find the next delimiter // // Find the next delimiter
delimiterPos = receivedData.find('\0'); // delimiterPos = receivedData.find('\0');
} // }
} // }
if (isConnected) { // commented out because of SDL_net removal
SDLNet_TCP_Close(networkSocket); // if (isConnected) {
isConnected = false; // SDLNet_TCP_Close(networkSocket);
OnDisconnected(); // isConnected = false;
SPDLOG_INFO("[Network] Ending receiving thread..."); // OnDisconnected();
} // SPDLOG_INFO("[Network] Ending receiving thread...");
// }
} }
} }

View file

@ -4,13 +4,20 @@
#ifdef __cplusplus #ifdef __cplusplus
#include <thread> #include <thread>
#include <SDL2/SDL_net.h>
#ifdef _WIN32
#include "libwebsockets_windows.h"
#else
#include <libwebsockets.h>
#endif
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
class Network { class Network {
private: private:
IPaddress networkAddress; // commented out because of SDL_net removal
TCPsocket networkSocket; // IPaddress networkAddress;
// TCPsocket networkSocket;
std::thread receiveThread; std::thread receiveThread;
std::string receivedData; std::string receivedData;

View file

@ -0,0 +1,105 @@
// undef a couple int types
#undef u32
#undef u64
// undef all the HTTP response codes from wininet.h
#undef HTTP_STATUS_CONTINUE
#undef HTTP_STATUS_SWITCH_PROTOCOLS
#undef HTTP_STATUS_OK
#undef HTTP_STATUS_CREATED
#undef HTTP_STATUS_ACCEPTED
#undef HTTP_STATUS_PARTIAL
#undef HTTP_STATUS_NO_CONTENT
#undef HTTP_STATUS_RESET_CONTENT
#undef HTTP_STATUS_PARTIAL_CONTENT
#undef HTTP_STATUS_AMBIGUOUS
#undef HTTP_STATUS_MOVED
#undef HTTP_STATUS_REDIRECT
#undef HTTP_STATUS_REDIRECT_METHOD
#undef HTTP_STATUS_NOT_MODIFIED
#undef HTTP_STATUS_USE_PROXY
#undef HTTP_STATUS_REDIRECT_KEEP_VERB
#undef HTTP_STATUS_PERMANENT_REDIRECT
#undef HTTP_STATUS_BAD_REQUEST
#undef HTTP_STATUS_DENIED
#undef HTTP_STATUS_PAYMENT_REQ
#undef HTTP_STATUS_FORBIDDEN
#undef HTTP_STATUS_NOT_FOUND
#undef HTTP_STATUS_BAD_METHOD
#undef HTTP_STATUS_NONE_ACCEPTABLE
#undef HTTP_STATUS_PROXY_AUTH_REQ
#undef HTTP_STATUS_REQUEST_TIMEOUT
#undef HTTP_STATUS_CONFLICT
#undef HTTP_STATUS_GONE
#undef HTTP_STATUS_LENGTH_REQUIRED
#undef HTTP_STATUS_PRECOND_FAILED
#undef HTTP_STATUS_REQUEST_TOO_LARGE
#undef HTTP_STATUS_URI_TOO_LONG
#undef HTTP_STATUS_UNSUPPORTED_MEDIA
#undef HTTP_STATUS_MISDIRECTED_REQUEST
#undef HTTP_STATUS_RETRY_WITH
#undef HTTP_STATUS_SERVER_ERROR
#undef HTTP_STATUS_NOT_SUPPORTED
#undef HTTP_STATUS_BAD_GATEWAY
#undef HTTP_STATUS_SERVICE_UNAVAIL
#undef HTTP_STATUS_GATEWAY_TIMEOUT
#undef HTTP_STATUS_VERSION_NOT_SUP
#undef HTTP_STATUS_FIRST
#undef HTTP_STATUS_LAST
// actually include libwebsockets
#include <libwebsockets.h>
// redefine the int types
#define u32 uint32_t
#define u64 uint64_t
// redefine the responses from wininet.h
#define HTTP_STATUS_CONTINUE 100 // OK to continue with request
#define HTTP_STATUS_SWITCH_PROTOCOLS 101 // server has switched protocols in upgrade header
#define HTTP_STATUS_OK 200 // request completed
#define HTTP_STATUS_CREATED 201 // object created, reason = new URI
#define HTTP_STATUS_ACCEPTED 202 // async completion (TBS)
#define HTTP_STATUS_PARTIAL 203 // partial completion
#define HTTP_STATUS_NO_CONTENT 204 // no info to return
#define HTTP_STATUS_RESET_CONTENT 205 // request completed, but clear form
#define HTTP_STATUS_PARTIAL_CONTENT 206 // partial GET furfilled
#define HTTP_STATUS_AMBIGUOUS 300 // server couldn't decide what to return
#define HTTP_STATUS_MOVED 301 // object permanently moved
#define HTTP_STATUS_REDIRECT 302 // object temporarily moved
#define HTTP_STATUS_REDIRECT_METHOD 303 // redirection w/ new access method
#define HTTP_STATUS_NOT_MODIFIED 304 // if-modified-since was not modified
#define HTTP_STATUS_USE_PROXY 305 // redirection to proxy, location header specifies proxy to use
#define HTTP_STATUS_REDIRECT_KEEP_VERB 307 // HTTP/1.1: keep same verb
#define HTTP_STATUS_PERMANENT_REDIRECT 308 // Object permanently moved keep verb
#define HTTP_STATUS_BAD_REQUEST 400 // invalid syntax
#define HTTP_STATUS_DENIED 401 // access denied
#define HTTP_STATUS_PAYMENT_REQ 402 // payment required
#define HTTP_STATUS_FORBIDDEN 403 // request forbidden
#define HTTP_STATUS_NOT_FOUND 404 // object not found
#define HTTP_STATUS_BAD_METHOD 405 // method is not allowed
#define HTTP_STATUS_NONE_ACCEPTABLE 406 // no response acceptable to client found
#define HTTP_STATUS_PROXY_AUTH_REQ 407 // proxy authentication required
#define HTTP_STATUS_REQUEST_TIMEOUT 408 // server timed out waiting for request
#define HTTP_STATUS_CONFLICT 409 // user should resubmit with more info
#define HTTP_STATUS_GONE 410 // the resource is no longer available
#define HTTP_STATUS_LENGTH_REQUIRED 411 // the server refused to accept request w/o a length
#define HTTP_STATUS_PRECOND_FAILED 412 // precondition given in request failed
#define HTTP_STATUS_REQUEST_TOO_LARGE 413 // request entity was too large
#define HTTP_STATUS_URI_TOO_LONG 414 // request URI too long
#define HTTP_STATUS_UNSUPPORTED_MEDIA 415 // unsupported media type
#define HTTP_STATUS_MISDIRECTED_REQUEST 421 // misdirected request
#define HTTP_STATUS_RETRY_WITH 449 // retry after doing the appropriate action.
#define HTTP_STATUS_SERVER_ERROR 500 // internal server error
#define HTTP_STATUS_NOT_SUPPORTED 501 // required not supported
#define HTTP_STATUS_BAD_GATEWAY 502 // error response received from gateway
#define HTTP_STATUS_SERVICE_UNAVAIL 503 // temporarily overloaded
#define HTTP_STATUS_GATEWAY_TIMEOUT 504 // timed out waiting for gateway
#define HTTP_STATUS_VERSION_NOT_SUP 505 // HTTP version not supported
#define HTTP_STATUS_FIRST HTTP_STATUS_CONTINUE
#define HTTP_STATUS_LAST HTTP_STATUS_VERSION_NOT_SUP

View file

@ -1264,7 +1264,8 @@ extern "C" void InitOTR() {
srand(now); srand(now);
#ifdef ENABLE_REMOTE_CONTROL #ifdef ENABLE_REMOTE_CONTROL
SDLNet_Init(); // commented out because of SDL_net removal
// SDLNet_Init();
if (CVarGetInteger(CVAR_REMOTE_CROWD_CONTROL("Enabled"), 0)) { if (CVarGetInteger(CVAR_REMOTE_CROWD_CONTROL("Enabled"), 0)) {
CrowdControl::Instance->Enable(); CrowdControl::Instance->Enable();
} }
@ -1288,7 +1289,8 @@ extern "C" void DeinitOTR() {
if (CVarGetInteger(CVAR_REMOTE_SAIL("Enabled"), 0)) { if (CVarGetInteger(CVAR_REMOTE_SAIL("Enabled"), 0)) {
Sail::Instance->Disable(); Sail::Instance->Disable();
} }
SDLNet_Quit(); // commented out because of SDL_net removal
// SDLNet_Quit();
#endif #endif
// Destroying gui here because we have shared ptrs to LUS objects which output to SPDLOG which is destroyed before // Destroying gui here because we have shared ptrs to LUS objects which output to SPDLOG which is destroyed before