diff --git a/MyMcRealms/Controllers/OpsController.cs b/MyMcRealms/Controllers/OpsController.cs new file mode 100644 index 0000000..8381b21 --- /dev/null +++ b/MyMcRealms/Controllers/OpsController.cs @@ -0,0 +1,67 @@ +using Microsoft.AspNetCore.Mvc; +using Minecraft_Realms_Emulator.Responses; +using MyMcRealms.Attributes; +using MyMcRealms.MyMcAPI; + +namespace Minecraft_Realms_Emulator.Controllers +{ + [Route("[controller]")] + [ApiController] + [RequireMinecraftCookie] + public class OpsController : ControllerBase + { + [HttpPost("{wId}/{uuid}")] + public async Task> OpPlayer(int wId, string uuid) + { + var api = new MyMcAPI(Environment.GetEnvironmentVariable("MYMC_API_KEY")); + var world = (await api.GetAllServers()).Servers[wId]; + + var ops = world.Ops; + var player = world.Whitelist.Find(p => p.Uuid.Replace("-", "") == uuid); + + List opNames = []; + + foreach (var op in ops) + { + opNames.Add(op.Name); + } + + api.ExecuteCommand($"op {player.Name}"); + opNames.Add(player.Name); + + var opsResponse = new OpsResponse + { + Ops = opNames + }; + + return Ok(opsResponse); + } + + [HttpDelete("{wId}/{uuid}")] + public async Task> DeopPlayerAsync(int wId, string uuid) + { + var api = new MyMcAPI(Environment.GetEnvironmentVariable("MYMC_API_KEY")); + var world = (await api.GetAllServers()).Servers[wId]; + + var ops = world.Ops; + var player = world.Whitelist.Find(p => p.Uuid.Replace("-", "") == uuid); + + List opNames = []; + + foreach (var op in ops) + { + opNames.Add(op.Name); + } + + api.ExecuteCommand($"deop {player.Name}"); + opNames.Remove(player.Name); + + var opsResponse = new OpsResponse + { + Ops = opNames + }; + + return Ok(opsResponse); + } + } +} \ No newline at end of file diff --git a/MyMcRealms/Controllers/WorldsController.cs b/MyMcRealms/Controllers/WorldsController.cs index 308c081..5187df7 100644 --- a/MyMcRealms/Controllers/WorldsController.cs +++ b/MyMcRealms/Controllers/WorldsController.cs @@ -74,32 +74,79 @@ namespace MyMcRealms.Controllers [HttpGet("{id}")] public async Task> GetWorldById(int id) { - return NotFound("World not found"); + var worlds = await new MyMcAPI.MyMcAPI(Environment.GetEnvironmentVariable("MYMC_API_KEY")).GetAllServers(); + var world = worlds.Servers[id]; + + string worldOwnerName = world.Ops.ToArray().Length == 0 ? "Owner" : world.Ops[0].Name; + string worldOwnerUuid = world.Ops.ToArray().Length == 0 ? "069a79f444e94726a5befca90e38aaf5" : world.Ops[0].Uuid; + string worldName = world.Ops.ToArray().Length == 0 ? world.ServerName : $"{world.Ops[0].Name}'s server"; + List whitelistedPlayers = []; + + foreach (var player in world.Whitelist) + { + Player whitelistedPlayer = new() + { + Name = player.Name, + Uuid = player.Uuid, + Accepted = true, + Online = false, + Operator = world.Ops.Find(p => p.Name == player.Name) != null, + Permission = world.Ops.Find(p => p.Name == player.Name) != null ? "OPERATOR" : "MEMBER", + }; + + whitelistedPlayers.Add(whitelistedPlayer); + } + + WorldResponse response = new() + { + Id = id, + Owner = worldOwnerName, + OwnerUUID = worldOwnerUuid, + Name = worldName, + Motd = world.Motd, + State = "OPEN", + WorldType = "NORMAL", + MaxPlayers = 10, + MinigameId = null, + MinigameName = null, + MinigameImage = null, + ActiveSlot = 1, + Member = false, + Players = whitelistedPlayers, + DaysLeft = 7, + Expired = false, + ExpiredTrial = false, + ActiveVersion = world.GameVersion + }; + + return Ok(response); } -// [HttpPut("{id}/open")] -// public async Task> Open(int id) -// { -// var world = worlds.Find(w => w.Id == id); + [HttpPut("{id}/open")] + public async Task> Open(int id) + { + var worlds = await new MyMcAPI.MyMcAPI(Environment.GetEnvironmentVariable("MYMC_API_KEY")).GetAllServers(); + var world = worlds.Servers[id]; -// if (world == null) return NotFound("World not found"); + if (world == null) return NotFound("World not found"); // Turn off whitelist -// return Ok(true); -// } + return Ok(true); + } -// [HttpPut("{id}/close")] -// public async Task> Close(int id) -// { -// var world = worlds.FirstOrDefault(w => w.Id == id); + [HttpPut("{id}/close")] + public async Task> Close(int id) + { + var worlds = await new MyMcAPI.MyMcAPI(Environment.GetEnvironmentVariable("MYMC_API_KEY")).GetAllServers(); + var world = worlds.Servers[id]; -// if (world == null) return NotFound("World not found"); + if (world == null) return NotFound("World not found"); // Turn on whitelist -// return Ok(true); -// } + return Ok(true); + } [HttpGet("v1/{wId}/join/pc")] public async Task> Join(int wId) diff --git a/MyMcRealms/MyMcAPI/Responses/AllServersResponse.cs b/MyMcRealms/MyMcAPI/Responses/AllServersResponse.cs index 4c95a12..bf106c6 100644 --- a/MyMcRealms/MyMcAPI/Responses/AllServersResponse.cs +++ b/MyMcRealms/MyMcAPI/Responses/AllServersResponse.cs @@ -15,6 +15,7 @@ public bool Online { get; set; } public List Ops { get; set; } = null!; public List Banlist { get; set; } = null!; + public List Whitelist { get; set; } = null!; public string OwnersToken { get; set; } = string.Empty; } diff --git a/MyMcRealms/MyMcAPI/Responses/ConsoleResponse.cs b/MyMcRealms/MyMcAPI/Responses/ConsoleResponse.cs new file mode 100644 index 0000000..7889ff1 --- /dev/null +++ b/MyMcRealms/MyMcAPI/Responses/ConsoleResponse.cs @@ -0,0 +1,9 @@ + +namespace MyMcRealms.MyMcAPI.Responses +{ + public class ConsoleResponse + { + public bool Success { get; set; } + public string Message { get; set; } = null!; + } +} diff --git a/MyMcRealms/MyMcAPI/Wrapper.cs b/MyMcRealms/MyMcAPI/Wrapper.cs index 5ece156..7597f34 100644 --- a/MyMcRealms/MyMcAPI/Wrapper.cs +++ b/MyMcRealms/MyMcAPI/Wrapper.cs @@ -25,5 +25,21 @@ namespace MyMcRealms.MyMcAPI return response; } + + public HttpResponseMessage? ExecuteCommand(string command) + { + string json = $"{{ \"command\": \"{command}\" }}"; + + StringContent content = new(json, System.Text.Encoding.UTF8, "application/json"); + var response = httpClient.PostAsync("console", content).Result; + + if (!response.IsSuccessStatusCode) + { + Console.WriteLine("error while doing POST /console"); + return null; + } + + return response; + } } } diff --git a/MyMcRealms/Responses/OpsResponse.cs b/MyMcRealms/Responses/OpsResponse.cs new file mode 100644 index 0000000..a443ce5 --- /dev/null +++ b/MyMcRealms/Responses/OpsResponse.cs @@ -0,0 +1,7 @@ +namespace Minecraft_Realms_Emulator.Responses +{ + public class OpsResponse + { + public List Ops { get; set; } = null!; + } +} \ No newline at end of file diff --git a/MyMcRealms/Responses/WorldResponse.cs b/MyMcRealms/Responses/WorldResponse.cs index f7fafa8..2396780 100644 --- a/MyMcRealms/Responses/WorldResponse.cs +++ b/MyMcRealms/Responses/WorldResponse.cs @@ -5,14 +5,14 @@ namespace MyMcRealms.Entities public class WorldResponse { public int Id { get; set; } -// public Subscription? Subscription { get; set; } + // public Subscription? Subscription { get; set; } public string? Owner { get; set; } public string? OwnerUUID { get; set; } public string? Name { get; set; } public string? Motd { get; set; } public string State { get; set; } = "OPEN"; public string WorldType { get; set; } = "NORMAL"; - // public List Players { get; set; } = []; + public List Players { get; set; } = []; public int MaxPlayers { get; set; } = 10; public string? MinigameName { get; set; } public int? MinigameId { get; set; } @@ -27,4 +27,14 @@ namespace MyMcRealms.Entities public string Compatibility { get; set; } = string.Empty; public string ActiveVersion { get; set; } = string.Empty; } + + public class Player + { + public string Name { get; set; } = string.Empty; + public string Uuid { get; set; } = string.Empty; + public bool Operator { get; set; } + public bool Accepted { get; set; } + public bool Online { get; set; } + public string Permission { get; set; } = "MEMBER"; + } } \ No newline at end of file