diff --git a/config.example.yml b/config.example.yml index 006890d..d94e3e8 100644 --- a/config.example.yml +++ b/config.example.yml @@ -39,6 +39,11 @@ MaxConnections: 20 MaxGamePeers: 0 TickTimeBudget: 2000 +#Optional Override for Region List +#RegionList: +# - Asia +# - Europe + # Settings database # Requires LUXON_SERVER_ENABLE_SETTINGS_DATABASE diff --git a/include/luxon/server/server_manager.hpp b/include/luxon/server/server_manager.hpp index b019295..fc1523d 100644 --- a/include/luxon/server/server_manager.hpp +++ b/include/luxon/server/server_manager.hpp @@ -86,6 +86,7 @@ struct HttpServerConfig { /// struct ServerManagerConfig { std::vector servers; + std::vector region_list; bool enable_ipv6 = true; bool no_banner = false; unsigned max_connections = 0; @@ -175,9 +176,15 @@ class ServerManager { Hookpoints hookpoints; #endif + // For use by the handler_nameserver + const std::vector& get_region_list() const { return region_list_; } + private: SockSelector sock_selector_; + // For use by the handler_nameserver + std::vector region_list_; + std::shared_ptr log_; std::vector configs_; std::unordered_map servers_; diff --git a/src/handler_nameserver.cpp b/src/handler_nameserver.cpp index 104e546..d4c9792 100644 --- a/src/handler_nameserver.cpp +++ b/src/handler_nameserver.cpp @@ -48,8 +48,13 @@ Awaitable<> NameServerHandler::HandleOperationRequest(ser::OperationRequestMessa case OpCodes::RpcAndMisc::GetRegions: { ZoneScopedN("HandleOperationRequest_GetRegions"); - // Build dummy response with all regions + // Build dummy response with all regions unless overidden by config std::vector regions = {"asia", "au", "cae", "cn", "eu", "hk", "in", "jp", "za", "sa", "kr", "tr", "uae", "us", "usw", "ussc"}; + const std::vector& regions_from_yml = server_manager_.get_region_list(); + + if( regions_from_yml.empty() == false ) { + regions = regions_from_yml; + } std::vector addresses(regions.size()); for (size_t i = 0; i < regions.size(); ++i) diff --git a/src/server_manager.cpp b/src/server_manager.cpp index b961082..e011791 100644 --- a/src/server_manager.cpp +++ b/src/server_manager.cpp @@ -382,6 +382,25 @@ ServerManagerConfig ServerManager::parse_config(const std::string& config_conten if (key == "Servers") { ParseServersSection(config, section); + } else if (key == "RegionList") { + if (section.IsScalar()) { + config.region_list.push_back(section.As()); + } else if( section.IsSequence() ) { + for (Yaml::Iterator it = section.Begin(); it != section.End(); it.operator++(1)) { + Yaml::Node& region_node = (*it).second; + if (region_node.IsScalar()) { + config.region_list.push_back(region_node.As()); + } else { + create_logger("ConfigParser") + ->warn("The 'RegionList' must be a valid scalar or valid sequence in yml. It is not, so the default value will be used."); + config.region_list.clear(); + break; + } + } + } else { + create_logger("ConfigParser") + ->warn("The 'RegionList' must be a valid scalar or valid sequence in yml. It is not, so the default value will be used."); + } } else if (key == "External") { create_logger("ConfigParser") ->warn("The 'External' configuration block is deprecated and will be ignored. Please migrate to using 'proxies' within the 'Servers' block."); @@ -443,6 +462,9 @@ ServerManager::ServerManager(ServerManagerConfig config config.no_banner = true; #endif + // Fill in the region list for the handler_nameserver + region_list_ = (std::move(config.region_list)); + if (!config.no_banner) { static bool banner_printed = false; if (!banner_printed) {