Skip to content

Commit 910b92f

Browse files
committed
WIP
1 parent f1847d1 commit 910b92f

24 files changed

+884
-181
lines changed

dDashboardServer/CMakeLists.txt

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
set(DDASHBOARDSERVER_SOURCES
22
"DashboardServer.cpp"
3-
"MasterPacketHandler.cpp"
4-
"routes/APIRoutes.cpp"
5-
"routes/StaticRoutes.cpp"
6-
"routes/DashboardRoutes.cpp"
7-
"routes/WSRoutes.cpp"
8-
"routes/AuthRoutes.cpp"
9-
"auth/JWTUtils.cpp"
10-
"auth/DashboardAuthService.cpp"
11-
"auth/AuthMiddleware.cpp"
12-
"auth/RequireAuthMiddleware.cpp"
3+
"handlers/MasterPacketHandler.cpp"
4+
"handlers/DashboardPacketHandler.cpp"
135
)
146

7+
add_subdirectory(routes)
8+
add_subdirectory(auth)
9+
1510
add_executable(DashboardServer ${DDASHBOARDSERVER_SOURCES})
1611

1712
target_include_directories(DashboardServer PRIVATE
@@ -29,11 +24,12 @@ target_include_directories(DashboardServer PRIVATE
2924
"${PROJECT_SOURCE_DIR}/dServer"
3025
"${PROJECT_SOURCE_DIR}/thirdparty"
3126
"${PROJECT_SOURCE_DIR}/thirdparty/nlohmann"
27+
"${PROJECT_SOURCE_DIR}/dDashboardServer"
3228
"${PROJECT_SOURCE_DIR}/dDashboardServer/auth"
3329
"${PROJECT_SOURCE_DIR}/dDashboardServer/routes"
3430
)
3531

36-
target_link_libraries(DashboardServer ${COMMON_LIBRARIES} dWeb dServer bcrypt OpenSSL::Crypto)
32+
target_link_libraries(DashboardServer ${COMMON_LIBRARIES} dWeb dServer bcrypt OpenSSL::Crypto DashboardRoutes DashboardAuth)
3733

3834

3935
# Copy static files and templates to build directory (always copy)

dDashboardServer/DashboardServer.cpp

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,16 @@
2020
#include "Diagnostics.h"
2121
#include "Web.h"
2222
#include "Server.h"
23-
#include "MasterPacketHandler.h"
24-
25-
#include "routes/ServerState.h"
26-
#include "routes/APIRoutes.h"
27-
#include "routes/StaticRoutes.h"
28-
#include "routes/DashboardRoutes.h"
29-
#include "routes/WSRoutes.h"
30-
#include "routes/AuthRoutes.h"
23+
#include "PacketHandler.h"
24+
#include "handlers/MasterPacketHandler.h"
25+
#include "handlers/DashboardPacketHandler.h"
26+
27+
#include "ServerState.h"
28+
#include "APIRoutes.h"
29+
#include "StaticRoutes.h"
30+
#include "DashboardRoutes.h"
31+
#include "WSRoutes.h"
32+
#include "AuthRoutes.h"
3133
#include "AuthMiddleware.h"
3234

3335
namespace Game {
@@ -97,6 +99,9 @@ int main(int argc, char** argv) {
9799
return EXIT_FAILURE;
98100
}
99101

102+
// Register dashboard-specific packet handlers
103+
DashboardPacketHandler::RegisterDashboardHandlers();
104+
100105
// Get master info from database
101106
std::string masterIP = "localhost";
102107
uint32_t masterPort = 1000;
@@ -160,10 +165,20 @@ int main(int argc, char** argv) {
160165
// Handle master server packets
161166
Packet* packet = g_Server->ReceiveFromMaster();
162167
if (packet) {
163-
MasterPacketHandler::HandleMasterPacket(packet);
168+
RakNet::BitStream bitStream(packet->data, packet->length, false);
169+
PacketHandler::HandlePacket(bitStream, packet->systemAddress);
164170
g_Server->DeallocateMasterPacket(packet);
165171
}
166172

173+
// Handle RakNet protocol packets from connected servers
174+
packet = g_Server->Receive();
175+
while (packet) {
176+
RakNet::BitStream bitStream(packet->data, packet->length, false);
177+
PacketHandler::HandlePacket(bitStream, packet->systemAddress);
178+
g_Server->DeallocatePacket(packet);
179+
packet = g_Server->Receive();
180+
}
181+
167182
// Handle web requests
168183
Game::web.ReceiveRequests();
169184

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
set(DASHBOARDAUTH_SOURCES
2+
"JWTUtils.cpp"
3+
"DashboardAuthService.cpp"
4+
"AuthMiddleware.cpp"
5+
"RequireAuthMiddleware.cpp"
6+
)
7+
8+
add_library(DashboardAuth STATIC ${DASHBOARDAUTH_SOURCES})
9+
10+
target_include_directories(DashboardAuth PRIVATE
11+
"${PROJECT_SOURCE_DIR}/dCommon"
12+
"${PROJECT_SOURCE_DIR}/dCommon/dClient"
13+
"${PROJECT_SOURCE_DIR}/dCommon/dEnums"
14+
"${PROJECT_SOURCE_DIR}/dDatabase"
15+
"${PROJECT_SOURCE_DIR}/dDatabase/CDClientDatabase"
16+
"${PROJECT_SOURCE_DIR}/dDatabase/CDClientDatabase/CDClientTables"
17+
"${PROJECT_SOURCE_DIR}/dDatabase/GameDatabase"
18+
"${PROJECT_SOURCE_DIR}/dDatabase/GameDatabase/ITables"
19+
"${PROJECT_SOURCE_DIR}/dDatabase/GameDatabase/MySQL"
20+
"${PROJECT_SOURCE_DIR}/dNet"
21+
"${PROJECT_SOURCE_DIR}/dWeb"
22+
"${PROJECT_SOURCE_DIR}/dServer"
23+
"${PROJECT_SOURCE_DIR}/thirdparty"
24+
"${PROJECT_SOURCE_DIR}/thirdparty/nlohmann"
25+
"${PROJECT_SOURCE_DIR}/dDashboardServer/auth"
26+
)
27+
28+
target_link_libraries(DashboardAuth PRIVATE ${COMMON_LIBRARIES} dWeb dServer bcrypt OpenSSL::Crypto)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include "DashboardPacketHandler.h"
2+
3+
#include "BitStreamUtils.h"
4+
#include "Logger.h"
5+
#include "Game.h"
6+
#include "handlers/MasterPacketHandler.h"
7+
#include <functional>
8+
#include <map>
9+
10+
namespace DashboardPacketHandler {
11+
std::map<ServiceType, std::function<void()>> g_ServiceHandlers;
12+
13+
void DashboardNewIncomingConnection::Handle() {
14+
LOG_DEBUG("DashboardPacketHandler: New incoming connection from %s", sysAddr.ToString(true));
15+
}
16+
17+
void DashboardDisconnectionNotification::Handle() {
18+
LOG_DEBUG("DashboardPacketHandler: Disconnection notification from %s", sysAddr.ToString(true));
19+
}
20+
21+
void DashboardConnectionLost::Handle() {
22+
LOG_DEBUG("DashboardPacketHandler: Connection lost with %s", sysAddr.ToString(true));
23+
}
24+
25+
void DashboardConnectedPong::Handle() {
26+
LOG_DEBUG("DashboardPacketHandler: Received pong from %s", sysAddr.ToString(true));
27+
}
28+
29+
void DashboardUserPacketEnum::Handle() {
30+
const auto it = g_ServiceHandlers.find(serviceType);
31+
if (it != g_ServiceHandlers.end()) {
32+
it->second();
33+
} else {
34+
LOG_DEBUG("DashboardPacketHandler: No handler registered for service type %u from %s", static_cast<uint16_t>(serviceType), sysAddr.ToString(true));
35+
}
36+
}
37+
38+
bool DashboardUserPacketEnum::Deserialize(RakNet::BitStream& bitStream) {
39+
if (!PacketHandler::UserPacketEnum::Deserialize(bitStream)) {
40+
return false;
41+
}
42+
VALIDATE_READ(bitStream.Read(serviceType));
43+
return true;
44+
}
45+
46+
void RegisterDashboardHandlers() {
47+
// Override the default handlers with dashboard-specific implementations
48+
PacketHandler::g_Handlers[ID_NEW_INCOMING_CONNECTION] = []() {
49+
return std::make_unique<DashboardNewIncomingConnection>();
50+
};
51+
PacketHandler::g_Handlers[ID_DISCONNECTION_NOTIFICATION] = []() {
52+
return std::make_unique<DashboardDisconnectionNotification>();
53+
};
54+
PacketHandler::g_Handlers[ID_CONNECTION_LOST] = []() {
55+
return std::make_unique<DashboardConnectionLost>();
56+
};
57+
PacketHandler::g_Handlers[ID_CONNECTED_PONG] = []() {
58+
return std::make_unique<DashboardConnectedPong>();
59+
};
60+
PacketHandler::g_Handlers[ID_USER_PACKET_ENUM] = []() {
61+
return std::make_unique<DashboardUserPacketEnum>();
62+
};
63+
64+
// Register service type handlers
65+
}
66+
}
67+
68+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#pragma once
2+
3+
#include "PacketHandler.h"
4+
#include "ServiceType.h"
5+
6+
namespace DashboardPacketHandler {
7+
// Dashboard-specific implementations of RakNet packet handlers
8+
9+
struct DashboardNewIncomingConnection : public PacketHandler::NewIncomingConnection {
10+
void Handle() override;
11+
};
12+
13+
struct DashboardDisconnectionNotification : public PacketHandler::DisconnectionNotification {
14+
void Handle() override;
15+
};
16+
17+
struct DashboardConnectionLost : public PacketHandler::ConnectionLost {
18+
void Handle() override;
19+
};
20+
21+
struct DashboardConnectedPong : public PacketHandler::ConnectedPong {
22+
void Handle() override;
23+
};
24+
25+
struct DashboardUserPacketEnum : public PacketHandler::UserPacketEnum {
26+
ServiceType serviceType{};
27+
28+
bool Deserialize(RakNet::BitStream& bitStream);
29+
void Handle() override;
30+
};
31+
32+
// Initialize dashboard-specific packet handlers
33+
void RegisterDashboardHandlers();
34+
}
35+
36+
37+

dDashboardServer/MasterPacketHandler.cpp renamed to dDashboardServer/handlers/MasterPacketHandler.cpp

Lines changed: 18 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,27 @@
55
#include "Game.h"
66
#include "Logger.h"
77
#include "RakNetTypes.h"
8-
#include "routes/ServerState.h"
8+
#include "ServerState.h"
99
#include <chrono>
10-
#include <mutex>
1110

1211
namespace MasterPacketHandler {
13-
namespace {
14-
std::map<MessageType::Master, std::function<std::unique_ptr<MasterPacket>()>> g_Handlers = {
15-
{MessageType::Master::SERVER_INFO, []() {
16-
return std::make_unique<ServerInfo>();
17-
}},
18-
{MessageType::Master::PLAYER_ADDED, []() {
19-
return std::make_unique<PlayerAdded>();
20-
}},
21-
{MessageType::Master::PLAYER_REMOVED, []() {
22-
return std::make_unique<PlayerRemoved>();
23-
}},
24-
{MessageType::Master::SHUTDOWN_RESPONSE, []() {
25-
return std::make_unique<ShutdownResponse>();
26-
}},
27-
{MessageType::Master::SHUTDOWN, []() {
28-
return std::make_unique<Shutdown>();
29-
}},
30-
};
31-
}
12+
std::map<MessageType::Master, std::function<std::unique_ptr<MasterPacket>()>> g_Handlers = {
13+
{MessageType::Master::SERVER_INFO, []() {
14+
return std::make_unique<ServerInfo>();
15+
}},
16+
{MessageType::Master::PLAYER_ADDED, []() {
17+
return std::make_unique<PlayerAdded>();
18+
}},
19+
{MessageType::Master::PLAYER_REMOVED, []() {
20+
return std::make_unique<PlayerRemoved>();
21+
}},
22+
{MessageType::Master::SHUTDOWN_RESPONSE, []() {
23+
return std::make_unique<ShutdownResponse>();
24+
}},
25+
{MessageType::Master::SHUTDOWN, []() {
26+
return std::make_unique<Shutdown>();
27+
}},
28+
};
3229

3330
bool ServerInfo::Deserialize(RakNet::BitStream& bitStream) {
3431
VALIDATE_READ(bitStream.Read(port));
@@ -42,8 +39,6 @@ namespace MasterPacketHandler {
4239
}
4340

4441
void ServerInfo::Handle() {
45-
std::lock_guard<std::mutex> lock(ServerState::g_StatusMutex);
46-
4742
LOG("MasterPacketHandler: Processing SERVER_INFO for service type %i, zone %u, instance %u, port %u", serverType, zoneID, instanceID, port);
4843

4944
switch (serverType) {
@@ -94,7 +89,6 @@ namespace MasterPacketHandler {
9489
}
9590

9691
void PlayerAdded::Handle() {
97-
std::lock_guard<std::mutex> lock(ServerState::g_StatusMutex);
9892
for (auto& world : ServerState::g_WorldInstances) {
9993
if (world.mapID == zoneID && world.instanceID == instanceID) {
10094
world.players++;
@@ -111,7 +105,6 @@ namespace MasterPacketHandler {
111105
}
112106

113107
void PlayerRemoved::Handle() {
114-
std::lock_guard<std::mutex> lock(ServerState::g_StatusMutex);
115108
for (auto& world : ServerState::g_WorldInstances) {
116109
if (world.mapID == zoneID && world.instanceID == instanceID) {
117110
if (world.players > 0) world.players--;
@@ -129,8 +122,6 @@ namespace MasterPacketHandler {
129122
}
130123

131124
void ShutdownResponse::Handle() {
132-
std::lock_guard<std::mutex> lock(ServerState::g_StatusMutex);
133-
134125
switch (serverType) {
135126
case ServiceType::AUTH:
136127
ServerState::g_AuthStatus.online = false;
@@ -163,47 +154,4 @@ namespace MasterPacketHandler {
163154
LOG("Received SHUTDOWN command from Master");
164155
Game::lastSignal = -1; // Trigger shutdown
165156
}
166-
167-
void HandleMasterPacket(Packet* packet) {
168-
if (!packet) return;
169-
170-
switch (packet->data[0]) {
171-
case ID_DISCONNECTION_NOTIFICATION:
172-
case ID_CONNECTION_LOST:
173-
LOG("Lost connection to Master Server");
174-
{
175-
std::lock_guard<std::mutex> lock(ServerState::g_StatusMutex);
176-
ServerState::g_AuthStatus.online = false;
177-
ServerState::g_ChatStatus.online = false;
178-
ServerState::g_WorldInstances.clear();
179-
}
180-
break;
181-
case ID_CONNECTION_REQUEST_ACCEPTED:
182-
LOG("Connected to Master Server");
183-
break;
184-
case ID_USER_PACKET_ENUM: {
185-
RakNet::BitStream inStream(packet->data, packet->length, false);
186-
uint64_t header{};
187-
inStream.Read(header);
188-
189-
const auto packetType = static_cast<MessageType::Master>(header);
190-
LOG_DEBUG("Received Master packet type: %i", packetType);
191-
192-
auto it = g_Handlers.find(packetType);
193-
if (it != g_Handlers.end()) {
194-
auto handler = it->second();
195-
if (!handler->Deserialize(inStream)) {
196-
LOG_DEBUG("Error deserializing Master packet type %i", packetType);
197-
return;
198-
}
199-
handler->Handle();
200-
} else {
201-
LOG_DEBUG("Unhandled Master packet type: %i", packetType);
202-
}
203-
break;
204-
}
205-
default:
206-
break;
207-
}
208-
}
209157
}

dDashboardServer/MasterPacketHandler.h renamed to dDashboardServer/handlers/MasterPacketHandler.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#pragma once
1+
#pragma once
22

33
#include <functional>
44
#include <map>
@@ -74,6 +74,6 @@ namespace MasterPacketHandler {
7474
void Handle() override;
7575
};
7676

77-
// Main handler function
78-
void HandleMasterPacket(Packet* packet);
77+
// Master packet handler registry
78+
extern std::map<MessageType::Master, std::function<std::unique_ptr<MasterPacket>()>> g_Handlers;
7979
}

0 commit comments

Comments
 (0)