mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-04 02:06:50 +00:00
Work on relay
This commit is contained in:
+65
-3
@@ -17,10 +17,10 @@ extern WebInterfaceConnection WILink;
|
||||
std::map<std::string, RemoteCallHandler> remote_call_methods;
|
||||
|
||||
void RemoteCallResponse(const std::string &connection_id, const std::string &request_id, const std::vector<std::string> &res, const std::string &error) {
|
||||
uint32 sz = connection_id.size() + request_id.size() + error.size() + 3 + 16;
|
||||
uint32 res_sz = res.size();
|
||||
uint32 sz = (uint32)(connection_id.size() + request_id.size() + error.size() + 3 + 16);
|
||||
uint32 res_sz = (uint32)res.size();
|
||||
for(uint32 i = 0; i < res_sz; ++i) {
|
||||
sz += res[i].size() + 5;
|
||||
sz += (uint32)res[i].size() + 5;
|
||||
}
|
||||
|
||||
ServerPacket *pack = new ServerPacket(ServerOP_WIRemoteCallResponse, sz);
|
||||
@@ -43,6 +43,7 @@ void RemoteCallResponse(const std::string &connection_id, const std::string &req
|
||||
void register_remote_call_handlers() {
|
||||
remote_call_methods["list_zones"] = handle_rc_list_zones;
|
||||
remote_call_methods["get_zone_info"] = handle_rc_get_zone_info;
|
||||
remote_call_methods["subscribe"] = handle_rc_relay;
|
||||
}
|
||||
|
||||
void handle_rc_list_zones(const std::string &method, const std::string &connection_id, const std::string &request_id, const std::vector<std::string> ¶ms) {
|
||||
@@ -86,3 +87,64 @@ void handle_rc_get_zone_info(const std::string &method, const std::string &conne
|
||||
res.push_back(itoa(zs->NumPlayers()));
|
||||
RemoteCallResponse(connection_id, request_id, res, error);
|
||||
}
|
||||
|
||||
void handle_rc_relay(const std::string &method, const std::string &connection_id, const std::string &request_id, const std::vector<std::string> ¶ms) {
|
||||
std::string error;
|
||||
std::vector<std::string> res;
|
||||
uint32 zone_id = 0;
|
||||
uint32 instance_id = 0;
|
||||
ZoneServer *zs = nullptr;
|
||||
|
||||
if(params.size() < 2) {
|
||||
error = "Missing zone relay params";
|
||||
RemoteCallResponse(connection_id, request_id, res, error);
|
||||
return;
|
||||
}
|
||||
|
||||
zone_id = (uint32)atoi(params[0].c_str());
|
||||
instance_id = (uint32)atoi(params[1].c_str());
|
||||
if(!zone_id && !instance_id) {
|
||||
error = "Zone not booted";
|
||||
RemoteCallResponse(connection_id, request_id, res, error);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if(instance_id) {
|
||||
zs = zoneserver_list.FindByInstanceID(instance_id);
|
||||
} else {
|
||||
zs = zoneserver_list.FindByZoneID(zone_id);
|
||||
}
|
||||
|
||||
if(!zs) {
|
||||
error = "Zone server not found";
|
||||
RemoteCallResponse(connection_id, request_id, res, error);
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 sz = (uint32)(request_id.size() + connection_id.size() + method.size() + 3 + 16);
|
||||
uint32 p_sz = (uint32)params.size() - 2;
|
||||
for(uint32 i = 0; i < p_sz; ++i) {
|
||||
auto ¶m = params[i + 2];
|
||||
sz += (uint32)param.size();
|
||||
sz += 5;
|
||||
}
|
||||
|
||||
ServerPacket *pack = new ServerPacket(ServerOP_WIRemoteCall, sz);
|
||||
pack->WriteUInt32((uint32)request_id.size());
|
||||
pack->WriteString(request_id.c_str());
|
||||
pack->WriteUInt32((uint32)connection_id.size());
|
||||
pack->WriteString(connection_id.c_str());
|
||||
pack->WriteUInt32((uint32)method.size());
|
||||
pack->WriteString(method.c_str());
|
||||
pack->WriteUInt32(p_sz);
|
||||
|
||||
for(uint32 i = 0; i < p_sz; ++i) {
|
||||
auto ¶m = params[i + 2];
|
||||
pack->WriteUInt32((uint32)param.size());
|
||||
pack->WriteString(param.c_str());
|
||||
}
|
||||
|
||||
zs->SendPacket(pack);
|
||||
safe_delete(pack);
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ void RemoteCallResponse(const std::string &connection_id, const std::string &req
|
||||
void register_remote_call_handlers();
|
||||
void handle_rc_list_zones(const std::string &method, const std::string &connection_id, const std::string &request_id, const std::vector<std::string> ¶ms);
|
||||
void handle_rc_get_zone_info(const std::string &method, const std::string &connection_id, const std::string &request_id, const std::vector<std::string> ¶ms);
|
||||
void handle_rc_relay(const std::string &method, const std::string &connection_id, const std::string &request_id, const std::vector<std::string> ¶ms);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user