using Docker.DotNet; using MoonlightServers.Daemon.ServerSystem.Abstractions; using MoonlightServers.Daemon.ServerSystem.Implementations.Docker.Events; namespace MoonlightServers.Daemon.ServerSystem.Implementations.Docker; public class DockerInstallEnv : IInstallEnvironment { public IInstallStatistics Statistics => InnerStatistics; public IInstallConsole Console => InnerConsole; public event Func? OnExited; public string ContainerId { get; } private readonly DockerClient DockerClient; private readonly ILogger Logger; private readonly DockerEventService EventService; private readonly DockerStatistics InnerStatistics; private readonly DockerConsole InnerConsole; public DockerInstallEnv(string containerId, DockerClient dockerClient, ILogger logger, DockerEventService eventService) { ContainerId = containerId; DockerClient = dockerClient; Logger = logger; EventService = eventService; InnerStatistics = new DockerStatistics(containerId, dockerClient, logger); InnerConsole = new DockerConsole(containerId, dockerClient, logger); EventService.OnContainerDied += HandleDieEventAsync; } public async Task IsRunningAsync() { var container = await DockerClient.Containers.InspectContainerAsync(ContainerId); return container.State.Running; } public async Task StartAsync() => await DockerClient.Containers.StartContainerAsync(ContainerId, new()); public async Task KillAsync() => await DockerClient.Containers.KillContainerAsync(ContainerId, new()); private async Task HandleDieEventAsync(ContainerDieEvent dieEvent) { if(dieEvent.ContainerId != ContainerId) return; if(OnExited != null) await OnExited.Invoke(); } public async ValueTask DisposeAsync() { EventService.OnContainerDied -= HandleDieEventAsync; await InnerConsole.DisposeAsync(); await InnerStatistics.DisposeAsync(); } }