diff --git a/Minecraft-Realms-Emulator/Controllers/Admin/ServersController.cs b/Minecraft-Realms-Emulator/Controllers/Admin/ServersController.cs index 0b26544..0b49623 100644 --- a/Minecraft-Realms-Emulator/Controllers/Admin/ServersController.cs +++ b/Minecraft-Realms-Emulator/Controllers/Admin/ServersController.cs @@ -57,5 +57,29 @@ namespace Minecraft_Realms_Emulator.Controllers.Admin return new EmptyResult(); } + + [HttpPut("{wId}/open")] + public ActionResult OpenServer(int wId) + { + var world = _context.Worlds.ToList().Find(w => w.Id == wId); + + if (world == null) return BadRequest("World not found"); + + new DockerHelper(world).StartServer(); + + return Ok(true); + } + + [HttpPut("{wId}/close")] + public ActionResult CloseServer(int wId) + { + var world = _context.Worlds.ToList().Find(w => w.Id == wId); + + if (world == null) return BadRequest("World not found"); + + new DockerHelper(world).StopServer(); + + return Ok(true); + } } } \ No newline at end of file diff --git a/Panel/Components/App.razor b/Panel/Components/App.razor index 4a0ef8d..fc85a77 100644 --- a/Panel/Components/App.razor +++ b/Panel/Components/App.razor @@ -15,6 +15,7 @@ + diff --git a/Panel/Components/Pages/Servers/Server.razor b/Panel/Components/Pages/Servers/Server.razor new file mode 100644 index 0000000..7611156 --- /dev/null +++ b/Panel/Components/Pages/Servers/Server.razor @@ -0,0 +1,88 @@ +@page "/servers/{wId:int}" +@inject IJSRuntime JS +@rendermode InteractiveServer + +Server #@wId + +@if (server == null) +{ +

Loading...

+} +else +{ +
+
+
+ @server.Name + @server.State +
+
+ + +
+
+ +
+
+                @foreach (var log in logs)
+                {
+                    @log
+ } +
+
+
+} + +@code { + [Parameter] + public int wId { get; set; } + + private World? server; + private List logs = []; + + protected override async Task OnInitializedAsync() + { + HttpClient httpClient = new HttpClient(); + httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(Environment.GetEnvironmentVariable("ADMIN_KEY")); + + server = await httpClient.GetFromJsonAsync($"http://localhost:8080/api/admin/servers/{wId}"); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + await JS.InvokeVoidAsync("serverLogsStream.start", DotNetObjectReference.Create(this), wId); + } + } + + [JSInvokable] + public Task ReceiveLog(string log) + { + logs.Add(log); + InvokeAsync(StateHasChanged); + return Task.CompletedTask; + } + + public async Task StartServer() + { + HttpClient httpClient = new HttpClient(); + httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(Environment.GetEnvironmentVariable("ADMIN_KEY")); + + await httpClient.PutAsync($"http://localhost:8080/api/admin/servers/{wId}/open", new StringContent("")); + } + + public async Task StopServer() + { + HttpClient httpClient = new HttpClient(); + httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(Environment.GetEnvironmentVariable("ADMIN_KEY")); + + await httpClient.PutAsync($"http://localhost:8080/api/admin/servers/{wId}/close", new StringContent("")); + } +} \ No newline at end of file diff --git a/Panel/wwwroot/app.css b/Panel/wwwroot/app.css index 6dad3f4..794e16e 100644 --- a/Panel/wwwroot/app.css +++ b/Panel/wwwroot/app.css @@ -1,3 +1,5 @@ +@import url("https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"); + html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; } @@ -56,4 +58,29 @@ h1:focus { .table.clickable tbody tr:hover { background-color: #e8e8e8; +} + +.panel { + display: flex; + flex-direction: column; +} + +.panel .header { + display: flex; +} + +.panel .header .status { + flex-grow: 1; +} + +.panel .header .buttons {} + +.panel .console { + background-color: #000000; + color: #ffffff; + width: 80%; + margin: auto; + height: 800px; + overflow: auto; + padding: 5px; } \ No newline at end of file diff --git a/Panel/wwwroot/js/serverLogsStream.js b/Panel/wwwroot/js/serverLogsStream.js new file mode 100644 index 0000000..0eeced0 --- /dev/null +++ b/Panel/wwwroot/js/serverLogsStream.js @@ -0,0 +1,9 @@ +window.serverLogsStream = { + start: (dotNetObject, serverId) => { + const logs = new EventSource(`http://localhost:8080/api/admin/servers/${serverId}/logs`, { withCredentials: true }); + + logs.onmessage = event => { + dotNetObject.invokeMethodAsync("ReceiveLog", event.data); + } + } +} \ No newline at end of file