From c9cc5ff23a7c649ebbfea9430cc14254cf35403a Mon Sep 17 00:00:00 2001 From: flashwave Date: Tue, 7 Feb 2023 15:34:31 +0100 Subject: [PATCH] Removed protocol enums. --- SharpChat/ChatContext.cs | 16 ++-- SharpChat/Packet/AuthFailPacket.cs | 2 +- SharpChat/Packet/AuthSuccessPacket.cs | 2 +- SharpChat/Packet/BanListPacket.cs | 2 +- SharpChat/Packet/ChannelCreatePacket.cs | 4 +- SharpChat/Packet/ChannelDeletePacket.cs | 4 +- SharpChat/Packet/ChannelUpdatePacket.cs | 4 +- SharpChat/Packet/ChatMessageAddPacket.cs | 2 +- SharpChat/Packet/ChatMessageDeletePacket.cs | 2 +- SharpChat/Packet/ContextChannelsPacket.cs | 4 +- SharpChat/Packet/ContextClearPacket.cs | 2 +- SharpChat/Packet/ContextMessagePacket.cs | 4 +- SharpChat/Packet/ContextUsersPacket.cs | 4 +- SharpChat/Packet/FloodWarningPacket.cs | 2 +- SharpChat/Packet/ForceDisconnectPacket.cs | 2 +- SharpChat/Packet/LegacyCommandResponse.cs | 6 +- SharpChat/Packet/PongPacket.cs | 2 +- SharpChat/Packet/TypingPacket.cs | 29 -------- .../Packet/UserChannelForceJoinPacket.cs | 4 +- SharpChat/Packet/UserChannelJoinPacket.cs | 4 +- SharpChat/Packet/UserChannelLeavePacket.cs | 4 +- SharpChat/Packet/UserConnectPacket.cs | 2 +- SharpChat/Packet/UserDisconnectPacket.cs | 2 +- SharpChat/Packet/UserUpdatePacket.cs | 4 +- SharpChat/SharpChat.csproj | 2 +- SharpChat/SockChatEnums.cs | 48 ------------ SharpChat/SockChatServer.cs | 73 ++++++++----------- 27 files changed, 77 insertions(+), 159 deletions(-) delete mode 100644 SharpChat/Packet/TypingPacket.cs delete mode 100644 SharpChat/SockChatEnums.cs diff --git a/SharpChat/ChatContext.cs b/SharpChat/ChatContext.cs index 73da497..0815ba6 100644 --- a/SharpChat/ChatContext.cs +++ b/SharpChat/ChatContext.cs @@ -15,7 +15,10 @@ namespace SharpChat { public SockChatServer Server { get; } public Timer BumpTimer { get; } + public BanManager Bans { get; } + public readonly object BansAccess = new(); + public ChannelManager Channels { get; } public UserManager Users { get; } public ChatEventManager Events { get; } @@ -34,7 +37,8 @@ namespace SharpChat { } public void Update() { - Bans.RemoveExpired(); + lock(BansAccess) + Bans.RemoveExpired(); CheckPings(); } @@ -44,11 +48,13 @@ namespace SharpChat { if (until.HasValue) { user.Send(new ForceDisconnectPacket(ForceDisconnectReason.Banned, until.Value)); - Bans.Add(user, until.Value); - if (banIPs) { - foreach (IPAddress ip in user.RemoteAddresses) - Bans.Add(ip, until.Value); + lock(BansAccess) { + Bans.Add(user, until.Value); + + if(banIPs) + foreach(IPAddress ip in user.RemoteAddresses) + Bans.Add(ip, until.Value); } } else user.Send(new ForceDisconnectPacket(ForceDisconnectReason.Kicked)); diff --git a/SharpChat/Packet/AuthFailPacket.cs b/SharpChat/Packet/AuthFailPacket.cs index 7b36837..2abb801 100644 --- a/SharpChat/Packet/AuthFailPacket.cs +++ b/SharpChat/Packet/AuthFailPacket.cs @@ -26,7 +26,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.UserConnect); + sb.Append('1'); sb.Append("\tn\t"); switch (Reason) { diff --git a/SharpChat/Packet/AuthSuccessPacket.cs b/SharpChat/Packet/AuthSuccessPacket.cs index 2f30f6d..61ce1b8 100644 --- a/SharpChat/Packet/AuthSuccessPacket.cs +++ b/SharpChat/Packet/AuthSuccessPacket.cs @@ -17,7 +17,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.UserConnect); + sb.Append('1'); sb.Append("\ty\t"); sb.Append(User.Pack()); sb.Append('\t'); diff --git a/SharpChat/Packet/BanListPacket.cs b/SharpChat/Packet/BanListPacket.cs index 8979bcd..643e579 100644 --- a/SharpChat/Packet/BanListPacket.cs +++ b/SharpChat/Packet/BanListPacket.cs @@ -14,7 +14,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.MessageAdd); + sb.Append('2'); sb.Append('\t'); sb.Append(DateTimeOffset.Now.ToUnixTimeSeconds()); sb.Append("\t-1\t0\fbanlist\f"); diff --git a/SharpChat/Packet/ChannelCreatePacket.cs b/SharpChat/Packet/ChannelCreatePacket.cs index 8bab3c2..804b354 100644 --- a/SharpChat/Packet/ChannelCreatePacket.cs +++ b/SharpChat/Packet/ChannelCreatePacket.cs @@ -12,9 +12,9 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.ChannelEvent); + sb.Append('4'); sb.Append('\t'); - sb.Append((int)SockChatServerChannelPacket.Create); + sb.Append('0'); sb.Append('\t'); sb.Append(Channel.Pack()); diff --git a/SharpChat/Packet/ChannelDeletePacket.cs b/SharpChat/Packet/ChannelDeletePacket.cs index 615319e..1c5c2bc 100644 --- a/SharpChat/Packet/ChannelDeletePacket.cs +++ b/SharpChat/Packet/ChannelDeletePacket.cs @@ -13,9 +13,9 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.ChannelEvent); + sb.Append('4'); sb.Append('\t'); - sb.Append((int)SockChatServerChannelPacket.Delete); + sb.Append('2'); sb.Append('\t'); sb.Append(Channel.Name); diff --git a/SharpChat/Packet/ChannelUpdatePacket.cs b/SharpChat/Packet/ChannelUpdatePacket.cs index a151885..2094dd9 100644 --- a/SharpChat/Packet/ChannelUpdatePacket.cs +++ b/SharpChat/Packet/ChannelUpdatePacket.cs @@ -14,9 +14,9 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.ChannelEvent); + sb.Append('4'); sb.Append('\t'); - sb.Append((int)SockChatServerChannelPacket.Update); + sb.Append('1'); sb.Append('\t'); sb.Append(PreviousName); sb.Append('\t'); diff --git a/SharpChat/Packet/ChatMessageAddPacket.cs b/SharpChat/Packet/ChatMessageAddPacket.cs index da2e11f..c8a98d0 100644 --- a/SharpChat/Packet/ChatMessageAddPacket.cs +++ b/SharpChat/Packet/ChatMessageAddPacket.cs @@ -17,7 +17,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.MessageAdd); + sb.Append('2'); sb.Append('\t'); sb.Append(Message.DateTime.ToUnixTimeSeconds()); diff --git a/SharpChat/Packet/ChatMessageDeletePacket.cs b/SharpChat/Packet/ChatMessageDeletePacket.cs index 0d94b74..ce94292 100644 --- a/SharpChat/Packet/ChatMessageDeletePacket.cs +++ b/SharpChat/Packet/ChatMessageDeletePacket.cs @@ -12,7 +12,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.MessageDelete); + sb.Append('6'); sb.Append('\t'); sb.Append(EventId); diff --git a/SharpChat/Packet/ContextChannelsPacket.cs b/SharpChat/Packet/ContextChannelsPacket.cs index f7919bb..6d57bc4 100644 --- a/SharpChat/Packet/ContextChannelsPacket.cs +++ b/SharpChat/Packet/ContextChannelsPacket.cs @@ -14,9 +14,9 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.ContextPopulate); + sb.Append('7'); sb.Append('\t'); - sb.Append((int)SockChatServerContextPacket.Channels); + sb.Append('2'); sb.Append('\t'); sb.Append(Channels.Count()); diff --git a/SharpChat/Packet/ContextClearPacket.cs b/SharpChat/Packet/ContextClearPacket.cs index cb9cbd1..a0241fe 100644 --- a/SharpChat/Packet/ContextClearPacket.cs +++ b/SharpChat/Packet/ContextClearPacket.cs @@ -25,7 +25,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.ContextClear); + sb.Append('8'); sb.Append('\t'); sb.Append((int)Mode); diff --git a/SharpChat/Packet/ContextMessagePacket.cs b/SharpChat/Packet/ContextMessagePacket.cs index 2b87d77..fe13845 100644 --- a/SharpChat/Packet/ContextMessagePacket.cs +++ b/SharpChat/Packet/ContextMessagePacket.cs @@ -18,9 +18,9 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.ContextPopulate); + sb.Append('7'); sb.Append('\t'); - sb.Append((int)SockChatServerContextPacket.Message); + sb.Append('1'); sb.Append('\t'); sb.Append(Event.DateTime.ToUnixTimeSeconds()); sb.Append('\t'); diff --git a/SharpChat/Packet/ContextUsersPacket.cs b/SharpChat/Packet/ContextUsersPacket.cs index bb13774..324ec4c 100644 --- a/SharpChat/Packet/ContextUsersPacket.cs +++ b/SharpChat/Packet/ContextUsersPacket.cs @@ -14,9 +14,9 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.ContextPopulate); + sb.Append('7'); sb.Append('\t'); - sb.Append((int)SockChatServerContextPacket.Users); + sb.Append('0'); sb.Append('\t'); sb.Append(Users.Count()); diff --git a/SharpChat/Packet/FloodWarningPacket.cs b/SharpChat/Packet/FloodWarningPacket.cs index 410ac86..487ddec 100644 --- a/SharpChat/Packet/FloodWarningPacket.cs +++ b/SharpChat/Packet/FloodWarningPacket.cs @@ -7,7 +7,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.MessageAdd); + sb.Append('2'); sb.Append('\t'); sb.Append(DateTimeOffset.Now.ToUnixTimeSeconds()); sb.Append("\t-1\t0\fflwarn\t"); diff --git a/SharpChat/Packet/ForceDisconnectPacket.cs b/SharpChat/Packet/ForceDisconnectPacket.cs index 1de41aa..e212d46 100644 --- a/SharpChat/Packet/ForceDisconnectPacket.cs +++ b/SharpChat/Packet/ForceDisconnectPacket.cs @@ -25,7 +25,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.BAKA); + sb.Append('9'); sb.Append('\t'); sb.Append((int)Reason); diff --git a/SharpChat/Packet/LegacyCommandResponse.cs b/SharpChat/Packet/LegacyCommandResponse.cs index 26f5141..a7237c4 100644 --- a/SharpChat/Packet/LegacyCommandResponse.cs +++ b/SharpChat/Packet/LegacyCommandResponse.cs @@ -23,14 +23,14 @@ namespace SharpChat.Packet { StringBuilder sb = new StringBuilder(); if (StringId == LCR.WELCOME) { - sb.Append((int)SockChatServerPacket.ContextPopulate); + sb.Append('7'); sb.Append('\t'); - sb.Append((int)SockChatServerContextPacket.Message); + sb.Append('1'); sb.Append('\t'); sb.Append(DateTimeOffset.Now.ToUnixTimeSeconds()); sb.Append("\t-1\tChatBot\tinherit\t\t"); } else { - sb.Append((int)SockChatServerPacket.MessageAdd); + sb.Append('2'); sb.Append('\t'); sb.Append(DateTimeOffset.Now.ToUnixTimeSeconds()); sb.Append("\t-1\t"); diff --git a/SharpChat/Packet/PongPacket.cs b/SharpChat/Packet/PongPacket.cs index bda008e..409ddc9 100644 --- a/SharpChat/Packet/PongPacket.cs +++ b/SharpChat/Packet/PongPacket.cs @@ -13,7 +13,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.Pong); + sb.Append('0'); sb.Append('\t'); sb.Append(PongTime.ToUnixTimeSeconds()); diff --git a/SharpChat/Packet/TypingPacket.cs b/SharpChat/Packet/TypingPacket.cs deleted file mode 100644 index 57b2dfd..0000000 --- a/SharpChat/Packet/TypingPacket.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace SharpChat.Packet { - public class TypingPacket : ServerPacket { - public ChatChannel Channel { get; } - public ChatChannelTyping TypingInfo { get; } - - public TypingPacket(ChatChannel channel, ChatChannelTyping typingInfo) { - Channel = channel; - TypingInfo = typingInfo ?? throw new ArgumentNullException(nameof(typingInfo)); - } - - public override IEnumerable Pack() { - StringBuilder sb = new StringBuilder(); - - sb.Append((int)SockChatServerPacket.Typing); - sb.Append('\t'); - sb.Append(Channel?.TargetName ?? string.Empty); - sb.Append('\t'); - sb.Append(TypingInfo.User.UserId); - sb.Append('\t'); - sb.Append(TypingInfo.Started.ToUnixTimeSeconds()); - - yield return sb.ToString(); - } - } -} diff --git a/SharpChat/Packet/UserChannelForceJoinPacket.cs b/SharpChat/Packet/UserChannelForceJoinPacket.cs index da58ea2..b183468 100644 --- a/SharpChat/Packet/UserChannelForceJoinPacket.cs +++ b/SharpChat/Packet/UserChannelForceJoinPacket.cs @@ -13,9 +13,9 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.UserSwitch); + sb.Append('5'); sb.Append('\t'); - sb.Append((int)SockChatServerMovePacket.ForcedMove); + sb.Append('2'); sb.Append('\t'); sb.Append(Channel.Name); diff --git a/SharpChat/Packet/UserChannelJoinPacket.cs b/SharpChat/Packet/UserChannelJoinPacket.cs index d0d4d64..fa91477 100644 --- a/SharpChat/Packet/UserChannelJoinPacket.cs +++ b/SharpChat/Packet/UserChannelJoinPacket.cs @@ -13,9 +13,9 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.UserSwitch); + sb.Append('5'); sb.Append('\t'); - sb.Append((int)SockChatServerMovePacket.UserJoined); + sb.Append('0'); sb.Append('\t'); sb.Append(User.Pack()); sb.Append('\t'); diff --git a/SharpChat/Packet/UserChannelLeavePacket.cs b/SharpChat/Packet/UserChannelLeavePacket.cs index 2bc6275..780fd26 100644 --- a/SharpChat/Packet/UserChannelLeavePacket.cs +++ b/SharpChat/Packet/UserChannelLeavePacket.cs @@ -13,9 +13,9 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.UserSwitch); + sb.Append('5'); sb.Append('\t'); - sb.Append((int)SockChatServerMovePacket.UserLeft); + sb.Append('1'); sb.Append('\t'); sb.Append(User.UserId); sb.Append('\t'); diff --git a/SharpChat/Packet/UserConnectPacket.cs b/SharpChat/Packet/UserConnectPacket.cs index b04bbf5..c1707c4 100644 --- a/SharpChat/Packet/UserConnectPacket.cs +++ b/SharpChat/Packet/UserConnectPacket.cs @@ -15,7 +15,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.UserConnect); + sb.Append('1'); sb.Append('\t'); sb.Append(Joined.ToUnixTimeSeconds()); sb.Append('\t'); diff --git a/SharpChat/Packet/UserDisconnectPacket.cs b/SharpChat/Packet/UserDisconnectPacket.cs index 1b3623b..6539938 100644 --- a/SharpChat/Packet/UserDisconnectPacket.cs +++ b/SharpChat/Packet/UserDisconnectPacket.cs @@ -24,7 +24,7 @@ namespace SharpChat.Packet { public override IEnumerable Pack() { StringBuilder sb = new StringBuilder(); - sb.Append((int)SockChatServerPacket.UserDisconnect); + sb.Append('3'); sb.Append('\t'); sb.Append(User.UserId); sb.Append('\t'); diff --git a/SharpChat/Packet/UserUpdatePacket.cs b/SharpChat/Packet/UserUpdatePacket.cs index 36d12fe..d6330f4 100644 --- a/SharpChat/Packet/UserUpdatePacket.cs +++ b/SharpChat/Packet/UserUpdatePacket.cs @@ -18,7 +18,7 @@ namespace SharpChat.Packet { bool isSilent = string.IsNullOrEmpty(PreviousName); if (!isSilent) { - sb.Append((int)SockChatServerPacket.MessageAdd); + sb.Append('2'); sb.Append('\t'); sb.Append(DateTimeOffset.Now.ToUnixTimeSeconds()); sb.Append("\t-1\t0\fnick\f"); @@ -32,7 +32,7 @@ namespace SharpChat.Packet { sb.Clear(); } - sb.Append((int)SockChatServerPacket.UserUpdate); + sb.Append("10"); sb.Append('\t'); sb.Append(User.Pack()); diff --git a/SharpChat/SharpChat.csproj b/SharpChat/SharpChat.csproj index a5c547c..22ec985 100644 --- a/SharpChat/SharpChat.csproj +++ b/SharpChat/SharpChat.csproj @@ -7,7 +7,7 @@ - + diff --git a/SharpChat/SockChatEnums.cs b/SharpChat/SockChatEnums.cs deleted file mode 100644 index 99ea7ca..0000000 --- a/SharpChat/SockChatEnums.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace SharpChat { - public enum SockChatClientPacket { - // Version 1 - Ping = 0, - Authenticate = 1, - MessageSend = 2, - - // Version 2 - FocusChannel = 3, - Typing = 4, - } - - public enum SockChatServerPacket { - // Version 1 - Pong = 0, - UserConnect = 1, - MessageAdd = 2, - UserDisconnect = 3, - ChannelEvent = 4, - UserSwitch = 5, - MessageDelete = 6, - ContextPopulate = 7, - ContextClear = 8, - BAKA = 9, - UserUpdate = 10, - - // Version 2 - Typing = 11, - } - - public enum SockChatServerChannelPacket { - Create = 0, - Update = 1, - Delete = 2, - } - - public enum SockChatServerMovePacket { - UserJoined = 0, - UserLeft = 1, - ForcedMove = 2, - } - - public enum SockChatServerContextPacket { - Users = 0, - Message = 1, - Channels = 2, - } -} diff --git a/SharpChat/SockChatServer.cs b/SharpChat/SockChatServer.cs index d0080da..29f64e8 100644 --- a/SharpChat/SockChatServer.cs +++ b/SharpChat/SockChatServer.cs @@ -152,11 +152,11 @@ namespace SharpChat { string[] args = msg.Split('\t'); - if(args.Length < 1 || !Enum.TryParse(args[0], out SockChatClientPacket opCode)) + if(args.Length < 1) return; - switch(opCode) { - case SockChatClientPacket.Ping: + switch(args[0]) { + case "0": if(!int.TryParse(args[1], out int pTime)) break; @@ -164,11 +164,13 @@ namespace SharpChat { sess.Send(new PongPacket(sess.LastPing)); break; - case SockChatClientPacket.Authenticate: + case "1": if(sess.User != null) break; - DateTimeOffset aBanned = Context.Bans.Check(sess.RemoteAddress); + DateTimeOffset aBanned; + lock(Context.BansAccess) + aBanned = Context.Bans.Check(sess.RemoteAddress); if(aBanned > DateTimeOffset.UtcNow) { sess.Send(new AuthFailPacket(AuthFailReason.Banned, aBanned)); @@ -209,7 +211,8 @@ namespace SharpChat { aUser.Channel?.Send(new UserUpdatePacket(aUser)); } - aBanned = Context.Bans.Check(aUser); + lock(Context.BansAccess) + aBanned = Context.Bans.Check(aUser); if(aBanned > DateTimeOffset.Now) { sess.Send(new AuthFailPacket(AuthFailReason.Banned, aBanned)); @@ -243,7 +246,7 @@ namespace SharpChat { }); break; - case SockChatClientPacket.MessageSend: + case "2": if(args.Length < 3) break; @@ -301,32 +304,6 @@ namespace SharpChat { Context.Events.Add(message); mChannel.Send(new ChatMessageAddPacket(message)); break; - - case SockChatClientPacket.FocusChannel: - if(sess.User == null || args.Length < 2) - break; - - ChatChannel fChannel = Context.Channels.Get(args[1]); - if(fChannel == null || sess.User.CurrentChannel == fChannel) - break; - - sess.User.FocusChannel(fChannel); - break; - - case SockChatClientPacket.Typing: - if(!ENABLE_TYPING_EVENT || sess.User == null) - break; - - ChatChannel tChannel = sess.User.CurrentChannel; - if(tChannel == null || !tChannel.CanType(sess.User)) - break; - - ChatChannelTyping tInfo = tChannel.RegisterTyping(sess.User); - if(tInfo == null) - return; - - tChannel.Send(new TypingPacket(tChannel, tInfo)); - break; } } @@ -670,11 +647,17 @@ namespace SharpChat { break; } - if(banUser == user || banUser.Rank >= user.Rank || Context.Bans.Check(banUser) > DateTimeOffset.Now) { + if(banUser == user || banUser.Rank >= user.Rank) { user.Send(new LegacyCommandResponse(LCR.KICK_NOT_ALLOWED, true, banUser.DisplayName)); break; } + lock(Context.BansAccess) + if(Context.Bans.Check(banUser) > DateTimeOffset.Now) { + user.Send(new LegacyCommandResponse(LCR.KICK_NOT_ALLOWED, true, banUser.DisplayName)); + break; + } + DateTimeOffset? banUntil = isBanning ? (DateTimeOffset?)DateTimeOffset.MaxValue : null; if(parts.Length > 2) { @@ -700,14 +683,17 @@ namespace SharpChat { break; } - BannedUser unbanUser = Context.Bans.GetUser(parts[1]); + BannedUser unbanUser; + lock(Context.BansAccess) + unbanUser = Context.Bans.GetUser(parts[1]); if(unbanUser == null || unbanUser.Expires <= DateTimeOffset.Now) { user.Send(new LegacyCommandResponse(LCR.USER_NOT_BANNED, true, unbanUser?.Username ?? parts[1])); break; } - Context.Bans.Remove(unbanUser); + lock(Context.BansAccess) + Context.Bans.Remove(unbanUser); user.Send(new LegacyCommandResponse(LCR.USER_UNBANNED, false, unbanUser)); break; @@ -723,12 +709,14 @@ namespace SharpChat { break; } - if(Context.Bans.Check(unbanIP) <= DateTimeOffset.Now) { - user.Send(new LegacyCommandResponse(LCR.USER_NOT_BANNED, true, unbanIP)); - break; - } + lock(Context.BansAccess) { + if(Context.Bans.Check(unbanIP) <= DateTimeOffset.Now) { + user.Send(new LegacyCommandResponse(LCR.USER_NOT_BANNED, true, unbanIP)); + break; + } - Context.Bans.Remove(unbanIP); + Context.Bans.Remove(unbanIP); + } user.Send(new LegacyCommandResponse(LCR.USER_UNBANNED, false, unbanIP)); break; @@ -739,7 +727,8 @@ namespace SharpChat { break; } - user.Send(new BanListPacket(Context.Bans.All())); + lock(Context.BansAccess) + user.Send(new BanListPacket(Context.Bans.All())); break; case @"silence": // silence a user if(!user.Can(ChatUserPermissions.SilenceUser)) {