diff --git a/src/Perpetuum.AdminTool/LocalServerRunner.cs b/src/Perpetuum.AdminTool/LocalServerRunner.cs index 602101bdf..18161f893 100644 --- a/src/Perpetuum.AdminTool/LocalServerRunner.cs +++ b/src/Perpetuum.AdminTool/LocalServerRunner.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Net; @@ -17,6 +18,8 @@ public class LocalServerRunner private bool _stopProbing; private LogHandler _log; private LocalServerState _localServerState; + + private Dictionary _loadedConfig; public LocalServerState State { get => _localServerState; @@ -93,13 +96,25 @@ public void Run(string gameRoot, string pathToExecutable) // save localserverinfo file SaveLocalServerInfo(gameRoot, pathToExecutable); - var listeningPort = GetPortFromIni(gameRoot); + _loadedConfig = ReadConfigFromDisk(gameRoot); + + var listeningPort = _loadedConfig["listenerPort"]; if (listeningPort <= 0) { _log.StatusError($"Wasn't able to get listening port from {PERPETUUMINIFILE}. No port probe is started."); return; } + var adminOnlyMode = _loadedConfig["adminOnlyMode"]; + if (!adminOnlyMode) + { + _log.Log("AdminOnlyMode: Disabled (Default)"); + } + else + { + _log.Log("AdminOnlyMode: Enabled"); + } + //RunNetStatProbe(listeningPort); RunSocketProbe(listeningPort); } @@ -335,26 +350,29 @@ private string NextIndicatorText() return _indicatorPhases[_indicatorTextIndex]; } - private int GetPortFromIni(string gameRoot) + private Dictionary ReadConfigFromDisk(string gameRoot) { var perpetuumIni = Path.Combine(gameRoot, PERPETUUMINIFILE); if (!File.Exists(perpetuumIni)) { - _log.StatusError($"{PERPETUUMINIFILE} was not found in game root {gameRoot} folder. Check your settings!" ); - return -1; + _log.StatusError($"{PERPETUUMINIFILE} was not found in game root {gameRoot} folder. Check your settings!"); } var json = File.ReadAllText(perpetuumIni); - var portData = JsonConvert.DeserializeAnonymousType(json,new + var listenerPort = JsonConvert.DeserializeAnonymousType(json, new { ListenerPort = -1, }); + var adminOnlyMode = JsonConvert.DeserializeAnonymousType(json, new + { + StartServerInAdminOnlyMode = false, + }); - _log.Log($"Relay port loaded from {PERPETUUMINIFILE}: {portData.ListenerPort}"); + Dictionary result = new Dictionary(); + result.Add("listenerPort", listenerPort.ListenerPort); + result.Add("adminOnlyMode", adminOnlyMode.StartServerInAdminOnlyMode); - return portData.ListenerPort; + return result; } - - } } diff --git a/src/Perpetuum.RequestHandlers/RelayClose.cs b/src/Perpetuum.RequestHandlers/RelayClose.cs index 55675dcdb..22e0a2b2e 100644 --- a/src/Perpetuum.RequestHandlers/RelayClose.cs +++ b/src/Perpetuum.RequestHandlers/RelayClose.cs @@ -14,7 +14,9 @@ public RelayClose(IRelayStateService relayStateService) public void HandleRequest(IRequest request) { + _relayStateService.ConfigOnlyAllowAdmins(true); _relayStateService.State = RelayState.OpenForAdminsOnly; + Message.Builder.FromRequest(request).WithOk().Send(); } } diff --git a/src/Perpetuum.RequestHandlers/RelayOpen.cs b/src/Perpetuum.RequestHandlers/RelayOpen.cs index 460e2af1d..3179dae94 100644 --- a/src/Perpetuum.RequestHandlers/RelayOpen.cs +++ b/src/Perpetuum.RequestHandlers/RelayOpen.cs @@ -14,7 +14,9 @@ public RelayOpen(IRelayStateService relayStateService) public void HandleRequest(IRequest request) { + _relayStateService.ConfigOnlyAllowAdmins(false); _relayStateService.State = RelayState.OpenForPublic; + Message.Builder.FromRequest(request).WithOk().Send(); } } diff --git a/src/Perpetuum/GlobalConfiguration.cs b/src/Perpetuum/GlobalConfiguration.cs index 85d8a6665..49be1c097 100644 --- a/src/Perpetuum/GlobalConfiguration.cs +++ b/src/Perpetuum/GlobalConfiguration.cs @@ -21,5 +21,7 @@ public class GlobalConfiguration public bool EnableDev { get; set; } public CorporationConfiguration Corporation { get; set; } + + public bool StartServerInAdminOnlyMode { get; set; } } } \ No newline at end of file diff --git a/src/Perpetuum/Services/Relay/IRelayStateService.cs b/src/Perpetuum/Services/Relay/IRelayStateService.cs index 2af4aabf0..89ea0ec38 100644 --- a/src/Perpetuum/Services/Relay/IRelayStateService.cs +++ b/src/Perpetuum/Services/Relay/IRelayStateService.cs @@ -8,5 +8,6 @@ public interface IRelayStateService RelayState State { get; set; } event Action StateChanged; void SendStateToClient(ISession session); + void ConfigOnlyAllowAdmins(bool enabled); } } \ No newline at end of file diff --git a/src/Perpetuum/Services/Relay/RelayInfoBuilder.cs b/src/Perpetuum/Services/Relay/RelayInfoBuilder.cs index eb1a13878..9a7d32193 100644 --- a/src/Perpetuum/Services/Relay/RelayInfoBuilder.cs +++ b/src/Perpetuum/Services/Relay/RelayInfoBuilder.cs @@ -41,6 +41,11 @@ public RelayInfoBuilder(GlobalConfiguration globalConfiguration, IRelayStateServ public RelayInfo Build() { + if (_globalConfiguration.StartServerInAdminOnlyMode) + { + _relayStateService.State = RelayState.OpenForAdminsOnly; + } + var info = new RelayInfo { state = _relayStateService.State, @@ -48,7 +53,13 @@ public RelayInfo Build() usersCount = _sessionManager.Sessions.Count(), maxUsers = _sessionManager.MaxSessions }; + return info; } + + public void ConfigOnlyAllowAdmins(bool enabled) + { + _globalConfiguration.StartServerInAdminOnlyMode = enabled; + } } } \ No newline at end of file diff --git a/src/Perpetuum/Services/Relay/RelayStateService.cs b/src/Perpetuum/Services/Relay/RelayStateService.cs index 0c11b869c..82e7dcb83 100644 --- a/src/Perpetuum/Services/Relay/RelayStateService.cs +++ b/src/Perpetuum/Services/Relay/RelayStateService.cs @@ -51,5 +51,11 @@ private MessageBuilder CreateStateMessageBuilder() var info = builder.Build(); return Message.Builder.SetCommand(Commands.State).WithData(info.ToDictionary()); } + + public void ConfigOnlyAllowAdmins(bool enabled) + { + var factory = _relayInfoBuilderFactory(); + factory.ConfigOnlyAllowAdmins(enabled); + } } } \ No newline at end of file