Files
caliverse_server/BrokerApiServer/BrokerServerService.cs
2025-11-28 16:54:56 +09:00

112 lines
3.0 KiB
C#

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<List<ServerInfo>> GetServerInfosByServerType(ServerType serverType)
{
var (result, serverInfos) = await ServerLogic.getServerInfosByServerType(serverType);
return result.isFail() ? [] : serverInfos;
}
public async Task<int> Run(string[] args)
{
var result = new Result();
Log.getLogger().info($"GameServer start");
var name = nameof(BrokerServerService);
ParserResult<CmdOptions>? parser_result = Parser.Default.ParseArguments<CmdOptions>(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<Result> RunServer(CmdOptions argCmdOptions)
{
var result = new Result();
var key_options = new Dictionary<string, string> { { "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);
}
}
}