1
0

Combined peering to a single request to reduce load

This commit is contained in:
Emagi 2024-12-06 09:11:30 -05:00
parent 4e07b26cc7
commit f0b37e67d1
4 changed files with 189 additions and 139 deletions

View File

@ -532,7 +532,7 @@ void HTTPSClientPool::pollPeerHealth(const std::string& server, const std::strin
HealthStatus curStatus = peer_manager.getPeerStatus(server, web_worldport); HealthStatus curStatus = peer_manager.getPeerStatus(server, web_worldport);
id = peer_manager.isPeer(server, web_worldport); id = peer_manager.isPeer(server, web_worldport);
try { try {
auto response = client->sendRequest(server, port, "/status"); // Assumes HTTPSClient has a get method auto response = client->sendRequest(server, port, "/peerstatus"); // Assumes HTTPSClient has a get method
//std::cout << "Health check response from " << server << ":" << port << " - " << response << std::endl; //std::cout << "Health check response from " << server << ":" << port << " - " << response << std::endl;
boost::property_tree::ptree json_tree; boost::property_tree::ptree json_tree;
@ -544,29 +544,51 @@ void HTTPSClientPool::pollPeerHealth(const std::string& server, const std::strin
std::string worldAddr(""), internalWorldAddr(""), clientIP(""); std::string worldAddr(""), internalWorldAddr(""), clientIP("");
int16 worldPort = 0; int16 worldPort = 0;
if (auto status = json_tree.get_optional<std::string>("world_status")) { try {
online_status = status.get(); auto webStatusTree = json_tree.get_child("WebStatus");
}
if (auto priority = json_tree.get_optional<int16>("peer_priority")) {
peer_priority = priority.get();
}
if (auto isprimary = json_tree.get_optional<bool>("peer_primary")) {
peer_primary = isprimary.get();
}
if (auto peerclientaddr = json_tree.get_optional<std::string>("peer_client_address")) {
worldAddr = peerclientaddr.get();
}
if (auto peerclient_internaladdr = json_tree.get_optional<std::string>("peer_client_internal_address")) {
internalWorldAddr = peerclient_internaladdr.get();
}
if (auto peerclientport = json_tree.get_optional<int16>("peer_client_port")) {
worldPort = peerclientport.get();
}
if(worldAddr.size() > 0 && worldPort > 0) {
peer_manager.updatePeer(server, web_worldport, worldAddr, internalWorldAddr, worldPort, peer_primary);
}
peer_manager.updatePriority(id, peer_priority);
if (auto status = webStatusTree.get_optional<std::string>("world_status")) {
online_status = status.get();
}
if (auto priority = webStatusTree.get_optional<int16>("peer_priority")) {
peer_priority = priority.get();
}
if (auto isprimary = webStatusTree.get_optional<bool>("peer_primary")) {
peer_primary = isprimary.get();
}
if (auto peerclientaddr = webStatusTree.get_optional<std::string>("peer_client_address")) {
worldAddr = peerclientaddr.get();
}
if (auto peerclient_internaladdr = webStatusTree.get_optional<std::string>("peer_client_internal_address")) {
internalWorldAddr = peerclient_internaladdr.get();
}
if (auto peerclientport = webStatusTree.get_optional<int16>("peer_client_port")) {
worldPort = peerclientport.get();
}
if(worldAddr.size() > 0 && worldPort > 0) {
peer_manager.updatePeer(server, web_worldport, worldAddr, internalWorldAddr, worldPort, peer_primary);
}
peer_manager.updatePriority(id, peer_priority);
} catch (const boost::property_tree::ptree_error& e) {
LogWrite(PEERING__ERROR, 0, "Peering", "%s: Error accessing WebStatus tree: Peer %s at %s:%s - HAS PRIMARY status, demoting self.", __FUNCTION__, id.c_str(), server.c_str(), port.c_str());
}
// Process Clients
if (json_tree.find("Clients") != json_tree.not_found()) {
for (const auto& client : json_tree.get_child("Clients")) {
boost::property_tree::ptree clientTree = client.second;
peer_manager.updateClientTree(id, clientTree);
break; // should only be one tree
}
}
// Process Zones
if (json_tree.find("Zones") != json_tree.not_found()) {
for (const auto& zone : json_tree.get_child("Zones")) {
boost::property_tree::ptree zoneTree = zone.second;
peer_manager.updateZoneTree(id, zoneTree);
break; // should only be one tree
}
}
if (peer_primary && net.is_primary) { if (peer_primary && net.is_primary) {
peer_manager.handlePrimaryConflict(id); peer_manager.handlePrimaryConflict(id);
std::shared_ptr<Peer> hasPrimary = peer_manager.getHealthyPrimaryPeerPtr(); std::shared_ptr<Peer> hasPrimary = peer_manager.getHealthyPrimaryPeerPtr();
@ -581,7 +603,6 @@ void HTTPSClientPool::pollPeerHealth(const std::string& server, const std::strin
switch (curStatus) { switch (curStatus) {
case HealthStatus::STARTUP: { case HealthStatus::STARTUP: {
pollPeerHealthData(client, id, server, port);
if (online_status == "offline") { if (online_status == "offline") {
std::shared_ptr<Peer> peer = peer_manager.getPeerById(id); std::shared_ptr<Peer> peer = peer_manager.getPeerById(id);
if (peer) { if (peer) {
@ -620,7 +641,6 @@ void HTTPSClientPool::pollPeerHealth(const std::string& server, const std::strin
break; break;
} }
case HealthStatus::OK: { case HealthStatus::OK: {
pollPeerHealthData(client, id, server, port);
if (!net.is_primary && !peer_manager.hasPrimary() && peer_priority < net.GetPeerPriority()) { if (!net.is_primary && !peer_manager.hasPrimary() && peer_priority < net.GetPeerPriority()) {
LogWrite(PEERING__INFO, 0, "Peering", "%s: Peer %s at %s:%s - HAS PRIMARY.", __FUNCTION__, id.c_str(), server.c_str(), port.c_str()); LogWrite(PEERING__INFO, 0, "Peering", "%s: Peer %s at %s:%s - HAS PRIMARY.", __FUNCTION__, id.c_str(), server.c_str(), port.c_str());
peer_manager.setPrimary(id); peer_manager.setPrimary(id);

View File

@ -50,15 +50,27 @@ HTTPSClientPool peer_https_pool;
void World::Web_worldhandle_status(const http::request<http::string_body>& req, http::response<http::string_body>& res) { void World::Web_worldhandle_status(const http::request<http::string_body>& req, http::response<http::string_body>& res) {
res.set(http::field::content_type, "application/json; charset=utf-8"); res.set(http::field::content_type, "application/json; charset=utf-8");
boost::property_tree::ptree pt; boost::property_tree::ptree pt;
world.Web_populate_status(pt);
std::ostringstream oss;
boost::property_tree::write_json(oss, pt);
std::string json = oss.str();
res.body() = json;
res.prepare_payload();
}
void World::Web_populate_status(boost::property_tree::ptree& pt) {
pt.put("web_status", "online"); pt.put("web_status", "online");
bool world_online = world.world_loaded; bool world_online = world.world_loaded;
pt.put("world_status", world.world_loaded ? "online" : "offline"); pt.put("world_status", world_online ? "online" : "offline");
pt.put("world_uptime", (getCurrentTimestamp() - world.world_uptime)); pt.put("world_uptime", (getCurrentTimestamp() - world.world_uptime));
auto [days, hours, minutes, seconds] = convertTimestampDuration((getCurrentTimestamp() - world.world_uptime)); auto [days, hours, minutes, seconds] = convertTimestampDuration((getCurrentTimestamp() - world.world_uptime));
std::string uptime_str("Days: " + std::to_string(days) + ", " + "Hours: " + std::to_string(hours) + ", " + "Minutes: " + std::to_string(minutes) + ", " + "Seconds: " + std::to_string(seconds)); std::string uptime_str = "Days: " + std::to_string(days) + ", Hours: " + std::to_string(hours) + ", Minutes: " + std::to_string(minutes) + ", Seconds: " + std::to_string(seconds);
pt.put("world_uptime_string", uptime_str); pt.put("world_uptime_string", uptime_str);
pt.put("login_connected", loginserver.Connected() ? "connected" : "disconnected"); pt.put("login_connected", loginserver.Connected() ? "connected" : "disconnected");
pt.put("player_count", zone_list.GetZonesPlayersCount()); pt.put("player_count", zone_list.GetZonesPlayersCount());
pt.put("client_count", numclients); pt.put("client_count", numclients);
@ -69,7 +81,14 @@ void World::Web_worldhandle_status(const http::request<http::string_body>& req,
pt.put("peer_client_address", std::string(net.GetWorldAddress())); pt.put("peer_client_address", std::string(net.GetWorldAddress()));
pt.put("peer_client_internal_address", std::string(net.GetInternalWorldAddress())); pt.put("peer_client_internal_address", std::string(net.GetInternalWorldAddress()));
pt.put("peer_client_port", std::to_string(net.GetWorldPort())); pt.put("peer_client_port", std::to_string(net.GetWorldPort()));
}
void World::Web_worldhandle_clients(const http::request<http::string_body>& req, http::response<http::string_body>& res) {
res.set(http::field::content_type, "application/json; charset=utf-8");
boost::property_tree::ptree pt;
zone_list.PopulateClientList(pt);
std::ostringstream oss; std::ostringstream oss;
boost::property_tree::write_json(oss, pt); boost::property_tree::write_json(oss, pt);
std::string json = oss.str(); std::string json = oss.str();
@ -77,76 +96,66 @@ void World::Web_worldhandle_status(const http::request<http::string_body>& req,
res.prepare_payload(); res.prepare_payload();
} }
void World::Web_worldhandle_clients(const http::request<http::string_body>& req, http::response<http::string_body>& res) { void ZoneList::PopulateClientList(boost::property_tree::ptree& pt) {
zone_list.PopulateClientList(res); boost::property_tree::ptree maintree;
MClientList.lock();
for (auto& itr : client_map) {
if (itr.second) {
Client* cur = itr.second;
boost::property_tree::ptree client_pt;
client_pt.put("character_id", cur->GetCharacterID());
client_pt.put("character_name", cur->GetPlayer() ? cur->GetPlayer()->GetName() : "");
client_pt.put("subtitle", cur->GetPlayer() ? cur->GetPlayer()->appearance.sub_title : "");
client_pt.put("class1", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_class1() : 0);
client_pt.put("class2", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_class2() : 0);
client_pt.put("class3", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_class3() : 0);
client_pt.put("deity", cur->GetPlayer() ? cur->GetPlayer()->GetDeity() : 0);
client_pt.put("tradeskill_class1", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_tradeskill_class1() : 0);
client_pt.put("tradeskill_class2", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_tradeskill_class2() : 0);
client_pt.put("tradeskill_class3", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_tradeskill_class3() : 0);
client_pt.put("race", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_race() : 0);
client_pt.put("level", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_level() : 0);
client_pt.put("effective_level", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_effective_level() : 0);
client_pt.put("tradeskill_level", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_tradeskill_level() : 0);
client_pt.put("account_age", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_account_age_base() : 0);
client_pt.put("account_id", cur->GetAccountID());
client_pt.put("version", cur->GetVersion());
client_pt.put("status", cur->GetAdminStatus());
client_pt.put("guild_id", cur->GetPlayer() && cur->GetPlayer()->GetGuild() ? cur->GetPlayer()->GetGuild()->GetID() : 0);
client_pt.put("flags", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_flags() : 0);
client_pt.put("flags2", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_flags2() : 0);
client_pt.put("adventure_class", cur->GetPlayer() ? cur->GetPlayer()->GetAdventureClass() : 0);
client_pt.put("tradeskill_class", cur->GetPlayer() ? cur->GetPlayer()->GetTradeskillClass() : 0);
client_pt.put("is_zoning", cur->IsZoning() || !cur->IsReadyForUpdates());
bool linkdead = cur->GetPlayer() ? ((cur->GetPlayer()->GetActivityStatus() & ACTIVITY_STATUS_LINKDEAD) > 0) : false;
client_pt.put("is_linkdead", linkdead);
client_pt.put("in_zone", cur->IsReadyForUpdates());
client_pt.put("zone_id", cur->GetPlayer() && cur->GetPlayer()->GetZone() ? cur->GetPlayer()->GetZone()->GetZoneID() : 0);
client_pt.put("instance_id", cur->GetPlayer() && cur->GetPlayer()->GetZone() ? cur->GetPlayer()->GetZone()->GetInstanceID() : 0);
client_pt.put("zonename", cur->GetPlayer() && cur->GetPlayer()->GetZone() ? cur->GetPlayer()->GetZone()->GetZoneName() : "N/A");
client_pt.put("zonedescription", cur->GetPlayer() && cur->GetPlayer()->GetZone() ? cur->GetPlayer()->GetZone()->GetZoneDescription() : "");
GroupMemberInfo* gmi = cur->GetPlayer() ? cur->GetPlayer()->GetGroupMemberInfo() : nullptr;
int32 group_id = 0;
bool group_leader = false;
if (gmi && gmi->group_id) {
group_id = gmi->group_id;
group_leader = gmi->leader;
}
client_pt.put("group_id", group_id);
client_pt.put("group_leader", group_leader);
maintree.push_back(std::make_pair("", client_pt));
}
}
MClientList.unlock();
pt.add_child("Clients", maintree);
} }
void ZoneList::PopulateClientList(http::response<http::string_body>& res) {
res.set(http::field::content_type, "application/json; charset=utf-8");
boost::property_tree::ptree maintree;
std::ostringstream oss;
MClientList.lock();
map<string, Client*>::iterator itr;
for (itr = client_map.begin(); itr != client_map.end(); itr++) {
if (itr->second) {
Client* cur = (Client*)itr->second;
boost::property_tree::ptree pt;
pt.put("character_id", cur->GetCharacterID());
pt.put("character_name", cur->GetPlayer() ? cur->GetPlayer()->GetName() : "");
pt.put("subtitle", cur->GetPlayer() ? cur->GetPlayer()->appearance.sub_title : "");
pt.put("class1", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_class1() : 0);
pt.put("class2", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_class2() : 0);
pt.put("class3", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_class3() : 0);
pt.put("deity", cur->GetPlayer() ? cur->GetPlayer()->GetDeity() : 0);
pt.put("tradeskill_class1", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_tradeskill_class1() : 0);
pt.put("tradeskill_class2", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_tradeskill_class2() : 0);
pt.put("tradeskill_class3", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_tradeskill_class3() : 0);
pt.put("race", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_race() : 0);
pt.put("level", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_level() : 0);
pt.put("effective_level", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_effective_level() : 0);
pt.put("tradeskill_level", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_tradeskill_level() : 0);
pt.put("account_age", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_account_age_base() : 0);
pt.put("account_id", cur->GetAccountID());
pt.put("version", cur->GetVersion());
pt.put("status", cur->GetAdminStatus());
pt.put("guild_id", cur->GetPlayer()->GetGuild() != nullptr ? cur->GetPlayer()->GetGuild()->GetID() : 0);
pt.put("flags", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_flags() : 0);
pt.put("flags2", cur->GetPlayer() ? cur->GetPlayer()->GetInfoStruct()->get_flags2() : 0);
pt.put("adventure_class", cur->GetPlayer() ? cur->GetPlayer()->GetAdventureClass() : 0);
pt.put("tradeskill_class", cur->GetPlayer() ? cur->GetPlayer()->GetTradeskillClass() : 0);
pt.put("is_zoning", (cur->IsZoning() || !cur->IsReadyForUpdates()));
bool linkdead = cur->GetPlayer() ? (((cur->GetPlayer()->GetActivityStatus() & ACTIVITY_STATUS_LINKDEAD) > 0)) : false;
pt.put("is_linkdead", linkdead);
pt.put("in_zone", cur->IsReadyForUpdates());
pt.put("zone_id", (cur->GetPlayer() && cur->GetPlayer()->GetZone()) ? cur->GetPlayer()->GetZone()->GetZoneID() : 0);
pt.put("instance_id", (cur->GetPlayer() && cur->GetPlayer()->GetZone()) ? cur->GetPlayer()->GetZone()->GetInstanceID() : 0);
pt.put("zonename", (cur->GetPlayer() && cur->GetPlayer()->GetZone()) ? cur->GetPlayer()->GetZone()->GetZoneName() : "N/A");
pt.put("zonedescription", (cur->GetPlayer() && cur->GetPlayer()->GetZone()) ? cur->GetPlayer()->GetZone()->GetZoneDescription() : "");
GroupMemberInfo* gmi = cur->GetPlayer()->GetGroupMemberInfo();
int32 group_id = 0;
bool group_leader = false;
if (gmi && gmi->group_id) {
group_id = gmi->group_id;
group_leader = gmi->leader;
}
pt.put("group_id", group_id);
pt.put("group_leader", group_leader);
maintree.push_back(std::make_pair("", pt));
}
}
MClientList.unlock();
boost::property_tree::ptree result;
result.add_child("Clients", maintree);
boost::property_tree::write_json(oss, result);
std::string json = oss.str();
res.body() = json;
res.prepare_payload();
}
void World::Web_worldhandle_setadminstatus(const http::request<http::string_body>& req, http::response<http::string_body>& res) { void World::Web_worldhandle_setadminstatus(const http::request<http::string_body>& req, http::response<http::string_body>& res) {
res.set(http::field::content_type, "application/json; charset=utf-8"); res.set(http::field::content_type, "application/json; charset=utf-8");
@ -452,55 +461,56 @@ void World::Web_worldhandle_addpeer(const http::request<http::string_body>& req,
} }
void World::Web_worldhandle_zones(const http::request<http::string_body>& req, http::response<http::string_body>& res) { void World::Web_worldhandle_zones(const http::request<http::string_body>& req, http::response<http::string_body>& res) {
zone_list.PopulateZoneList(res);
}
void ZoneList::PopulateZoneList(http::response<http::string_body>& res) {
res.set(http::field::content_type, "application/json; charset=utf-8"); res.set(http::field::content_type, "application/json; charset=utf-8");
boost::property_tree::ptree maintree;
boost::property_tree::ptree pt;
zone_list.PopulateZoneList(pt);
std::ostringstream oss; std::ostringstream oss;
list<ZoneServer*>::iterator zone_iter; boost::property_tree::write_json(oss, pt);
ZoneServer* tmp = 0;
MZoneList.readlock(__FUNCTION__, __LINE__);
int zonesListed = 0;
for (zone_iter = zlist.begin(); zone_iter != zlist.end(); zone_iter++) {
tmp = *zone_iter;
boost::property_tree::ptree pt;
pt.put("zone_name", tmp->GetZoneName());
pt.put("zone_file_name", tmp->GetZoneFile());
pt.put("zone_id", tmp->GetZoneID());
pt.put("instance_id", tmp->GetInstanceID());
pt.put("shutting_down", tmp->isZoneShuttingDown());
pt.put("instance_zone", tmp->IsInstanceZone());
pt.put("num_players", tmp->NumPlayers());
pt.put("city_zone", tmp->IsCityZone());
pt.put("safe_x", tmp->GetSafeX());
pt.put("safe_y", tmp->GetSafeY());
pt.put("safe_z", tmp->GetSafeZ());
pt.put("safe_heading", tmp->GetSafeHeading());
pt.put("lock_state", tmp->GetZoneLockState());
pt.put("min_status", tmp->GetMinimumStatus());
pt.put("min_level", tmp->GetMinimumLevel());
pt.put("max_level", tmp->GetMaximumLevel());
pt.put("min_version", tmp->GetMinimumVersion());
pt.put("default_lockout_time", tmp->GetDefaultLockoutTime());
pt.put("default_reenter_time", tmp->GetDefaultReenterTime());
pt.put("instance_type", (int8)tmp->GetInstanceType());
pt.put("always_loaded", tmp->AlwaysLoaded());
zonesListed++;
maintree.push_back(std::make_pair("", pt));
}
MZoneList.releasereadlock(__FUNCTION__, __LINE__);
boost::property_tree::ptree result;
result.add_child("Zones", maintree);
boost::property_tree::write_json(oss, result);
std::string json = oss.str(); std::string json = oss.str();
res.body() = json; res.body() = json;
res.prepare_payload(); res.prepare_payload();
} }
void ZoneList::PopulateZoneList(boost::property_tree::ptree& pt) {
boost::property_tree::ptree maintree;
list<ZoneServer*>::iterator zone_iter;
ZoneServer* tmp = nullptr;
MZoneList.readlock(__FUNCTION__, __LINE__);
for (zone_iter = zlist.begin(); zone_iter != zlist.end(); ++zone_iter) {
tmp = *zone_iter;
boost::property_tree::ptree zone_pt;
zone_pt.put("zone_name", tmp->GetZoneName());
zone_pt.put("zone_file_name", tmp->GetZoneFile());
zone_pt.put("zone_id", tmp->GetZoneID());
zone_pt.put("instance_id", tmp->GetInstanceID());
zone_pt.put("shutting_down", tmp->isZoneShuttingDown());
zone_pt.put("instance_zone", tmp->IsInstanceZone());
zone_pt.put("num_players", tmp->NumPlayers());
zone_pt.put("city_zone", tmp->IsCityZone());
zone_pt.put("safe_x", tmp->GetSafeX());
zone_pt.put("safe_y", tmp->GetSafeY());
zone_pt.put("safe_z", tmp->GetSafeZ());
zone_pt.put("safe_heading", tmp->GetSafeHeading());
zone_pt.put("lock_state", tmp->GetZoneLockState());
zone_pt.put("min_status", tmp->GetMinimumStatus());
zone_pt.put("min_level", tmp->GetMinimumLevel());
zone_pt.put("max_level", tmp->GetMaximumLevel());
zone_pt.put("min_version", tmp->GetMinimumVersion());
zone_pt.put("default_lockout_time", tmp->GetDefaultLockoutTime());
zone_pt.put("default_reenter_time", tmp->GetDefaultReenterTime());
zone_pt.put("instance_type", static_cast<int8>(tmp->GetInstanceType()));
zone_pt.put("always_loaded", tmp->AlwaysLoaded());
maintree.push_back(std::make_pair("", zone_pt));
}
MZoneList.releasereadlock(__FUNCTION__, __LINE__);
pt.add_child("Zones", maintree);
}
void World::Web_worldhandle_addcharauth(const http::request<http::string_body>& req, http::response<http::string_body>& res) { void World::Web_worldhandle_addcharauth(const http::request<http::string_body>& req, http::response<http::string_body>& res) {
res.set(http::field::content_type, "application/json; charset=utf-8"); res.set(http::field::content_type, "application/json; charset=utf-8");
boost::property_tree::ptree pt, json_tree; boost::property_tree::ptree pt, json_tree;
@ -1296,3 +1306,18 @@ void World::Web_worldhandle_setguildeventfilter(const http::request<http::string
res.body() = json; res.body() = json;
res.prepare_payload(); res.prepare_payload();
} }
void World::Web_worldhandle_peerstatus(const http::request<http::string_body>& req, http::response<http::string_body>& res) {
res.set(http::field::content_type, "application/json; charset=utf-8");
boost::property_tree::ptree pt;
world.Web_populate_status(pt);
zone_list.PopulateZoneList(pt);
zone_list.PopulateClientList(pt);
std::ostringstream oss;
boost::property_tree::write_json(oss, pt);
std::string json = oss.str();
res.body() = json;
res.prepare_payload();
}

View File

@ -277,6 +277,8 @@ void World::init(std::string web_ipaddr, int16 web_port, std::string cert_file,
world_webserver->register_route("/removeguildmember", World::Web_worldhandle_removeguildmember); world_webserver->register_route("/removeguildmember", World::Web_worldhandle_removeguildmember);
world_webserver->register_route("/setguildpermission", World::Web_worldhandle_setguildpermission); world_webserver->register_route("/setguildpermission", World::Web_worldhandle_setguildpermission);
world_webserver->register_route("/setguildeventfilter", World::Web_worldhandle_setguildeventfilter); world_webserver->register_route("/setguildeventfilter", World::Web_worldhandle_setguildeventfilter);
world_webserver->register_route("/peerstatus", World::Web_worldhandle_peerstatus);
world_webserver->run(); world_webserver->run();
LogWrite(INIT__INFO, 0, "Init", "World Web Server is listening on %s:%u..", web_ipaddr.c_str(), web_port); LogWrite(INIT__INFO, 0, "Init", "World Web Server is listening on %s:%u..", web_ipaddr.c_str(), web_port);
web_success = true; web_success = true;

View File

@ -516,8 +516,8 @@ class ZoneList {
void SendTimeUpdate(); void SendTimeUpdate();
void PopulateClientList(http::response<http::string_body>& res); void PopulateClientList(boost::property_tree::ptree& pt);
void PopulateZoneList(http::response<http::string_body>& res); void PopulateZoneList(boost::property_tree::ptree& pt);
private: private:
Mutex MClientList; Mutex MClientList;
Mutex MZoneList; Mutex MZoneList;
@ -707,6 +707,9 @@ public:
static void Web_worldhandle_removeguildmember(const http::request<http::string_body>& req, http::response<http::string_body>& res); static void Web_worldhandle_removeguildmember(const http::request<http::string_body>& req, http::response<http::string_body>& res);
static void Web_worldhandle_setguildpermission(const http::request<http::string_body>& req, http::response<http::string_body>& res); static void Web_worldhandle_setguildpermission(const http::request<http::string_body>& req, http::response<http::string_body>& res);
static void Web_worldhandle_setguildeventfilter(const http::request<http::string_body>& req, http::response<http::string_body>& res); static void Web_worldhandle_setguildeventfilter(const http::request<http::string_body>& req, http::response<http::string_body>& res);
static void Web_worldhandle_peerstatus(const http::request<http::string_body>& req, http::response<http::string_body>& res);
static void Web_populate_status(boost::property_tree::ptree& pt);
Mutex MVoiceOvers; Mutex MVoiceOvers;
static sint64 newValue; static sint64 newValue;