From ad0a40878d80d20dc8dac936a0408cbdc1b6253a Mon Sep 17 00:00:00 2001 From: Sanae Date: Mon, 14 Mar 2022 23:59:23 -0600 Subject: [PATCH] Add tag commands and improve command handling --- Server/CommandHandler.cs | 16 ++++++- Server/Program.cs | 96 ++++++++++++++++++++++++++++++++++++---- Server/Server.cs | 14 ++++++ Server/Server.csproj | 4 +- Server/Time.cs | 1 + 5 files changed, 119 insertions(+), 12 deletions(-) create mode 100644 Server/Time.cs diff --git a/Server/CommandHandler.cs b/Server/CommandHandler.cs index 86d24cb..970d51a 100644 --- a/Server/CommandHandler.cs +++ b/Server/CommandHandler.cs @@ -1,7 +1,7 @@ namespace Server; public static class CommandHandler { - public delegate string Handler(string[] args); + public delegate Response Handler(string[] args); public static Dictionary Handlers = new Dictionary(); @@ -13,7 +13,7 @@ public static class CommandHandler { Handlers[name] = handler; } - public static string GetResult(string input) { + public static Response GetResult(string input) { try { string[] args = input.Split(' '); if (args.Length == 0) return "No command entered, see help command for valid commands"; @@ -24,4 +24,16 @@ public static class CommandHandler { return $"An error occured while trying to process your command: {e}"; } } + + public class Response { + public string[] ReturnStrings = null!; + private Response(){} + + public static implicit operator Response(string value) => new Response { + ReturnStrings = value.Split('\n') + }; + public static implicit operator Response(string[] values) => new Response { + ReturnStrings = values + }; + } } \ No newline at end of file diff --git a/Server/Program.cs b/Server/Program.cs index b6bab11..7e2ea53 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -34,7 +34,8 @@ async Task ClientSyncShineBag(Client client) { ShineId = shine }); } - } catch { + } + catch { // errors that can happen when sending will crash the server :) } } @@ -42,7 +43,8 @@ async Task ClientSyncShineBag(Client client) { async void SyncShineBag() { try { await Parallel.ForEachAsync(server.Clients.ToArray(), async (client, _) => await ClientSyncShineBag(client)); - } catch { + } + catch { // errors that can happen shines change will crash the server :) } } @@ -59,9 +61,17 @@ float MarioSize(bool is2d) { server.PacketHandler = (c, p) => { { - if (p is GamePacket gamePacket) { - c.Metadata["scenario"] = gamePacket.ScenarioNum; - c.Metadata["2d"] = gamePacket.Is2d; + switch (p) { + case GamePacket gamePacket: { + c.Metadata["scenario"] = gamePacket.ScenarioNum; + c.Metadata["2d"] = gamePacket.Is2d; + break; + } + case TagPacket tagPacket: { + if ((tagPacket.UpdateType & TagPacket.TagUpdate.State) != 0) c.Metadata["seeking"] = tagPacket.IsIt; + if ((tagPacket.UpdateType & TagPacket.TagUpdate.Time) != 0) c.Metadata["time"] = new Time(tagPacket.Minutes, tagPacket.Seconds, DateTime.Now); + break; + } } } switch (p) { @@ -124,10 +134,76 @@ CommandHandler.RegisterCommand("scenario", args => { } }); -CommandHandler.RegisterCommand("list", _ => $"List: {string.Join(", ", server.Clients.Select(x => $"{x.Name} ({x.Id})"))}"); +CommandHandler.RegisterCommand("tag", args => { + const string optionUsage = "Valid options:\n\ttime \n\tseeking \n\tstart