From 90457b6c7857abdcaa55ad1f2501d9c0f23c137d Mon Sep 17 00:00:00 2001 From: Spirtix Date: Sun, 7 Apr 2024 15:42:36 +0200 Subject: [PATCH] chat commands --- src/CommandHandlers/ChatMessageHandler.cs | 32 ++++++++----------- src/CommandHandlers/LoginHandler.cs | 2 +- src/Core/Client.cs | 1 + src/Core/Room.cs | 2 ++ src/Core/Utils.cs | 15 +++++++++ src/Data/PlayerData.cs | 2 +- src/Management/Commands/AnnounceCommand.cs | 15 +++++++++ src/Management/Commands/DisableChatCommand.cs | 12 +++++++ src/Management/Commands/EnableChatCommand.cs | 12 +++++++ src/Management/Commands/TempMuteCommand.cs | 24 ++++++++++++++ src/Management/ManagementCommandProcessor.cs | 3 +- 11 files changed, 98 insertions(+), 22 deletions(-) create mode 100644 src/Management/Commands/AnnounceCommand.cs create mode 100644 src/Management/Commands/DisableChatCommand.cs create mode 100644 src/Management/Commands/EnableChatCommand.cs create mode 100644 src/Management/Commands/TempMuteCommand.cs diff --git a/src/CommandHandlers/ChatMessageHandler.cs b/src/CommandHandlers/ChatMessageHandler.cs index 8a3ceb6..412ce51 100644 --- a/src/CommandHandlers/ChatMessageHandler.cs +++ b/src/CommandHandlers/ChatMessageHandler.cs @@ -11,7 +11,11 @@ class ChatMessageHandler : CommandHandler { string message = receivedObject.Get("p").Get("chm"); if (ManagementCommandProcessor.ProcessCommand(message, client)) return Task.CompletedTask; - if (!Configuration.ServerConfiguration.EnableChat) { + if (client.TempMuted) { + ClientMuted(client); + return Task.CompletedTask; + } + if (!Configuration.ServerConfiguration.EnableChat && !client.Room.AllowChatOverride) { ChatDisabled(client); } else { Chat(client, message); @@ -20,35 +24,25 @@ class ChatMessageHandler : CommandHandler { } public void ChatDisabled(Client client) { - NetworkObject cmd = new(); - NetworkObject data = new(); - data.Add("arr", new string[] { "CMR", "-1", "-1", "1", "Unfortunately, chat has been disabled by server administrators", "", "1", "Server" }); - cmd.Add("c", "CMR"); - cmd.Add("p", data); + client.Send(Utils.BuildServerSideMessage("Unfortunately, chat has been disabled by server administrators", "Server")); + } - NetworkPacket packet = NetworkObject.WrapObject(1, 13, cmd).Serialize(); - client.Send(packet); + public void ClientMuted(Client client) { + client.Send(Utils.BuildServerSideMessage("You have been muted by the moderators", "Server")); } public void Chat(Client client, string message) { - if (client.PlayerData.DiplayName == "") + if (Configuration.ServerConfiguration.Authentication && client.PlayerData.DiplayName == "placeholder") return; + client.Room.Send(Utils.BuildChatMessage(client.PlayerData.Uid, message, client.PlayerData.DiplayName), client); + NetworkObject cmd = new(); NetworkObject data = new(); - data.Add("arr", new string[] { "CMR", "-1", client.PlayerData.Uid, "1", message, "", "1", client.PlayerData.DiplayName }); - cmd.Add("c", "CMR"); - cmd.Add("p", data); - - NetworkPacket packet = NetworkObject.WrapObject(1, 13, cmd).Serialize(); - client.Room.Send(packet, client); - - cmd = new(); - data = new(); data.Add("arr", new string[] { "SCA", "-1", "1", message, "", "1" }); cmd.Add("c", "SCA"); cmd.Add("p", data); - packet = NetworkObject.WrapObject(1, 13, cmd).Serialize(); + NetworkPacket packet = NetworkObject.WrapObject(1, 13, cmd).Serialize(); client.Send(packet); } } diff --git a/src/CommandHandlers/LoginHandler.cs b/src/CommandHandlers/LoginHandler.cs index 2af9a57..af626a2 100644 --- a/src/CommandHandlers/LoginHandler.cs +++ b/src/CommandHandlers/LoginHandler.cs @@ -90,7 +90,7 @@ class LoginHandler : CommandHandler return false; if (responseString == null) throw new Exception("Response string null"); - Console.WriteLine(responseString); + AuthenticationInfo info = Utils.DeserializeXml(responseString); if (info.Authenticated) { client.PlayerData.DiplayName = info.DisplayName; diff --git a/src/Core/Client.cs b/src/Core/Client.cs index 1de9fc7..6a1e277 100644 --- a/src/Core/Client.cs +++ b/src/Core/Client.cs @@ -11,6 +11,7 @@ public class Client { public int ClientID { get; private set; } public PlayerData PlayerData { get; set; } = new(); public Room? Room { get; private set; } + public bool TempMuted { get; set; } = false; private readonly Socket socket; SocketBuffer socketBuffer = new(); diff --git a/src/Core/Room.cs b/src/Core/Room.cs index 08b23bc..bcbaa3a 100644 --- a/src/Core/Room.cs +++ b/src/Core/Room.cs @@ -16,6 +16,8 @@ public class Room { public string Group { get; private set; } public bool AutoRemove { get; private set; } public bool IsRemoved { get; private set; } = false; + + public bool AllowChatOverride { get; set; } = false; public NetworkArray RoomVariables = new(); public Room(string? name, string? group = null, bool autoRemove = false) { diff --git a/src/Core/Utils.cs b/src/Core/Utils.cs index 823ef57..b9582f5 100644 --- a/src/Core/Utils.cs +++ b/src/Core/Utils.cs @@ -38,4 +38,19 @@ internal static class Utils { using (var reader = new StringReader(xmlString)) return (T)serializer.Deserialize(reader); } + + public static NetworkPacket BuildChatMessage(string uid, string message, string displayName) { + NetworkObject cmd = new(); + NetworkObject data = new(); + data.Add("arr", new string[] { "CMR", "-1", uid, "1", message, "", "1", displayName }); + cmd.Add("c", "CMR"); + cmd.Add("p", data); + + return NetworkObject.WrapObject(1, 13, cmd).Serialize(); + } + + public static NetworkPacket BuildServerSideMessage(string message, string displayName) { + return BuildChatMessage("-1", message, displayName); + } + } diff --git a/src/Data/PlayerData.cs b/src/Data/PlayerData.cs index de568c7..8479c61 100644 --- a/src/Data/PlayerData.cs +++ b/src/Data/PlayerData.cs @@ -33,7 +33,7 @@ public class PlayerData { // animation bitfield (animations used by avatar, e.g. mounted, swim, ...) public int Mbf { get; set; } - public string DiplayName { get; set; } = ""; + public string DiplayName { get; set; } = "placeholder"; public Role Role { get; set; } = Role.User; public static readonly string[] SupportedVariables = { diff --git a/src/Management/Commands/AnnounceCommand.cs b/src/Management/Commands/AnnounceCommand.cs new file mode 100644 index 0000000..3f4a2c7 --- /dev/null +++ b/src/Management/Commands/AnnounceCommand.cs @@ -0,0 +1,15 @@ +using sodoffmmo.Attributes; +using sodoffmmo.Core; + +namespace sodoffmmo.Management.Commands; + +[ManagementCommand("announce", Role.Admin)] +class AnnounceCommand : IManagementCommand { + public void Handle(Client client, string[] arguments) { + if (arguments.Length == 0) { + client.Send(Utils.BuildServerSideMessage("Announce: No message to announce", "Server")); + return; + } + client.Room.Send(Utils.BuildServerSideMessage(string.Join(' ', arguments), "Server")); + } +} diff --git a/src/Management/Commands/DisableChatCommand.cs b/src/Management/Commands/DisableChatCommand.cs new file mode 100644 index 0000000..7c8ab5f --- /dev/null +++ b/src/Management/Commands/DisableChatCommand.cs @@ -0,0 +1,12 @@ +using sodoffmmo.Attributes; +using sodoffmmo.Core; + +namespace sodoffmmo.Management.Commands; + +[ManagementCommand("disablechat", Role.Moderator)] +class DisableChatCommand : IManagementCommand { + public void Handle(Client client, string[] arguments) { + client.Room.AllowChatOverride = false; + client.Room.Send(Utils.BuildServerSideMessage("Chat has been disabled", "Server")); + } +} diff --git a/src/Management/Commands/EnableChatCommand.cs b/src/Management/Commands/EnableChatCommand.cs new file mode 100644 index 0000000..8624c60 --- /dev/null +++ b/src/Management/Commands/EnableChatCommand.cs @@ -0,0 +1,12 @@ +using sodoffmmo.Attributes; +using sodoffmmo.Core; + +namespace sodoffmmo.Management.Commands; + +[ManagementCommand("enablechat", Role.Moderator)] +class EnableChatCommand : IManagementCommand { + public void Handle(Client client, string[] arguments) { + client.Room.AllowChatOverride = true; + client.Room.Send(Utils.BuildServerSideMessage("Chat has been enabled", "Server")); + } +} diff --git a/src/Management/Commands/TempMuteCommand.cs b/src/Management/Commands/TempMuteCommand.cs new file mode 100644 index 0000000..6479173 --- /dev/null +++ b/src/Management/Commands/TempMuteCommand.cs @@ -0,0 +1,24 @@ +using sodoffmmo.Attributes; +using sodoffmmo.Core; + +namespace sodoffmmo.Management.Commands; + +[ManagementCommand("tempmute", Role.Moderator)] +class TempMuteCommand : IManagementCommand { + public void Handle(Client client, string[] arguments) { + if (arguments.Length != 1) { + client.Send(Utils.BuildServerSideMessage("TempMute: Invalid number of arguments", "Server")); + return; + } + Client? target = client.Room.Clients.FirstOrDefault(x => x.PlayerData.DiplayName == arguments[0]); + if (target == null) { + client.Send(Utils.BuildServerSideMessage($"TempMute: user {arguments[0]} not found", "Server")); + return; + } + target.TempMuted = !target.TempMuted; + if (target.TempMuted) + client.Send(Utils.BuildServerSideMessage($"TempMute: {arguments[0]} has been temporarily muted", "Server")); + else + client.Send(Utils.BuildServerSideMessage($"TempMute: {arguments[0]} has been unmuted", "Server")); + } +} diff --git a/src/Management/ManagementCommandProcessor.cs b/src/Management/ManagementCommandProcessor.cs index 508db68..0eb0314 100644 --- a/src/Management/ManagementCommandProcessor.cs +++ b/src/Management/ManagementCommandProcessor.cs @@ -30,7 +30,7 @@ public class ManagementCommandProcessor { public static bool ProcessCommand(string message, Client client) { if (!Configuration.ServerConfiguration.Authentication || !initialized) return false; - if (!message.StartsWith("//") && message.Length < 3) + if (!message.StartsWith("::") && message.Length < 3) return false; string[] parts = message.Split(' '); @@ -42,6 +42,7 @@ public class ManagementCommandProcessor { if (commands.TryGetValue(new Tuple(commandName, currentRole), out Type? commandType)) { IManagementCommand command = (IManagementCommand)Activator.CreateInstance(commandType)!; + Console.WriteLine($"Management command {commandName} by {client.PlayerData.DiplayName} ({client.PlayerData.Uid}) in {client.Room.Name}"); command.Handle(client, arguments); return true; }