using Docker.DotNet.Models; using Microsoft.AspNetCore.SignalR; using MoonlightServers.Daemon.Configuration; using MoonlightServers.Daemon.Enums; using MoonlightServers.Daemon.Http.Hubs; using MoonlightServers.Daemon.Models; using MoonlightServers.Daemon.Models.Cache; using Stateless; namespace MoonlightServers.Daemon.Abstractions; public partial class Server { // Exposed configuration/state values public int Id => Configuration.Id; public ServerState State => StateMachine.State; // Exposed container names and ids public string RuntimeContainerName { get; private set; } public string? RuntimeContainerId { get; private set; } public string InstallationContainerName { get; private set; } public string? InstallationContainerId { get; private set; } // Events public event Func? OnStateChanged; public event Func? OnConsoleOutput; // Private stuff private readonly ILogger Logger; private readonly IServiceProvider ServiceProvider; private readonly ServerConsole Console; private readonly IHubContext WebSocketHub; private StateMachine StateMachine; private ServerConfiguration Configuration; private CancellationTokenSource Cancellation; private AppConfiguration AppConfiguration; public Server( ILogger logger, IServiceProvider serviceProvider, ServerConfiguration configuration, IHubContext webSocketHub, AppConfiguration appConfiguration ) { Logger = logger; ServiceProvider = serviceProvider; Configuration = configuration; WebSocketHub = webSocketHub; AppConfiguration = appConfiguration; Console = new(AppConfiguration.Server.ConsoleMessageCacheLimit); Cancellation = new(); RuntimeContainerName = $"moonlight-runtime-{Configuration.Id}"; InstallationContainerName = $"moonlight-install-{Configuration.Id}"; } public void UpdateConfiguration(ServerConfiguration configuration) => Configuration = configuration; }