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.
string |
- Any 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 {