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

View file

@ -1,7 +1,7 @@
using System;
namespace SharpChat.SockChat.PacketsS2C {
public class AuthFailS2CPacket : SockChatS2CPacket {
public class AuthFailS2CPacket : ISockChatS2CPacket {
public enum FailReason {
AuthInvalid,
MaxSessions,
@ -21,7 +21,7 @@ namespace SharpChat.SockChat.PacketsS2C {
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 {
FailReason.AuthInvalid => "auth",
FailReason.MaxSessions => "sock",

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelNameFormatErrorS2CPacket : SockChatTimedS2CPacket {
public override string Pack() {
using System;
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(
"2\t{0}\t-1\t1\finchan\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),

View file

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

View file

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

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelPasswordChangedResponseS2CPacket : SockChatTimedS2CPacket {
public override string Pack() {
using System;
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(
"2\t{0}\t-1\t0\fcpwdchan\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),

View file

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

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelRankChangedResponseS2CPacket : SockChatTimedS2CPacket {
public override string Pack() {
using System;
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(
"2\t{0}\t-1\t0\fcprivchan\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C {
public class ChannelRankTooHighErrorS2CPacket : SockChatTimedS2CPacket {
public override string Pack() {
using System;
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(
"2\t{0}\t-1\t1\frankerr\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),

View file

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

View file

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

View file

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

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C {
public class CommandFormatErrorS2CPacket : SockChatTimedS2CPacket {
public override string Pack() {
using System;
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(
"2\t{0}\t-1\t1\fcmdna\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),

View file

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

View file

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

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C {
public class FloodWarningS2CPacket : SockChatTimedS2CPacket {
public override string Pack() {
using System;
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(
"2\t{0}\t-1\t0\fflwarn\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),

View file

@ -1,16 +1,17 @@
using System;
namespace SharpChat.SockChat.PacketsS2C {
public class ForceDisconnectS2CPacket : SockChatS2CPacket {
public class ForceDisconnectS2CPacket : ISockChatS2CPacket {
private readonly long Expires;
public ForceDisconnectS2CPacket() { }
public ForceDisconnectS2CPacket() {
}
public ForceDisconnectS2CPacket(DateTimeOffset expires) {
Expires = expires.Year >= 2100 ? -1 : expires.ToUnixTimeSeconds();
}
public override string Pack() {
public string Pack() {
if(Expires != 0)
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 {
public class KickBanNoRecordErrorS2CPacket : SockChatTimedS2CPacket {
using System;
namespace SharpChat.SockChat.PacketsS2C {
public class KickBanNoRecordErrorS2CPacket : ISockChatS2CPacket {
private readonly long MessageId;
private readonly DateTimeOffset TimeStamp;
private readonly string TargetName;
public KickBanNoRecordErrorS2CPacket(string targetName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
TargetName = targetName;
}
public override string Pack() {
public string Pack() {
return string.Format(
"2\t{0}\t-1\t1\fnotban\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(),

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,16 @@
namespace SharpChat.SockChat.PacketsS2C {
public class MessageDeleteNotAllowedErrorS2CPacket : SockChatTimedS2CPacket {
public override string Pack() {
using System;
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(
"2\t{0}\t-1\t1\fdelerr\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),

View file

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

View file

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

View file

@ -1,6 +1,6 @@
namespace SharpChat.SockChat.PacketsS2C {
public class PongS2CPacket : SockChatS2CPacket {
public override string Pack() {
public class PongS2CPacket : ISockChatS2CPacket {
public string Pack() {
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 {
public class UserChannelForceJoinS2CPacket : SockChatS2CPacket {
public class UserChannelForceJoinS2CPacket : ISockChatS2CPacket {
private readonly string ChannelName;
public UserChannelForceJoinS2CPacket(string channelName) {
ChannelName = channelName;
}
public override string Pack() {
public string Pack() {
return string.Format(
"5\t2\t{0}",
SockChatUtility.SanitiseChannelName(ChannelName)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,7 +1,7 @@
using System.Text;
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);
private readonly ListEntry[] Entries;
@ -10,7 +10,7 @@ namespace SharpChat.SockChat.PacketsS2C {
Entries = entries;
}
public override string Pack() {
public string Pack() {
StringBuilder sb = new();
sb.AppendFormat("7\t0\t{0}", Entries.Length);

View file

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

View file

@ -2,18 +2,22 @@
using System.Text;
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[] Users;
private readonly string SelfName;
public WhoChannelResponseS2CPacket(string channelName, string[] users, string selfName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
ChannelName = channelName;
Users = users;
SelfName = selfName;
}
public override string Pack() {
public string Pack() {
StringBuilder sb = new();
sb.AppendFormat(

View file

@ -2,16 +2,20 @@
using System.Text;
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 SelfName;
public WhoServerResponseS2CPacket(string[] users, string selfName) {
MessageId = SharpId.Next();
TimeStamp = DateTimeOffset.UtcNow;
Users = users;
SelfName = selfName;
}
public override string Pack() {
public string Pack() {
StringBuilder sb = new();
sb.AppendFormat("2\t{0}\t-1\t0\fwho\f", TimeStamp.ToUnixTimeSeconds());

View file

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

View file

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

View file

@ -25,7 +25,7 @@ namespace SharpChat {
public void DispatchEvent(IChatEvent eventInfo) {
if(eventInfo is MessageCreateEvent mce) {
if(mce.IsBroadcast) {
Send(new MessageBroadcastS2CPacket(mce.MessageText));
Send(new MessageBroadcastS2CPacket(mce.MessageId, mce.MessageCreated, mce.MessageText));
} else if(mce.IsPrivate) {
// 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
@ -203,7 +203,7 @@ namespace SharpChat {
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))
handler(msg.Type switch {
"msg:add" => new MessageAddLogS2CPacket(
@ -247,7 +247,10 @@ namespace SharpChat {
public void HandleJoin(UserInfo user, ChannelInfo chan, SockChatConnectionInfo conn, int maxMsgLength) {
if(!ChannelsUsers.Has(chan, user)) {
long eventId = SharpId.Next();
SendTo(chan, new UserConnectS2CPacket(
eventId,
DateTimeOffset.UtcNow,
user.UserId,
SockChatUtility.GetUserNameWithStatus(user),
user.Colour,
@ -255,7 +258,7 @@ namespace SharpChat {
user.Permissions
));
Events.AddEvent(
SharpId.Next(),
eventId,
"user:connect",
chan.Name,
user.UserId,
@ -309,13 +312,16 @@ namespace SharpChat {
ChannelsUsers.DeleteUser(user);
foreach(ChannelInfo chan in channels) {
long eventId = SharpId.Next();
SendTo(chan, new UserDisconnectS2CPacket(
eventId,
DateTimeOffset.UtcNow,
user.UserId,
SockChatUtility.GetUserNameWithStatus(user),
reason
));
Events.AddEvent(
SharpId.Next(),
eventId,
"user:disconnect",
chan.Name,
user.UserId,
@ -422,7 +428,7 @@ namespace SharpChat {
RemoveChannel(oldChan);
}
public void Send(SockChatS2CPacket packet) {
public void Send(ISockChatS2CPacket packet) {
string data = packet.Pack();
Connections.WithAuthed(conn => {
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();
Connections.WithUser(user, conn => {
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());
}
@ -451,7 +457,7 @@ namespace SharpChat {
});
}
public void SendToUserChannels(UserInfo user, SockChatS2CPacket packet) {
public void SendToUserChannels(UserInfo user, ISockChatS2CPacket packet) {
ChannelInfo[] chans = GetUserChannels(user);
string data = packet.Pack();
foreach(ChannelInfo chan in chans)