mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-01 11:36:36 +00:00
More work on subscription events, and relaying through world.
This commit is contained in:
@@ -8,15 +8,16 @@ extern std::map<std::string, MethodHandler> unauthorized_methods;
|
||||
|
||||
void register_authorized_methods()
|
||||
{
|
||||
authorized_methods["token_auth"] = std::make_pair(0, handle_method_token_auth);
|
||||
authorized_methods["list_zones"] = std::make_pair(10, handle_method_no_args);
|
||||
authorized_methods["get_zone_info"] = std::make_pair(10, handle_method_get_zone_info);
|
||||
authorized_methods["subscribe"] = std::make_pair(10, handle_method_subscribe);
|
||||
authorized_methods["WebInterface::Authorize"] = std::make_pair(0, handle_method_token_auth);
|
||||
authorized_methods["World::ListZones"] = std::make_pair(10, handle_method_no_args);
|
||||
authorized_methods["World::GetZoneDetails"] = std::make_pair(10, handle_method_get_zone_info);
|
||||
authorized_methods["Zone::Subscribe"] = std::make_pair(10, handle_method_subscribe);
|
||||
authorized_methods["Zone::Unsubscribe"] = std::make_pair(10, handle_method_subscribe);
|
||||
}
|
||||
|
||||
void register_unauthorized_methods()
|
||||
{
|
||||
unauthorized_methods["token_auth"] = handle_method_token_auth;
|
||||
unauthorized_methods["WebInterface::Authorize"] = handle_method_token_auth;
|
||||
}
|
||||
|
||||
void register_methods()
|
||||
|
||||
@@ -13,8 +13,13 @@ void WriteWebCallResponseString(per_session_data_eqemu *session, rapidjson::Docu
|
||||
else {
|
||||
writer.String(doc["id"].GetString());
|
||||
}
|
||||
|
||||
writer.String("result");
|
||||
writer.StartObject();
|
||||
writer.String("value");
|
||||
writer.String(result.c_str());
|
||||
writer.EndObject();
|
||||
|
||||
writer.String("error");
|
||||
if (error) {
|
||||
writer.Bool(true);
|
||||
@@ -39,8 +44,13 @@ void WriteWebCallResponseInt(per_session_data_eqemu *session, rapidjson::Documen
|
||||
else {
|
||||
writer.String(doc["id"].GetString());
|
||||
}
|
||||
|
||||
writer.String("result");
|
||||
writer.StartObject();
|
||||
writer.String("value");
|
||||
writer.Int(result);
|
||||
writer.EndObject();
|
||||
|
||||
writer.String("error");
|
||||
if (error) {
|
||||
writer.Bool(true);
|
||||
@@ -65,8 +75,13 @@ void WriteWebCallResponseBoolean(per_session_data_eqemu *session, rapidjson::Doc
|
||||
else {
|
||||
writer.String(doc["id"].GetString());
|
||||
}
|
||||
|
||||
writer.String("result");
|
||||
writer.StartObject();
|
||||
writer.String("value");
|
||||
writer.Bool(result);
|
||||
writer.EndObject();
|
||||
|
||||
writer.String("error");
|
||||
if (error) {
|
||||
writer.Bool(true);
|
||||
|
||||
+114
-11
@@ -74,17 +74,24 @@ void WorldServer::Process(){
|
||||
pack->ReadString(error);
|
||||
|
||||
uint32 param_count = pack->ReadUInt32();
|
||||
std::vector<std::string> params;
|
||||
std::map<std::string, std::string> params;
|
||||
for(uint32 i = 0; i < param_count; ++i) {
|
||||
char *p = new char[pack->ReadUInt32() + 1];
|
||||
pack->ReadString(p);
|
||||
params.push_back(p);
|
||||
safe_delete_array(p);
|
||||
char *first = new char[pack->ReadUInt32() + 1];
|
||||
pack->ReadString(first);
|
||||
|
||||
char *second = new char[pack->ReadUInt32() + 1];
|
||||
pack->ReadString(second);
|
||||
|
||||
params[first] = second;
|
||||
|
||||
safe_delete_array(first);
|
||||
safe_delete_array(second);
|
||||
}
|
||||
|
||||
//send the response to client...
|
||||
rapidjson::StringBuffer s;
|
||||
rapidjson::Writer<rapidjson::StringBuffer> writer(s);
|
||||
|
||||
writer.StartObject();
|
||||
writer.String("id");
|
||||
if(strlen(id) == 0) {
|
||||
@@ -103,14 +110,15 @@ void WorldServer::Process(){
|
||||
writer.String("error");
|
||||
writer.Null();
|
||||
writer.String("result");
|
||||
writer.StartArray();
|
||||
uint32 p_sz = (uint32)params.size();
|
||||
for(uint32 i = 0; i < p_sz; ++i) {
|
||||
writer.String(params[i].c_str());
|
||||
writer.StartObject();
|
||||
auto iter = params.begin();
|
||||
while(iter != params.end()) {
|
||||
writer.String(iter->first.c_str());
|
||||
writer.String(iter->second.c_str());
|
||||
++iter;
|
||||
}
|
||||
writer.EndArray();
|
||||
writer.EndObject();
|
||||
}
|
||||
|
||||
writer.EndObject();
|
||||
|
||||
if(sessions.count(session_id) != 0) {
|
||||
@@ -123,6 +131,101 @@ void WorldServer::Process(){
|
||||
safe_delete_array(error);
|
||||
break;
|
||||
}
|
||||
|
||||
case ServerOP_WIRemoteCallToClient:
|
||||
{
|
||||
char *session_id = nullptr;
|
||||
char *method = nullptr;
|
||||
|
||||
DumpPacket(pack);
|
||||
|
||||
session_id = new char[pack->ReadUInt32() + 1];
|
||||
pack->ReadString(session_id);
|
||||
|
||||
method = new char[pack->ReadUInt32() + 1];
|
||||
pack->ReadString(method);
|
||||
|
||||
uint32 param_count = pack->ReadUInt32();
|
||||
std::vector<std::string> params(param_count);
|
||||
for(uint32 i = 0; i < param_count; ++i) {
|
||||
char *p = new char[pack->ReadUInt32() + 1];
|
||||
pack->ReadString(p);
|
||||
params[i] = p;
|
||||
|
||||
safe_delete_array(p);
|
||||
}
|
||||
|
||||
rapidjson::StringBuffer s;
|
||||
rapidjson::Writer<rapidjson::StringBuffer> writer(s);
|
||||
|
||||
writer.StartObject();
|
||||
writer.String("id");
|
||||
writer.Null();
|
||||
|
||||
writer.String("method");
|
||||
writer.String(method);
|
||||
|
||||
writer.String("params");
|
||||
writer.StartArray();
|
||||
|
||||
for(uint32 i = 0; i < param_count; ++i) {
|
||||
writer.String(params[i].c_str());
|
||||
}
|
||||
|
||||
writer.EndArray();
|
||||
|
||||
writer.EndObject();
|
||||
|
||||
if(sessions.count(session_id) != 0) {
|
||||
per_session_data_eqemu *session = sessions[session_id];
|
||||
session->send_queue->push_back(s.GetString());
|
||||
}
|
||||
|
||||
safe_delete_array(session_id);
|
||||
safe_delete_array(method);
|
||||
break;
|
||||
}
|
||||
|
||||
case ServerOP_WIClientSession:
|
||||
{
|
||||
std::vector<std::string> invalidate;
|
||||
uint32 zone_id = pack->ReadUInt32();
|
||||
uint32 instance_id = pack->ReadUInt32();
|
||||
uint32 count = pack->ReadUInt32();
|
||||
for(uint32 i = 0; i < count; ++i) {
|
||||
char *p = new char[pack->ReadUInt32() + 1];
|
||||
pack->ReadString(p);
|
||||
|
||||
if(sessions.count(p) == 0) {
|
||||
invalidate.push_back(p);
|
||||
}
|
||||
|
||||
safe_delete_array(p);
|
||||
}
|
||||
|
||||
if(invalidate.size() != 0) {
|
||||
uint32 sz = 12;
|
||||
size_t isz = invalidate.size();
|
||||
for(size_t i = 0; i < isz; ++i) {
|
||||
sz += invalidate[i].size();
|
||||
sz += 5;
|
||||
}
|
||||
|
||||
ServerPacket *pack = new ServerPacket(ServerOP_WIClientSessionResponse, sz);
|
||||
pack->WriteUInt32((uint32)zone_id);
|
||||
pack->WriteUInt32((uint32)instance_id);
|
||||
pack->WriteUInt32((uint32)invalidate.size());
|
||||
for(size_t i = 0; i < isz; ++i) {
|
||||
pack->WriteUInt32((uint32)invalidate[i].size());
|
||||
pack->WriteString(invalidate[i].c_str());
|
||||
}
|
||||
|
||||
SendPacket(pack);
|
||||
safe_delete(pack);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user