diff --git a/Minecraft-Realms-Emulator/Controllers/Admin/ServersController.cs b/Minecraft-Realms-Emulator/Controllers/Admin/ServersController.cs index ba97739..0b26544 100644 --- a/Minecraft-Realms-Emulator/Controllers/Admin/ServersController.cs +++ b/Minecraft-Realms-Emulator/Controllers/Admin/ServersController.cs @@ -2,6 +2,7 @@ using Minecraft_Realms_Emulator.Attributes; using Minecraft_Realms_Emulator.Data; using Minecraft_Realms_Emulator.Entities; +using Minecraft_Realms_Emulator.Modes.Realms.Helpers; namespace Minecraft_Realms_Emulator.Controllers.Admin { @@ -31,5 +32,30 @@ namespace Minecraft_Realms_Emulator.Controllers.Admin return Ok(world); } + + [HttpGet("{wId}/logs")] + public async Task GetLogs(int wId) + { + Response.ContentType = "text/event-stream"; + Response.Headers.Add("Cache-Control", "no-cache"); + Response.Headers.Add("X-Accel-Buffering", "no"); + + var world = _context.Worlds.ToList().Find(w => w.Id == wId); + + if (world == null) return BadRequest("World not found"); + + await new DockerHelper(world).GetServerLogsStreamAsync(async log => + { + if (!HttpContext.Response.Body.CanWrite) + { + return; + } + + await HttpContext.Response.WriteAsync($"data: {log}\n\n"); + await HttpContext.Response.Body.FlushAsync(); + }); + + return new EmptyResult(); + } } } \ No newline at end of file diff --git a/Minecraft-Realms-Emulator/Modes/Realms/Controllers/WorldsController.cs b/Minecraft-Realms-Emulator/Modes/Realms/Controllers/WorldsController.cs index d828bb6..5bd8386 100644 --- a/Minecraft-Realms-Emulator/Modes/Realms/Controllers/WorldsController.cs +++ b/Minecraft-Realms-Emulator/Modes/Realms/Controllers/WorldsController.cs @@ -10,7 +10,6 @@ using Minecraft_Realms_Emulator.Requests; using Minecraft_Realms_Emulator.Responses; using Newtonsoft.Json; using Semver; -using System.Diagnostics; using System.Net; using System.Net.Sockets; diff --git a/Minecraft-Realms-Emulator/Modes/Realms/Helpers/DockerHelper.cs b/Minecraft-Realms-Emulator/Modes/Realms/Helpers/DockerHelper.cs index 25f6804..fdc3e8d 100644 --- a/Minecraft-Realms-Emulator/Modes/Realms/Helpers/DockerHelper.cs +++ b/Minecraft-Realms-Emulator/Modes/Realms/Helpers/DockerHelper.cs @@ -29,7 +29,8 @@ namespace Minecraft_Realms_Emulator.Modes.Realms.Helpers serverProcess.Start(); } - public void StopServer() { + public void StopServer() + { ProcessStartInfo serverProcessInfo = new(); serverProcessInfo.FileName = "docker"; @@ -51,5 +52,33 @@ namespace Minecraft_Realms_Emulator.Modes.Realms.Helpers serverProcess.StartInfo = serverProcessInfo; serverProcess.Start(); } + + public async Task GetServerLogsStreamAsync(Action handler) + { + ProcessStartInfo serverProcessInfo = new(); + + serverProcessInfo.FileName = "docker"; + serverProcessInfo.Arguments = $"container logs -f realm-server-{world.Id} --tail 100"; + serverProcessInfo.RedirectStandardOutput = true; + + Process serverProcess = new(); + serverProcess.StartInfo = serverProcessInfo; + serverProcess.Start(); + + List logs = []; + + await Task.Run(() => + { + while (!serverProcess.StandardOutput.EndOfStream) + { + string line = serverProcess.StandardOutput.ReadLine(); + + if (line != null) + { + handler(line); + } + } + }); + } } -} +} \ No newline at end of file