using CommandLine; using ControlCenter.NamedPipe.Model; using ServerBase; using ServerCore; namespace BrokerApiServer; using BrokerApiCore; public class BrokerServerService { public class CmdOptions { [Option("config", Default = "ServerConfig.json")] public string Config { get; set; } = "ServerConfig.json"; [Option('p', "port", Default = 12000, Required = true, HelpText = "Server Port")] public int Port { get; init; } = 12000; [Option('s', "swagger", Default = false, Required = false, HelpText = "Show Swagger Mode")] public bool UseSwagger { get; init; } = false; } private BrokerServerLogic? _serverLogic; private CancellationTokenSource _onStartCts = new(); public BrokerServerLogic ServerLogic => _serverLogic!; public CmdOptions Options { get; private set; } = new(); public bool IsRunning { get; private set; } = false; public async Task> GetServerInfosByServerType(ServerType serverType) { var (result, serverInfos) = await ServerLogic.getServerInfosByServerType(serverType); return result.isFail() ? [] : serverInfos; } public async Task Run(string[] args) { var result = new Result(); Log.getLogger().info($"GameServer start"); var name = nameof(BrokerServerService); ParserResult? parser_result = Parser.Default.ParseArguments(args); Options = parser_result?.Value ?? new CmdOptions(); try { await RunServer(Options); } catch (Exception e) { var err_msg = $"Exception !!!, {name}.runServer() : message:{e}"; result.setFail(ServerErrorCode.TryCatchException, err_msg); await _onStartCts.CancelAsync(); } finally { if (result.isFail()) { Log.getLogger().error($"{name} finally error !!! - {result.toBasicString()}"); } } Log.getLogger().info($"{name} terminated"); Log.shutdown(); return 0; } private async Task RunServer(CmdOptions argCmdOptions) { var result = new Result(); var key_options = new Dictionary { { "config", argCmdOptions.Config }, }; var configuration = new ConfigurationBuilder().AddInMemoryCollection(key_options!).Build(); NullReferenceCheckHelper.throwIfNull(configuration, () => $"configuration is null !!!"); var server_config = new ServerConfig(); server_config.setAppParamPort((ushort)argCmdOptions.Port); _serverLogic = new BrokerServerLogic(server_config); _serverLogic.setServerType(nameof(ServerType.BrokerApi)); _serverLogic.setConfiguration(configuration); _serverLogic.OnServerStart = () => { _onStartCts.Cancel(); }; var namedOptionBuilder = new NamedPipeClientOptionBuilder(); namedOptionBuilder.setIP(NetworkHelper.getEthernetLocalIPv4()) .setPort(argCmdOptions.Port) .setType(nameof(ServerType.BrokerApi)) .setServiceCategory(nameof(ServiceCategory.Caliverse)); result = await _serverLogic.onRunServer(namedOptionBuilder); if (result.isFail()) { return result; } return result; } public async Task WaitOnStart() { while (!_onStartCts.IsCancellationRequested) { await Task.Delay(10); } } }