using EmbedIO; using EmbedIO.Routing; using EmbedIO.WebApi; using Sandbox.Engine.Multiplayer; using Sandbox.Game.Multiplayer; using TorchRemote.Models.Responses; using TorchRemote.Plugin.Utils; namespace TorchRemote.Plugin.Controllers; public class PlayersController : WebApiController { private const string RootPath = "/players"; [Route(HttpVerbs.Get, RootPath)] public Task> Get() { return Statics.Torch.InvokeAsync(() => Sync.Players.GetOnlinePlayers() .Select(b => new PlayerResponse(b.Id.SteamId, b.DisplayName, (PlayerPromoteLevel)Statics.MultiplayerManager! .GetUserPromoteLevel(b.Id.SteamId)))); } [Route(HttpVerbs.Post, $"{RootPath}/{{id}}/kick")] public Task Kick(ulong id, [QueryField] bool cooldown = true) { return Statics.Torch.InvokeAsync(() => MyMultiplayer.Static.KickClient(id, true, cooldown)); } [Route(HttpVerbs.Post, $"{RootPath}/{{id}}/ban")] public void Ban(ulong id) { Statics.MultiplayerManager!.BanPlayer(id); } [Route(HttpVerbs.Post, $"{RootPath}/{{id}}/disconnect")] public Task Disconnect(ulong id) { return Statics.Torch.InvokeAsync(() => MyMultiplayer.Static.DisconnectClient(id)); } [Route(HttpVerbs.Post, $"{RootPath}/{{id}}/promote")] public void Promote(ulong id) { Statics.MultiplayerManager!.PromoteUser(id); } [Route(HttpVerbs.Post, $"{RootPath}/{{id}}/demote")] public void Demote(ulong id) { Statics.MultiplayerManager!.DemoteUser(id); } }