diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..1b749e0 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +[*.{cs,vb}] + +# IDE0046: Convert to conditional expression +dotnet_style_prefer_conditional_expression_over_return = false diff --git a/Protocol.md b/Protocol.md index 2cc3ab0..7e4fe59 100644 --- a/Protocol.md +++ b/Protocol.md @@ -127,7 +127,7 @@ Response to client packet `0`: Ping. - +
stringAny arbitrary string, do not rely on the data sent here. Original Sock Chat server sent pong, SharpChat currently sends the current Unix epoch timestamp in seconds.A string containing pong. Previously SharpChat sent the current Unix timestamp here, but has since been updated to conform to the Original Sock Chat server formatting.
diff --git a/SharpChat.sln b/SharpChat.sln index f5b141f..b79e108 100644 --- a/SharpChat.sln +++ b/SharpChat.sln @@ -7,6 +7,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpChat", "SharpChat\Shar EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DF7A7073-A67A-4D93-92C6-F9D0F95E2359}" ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig .gitattributes = .gitattributes .gitignore = .gitignore LICENSE = LICENSE diff --git a/SharpChat/ChatChannel.cs b/SharpChat/ChatChannel.cs index 61f8c0a..3d1b7e9 100644 --- a/SharpChat/ChatChannel.cs +++ b/SharpChat/ChatChannel.cs @@ -1,6 +1,5 @@ using System; using System.Linq; -using System.Text; namespace SharpChat { public class ChatChannel { @@ -35,18 +34,6 @@ namespace SharpChat { OwnerId = ownerId; } - public string Pack() { - StringBuilder sb = new(); - - sb.Append(Name); - sb.Append('\t'); - sb.Append(string.IsNullOrEmpty(Password) ? '0' : '1'); - sb.Append('\t'); - sb.Append(IsTemporary ? '1' : '0'); - - return sb.ToString(); - } - public bool NameEquals(string name) { return string.Equals(name, Name, StringComparison.InvariantCultureIgnoreCase); } diff --git a/SharpChat/ChatContext.cs b/SharpChat/ChatContext.cs index fd17f9d..56ddb17 100644 --- a/SharpChat/ChatContext.cs +++ b/SharpChat/ChatContext.cs @@ -199,9 +199,9 @@ namespace SharpChat { public void BanUser(ChatUser user, TimeSpan duration, UserDisconnectReason reason = UserDisconnectReason.Kicked) { if(duration > TimeSpan.Zero) { DateTimeOffset expires = duration >= TimeSpan.MaxValue ? DateTimeOffset.MaxValue : DateTimeOffset.Now + duration; - SendTo(user, new ForceDisconnectPacket(ForceDisconnectReason.Banned, expires)); + SendTo(user, new ForceDisconnectPacket(expires)); } else - SendTo(user, new ForceDisconnectPacket(ForceDisconnectReason.Kicked)); + SendTo(user, new ForceDisconnectPacket()); foreach(ChatConnection conn in Connections) if(conn.User == user) diff --git a/SharpChat/ChatUser.cs b/SharpChat/ChatUser.cs index c301f21..64cc24b 100644 --- a/SharpChat/ChatUser.cs +++ b/SharpChat/ChatUser.cs @@ -51,6 +51,7 @@ namespace SharpChat { NickName = nickName ?? string.Empty; Status = status; StatusText = statusText ?? string.Empty; + IsSuper = isSuper; } public bool Can(ChatUserPermissions perm, bool strict = false) { @@ -58,30 +59,6 @@ namespace SharpChat { return strict ? perms == perm : perms > 0; } - public string Pack() { - StringBuilder sb = new(); - - sb.Append(UserId); - sb.Append('\t'); - sb.Append(LegacyNameWithStatus); - sb.Append('\t'); - sb.Append(Colour); - sb.Append('\t'); - sb.Append(Rank); - sb.Append(' '); - sb.Append(Can(ChatUserPermissions.KickUser) ? '1' : '0'); - sb.Append(' '); - sb.Append(Can(ChatUserPermissions.ViewLogs) ? '1' : '0'); - sb.Append(' '); - sb.Append(Can(ChatUserPermissions.SetOwnNickname) ? '1' : '0'); - sb.Append(' '); - sb.Append(Can(ChatUserPermissions.CreateChannel | ChatUserPermissions.SetChannelPermanent, true) ? '2' : ( - Can(ChatUserPermissions.CreateChannel) ? '1' : '0' - )); - - return sb.ToString(); - } - public bool NameEquals(string name) { return string.Equals(name, UserName, StringComparison.InvariantCultureIgnoreCase) || string.Equals(name, NickName, StringComparison.InvariantCultureIgnoreCase) diff --git a/SharpChat/Packet/AuthFailPacket.cs b/SharpChat/Packet/AuthFailPacket.cs index 531701c..ea9b4e1 100644 --- a/SharpChat/Packet/AuthFailPacket.cs +++ b/SharpChat/Packet/AuthFailPacket.cs @@ -1,6 +1,5 @@ using SharpChat.Misuzu; using System; -using System.Text; namespace SharpChat.Packet { public enum AuthFailReason { @@ -21,34 +20,17 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); + string packet = string.Format("1\tn\t{0}fail", Reason switch { + AuthFailReason.AuthInvalid => "auth", + AuthFailReason.MaxSessions => "sock", + AuthFailReason.Banned => "join", + _ => "user", + }); - sb.Append('1'); - sb.Append("\tn\t"); + if(Reason == AuthFailReason.Banned) + packet += string.Format("\t{0}", BanInfo.IsPermanent ? -1 : BanInfo.ExpiresAt.ToUnixTimeSeconds()); - switch(Reason) { - case AuthFailReason.AuthInvalid: - default: - sb.Append("authfail"); - break; - case AuthFailReason.MaxSessions: - sb.Append("sockfail"); - break; - case AuthFailReason.Banned: - sb.Append("joinfail"); - break; - } - - if(Reason == AuthFailReason.Banned) { - sb.Append('\t'); - - if(BanInfo.IsPermanent) - sb.Append("-1"); - else - sb.Append(BanInfo.ExpiresAt.ToUnixTimeSeconds()); - } - - return sb.ToString(); + return packet; } } } diff --git a/SharpChat/Packet/AuthSuccessPacket.cs b/SharpChat/Packet/AuthSuccessPacket.cs index bb6ef9a..2e6d36f 100644 --- a/SharpChat/Packet/AuthSuccessPacket.cs +++ b/SharpChat/Packet/AuthSuccessPacket.cs @@ -1,5 +1,4 @@ using System; -using System.Text; namespace SharpChat.Packet { public class AuthSuccessPacket : ServerPacket { @@ -21,17 +20,21 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('1'); - sb.Append("\ty\t"); - sb.Append(User.Pack()); - sb.Append('\t'); - sb.Append(Channel.Name); - sb.Append('\t'); - sb.Append(MaxMessageLength); - - return sb.ToString(); + return string.Format( + "1\ty\t{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}\t{8}\t{9}", + User.UserId, + User.LegacyNameWithStatus, + User.Colour, + User.Rank, + User.Can(ChatUserPermissions.KickUser) ? 1 : 0, + User.Can(ChatUserPermissions.ViewLogs) ? 1 : 0, + User.Can(ChatUserPermissions.SetOwnNickname) ? 1 : 0, + User.Can(ChatUserPermissions.CreateChannel | ChatUserPermissions.SetChannelPermanent, true) ? 2 : ( + User.Can(ChatUserPermissions.CreateChannel) ? 1 : 0 + ), + Channel.Name, + MaxMessageLength + ); } } } diff --git a/SharpChat/Packet/BanListPacket.cs b/SharpChat/Packet/BanListPacket.cs index 19d17c3..1b46cf0 100644 --- a/SharpChat/Packet/BanListPacket.cs +++ b/SharpChat/Packet/BanListPacket.cs @@ -15,10 +15,7 @@ namespace SharpChat.Packet { public override string Pack() { StringBuilder sb = new(); - sb.Append('2'); - sb.Append('\t'); - sb.Append(DateTimeOffset.Now.ToUnixTimeSeconds()); - sb.Append("\t-1\t0\fbanlist\f"); + sb.AppendFormat("2\t{0}\t-1\t0\fbanlist\f", DateTimeOffset.Now.ToUnixTimeSeconds()); foreach(MisuzuBanInfo ban in Bans) { string banStr = string.IsNullOrEmpty(ban.UserName) ? ban.RemoteAddress : ban.UserName; @@ -28,9 +25,7 @@ namespace SharpChat.Packet { if(Bans.Any()) sb.Length -= 2; - sb.Append('\t'); - sb.Append(SequenceId); - sb.Append("\t10010"); + sb.AppendFormat("\t{0}\t10010", SequenceId); return sb.ToString(); } diff --git a/SharpChat/Packet/ChannelCreatePacket.cs b/SharpChat/Packet/ChannelCreatePacket.cs index f1778b0..484b4ec 100644 --- a/SharpChat/Packet/ChannelCreatePacket.cs +++ b/SharpChat/Packet/ChannelCreatePacket.cs @@ -1,6 +1,4 @@ -using System.Text; - -namespace SharpChat.Packet { +namespace SharpChat.Packet { public class ChannelCreatePacket : ServerPacket { public ChatChannel Channel { get; private set; } @@ -9,15 +7,12 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('4'); - sb.Append('\t'); - sb.Append('0'); - sb.Append('\t'); - sb.Append(Channel.Pack()); - - return sb.ToString(); + return string.Format( + "4\t0\t{0}\t{1}\t{2}", + Channel.Name, + Channel.HasPassword ? 1 : 0, + Channel.IsTemporary ? 1 : 0 + ); } } } diff --git a/SharpChat/Packet/ChannelDeletePacket.cs b/SharpChat/Packet/ChannelDeletePacket.cs index e825715..9ab4812 100644 --- a/SharpChat/Packet/ChannelDeletePacket.cs +++ b/SharpChat/Packet/ChannelDeletePacket.cs @@ -1,5 +1,4 @@ using System; -using System.Text; namespace SharpChat.Packet { public class ChannelDeletePacket : ServerPacket { @@ -10,15 +9,7 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('4'); - sb.Append('\t'); - sb.Append('2'); - sb.Append('\t'); - sb.Append(Channel.Name); - - return sb.ToString(); + return string.Format("4\t2\t{0}", Channel.Name); } } } diff --git a/SharpChat/Packet/ChannelUpdatePacket.cs b/SharpChat/Packet/ChannelUpdatePacket.cs index cc3f40e..8a299ee 100644 --- a/SharpChat/Packet/ChannelUpdatePacket.cs +++ b/SharpChat/Packet/ChannelUpdatePacket.cs @@ -1,6 +1,4 @@ -using System.Text; - -namespace SharpChat.Packet { +namespace SharpChat.Packet { public class ChannelUpdatePacket : ServerPacket { public string PreviousName { get; private set; } public ChatChannel Channel { get; private set; } @@ -11,17 +9,13 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('4'); - sb.Append('\t'); - sb.Append('1'); - sb.Append('\t'); - sb.Append(PreviousName); - sb.Append('\t'); - sb.Append(Channel.Pack()); - - return sb.ToString(); + return string.Format( + "4\t1\t{0}\t{1}\t{2}\t{3}", + PreviousName, + Channel.Name, + Channel.HasPassword ? 1 : 0, + Channel.IsTemporary ? 1 : 0 + ); } } } diff --git a/SharpChat/Packet/ChatMessageAddPacket.cs b/SharpChat/Packet/ChatMessageAddPacket.cs index abab74c..2544663 100644 --- a/SharpChat/Packet/ChatMessageAddPacket.cs +++ b/SharpChat/Packet/ChatMessageAddPacket.cs @@ -1,5 +1,4 @@ using System; -using System.Text; namespace SharpChat.Packet { public class ChatMessageAddPacket : ServerPacket { @@ -25,40 +24,22 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('2'); - sb.Append('\t'); - - sb.Append(Created.ToUnixTimeSeconds()); - sb.Append('\t'); - - sb.Append(UserId); - sb.Append('\t'); - + string body = Text.Replace("<", "<").Replace(">", ">").Replace("\n", "
").Replace("\t", " "); if(IsAction) - sb.Append(""); + body = string.Format("{0}", body); - sb.Append( - Text.Replace("<", "<") - .Replace(">", ">") - .Replace("\n", "
") - .Replace("\t", " ") + return string.Format( + "2\t{0}\t{1}\t{2}\t{3}\t{4}{5}{6}{7}{8}", + Created.ToUnixTimeSeconds(), + UserId, + body, + SequenceId, + 1, + IsAction ? 1 : 0, + 0, + IsAction ? 0 : 1, + IsPrivate ? 1 : 0 ); - - if(IsAction) - sb.Append("
"); - - sb.Append('\t'); - sb.Append(SequenceId); - sb.AppendFormat( - "\t1{0}0{1}{2}", - IsAction ? '1' : '0', - IsAction ? '0' : '1', - IsPrivate ? '1' : '0' - ); - - return sb.ToString(); } } } diff --git a/SharpChat/Packet/ChatMessageDeletePacket.cs b/SharpChat/Packet/ChatMessageDeletePacket.cs index ee046b1..2988f06 100644 --- a/SharpChat/Packet/ChatMessageDeletePacket.cs +++ b/SharpChat/Packet/ChatMessageDeletePacket.cs @@ -1,6 +1,4 @@ -using System.Text; - -namespace SharpChat.Packet { +namespace SharpChat.Packet { public class ChatMessageDeletePacket : ServerPacket { public long EventId { get; private set; } @@ -9,13 +7,7 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('6'); - sb.Append('\t'); - sb.Append(EventId); - - return sb.ToString(); + return string.Format("6\t{0}", EventId); } } } diff --git a/SharpChat/Packet/ContextChannelsPacket.cs b/SharpChat/Packet/ContextChannelsPacket.cs index 3014191..5ce897c 100644 --- a/SharpChat/Packet/ContextChannelsPacket.cs +++ b/SharpChat/Packet/ContextChannelsPacket.cs @@ -14,16 +14,15 @@ namespace SharpChat.Packet { public override string Pack() { StringBuilder sb = new(); - sb.Append('7'); - sb.Append('\t'); - sb.Append('2'); - sb.Append('\t'); - sb.Append(Channels.Count()); + sb.AppendFormat("7\t2\t{0}", Channels.Count()); - foreach(ChatChannel channel in Channels) { - sb.Append('\t'); - sb.Append(channel.Pack()); - } + foreach(ChatChannel channel in Channels) + sb.AppendFormat( + "\t{0}\t{1}\t{2}", + channel.Name, + channel.HasPassword ? 1 : 0, + channel.IsTemporary ? 1 : 0 + ); return sb.ToString(); } diff --git a/SharpChat/Packet/ContextClearPacket.cs b/SharpChat/Packet/ContextClearPacket.cs index 6bc268d..7ef3913 100644 --- a/SharpChat/Packet/ContextClearPacket.cs +++ b/SharpChat/Packet/ContextClearPacket.cs @@ -1,6 +1,4 @@ -using System.Text; - -namespace SharpChat.Packet { +namespace SharpChat.Packet { public enum ContextClearMode { Messages = 0, Users = 1, @@ -22,13 +20,7 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('8'); - sb.Append('\t'); - sb.Append((int)Mode); - - return sb.ToString(); + return string.Format("8\t{0}", (int)Mode); } } } diff --git a/SharpChat/Packet/ContextMessagePacket.cs b/SharpChat/Packet/ContextMessagePacket.cs index 44db9f7..f4663ea 100644 --- a/SharpChat/Packet/ContextMessagePacket.cs +++ b/SharpChat/Packet/ContextMessagePacket.cs @@ -12,7 +12,7 @@ namespace SharpChat.Packet { Notify = notify; } - private const string V1_CHATBOT = "-1\tChatBot\tinherit\t\t"; + private const string V1_CHATBOT = "-1\tChatBot\tinherit\t"; public override string Pack() { bool isAction = Event.Flags.HasFlag(StoredEventFlags.Action); @@ -21,95 +21,82 @@ namespace SharpChat.Packet { StringBuilder sb = new(); - sb.Append('7'); - sb.Append('\t'); - sb.Append('1'); - sb.Append('\t'); - sb.Append(Event.Created.ToUnixTimeSeconds()); - sb.Append('\t'); + sb.AppendFormat("7\t1\t{0}\t", Event.Created.ToUnixTimeSeconds()); switch(Event.Type) { case "msg:add": case "SharpChat.Events.ChatMessage": if(isBroadcast) { sb.Append(V1_CHATBOT); - sb.Append("0\fsay\f"); } else { - sb.Append(Event.Sender.Pack()); - sb.Append('\t'); + sb.AppendFormat( + "{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}", + Event.Sender.UserId, + Event.Sender.LegacyNameWithStatus, + Event.Sender.Colour, + Event.Sender.Rank, + Event.Sender.Can(ChatUserPermissions.KickUser) ? 1 : 0, + Event.Sender.Can(ChatUserPermissions.ViewLogs) ? 1 : 0, + Event.Sender.Can(ChatUserPermissions.SetOwnNickname) ? 1 : 0, + Event.Sender.Can(ChatUserPermissions.CreateChannel | ChatUserPermissions.SetChannelPermanent, true) ? 2 : ( + Event.Sender.Can(ChatUserPermissions.CreateChannel) ? 1 : 0 + ) + ); } - if(isAction) - sb.Append(""); + sb.Append('\t'); - sb.Append( - Event.Data.RootElement.GetProperty("text").GetString() - .Replace("<", "<") - .Replace(">", ">") - .Replace("\n", "
") - .Replace("\t", " ") - ); + if(isBroadcast) + sb.Append("0\fsay\f"); + string body = Event.Data.RootElement.GetProperty("text").GetString().Replace("<", "<").Replace(">", ">").Replace("\n", "
").Replace("\t", " "); if(isAction) - sb.Append("
"); + body = string.Format("{0}", body); + + sb.Append(body); break; case "user:connect": case "SharpChat.Events.UserConnectEvent": - sb.Append(V1_CHATBOT); - sb.Append("0\fjoin\f"); - sb.Append(Event.Sender.LegacyName); + sb.AppendFormat("{0}\t0\fjoin\f{1}", V1_CHATBOT, Event.Sender.LegacyName); break; case "chan:join": case "SharpChat.Events.UserChannelJoinEvent": - sb.Append(V1_CHATBOT); - sb.Append("0\fjchan\f"); - sb.Append(Event.Sender.LegacyName); + sb.AppendFormat("{0}\t0\fjchan\f{1}", V1_CHATBOT, Event.Sender.LegacyName); break; case "chan:leave": case "SharpChat.Events.UserChannelLeaveEvent": - sb.Append(V1_CHATBOT); - sb.Append("0\flchan\f"); - sb.Append(Event.Sender.LegacyName); + sb.AppendFormat("{0}\t0\flchan\f{1}", V1_CHATBOT, Event.Sender.LegacyName); break; case "user:disconnect": case "SharpChat.Events.UserDisconnectEvent": - sb.Append(V1_CHATBOT); - sb.Append("0\f"); - - switch((UserDisconnectReason)Event.Data.RootElement.GetProperty("reason").GetByte()) { - case UserDisconnectReason.Flood: - sb.Append("flood"); - break; - case UserDisconnectReason.Kicked: - sb.Append("kick"); - break; - case UserDisconnectReason.TimeOut: - sb.Append("timeout"); - break; - case UserDisconnectReason.Leave: - default: - sb.Append("leave"); - break; - } - - sb.Append('\f'); - sb.Append(Event.Sender.LegacyName); + sb.AppendFormat( + "{0}\t0\f{1}\f{2}", + V1_CHATBOT, + (UserDisconnectReason)Event.Data.RootElement.GetProperty("reason").GetByte() switch { + UserDisconnectReason.Flood => "flood", + UserDisconnectReason.Kicked => "kick", + UserDisconnectReason.TimeOut => "timeout", + UserDisconnectReason.Leave => "leave", + _ => "leave", + }, + Event.Sender.LegacyName + ); break; } - sb.Append('\t'); - sb.Append(Event.Id < 1 ? SequenceId : Event.Id); - sb.Append('\t'); - sb.Append(Notify ? '1' : '0'); sb.AppendFormat( - "\t1{0}0{1}{2}", - isAction ? '1' : '0', - isAction ? '0' : '1', - isPrivate ? '1' : '0' + "\t{0}\t{1}\t{2}{3}{4}{5}{6}", + Event.Id < 1 ? SequenceId : Event.Id, + Notify ? 1 : 0, + 1, + isAction ? 1 : 0, + 0, + isAction ? 0 : 1, + isPrivate ? 1 : 0 ); return sb.ToString(); diff --git a/SharpChat/Packet/ContextUsersPacket.cs b/SharpChat/Packet/ContextUsersPacket.cs index 545a49e..2ea8649 100644 --- a/SharpChat/Packet/ContextUsersPacket.cs +++ b/SharpChat/Packet/ContextUsersPacket.cs @@ -14,18 +14,23 @@ namespace SharpChat.Packet { public override string Pack() { StringBuilder sb = new(); - sb.Append('7'); - sb.Append('\t'); - sb.Append('0'); - sb.Append('\t'); - sb.Append(Users.Count()); + sb.AppendFormat("7\t0\t{0}", Users.Count()); - foreach(ChatUser user in Users) { - sb.Append('\t'); - sb.Append(user.Pack()); - sb.Append('\t'); - sb.Append('1'); // visibility flag - } + foreach(ChatUser user in Users) + sb.AppendFormat( + "\t{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}\t{8}", + user.UserId, + user.LegacyNameWithStatus, + user.Colour, + user.Rank, + user.Can(ChatUserPermissions.KickUser) ? 1 : 0, + user.Can(ChatUserPermissions.ViewLogs) ? 1 : 0, + user.Can(ChatUserPermissions.SetOwnNickname) ? 1 : 0, + user.Can(ChatUserPermissions.CreateChannel | ChatUserPermissions.SetChannelPermanent, true) ? 2 : ( + user.Can(ChatUserPermissions.CreateChannel) ? 1 : 0 + ), + 1 // visibility flag + ); return sb.ToString(); } diff --git a/SharpChat/Packet/ForceDisconnectPacket.cs b/SharpChat/Packet/ForceDisconnectPacket.cs index fcf4db7..5352501 100644 --- a/SharpChat/Packet/ForceDisconnectPacket.cs +++ b/SharpChat/Packet/ForceDisconnectPacket.cs @@ -1,42 +1,21 @@ using System; -using System.Text; namespace SharpChat.Packet { - public enum ForceDisconnectReason { - Kicked = 0, - Banned = 1, - } - public class ForceDisconnectPacket : ServerPacket { - public ForceDisconnectReason Reason { get; private set; } - public DateTimeOffset Expires { get; private set; } + public DateTimeOffset? Expires { get; private set; } - public ForceDisconnectPacket(ForceDisconnectReason reason, DateTimeOffset? expires = null) { - Reason = reason; - - if(reason == ForceDisconnectReason.Banned) { - if(!expires.HasValue) - throw new ArgumentNullException(nameof(expires)); - Expires = expires.Value; - } + public ForceDisconnectPacket(DateTimeOffset? expires = null) { + Expires = expires; } public override string Pack() { - StringBuilder sb = new(); + if(Expires.HasValue) + return string.Format( + "9\t1\t{0}", + Expires.Value.Year >= 2100 ? -1 : Expires.Value.ToUnixTimeSeconds() + ); - sb.Append('9'); - sb.Append('\t'); - sb.Append((int)Reason); - - if(Reason == ForceDisconnectReason.Banned) { - sb.Append('\t'); - if(Expires.Year >= 2100) - sb.Append("-1"); - else - sb.Append(Expires.ToUnixTimeSeconds()); - } - - return sb.ToString(); + return "9\t0"; } } } diff --git a/SharpChat/Packet/LegacyCommandResponse.cs b/SharpChat/Packet/LegacyCommandResponse.cs index 33c41c4..878237b 100644 --- a/SharpChat/Packet/LegacyCommandResponse.cs +++ b/SharpChat/Packet/LegacyCommandResponse.cs @@ -22,45 +22,35 @@ namespace SharpChat.Packet { public override string Pack() { StringBuilder sb = new(); - if(StringId == LCR.WELCOME) { - sb.Append('7'); - sb.Append('\t'); - sb.Append('1'); - sb.Append('\t'); - sb.Append(DateTimeOffset.Now.ToUnixTimeSeconds()); - sb.Append("\t-1\tChatBot\tinherit\t\t"); - } else { - sb.Append('2'); - sb.Append('\t'); - sb.Append(DateTimeOffset.Now.ToUnixTimeSeconds()); - sb.Append("\t-1\t"); - } + if(StringId == LCR.WELCOME) + sb.AppendFormat( + "7\t1\t{0}\t-1\tChatBot\tinherit\t\t", + DateTimeOffset.Now.ToUnixTimeSeconds() + ); + else + sb.AppendFormat( + "2\t{0}\t-1\t", + DateTimeOffset.Now.ToUnixTimeSeconds() + ); - sb.Append(IsError ? '1' : '0'); - sb.Append('\f'); - sb.Append(StringId == LCR.WELCOME ? LCR.BROADCAST : StringId); + sb.AppendFormat( + "{0}\f{1}", + IsError ? 1 : 0, + StringId == LCR.WELCOME ? LCR.BROADCAST : StringId + ); if(Arguments?.Any() == true) - foreach(object arg in Arguments) { - sb.Append('\f'); - sb.Append(arg); - } + foreach(object arg in Arguments) + sb.AppendFormat("\f{0}", arg); sb.Append('\t'); - if(StringId == LCR.WELCOME) { - sb.Append(StringId); - sb.Append("\t0"); - } else + if(StringId == LCR.WELCOME) + sb.AppendFormat("{0}\t0", StringId); + else sb.Append(SequenceId); sb.Append("\t10010"); - /*sb.AppendFormat( - "\t1{0}0{1}{2}", - Flags.HasFlag(ChatMessageFlags.Action) ? '1' : '0', - Flags.HasFlag(ChatMessageFlags.Action) ? '0' : '1', - Flags.HasFlag(ChatMessageFlags.Private) ? '1' : '0' - );*/ return sb.ToString(); } diff --git a/SharpChat/Packet/PongPacket.cs b/SharpChat/Packet/PongPacket.cs index 36d3491..3eaf871 100644 --- a/SharpChat/Packet/PongPacket.cs +++ b/SharpChat/Packet/PongPacket.cs @@ -1,22 +1,7 @@ -using System; -using System.Text; - -namespace SharpChat.Packet { +namespace SharpChat.Packet { public class PongPacket : ServerPacket { - public DateTimeOffset PongTime { get; private set; } - - public PongPacket(DateTimeOffset dto) { - PongTime = dto; - } - public override string Pack() { - StringBuilder sb = new(); - - sb.Append('0'); - sb.Append('\t'); - sb.Append(PongTime.ToUnixTimeSeconds()); - - return sb.ToString(); + return "0\tpong"; } } } diff --git a/SharpChat/Packet/UserChannelForceJoinPacket.cs b/SharpChat/Packet/UserChannelForceJoinPacket.cs index a1da078..7d057d2 100644 --- a/SharpChat/Packet/UserChannelForceJoinPacket.cs +++ b/SharpChat/Packet/UserChannelForceJoinPacket.cs @@ -1,5 +1,4 @@ using System; -using System.Text; namespace SharpChat.Packet { public class UserChannelForceJoinPacket : ServerPacket { @@ -10,15 +9,7 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('5'); - sb.Append('\t'); - sb.Append('2'); - sb.Append('\t'); - sb.Append(Channel.Name); - - return sb.ToString(); + return string.Format("5\t2\t{0}", Channel.Name); } } } diff --git a/SharpChat/Packet/UserChannelJoinPacket.cs b/SharpChat/Packet/UserChannelJoinPacket.cs index 04a052c..b7f931a 100644 --- a/SharpChat/Packet/UserChannelJoinPacket.cs +++ b/SharpChat/Packet/UserChannelJoinPacket.cs @@ -1,5 +1,4 @@ using System; -using System.Text; namespace SharpChat.Packet { public class UserChannelJoinPacket : ServerPacket { @@ -10,17 +9,20 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('5'); - sb.Append('\t'); - sb.Append('0'); - sb.Append('\t'); - sb.Append(User.Pack()); - sb.Append('\t'); - sb.Append(SequenceId); - - return sb.ToString(); + return string.Format( + "5\t0\t{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}\t{8}", + User.UserId, + User.LegacyNameWithStatus, + User.Colour, + User.Rank, + User.Can(ChatUserPermissions.KickUser) ? 1 : 0, + User.Can(ChatUserPermissions.ViewLogs) ? 1 : 0, + User.Can(ChatUserPermissions.SetOwnNickname) ? 1 : 0, + User.Can(ChatUserPermissions.CreateChannel | ChatUserPermissions.SetChannelPermanent, true) ? 2 : ( + User.Can(ChatUserPermissions.CreateChannel) ? 1 : 0 + ), + SequenceId + ); } } } diff --git a/SharpChat/Packet/UserChannelLeavePacket.cs b/SharpChat/Packet/UserChannelLeavePacket.cs index 1300a78..77d57b7 100644 --- a/SharpChat/Packet/UserChannelLeavePacket.cs +++ b/SharpChat/Packet/UserChannelLeavePacket.cs @@ -1,5 +1,4 @@ using System; -using System.Text; namespace SharpChat.Packet { public class UserChannelLeavePacket : ServerPacket { @@ -10,17 +9,7 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('5'); - sb.Append('\t'); - sb.Append('1'); - sb.Append('\t'); - sb.Append(User.UserId); - sb.Append('\t'); - sb.Append(SequenceId); - - return sb.ToString(); + return string.Format("5\t1\t{0}\t{1}", User.UserId, SequenceId); } } } diff --git a/SharpChat/Packet/UserConnectPacket.cs b/SharpChat/Packet/UserConnectPacket.cs index 7267407..8e2580b 100644 --- a/SharpChat/Packet/UserConnectPacket.cs +++ b/SharpChat/Packet/UserConnectPacket.cs @@ -1,5 +1,4 @@ using System; -using System.Text; namespace SharpChat.Packet { public class UserConnectPacket : ServerPacket { @@ -12,17 +11,21 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('1'); - sb.Append('\t'); - sb.Append(Joined.ToUnixTimeSeconds()); - sb.Append('\t'); - sb.Append(User.Pack()); - sb.Append('\t'); - sb.Append(SequenceId); - - return sb.ToString(); + return string.Format( + "1\t{0}\t{1}\t{2}\t{3}\t{4} {5} {6} {7} {8}\t{9}", + Joined.ToUnixTimeSeconds(), + User.UserId, + User.LegacyNameWithStatus, + User.Colour, + User.Rank, + User.Can(ChatUserPermissions.KickUser) ? 1 : 0, + User.Can(ChatUserPermissions.ViewLogs) ? 1 : 0, + User.Can(ChatUserPermissions.SetOwnNickname) ? 1 : 0, + User.Can(ChatUserPermissions.CreateChannel | ChatUserPermissions.SetChannelPermanent, true) ? 2 : ( + User.Can(ChatUserPermissions.CreateChannel) ? 1 : 0 + ), + SequenceId + ); } } } diff --git a/SharpChat/Packet/UserDisconnectPacket.cs b/SharpChat/Packet/UserDisconnectPacket.cs index 6fb571c..87c370c 100644 --- a/SharpChat/Packet/UserDisconnectPacket.cs +++ b/SharpChat/Packet/UserDisconnectPacket.cs @@ -1,5 +1,4 @@ using System; -using System.Text; namespace SharpChat.Packet { public enum UserDisconnectReason { @@ -21,37 +20,20 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('3'); - sb.Append('\t'); - sb.Append(User.UserId); - sb.Append('\t'); - sb.Append(User.LegacyNameWithStatus); - sb.Append('\t'); - - switch(Reason) { - case UserDisconnectReason.Leave: - default: - sb.Append("leave"); - break; - case UserDisconnectReason.TimeOut: - sb.Append("timeout"); - break; - case UserDisconnectReason.Kicked: - sb.Append("kick"); - break; - case UserDisconnectReason.Flood: - sb.Append("flood"); - break; - } - - sb.Append('\t'); - sb.Append(Disconnected.ToUnixTimeSeconds()); - sb.Append('\t'); - sb.Append(SequenceId); - - return sb.ToString(); + return string.Format( + "3\t{0}\t{1}\t{2}\t{3}\t{4}", + User.UserId, + User.LegacyNameWithStatus, + Reason switch { + UserDisconnectReason.Leave => "leave", + UserDisconnectReason.TimeOut => "timeout", + UserDisconnectReason.Kicked => "kick", + UserDisconnectReason.Flood => "flood", + _ => "leave", + }, + Disconnected.ToUnixTimeSeconds(), + SequenceId + ); } } } diff --git a/SharpChat/Packet/UserUpdateNotificationPacket.cs b/SharpChat/Packet/UserUpdateNotificationPacket.cs index 147bf34..baa5a64 100644 --- a/SharpChat/Packet/UserUpdateNotificationPacket.cs +++ b/SharpChat/Packet/UserUpdateNotificationPacket.cs @@ -1,5 +1,4 @@ using System; -using System.Text; namespace SharpChat.Packet { public class UserUpdateNotificationPacket : ServerPacket { @@ -14,20 +13,13 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append('2'); - sb.Append('\t'); - sb.Append(Timestamp.ToUnixTimeSeconds()); - sb.Append("\t-1\t0\fnick\f"); - sb.Append(PreviousName); - sb.Append('\f'); - sb.Append(NewName); - sb.Append('\t'); - sb.Append(SequenceId); - sb.Append("\t10010"); - - return sb.ToString(); + return string.Format( + "2\t{0}\t-1\t0\fnick\f{1}\f{2}\t{3}\t10010", + Timestamp.ToUnixTimeSeconds(), + PreviousName, + NewName, + SequenceId + ); } } } diff --git a/SharpChat/Packet/UserUpdatePacket.cs b/SharpChat/Packet/UserUpdatePacket.cs index d2686b8..0a4716c 100644 --- a/SharpChat/Packet/UserUpdatePacket.cs +++ b/SharpChat/Packet/UserUpdatePacket.cs @@ -1,5 +1,4 @@ using System; -using System.Text; namespace SharpChat.Packet { public class UserUpdatePacket : ServerPacket { @@ -10,13 +9,19 @@ namespace SharpChat.Packet { } public override string Pack() { - StringBuilder sb = new(); - - sb.Append("10"); - sb.Append('\t'); - sb.Append(User.Pack()); - - return sb.ToString(); + return string.Format( + "10\t{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}", + User.UserId, + User.LegacyNameWithStatus, + User.Colour, + User.Rank, + User.Can(ChatUserPermissions.KickUser) ? 1 : 0, + User.Can(ChatUserPermissions.ViewLogs) ? 1 : 0, + User.Can(ChatUserPermissions.SetOwnNickname) ? 1 : 0, + User.Can(ChatUserPermissions.CreateChannel | ChatUserPermissions.SetChannelPermanent, true) ? 2 : ( + User.Can(ChatUserPermissions.CreateChannel) ? 1 : 0 + ) + ); } } } diff --git a/SharpChat/PacketHandlers/PingHandler.cs b/SharpChat/PacketHandlers/PingHandler.cs index 45aa83e..87d04c9 100644 --- a/SharpChat/PacketHandlers/PingHandler.cs +++ b/SharpChat/PacketHandlers/PingHandler.cs @@ -26,7 +26,7 @@ namespace SharpChat.PacketHandlers { return; ctx.Connection.BumpPing(); - ctx.Connection.Send(new PongPacket(ctx.Connection.LastPing)); + ctx.Connection.Send(new PongPacket()); ctx.Chat.ContextAccess.Wait(); try {