Use interface instead of abstract classes as base for Sock Chat S2C packets.

This commit is contained in:
flash 2024-05-23 23:13:57 +00:00
parent 4ace355374
commit 651c3f127d
56 changed files with 390 additions and 181 deletions
SharpChat.SockChat
PacketsS2C
AuthFailS2CPacket.csAuthSuccessS2CPacket.csBanListResponseS2CPacket.csChannelCreateResponseS2CPacket.csChannelCreateS2CPacket.csChannelDeleteNotAllowedErrorS2CPacket.csChannelDeleteResponseS2CPacket.csChannelDeleteS2CPacket.csChannelNameFormatErrorS2CPacket.csChannelNameInUseErrorS2CPacket.csChannelNotFoundErrorS2CPacket.csChannelPasswordChangedResponseS2CPacket.csChannelPasswordWrongErrorS2CPacket.csChannelRankChangedResponseS2CPacket.csChannelRankTooHighErrorS2CPacket.csChannelRankTooLowErrorS2CPacket.csChannelUpdateS2CPacket.csChannelsPopulateS2CPacket.csCommandFormatErrorS2CPacket.csCommandNotAllowedErrorS2CPacket.csContextClearS2CPacket.csFloodWarningS2CPacket.csForceDisconnectS2CPacket.csISockChatS2CPacket.csKickBanNoRecordErrorS2CPacket.csKickBanNotAllowedErrorS2CPacket.csMOTDS2CPacket.csMessageAddLogS2CPacket.csMessageAddS2CPacket.csMessageBroadcastS2CPacket.csMessageDeleteNotAllowedErrorS2CPacket.csMessageDeleteS2CPacket.csPardonResponseS2CPacket.csPongS2CPacket.csSockChatS2CPacket.csSockChatTimedS2CPacket.csUserChannelForceJoinS2CPacket.csUserChannelJoinLogS2CPacket.csUserChannelJoinS2CPacket.csUserChannelLeaveLogS2CPacket.csUserChannelLeaveS2CPacket.csUserConnectLogS2CPacket.csUserConnectS2CPacket.csUserDisconnectLogS2CPacket.csUserDisconnectS2CPacket.csUserNameInUseErrorS2CPacket.csUserNotFoundErrorS2CPacket.csUserUpdateNotificationS2CPacket.csUserUpdateS2CPacket.csUsersPopulateS2CPacket.csWhoChannelNotFoundErrorS2CPacket.csWhoChannelResponseS2CPacket.csWhoServerResponseS2CPacket.csWhoisResponseS2CPacket.cs
SockChatConnectionInfo.csSockChatContext.cs

View file

