diff options
author | Aki <please@ignore.pl> | 2022-04-01 21:23:39 +0200 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-04-01 21:23:39 +0200 |
commit | 3c487c5cd69c53d6fea948643c0a76df03516605 (patch) | |
tree | 72730c7b8b26a5ef8fc9a987ec4c16129efd5aac /StarsEx/NetBrokerClient.cpp | |
parent | 8f353abd0bfe18baddd8a8250ab7c4f2d1c83a6e (diff) | |
download | starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.zip starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.gz starshatter-3c487c5cd69c53d6fea948643c0a76df03516605.tar.bz2 |
Moved Stars45 to StarsEx
Diffstat (limited to 'StarsEx/NetBrokerClient.cpp')
-rw-r--r-- | StarsEx/NetBrokerClient.cpp | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/StarsEx/NetBrokerClient.cpp b/StarsEx/NetBrokerClient.cpp new file mode 100644 index 0000000..043c580 --- /dev/null +++ b/StarsEx/NetBrokerClient.cpp @@ -0,0 +1,237 @@ +/* Starshatter: The Open Source Project + Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors + Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors + Copyright (c) 1997-2006, Destroyer Studios LLC. + + AUTHOR: John DiCamillo + + + OVERVIEW + ======== + Client for Starshatter.com GameNet Broker +*/ + + +#include "NetBrokerClient.h" + +#include "HttpClient.h" +#include "HttpServlet.h" +#include "NetLayer.h" + +#include "Game.h" +#include "VersionInfo.h" + +const char* HOSTNAME = "www.starshatter.com"; +const WORD HTTPPORT = 80; + +bool NetBrokerClient::broker_available = false; +bool NetBrokerClient::broker_found = false; + +// +--------------------------------------------------------------------+ + +bool +NetBrokerClient::GameOn(const char* name, +const char* type, +const char* addr, +WORD port, +const char* password) +{ + bool result = false; + + if (!broker_available) + return result; + + Text msg; + char buffer[8]; + NetAddr broker(HOSTNAME, HTTPPORT); + + if (broker.IPAddr() == 0) + return result; + + sprintf_s(buffer, "%d", port); + + msg = "GET http://"; + msg += HOSTNAME; + msg += "/GameNet/GameOn.php?name="; + msg += HttpRequest::EncodeParam(name); + msg += "&addr="; + msg += HttpRequest::EncodeParam(addr); + msg += "&game="; + msg += HttpRequest::EncodeParam(type); + msg += "&vers="; + msg += HttpRequest::EncodeParam(versionInfo); + msg += "&port="; + msg += buffer; + msg += "&pass="; + msg += HttpRequest::EncodeParam(password); + msg += " HTTP/1.1\n\n"; + + HttpClient client(broker); + HttpRequest request(msg); + request.SetHeader("Host", HOSTNAME); + + HttpResponse* response = client.DoRequest(request); + + if (response && response->Status() == 200) { + broker_found = true; + result = true; + } + else { + ::Print("NetBrokerClient unable to contact GameNet!\n"); + + if (response) { + ::Print(" Response Status: %d\n", response->Status()); + ::Print(" Response Content: %s\n", response->Content().data()); + } + else { + ::Print(" No response.\n"); + } + + if (!broker_found) + broker_available = false; + } + + delete response; + return result; +} + +bool +NetBrokerClient::GameList(const char* type, List<NetServerInfo>& server_list) +{ + bool result = false; + + if (!broker_available) + return result; + + Text msg; + NetAddr broker(HOSTNAME, HTTPPORT); + + if (broker.IPAddr() == 0) + return result; + + msg = "GET http://"; + msg += HOSTNAME; + msg += "/GameNet/GameList.php?game="; + msg += HttpRequest::EncodeParam(type); + msg += "&vers="; + msg += HttpRequest::EncodeParam(versionInfo); + msg += " HTTP/1.1\n\n"; + + HttpClient client(broker); + HttpRequest request(msg); + request.SetHeader("Host", HOSTNAME); + + HttpResponse* response = client.DoRequest(request); + + if (response && response->Status() == 200) { + result = true; + + Text name; + Text type; + Text addr; + int port; + Text pass; + Text vers; + char buff[1024]; + + const char* p = response->Content(); + + // skip size + while (*p && strncmp(p, "name:", 5)) + p++; + + while (*p) { + if (!strncmp(p, "name:", 5)) { + p += 5; + ZeroMemory(buff, sizeof(buff)); + char* d = buff; + while (*p && *p != '\n') *d++ = *p++; + if (*p) p++; + + name = buff; + } + else if (!strncmp(p, "addr:", 5)) { + p += 5; + ZeroMemory(buff, sizeof(buff)); + char* d = buff; + while (*p && *p != '\n') *d++ = *p++; + if (*p) p++; + + addr = buff; + } + else if (!strncmp(p, "port:", 5)) { + p += 5; + ZeroMemory(buff, sizeof(buff)); + char* d = buff; + while (*p && *p != '\n') *d++ = *p++; + if (*p) p++; + + sscanf_s(buff, "%d", &port); + } + else if (!strncmp(p, "pass:", 5)) { + p += 5; + ZeroMemory(buff, sizeof(buff)); + char* d = buff; + while (*p && *p != '\n') *d++ = *p++; + if (*p) p++; + + pass = buff; + } + else if (!strncmp(p, "game:", 5)) { + p += 5; + ZeroMemory(buff, sizeof(buff)); + char* d = buff; + while (*p && *p != '\n') *d++ = *p++; + if (*p) p++; + + type = buff; + type.setSensitive(false); + + if (type.contains("lan")) + type = "LAN"; + else + type = "Public"; + } + else if (!strncmp(p, "vers:", 5)) { + p += 5; + ZeroMemory(buff, sizeof(buff)); + char* d = buff; + while (*p && *p != '\n') *d++ = *p++; + if (*p) p++; + + vers = buff; + } + else if (!strncmp(p, "time:", 5)) { + while (*p && *p != '\n') p++; + if (*p) p++; + } + + else if (!strncmp(p, "###", 3)) { + NetServerInfo* server = new NetServerInfo; + server->name = name; + server->hostname = addr; + server->type = type; + server->addr = NetAddr(addr, port); + server->port = port; + server->password = pass; + server->version = vers; + server->save = false; + + server_list.append(server); + + while (*p && strncmp(p, "name:", 5)) + p++; + } + else { + while (*p && *p != '\n') p++; + if (*p) p++; + } + } + } + else if (!broker_found) { + broker_available = false; + } + + delete response; + return result; +} |