@ -1,7 +1,7 @@
using System; using System;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class AuthFailS2CPacket : SockChatS2CPacket { public class AuthFailS2CPacket : ISockChatS2CPacket {
public enum FailReason { public enum FailReason {
AuthInvalid, AuthInvalid,
MaxSessions, MaxSessions,
@ -21,7 +21,7 @@ namespace SharpChat.SockChat.PacketsS2C {
Expires = expires.Year >= 2100 ? -1 : expires.ToUnixTimeSeconds(); Expires = expires.Year >= 2100 ? -1 : expires.ToUnixTimeSeconds();
} }
public override string Pack() { public string Pack() {
string packet = string.Format("1\tn\t{0}fail", Reason switch { string packet = string.Format("1\tn\t{0}fail", Reason switch {
FailReason.AuthInvalid => "auth", FailReason.AuthInvalid => "auth",
FailReason.MaxSessions => "sock", FailReason.MaxSessions => "sock",

View file

@ -1,5 +1,5 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class AuthSuccessS2CPacket : SockChatS2CPacket { public class AuthSuccessS2CPacket : ISockChatS2CPacket {
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly Colour UserColour; private readonly Colour UserColour;
@ -26,7 +26,7 @@
MaxMessageLength = maxMsgLength; MaxMessageLength = maxMsgLength;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"1\ty\t{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}\t{8}\t{9}", "1\ty\t{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}\t{8}\t{9}",
UserId, UserId,

View file

@ -1,14 +1,19 @@
using System.Text; using System;
using System.Text;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class BanListResponseS2CPacket : SockChatTimedS2CPacket { public class BanListResponseS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string[] Bans; private readonly string[] Bans;
public BanListResponseS2CPacket(string[] bans) { public BanListResponseS2CPacket(string[] bans) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
Bans = bans; Bans = bans;
} }
public override string Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.AppendFormat("2\t{0}\t-1\t0\fbanlist\f", TimeStamp.ToUnixTimeSeconds()); sb.AppendFormat("2\t{0}\t-1\t0\fbanlist\f", TimeStamp.ToUnixTimeSeconds());

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelCreateResponseS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelCreateResponseS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelCreateResponseS2CPacket(string channelName) { public ChannelCreateResponseS2CPacket(string channelName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t0\fcrchan\f{1}\t{2}\t10010", "2\t{0}\t-1\t0\fcrchan\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,5 +1,5 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class ChannelCreateS2CPacket : SockChatS2CPacket { public class ChannelCreateS2CPacket : ISockChatS2CPacket {
private readonly string ChannelName; private readonly string ChannelName;
private readonly bool ChannelHasPassword; private readonly bool ChannelHasPassword;
private readonly bool ChannelIsTemporary; private readonly bool ChannelIsTemporary;
@ -14,7 +14,7 @@
ChannelIsTemporary = channelIsTemporary; ChannelIsTemporary = channelIsTemporary;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"4\t0\t{0}\t{1}\t{2}", "4\t0\t{0}\t{1}\t{2}",
SockChatUtility.SanitiseChannelName(ChannelName), SockChatUtility.SanitiseChannelName(ChannelName),

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelDeleteNotAllowedErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelDeleteNotAllowedErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelDeleteNotAllowedErrorS2CPacket(string channelName) { public ChannelDeleteNotAllowedErrorS2CPacket(string channelName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fndchan\f{1}\t{2}\t10010", "2\t{0}\t-1\t1\fndchan\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelDeleteResponseS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelDeleteResponseS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelDeleteResponseS2CPacket(string channelName) { public ChannelDeleteResponseS2CPacket(string channelName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t0\fdelchan\f{1}\t{2}\t10010", "2\t{0}\t-1\t0\fdelchan\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,12 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class ChannelDeleteS2CPacket : SockChatS2CPacket { public class ChannelDeleteS2CPacket : ISockChatS2CPacket {
private readonly string ChannelName; private readonly string ChannelName;
public ChannelDeleteS2CPacket(string channelName) { public ChannelDeleteS2CPacket(string channelName) {
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"4\t2\t{0}", "4\t2\t{0}",
SockChatUtility.SanitiseChannelName(ChannelName) SockChatUtility.SanitiseChannelName(ChannelName)

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelNameFormatErrorS2CPacket : SockChatTimedS2CPacket {
public override string Pack() { namespace SharpChat.SockChat.PacketsS2C {
public class ChannelNameFormatErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
public ChannelNameFormatErrorS2CPacket() {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
}
public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\finchan\t{1}\t10010", "2\t{0}\t-1\t1\finchan\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelNameInUseErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelNameInUseErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelNameInUseErrorS2CPacket(string channelName) { public ChannelNameInUseErrorS2CPacket(string channelName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fnischan\f{1}\t{2}\t10010", "2\t{0}\t-1\t1\fnischan\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelNotFoundErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelNotFoundErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelNotFoundErrorS2CPacket(string channelName) { public ChannelNotFoundErrorS2CPacket(string channelName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fnochan\f{1}\t{2}\t10010", "2\t{0}\t-1\t1\fnochan\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelPasswordChangedResponseS2CPacket : SockChatTimedS2CPacket {
public override string Pack() { namespace SharpChat.SockChat.PacketsS2C {
public class ChannelPasswordChangedResponseS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
public ChannelPasswordChangedResponseS2CPacket() {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
}
public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t0\fcpwdchan\t{1}\t10010", "2\t{0}\t-1\t0\fcpwdchan\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelPasswordWrongErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelPasswordWrongErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelPasswordWrongErrorS2CPacket(string channelName) { public ChannelPasswordWrongErrorS2CPacket(string channelName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fipwchan\f{1}\t{2}\t10010", "2\t{0}\t-1\t1\fipwchan\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelRankChangedResponseS2CPacket : SockChatTimedS2CPacket {
public override string Pack() { namespace SharpChat.SockChat.PacketsS2C {
public class ChannelRankChangedResponseS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
public ChannelRankChangedResponseS2CPacket() {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
}
public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t0\fcprivchan\t{1}\t10010", "2\t{0}\t-1\t0\fcprivchan\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelRankTooHighErrorS2CPacket : SockChatTimedS2CPacket {
public override string Pack() { namespace SharpChat.SockChat.PacketsS2C {
public class ChannelRankTooHighErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
public ChannelRankTooHighErrorS2CPacket() {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
}
public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\frankerr\t{1}\t10010", "2\t{0}\t-1\t1\frankerr\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class ChannelRankTooLowErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelRankTooLowErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelRankTooLowErrorS2CPacket(string channelName) { public ChannelRankTooLowErrorS2CPacket(string channelName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fipchan\f{1}\t{2}\t10010", "2\t{0}\t-1\t1\fipchan\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,5 +1,5 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class ChannelUpdateS2CPacket : SockChatS2CPacket { public class ChannelUpdateS2CPacket : ISockChatS2CPacket {
private readonly string ChannelNamePrevious; private readonly string ChannelNamePrevious;
private readonly string ChannelNameNew; private readonly string ChannelNameNew;
private readonly bool ChannelHasPassword; private readonly bool ChannelHasPassword;
@ -17,7 +17,7 @@
ChannelIsTemporary = channelIsTemporary; ChannelIsTemporary = channelIsTemporary;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"4\t1\t{0}\t{1}\t{2}\t{3}", "4\t1\t{0}\t{1}\t{2}\t{3}",
SockChatUtility.SanitiseChannelName(ChannelNamePrevious), SockChatUtility.SanitiseChannelName(ChannelNamePrevious),

View file

@ -1,7 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class ChannelsPopulateS2CPacket : SockChatS2CPacket { public class ChannelsPopulateS2CPacket : ISockChatS2CPacket {
public record ListEntry(string Name, bool HasPassword, bool IsTemporary); public record ListEntry(string Name, bool HasPassword, bool IsTemporary);
private readonly ListEntry[] Entries; private readonly ListEntry[] Entries;
@ -10,7 +10,7 @@ namespace SharpChat.SockChat.PacketsS2C {
Entries = entries; Entries = entries;
} }
public override string Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.AppendFormat("7\t2\t{0}", Entries.Length); sb.AppendFormat("7\t2\t{0}", Entries.Length);

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class CommandFormatErrorS2CPacket : SockChatTimedS2CPacket {
public override string Pack() { namespace SharpChat.SockChat.PacketsS2C {
public class CommandFormatErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
public CommandFormatErrorS2CPacket() {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
}
public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fcmdna\t{1}\t10010", "2\t{0}\t-1\t1\fcmdna\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class CommandNotAllowedErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class CommandNotAllowedErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string CommandName; private readonly string CommandName;
public CommandNotAllowedErrorS2CPacket(string commandName) { public CommandNotAllowedErrorS2CPacket(string commandName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
CommandName = commandName; CommandName = commandName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fcmdna\f/{1}\t{2}\t10010", "2\t{0}\t-1\t1\fcmdna\f/{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,5 +1,5 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class ContextClearS2CPacket : SockChatS2CPacket { public class ContextClearS2CPacket : ISockChatS2CPacket {
public enum ClearMode { public enum ClearMode {
Messages = 0, Messages = 0,
Users = 1, Users = 1,
@ -14,7 +14,7 @@
Mode = mode; Mode = mode;
} }
public override string Pack() { public string Pack() {
return string.Format("8\t{0}", (int)Mode); return string.Format("8\t{0}", (int)Mode);
} }
} }

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class FloodWarningS2CPacket : SockChatTimedS2CPacket {
public override string Pack() { namespace SharpChat.SockChat.PacketsS2C {
public class FloodWarningS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
public FloodWarningS2CPacket() {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
}
public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t0\fflwarn\t{1}\t10010", "2\t{0}\t-1\t0\fflwarn\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,16 +1,17 @@
using System; using System;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class ForceDisconnectS2CPacket : SockChatS2CPacket { public class ForceDisconnectS2CPacket : ISockChatS2CPacket {
private readonly long Expires; private readonly long Expires;
public ForceDisconnectS2CPacket() { } public ForceDisconnectS2CPacket() {
}
public ForceDisconnectS2CPacket(DateTimeOffset expires) { public ForceDisconnectS2CPacket(DateTimeOffset expires) {
Expires = expires.Year >= 2100 ? -1 : expires.ToUnixTimeSeconds(); Expires = expires.Year >= 2100 ? -1 : expires.ToUnixTimeSeconds();
} }
public override string Pack() { public string Pack() {
if(Expires != 0) if(Expires != 0)
return string.Format("9\t1\t{0}", Expires); return string.Format("9\t1\t{0}", Expires);

View file

@ -0,0 +1,5 @@
namespace SharpChat.SockChat.PacketsS2C {
public interface ISockChatS2CPacket {
string Pack();
}
}

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class KickBanNoRecordErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class KickBanNoRecordErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string TargetName; private readonly string TargetName;
public KickBanNoRecordErrorS2CPacket(string targetName) { public KickBanNoRecordErrorS2CPacket(string targetName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
TargetName = targetName; TargetName = targetName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fnotban\f{1}\t{2}\t10010", "2\t{0}\t-1\t1\fnotban\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class KickBanNotAllowedErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class KickBanNotAllowedErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string UserName; private readonly string UserName;
public KickBanNotAllowedErrorS2CPacket(string userName) { public KickBanNotAllowedErrorS2CPacket(string userName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
UserName = userName; UserName = userName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fkickna\f{1}\t{2}\t10010", "2\t{0}\t-1\t1\fkickna\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,14 +1,16 @@
using System; using System;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class MOTDS2CPacket : SockChatTimedS2CPacket { public class MOTDS2CPacket : ISockChatS2CPacket {
private readonly DateTimeOffset TimeStamp;
private readonly string Body; private readonly string Body;
public MOTDS2CPacket(DateTimeOffset timeStamp, string body) : base(timeStamp) { public MOTDS2CPacket(DateTimeOffset timeStamp, string body) {
TimeStamp = timeStamp;
Body = body; Body = body;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"7\t1\t{0}\t-1\tChatBot\tinherit\t\t0\fsay\f{1}\twelcome\t0\t10010", "7\t1\t{0}\t-1\tChatBot\tinherit\t\t0\fsay\f{1}\twelcome\t0\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,7 +1,9 @@
using System; using System;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class MessageAddLogS2CPacket : SockChatTimedS2CPacket { public class MessageAddLogS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly Colour UserColour; private readonly Colour UserColour;
@ -26,7 +28,9 @@ namespace SharpChat.SockChat.PacketsS2C {
bool isPrivate, bool isPrivate,
bool isBroadcast, bool isBroadcast,
bool notify bool notify
) : base(messageId, timeStamp) { ) {
MessageId = messageId;
TimeStamp = timeStamp;
UserId = userId < 0 ? -1 : userId; UserId = userId < 0 ? -1 : userId;
UserName = userName; UserName = userName;
UserColour = userColour; UserColour = userColour;
@ -39,7 +43,7 @@ namespace SharpChat.SockChat.PacketsS2C {
Notify = notify; Notify = notify;
} }
public override string Pack() { public string Pack() {
string body = SockChatUtility.SanitiseMessageBody(Body); string body = SockChatUtility.SanitiseMessageBody(Body);
if(IsAction) if(IsAction)
body = string.Format("<i>{0}</i>", body); body = string.Format("<i>{0}</i>", body);

View file

@ -1,7 +1,9 @@
using System; using System;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class MessageAddS2CPacket : SockChatTimedS2CPacket { public class MessageAddS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly long UserId; private readonly long UserId;
private readonly string Body; private readonly string Body;
private readonly bool IsAction; private readonly bool IsAction;
@ -14,14 +16,16 @@ namespace SharpChat.SockChat.PacketsS2C {
string body, string body,
bool isAction, bool isAction,
bool isPrivate bool isPrivate
) : base(messageId, timeStamp) { ) {
MessageId = messageId;
TimeStamp = timeStamp;
UserId = userId < 0 ? -1 : userId; UserId = userId < 0 ? -1 : userId;
Body = body; Body = body;
IsAction = isAction; IsAction = isAction;
IsPrivate = isPrivate; IsPrivate = isPrivate;
} }
public override string Pack() { public string Pack() {
string body = SockChatUtility.SanitiseMessageBody(Body); string body = SockChatUtility.SanitiseMessageBody(Body);
if(IsAction) if(IsAction)
body = string.Format("<i>{0}</i>", body); body = string.Format("<i>{0}</i>", body);

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class MessageBroadcastS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class MessageBroadcastS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string Body; private readonly string Body;
public MessageBroadcastS2CPacket(string body) { public MessageBroadcastS2CPacket(long messageId, DateTimeOffset timeStamp, string body) {
MessageId = messageId;
TimeStamp = timeStamp;
Body = body; Body = body;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t0\fsay\f{1}\t{2}\t10010", "2\t{0}\t-1\t0\fsay\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class MessageDeleteNotAllowedErrorS2CPacket : SockChatTimedS2CPacket {
public override string Pack() { namespace SharpChat.SockChat.PacketsS2C {
public class MessageDeleteNotAllowedErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
public MessageDeleteNotAllowedErrorS2CPacket() {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
}
public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fdelerr\t{1}\t10010", "2\t{0}\t-1\t1\fdelerr\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,12 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class MessageDeleteS2CPacket : SockChatS2CPacket { public class MessageDeleteS2CPacket : ISockChatS2CPacket {
private readonly long DeletedMessageId; private readonly long DeletedMessageId;
public MessageDeleteS2CPacket(long deletedMessageId) { public MessageDeleteS2CPacket(long deletedMessageId) {
DeletedMessageId = deletedMessageId; DeletedMessageId = deletedMessageId;
} }
public override string Pack() { public string Pack() {
return string.Format("6\t{0}", DeletedMessageId); return string.Format("6\t{0}", DeletedMessageId);
} }
} }

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class PardonResponseS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class PardonResponseS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string Subject; private readonly string Subject;
public PardonResponseS2CPacket(string subject) { public PardonResponseS2CPacket(string subject) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
Subject = subject; Subject = subject;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t0\funban\f{1}\t{2}\t10010", "2\t{0}\t-1\t0\funban\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,6 +1,6 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class PongS2CPacket : SockChatS2CPacket { public class PongS2CPacket : ISockChatS2CPacket {
public override string Pack() { public string Pack() {
return "0\tpong"; return "0\tpong";
} }
} }

View file

@ -1,15 +0,0 @@
namespace SharpChat.SockChat.PacketsS2C {
public abstract class SockChatS2CPacket {
protected readonly long MessageId;
public SockChatS2CPacket() {
MessageId = SharpId.Next();
}
public SockChatS2CPacket(long messageId) {
MessageId = messageId;
}
public abstract string Pack();
}
}

View file

@ -1,19 +0,0 @@
using System;
namespace SharpChat.SockChat.PacketsS2C {
public abstract class SockChatTimedS2CPacket : SockChatS2CPacket {
protected readonly DateTimeOffset TimeStamp;
public SockChatTimedS2CPacket() : base() {
TimeStamp = DateTimeOffset.UtcNow;
}
public SockChatTimedS2CPacket(DateTimeOffset timeStamp) : base() {
TimeStamp = timeStamp;
}
public SockChatTimedS2CPacket(long messageId, DateTimeOffset timeStamp) : base(messageId) {
TimeStamp = timeStamp;
}
}
}

View file

@ -1,12 +1,12 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class UserChannelForceJoinS2CPacket : SockChatS2CPacket { public class UserChannelForceJoinS2CPacket : ISockChatS2CPacket {
private readonly string ChannelName; private readonly string ChannelName;
public UserChannelForceJoinS2CPacket(string channelName) { public UserChannelForceJoinS2CPacket(string channelName) {
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"5\t2\t{0}", "5\t2\t{0}",
SockChatUtility.SanitiseChannelName(ChannelName) SockChatUtility.SanitiseChannelName(ChannelName)

View file

@ -1,18 +1,22 @@
using System; using System;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class UserChannelJoinLogS2CPacket : SockChatTimedS2CPacket { public class UserChannelJoinLogS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string UserName; private readonly string UserName;
public UserChannelJoinLogS2CPacket( public UserChannelJoinLogS2CPacket(
long messageId, long messageId,
DateTimeOffset timeStamp, DateTimeOffset timeStamp,
string userName string userName
) : base(messageId, timeStamp) { ) {
MessageId = messageId;
TimeStamp = timeStamp;
UserName = userName; UserName = userName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"7\t1\t{0}\t-1\tChatBot\tinherit\t\t0\fjchan\f{1}\t{2}\t0\t10010", "7\t1\t{0}\t-1\tChatBot\tinherit\t\t0\fjchan\f{1}\t{2}\t0\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,5 +1,6 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class UserChannelJoinS2CPacket : SockChatS2CPacket { public class UserChannelJoinS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly Colour UserColour; private readonly Colour UserColour;
@ -13,6 +14,7 @@
int userRank, int userRank,
UserPermissions userPerms UserPermissions userPerms
) { ) {
MessageId = SharpId.Next();
UserId = userId; UserId = userId;
UserName = userName; UserName = userName;
UserColour = userColour; UserColour = userColour;
@ -20,7 +22,7 @@
UserPerms = userPerms; UserPerms = userPerms;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"5\t0\t{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}\t{8}", "5\t0\t{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}\t{8}",
UserId, UserId,

View file

@ -1,18 +1,22 @@
using System; using System;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class UserChannelLeaveLogS2CPacket : SockChatTimedS2CPacket { public class UserChannelLeaveLogS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string UserName; private readonly string UserName;
public UserChannelLeaveLogS2CPacket( public UserChannelLeaveLogS2CPacket(
long messageId, long messageId,
DateTimeOffset timeStamp, DateTimeOffset timeStamp,
string userName string userName
) : base(messageId, timeStamp) { ) {
MessageId = messageId;
TimeStamp = timeStamp;
UserName = userName; UserName = userName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"7\t1\t{0}\t-1\tChatBot\tinherit\t\t0\flchan\f{1}\t{2}\t0\t10010", "7\t1\t{0}\t-1\tChatBot\tinherit\t\t0\flchan\f{1}\t{2}\t0\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,14 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class UserChannelLeaveS2CPacket : SockChatS2CPacket { public class UserChannelLeaveS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly long UserId; private readonly long UserId;
public UserChannelLeaveS2CPacket(long userId) { public UserChannelLeaveS2CPacket(long userId) {
MessageId = SharpId.Next();
UserId = userId; UserId = userId;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"5\t1\t{0}\t{1}", "5\t1\t{0}\t{1}",
UserId, UserId,

View file

@ -1,18 +1,22 @@
using System; using System;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class UserConnectLogS2CPacket : SockChatTimedS2CPacket { public class UserConnectLogS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string UserName; private readonly string UserName;
public UserConnectLogS2CPacket( public UserConnectLogS2CPacket(
long messageId, long messageId,
DateTimeOffset timeStamp, DateTimeOffset timeStamp,
string userName string userName
) : base(messageId, timeStamp) { ) {
MessageId = messageId;
TimeStamp = timeStamp;
UserName = userName; UserName = userName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"7\t1\t{0}\t-1\tChatBot\tinherit\t\t0\fjoin\f{1}\t{2}\t0\t10010", "7\t1\t{0}\t-1\tChatBot\tinherit\t\t0\fjoin\f{1}\t{2}\t0\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,5 +1,9 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class UserConnectS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class UserConnectS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly Colour UserColour; private readonly Colour UserColour;
@ -7,12 +11,16 @@
private readonly UserPermissions UserPerms; private readonly UserPermissions UserPerms;
public UserConnectS2CPacket( public UserConnectS2CPacket(
long messageId,
DateTimeOffset timeStamp,
long userId, long userId,
string userName, string userName,
Colour userColour, Colour userColour,
int userRank, int userRank,
UserPermissions userPerms UserPermissions userPerms
) { ) {
MessageId = messageId;
TimeStamp = timeStamp;
UserId = userId; UserId = userId;
UserName = userName; UserName = userName;
UserColour = userColour; UserColour = userColour;
@ -20,7 +28,7 @@
UserPerms = userPerms; UserPerms = userPerms;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"1\t{0}\t{1}\t{2}\t{3}\t{4} {5} {6} {7} {8}\t{9}", "1\t{0}\t{1}\t{2}\t{3}\t{4} {5} {6} {7} {8}\t{9}",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,7 +1,9 @@
using System; using System;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class UserDisconnectLogS2CPacket : SockChatTimedS2CPacket { public class UserDisconnectLogS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string UserName; private readonly string UserName;
private readonly UserDisconnectReason Reason; private readonly UserDisconnectReason Reason;
@ -10,12 +12,14 @@ namespace SharpChat.SockChat.PacketsS2C {
DateTimeOffset timeStamp, DateTimeOffset timeStamp,
string userName, string userName,
UserDisconnectReason reason UserDisconnectReason reason
) : base(messageId, timeStamp) { ) {
MessageId = messageId;
TimeStamp = timeStamp;
UserName = userName; UserName = userName;
Reason = reason; Reason = reason;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"7\t1\t{0}\t-1\tChatBot\tinherit\t\t0\f{1}\f{2}\t{3}\t0\t10010", "7\t1\t{0}\t-1\tChatBot\tinherit\t\t0\f{1}\f{2}\t{3}\t0\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,20 +1,28 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class UserDisconnectS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class UserDisconnectS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly UserDisconnectReason Reason; private readonly UserDisconnectReason Reason;
public UserDisconnectS2CPacket( public UserDisconnectS2CPacket(
long messageId,
DateTimeOffset timeStamp,
long userId, long userId,
string userName, string userName,
UserDisconnectReason reason UserDisconnectReason reason
) { ) {
MessageId = messageId;
TimeStamp = timeStamp;
UserId = userId; UserId = userId;
UserName = userName; UserName = userName;
Reason = reason; Reason = reason;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"3\t{0}\t{1}\t{2}\t{3}\t{4}", "3\t{0}\t{1}\t{2}\t{3}\t{4}",
UserId, UserId,

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class UserNameInUseErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class UserNameInUseErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string UserName; private readonly string UserName;
public UserNameInUseErrorS2CPacket(string userName) { public UserNameInUseErrorS2CPacket(string userName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
UserName = userName; UserName = userName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fnameinuse\f{1}\t{2}\t10010", "2\t{0}\t-1\t1\fnameinuse\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class UserNotFoundErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class UserNotFoundErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string UserName; private readonly string UserName;
public UserNotFoundErrorS2CPacket(string userName) { public UserNotFoundErrorS2CPacket(string userName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
UserName = userName; UserName = userName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fusernf\f{1}\t{2}\t10010", "2\t{0}\t-1\t1\fusernf\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,14 +1,20 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class UserUpdateNotificationS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class UserUpdateNotificationS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string PreviousName; private readonly string PreviousName;
private readonly string NewName; private readonly string NewName;
public UserUpdateNotificationS2CPacket(string previousName, string newName) { public UserUpdateNotificationS2CPacket(string previousName, string newName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
PreviousName = previousName; PreviousName = previousName;
NewName = newName; NewName = newName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t0\fnick\f{1}\f{2}\t{3}\t10010", "2\t{0}\t-1\t0\fnick\f{1}\f{2}\t{3}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,5 +1,5 @@
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class UserUpdateS2CPacket : SockChatS2CPacket { public class UserUpdateS2CPacket : ISockChatS2CPacket {
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly Colour UserColour; private readonly Colour UserColour;
@ -20,7 +20,7 @@
UserPerms = userPerms; UserPerms = userPerms;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"10\t{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}", "10\t{0}\t{1}\t{2}\t{3} {4} {5} {6} {7}",
UserId, UserId,

View file

@ -1,7 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class UsersPopulateS2CPacket : SockChatS2CPacket { public class UsersPopulateS2CPacket : ISockChatS2CPacket {
public record ListEntry(long Id, string Name, Colour Colour, int Rank, UserPermissions Perms, bool Visible); public record ListEntry(long Id, string Name, Colour Colour, int Rank, UserPermissions Perms, bool Visible);
private readonly ListEntry[] Entries; private readonly ListEntry[] Entries;
@ -10,7 +10,7 @@ namespace SharpChat.SockChat.PacketsS2C {
Entries = entries; Entries = entries;
} }
public override string Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.AppendFormat("7\t0\t{0}", Entries.Length); sb.AppendFormat("7\t0\t{0}", Entries.Length);

View file

@ -1,12 +1,18 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class WhoChannelNotFoundErrorS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class WhoChannelNotFoundErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string ChannelName; private readonly string ChannelName;
public WhoChannelNotFoundErrorS2CPacket(string channelName) { public WhoChannelNotFoundErrorS2CPacket(string channelName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t1\fwhoerr\f{1}\t{2}\t10010", "2\t{0}\t-1\t1\fwhoerr\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -2,18 +2,22 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class WhoChannelResponseS2CPacket : SockChatTimedS2CPacket { public class WhoChannelResponseS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string ChannelName; private readonly string ChannelName;
private readonly string[] Users; private readonly string[] Users;
private readonly string SelfName; private readonly string SelfName;
public WhoChannelResponseS2CPacket(string channelName, string[] users, string selfName) { public WhoChannelResponseS2CPacket(string channelName, string[] users, string selfName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
ChannelName = channelName; ChannelName = channelName;
Users = users; Users = users;
SelfName = selfName; SelfName = selfName;
} }
public override string Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.AppendFormat( sb.AppendFormat(

View file

@ -2,16 +2,20 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.PacketsS2C { namespace SharpChat.SockChat.PacketsS2C {
public class WhoServerResponseS2CPacket : SockChatTimedS2CPacket { public class WhoServerResponseS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string[] Users; private readonly string[] Users;
private readonly string SelfName; private readonly string SelfName;
public WhoServerResponseS2CPacket(string[] users, string selfName) { public WhoServerResponseS2CPacket(string[] users, string selfName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
Users = users; Users = users;
SelfName = selfName; SelfName = selfName;
} }
public override string Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.AppendFormat("2\t{0}\t-1\t0\fwho\f", TimeStamp.ToUnixTimeSeconds()); sb.AppendFormat("2\t{0}\t-1\t0\fwho\f", TimeStamp.ToUnixTimeSeconds());

View file

@ -1,14 +1,20 @@
namespace SharpChat.SockChat.PacketsS2C { using System;
public class WhoisResponseS2CPacket : SockChatTimedS2CPacket {
namespace SharpChat.SockChat.PacketsS2C {
public class WhoisResponseS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string UserName; private readonly string UserName;
private readonly string RemoteAddress; private readonly string RemoteAddress;
public WhoisResponseS2CPacket(string userName, string remoteAddress) { public WhoisResponseS2CPacket(string userName, string remoteAddress) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
UserName = userName; UserName = userName;
RemoteAddress = remoteAddress; RemoteAddress = remoteAddress;
} }
public override string Pack() { public string Pack() {
return string.Format( return string.Format(
"2\t{0}\t-1\t0\fipaddr\f{1}\f{2}\t{3}\t10010", "2\t{0}\t-1\t0\fipaddr\f{1}\f{2}\t{3}\t10010",
TimeStamp.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),

View file

@ -30,7 +30,7 @@ namespace SharpChat.SockChat {
Socket.Send(packet).Wait(); Socket.Send(packet).Wait();
} }
public void Send(SockChatS2CPacket packet) { public void Send(ISockChatS2CPacket packet) {
string data = packet.Pack(); string data = packet.Pack();
if(!string.IsNullOrWhiteSpace(data)) if(!string.IsNullOrWhiteSpace(data))
Send(data); Send(data);

View file

@ -25,7 +25,7 @@ namespace SharpChat {
public void DispatchEvent(IChatEvent eventInfo) { public void DispatchEvent(IChatEvent eventInfo) {
if(eventInfo is MessageCreateEvent mce) { if(eventInfo is MessageCreateEvent mce) {
if(mce.IsBroadcast) { if(mce.IsBroadcast) {
Send(new MessageBroadcastS2CPacket(mce.MessageText)); Send(new MessageBroadcastS2CPacket(mce.MessageId, mce.MessageCreated, mce.MessageText));
} else if(mce.IsPrivate) { } else if(mce.IsPrivate) {
// The channel name returned by GetDMChannelName should not be exposed to the user, instead @<Target User> should be displayed // The channel name returned by GetDMChannelName should not be exposed to the user, instead @<Target User> should be displayed
// e.g. nook sees @Arysil and Arysil sees @nook // e.g. nook sees @Arysil and Arysil sees @nook
@ -203,7 +203,7 @@ namespace SharpChat {
HandleDisconnect(user, reason); HandleDisconnect(user, reason);
} }
public void HandleChannelEventLog(string channelName, Action<SockChatS2CPacket> handler) { public void HandleChannelEventLog(string channelName, Action<ISockChatS2CPacket> handler) {
foreach(StoredEventInfo msg in Events.GetChannelEventLog(channelName)) foreach(StoredEventInfo msg in Events.GetChannelEventLog(channelName))
handler(msg.Type switch { handler(msg.Type switch {
"msg:add" => new MessageAddLogS2CPacket( "msg:add" => new MessageAddLogS2CPacket(
@ -247,7 +247,10 @@ namespace SharpChat {
public void HandleJoin(UserInfo user, ChannelInfo chan, SockChatConnectionInfo conn, int maxMsgLength) { public void HandleJoin(UserInfo user, ChannelInfo chan, SockChatConnectionInfo conn, int maxMsgLength) {
if(!ChannelsUsers.Has(chan, user)) { if(!ChannelsUsers.Has(chan, user)) {
long eventId = SharpId.Next();
SendTo(chan, new UserConnectS2CPacket( SendTo(chan, new UserConnectS2CPacket(
eventId,
DateTimeOffset.UtcNow,
user.UserId, user.UserId,
SockChatUtility.GetUserNameWithStatus(user), SockChatUtility.GetUserNameWithStatus(user),
user.Colour, user.Colour,
@ -255,7 +258,7 @@ namespace SharpChat {
user.Permissions user.Permissions
)); ));
Events.AddEvent( Events.AddEvent(
SharpId.Next(), eventId,
"user:connect", "user:connect",
chan.Name, chan.Name,
user.UserId, user.UserId,
@ -309,13 +312,16 @@ namespace SharpChat {
ChannelsUsers.DeleteUser(user); ChannelsUsers.DeleteUser(user);
foreach(ChannelInfo chan in channels) { foreach(ChannelInfo chan in channels) {
long eventId = SharpId.Next();
SendTo(chan, new UserDisconnectS2CPacket( SendTo(chan, new UserDisconnectS2CPacket(
eventId,
DateTimeOffset.UtcNow,
user.UserId, user.UserId,
SockChatUtility.GetUserNameWithStatus(user), SockChatUtility.GetUserNameWithStatus(user),
reason reason
)); ));
Events.AddEvent( Events.AddEvent(
SharpId.Next(), eventId,
"user:disconnect", "user:disconnect",
chan.Name, chan.Name,
user.UserId, user.UserId,
@ -422,7 +428,7 @@ namespace SharpChat {
RemoveChannel(oldChan); RemoveChannel(oldChan);
} }
public void Send(SockChatS2CPacket packet) { public void Send(ISockChatS2CPacket packet) {
string data = packet.Pack(); string data = packet.Pack();
Connections.WithAuthed(conn => { Connections.WithAuthed(conn => {
if(conn is SockChatConnectionInfo scConn) if(conn is SockChatConnectionInfo scConn)
@ -430,7 +436,7 @@ namespace SharpChat {
}); });
} }
public void SendTo(UserInfo user, SockChatS2CPacket packet) { public void SendTo(UserInfo user, ISockChatS2CPacket packet) {
string data = packet.Pack(); string data = packet.Pack();
Connections.WithUser(user, conn => { Connections.WithUser(user, conn => {
if(conn is SockChatConnectionInfo scConn) if(conn is SockChatConnectionInfo scConn)
@ -438,7 +444,7 @@ namespace SharpChat {
}); });
} }
public void SendTo(ChannelInfo channel, SockChatS2CPacket packet) { public void SendTo(ChannelInfo channel, ISockChatS2CPacket packet) {
SendTo(channel, packet.Pack()); SendTo(channel, packet.Pack());
} }
@ -451,7 +457,7 @@ namespace SharpChat {
}); });
} }
public void SendToUserChannels(UserInfo user, SockChatS2CPacket packet) { public void SendToUserChannels(UserInfo user, ISockChatS2CPacket packet) {
ChannelInfo[] chans = GetUserChannels(user); ChannelInfo[] chans = GetUserChannels(user);
string data = packet.Pack(); string data = packet.Pack();
foreach(ChannelInfo chan in chans) foreach(ChannelInfo chan in chans)