Added base class for packets with timestamp.

This commit is contained in:
flash 2024-05-20 02:16:38 +00:00
parent 042b6ddbd6
commit 1d781bd72c
56 changed files with 265 additions and 334 deletions

View file

@ -200,7 +200,7 @@ namespace SharpChat {
HandleDisconnect(user, reason); HandleDisconnect(user, reason);
} }
public void HandleChannelEventLog(string channelName, Action<ServerPacket> handler) { public void HandleChannelEventLog(string channelName, Action<SockChatS2CPacket> 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 MessageAddLogPacket( "msg:add" => new MessageAddLogPacket(
@ -218,19 +218,23 @@ namespace SharpChat {
false false
), ),
"user:connect" => new UserConnectLogPacket( "user:connect" => new UserConnectLogPacket(
msg.Id,
msg.Created, msg.Created,
msg.Sender == null ? string.Empty : SockChatUtility.GetUserName(msg.Sender) msg.Sender == null ? string.Empty : SockChatUtility.GetUserName(msg.Sender)
), ),
"user:disconnect" => new UserDisconnectLogPacket( "user:disconnect" => new UserDisconnectLogPacket(
msg.Id,
msg.Created, msg.Created,
msg.Sender == null ? string.Empty : SockChatUtility.GetUserNameWithStatus(msg.Sender), msg.Sender == null ? string.Empty : SockChatUtility.GetUserNameWithStatus(msg.Sender),
(UserDisconnectReason)msg.Data.RootElement.GetProperty("reason").GetByte() (UserDisconnectReason)msg.Data.RootElement.GetProperty("reason").GetByte()
), ),
"chan:join" => new UserChannelJoinLogPacket( "chan:join" => new UserChannelJoinLogPacket(
msg.Id,
msg.Created, msg.Created,
msg.Sender == null ? string.Empty : SockChatUtility.GetUserName(msg.Sender) msg.Sender == null ? string.Empty : SockChatUtility.GetUserName(msg.Sender)
), ),
"chan:leave" => new UserChannelLeaveLogPacket( "chan:leave" => new UserChannelLeaveLogPacket(
msg.Id,
msg.Created, msg.Created,
msg.Sender == null ? string.Empty : SockChatUtility.GetUserName(msg.Sender) msg.Sender == null ? string.Empty : SockChatUtility.GetUserName(msg.Sender)
), ),
@ -241,7 +245,6 @@ namespace SharpChat {
public void HandleJoin(UserInfo user, ChannelInfo chan, ConnectionInfo conn, int maxMsgLength) { public void HandleJoin(UserInfo user, ChannelInfo chan, ConnectionInfo conn, int maxMsgLength) {
if(!ChannelsUsers.Has(chan, user)) { if(!ChannelsUsers.Has(chan, user)) {
SendTo(chan, new UserConnectPacket( SendTo(chan, new UserConnectPacket(
DateTimeOffset.Now,
user.UserId, user.UserId,
SockChatUtility.GetUserNameWithStatus(user), SockChatUtility.GetUserNameWithStatus(user),
user.Colour, user.Colour,
@ -292,7 +295,6 @@ namespace SharpChat {
foreach(ChannelInfo chan in channels) { foreach(ChannelInfo chan in channels) {
SendTo(chan, new UserDisconnectPacket( SendTo(chan, new UserDisconnectPacket(
DateTimeOffset.Now,
user.UserId, user.UserId,
SockChatUtility.GetUserNameWithStatus(user), SockChatUtility.GetUserNameWithStatus(user),
reason reason
@ -369,26 +371,26 @@ namespace SharpChat {
RemoveChannel(oldChan); RemoveChannel(oldChan);
} }
public void Send(ServerPacket packet) { public void Send(SockChatS2CPacket packet) {
foreach(ConnectionInfo conn in Connections) foreach(ConnectionInfo conn in Connections)
if(conn.IsAuthed) if(conn.IsAuthed)
conn.Send(packet); conn.Send(packet);
} }
public void SendTo(UserInfo user, ServerPacket packet) { public void SendTo(UserInfo user, SockChatS2CPacket packet) {
foreach(ConnectionInfo conn in Connections) foreach(ConnectionInfo conn in Connections)
if(conn.IsAuthed && conn.User!.UserId == user.UserId) if(conn.IsAuthed && conn.User!.UserId == user.UserId)
conn.Send(packet); conn.Send(packet);
} }
public void SendTo(ChannelInfo channel, ServerPacket packet) { public void SendTo(ChannelInfo channel, SockChatS2CPacket packet) {
long[] userIds = ChannelsUsers.GetChannelUserIds(channel); long[] userIds = ChannelsUsers.GetChannelUserIds(channel);
foreach(ConnectionInfo conn in Connections) foreach(ConnectionInfo conn in Connections)
if(conn.IsAuthed && userIds.Contains(conn.User!.UserId)) if(conn.IsAuthed && userIds.Contains(conn.User!.UserId))
conn.Send(packet); conn.Send(packet);
} }
public void SendToUserChannels(UserInfo user, ServerPacket packet) { public void SendToUserChannels(UserInfo user, SockChatS2CPacket packet) {
ChannelInfo[] chans = GetUserChannels(user); ChannelInfo[] chans = GetUserChannels(user);
foreach(ChannelInfo chan in chans) foreach(ChannelInfo chan in chans)
SendTo(chan, packet); SendTo(chan, packet);

View file

@ -44,7 +44,7 @@ namespace SharpChat {
RemotePort = (ushort)sock.ConnectionInfo.ClientPort; RemotePort = (ushort)sock.ConnectionInfo.ClientPort;
} }
public void Send(ServerPacket packet) { public void Send(SockChatS2CPacket packet) {
if(!Socket.IsAvailable) if(!Socket.IsAvailable)
return; return;

View file

@ -1,12 +0,0 @@
namespace SharpChat {
public abstract class ServerPacket {
public long SequenceId { get; }
public ServerPacket(long sequenceId = 0) {
// Allow sequence id to be manually set for potential message repeats
SequenceId = sequenceId > 0 ? sequenceId : SharpId.Next();
}
public abstract string Pack();
}
}

View file

@ -1,7 +1,7 @@
using System; using System;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class AuthFailPacket : ServerPacket { public class AuthFailPacket : SockChatS2CPacket {
public enum FailReason { public enum FailReason {
AuthInvalid, AuthInvalid,
MaxSessions, MaxSessions,

View file

@ -1,5 +1,5 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class AuthSuccessPacket : ServerPacket { public class AuthSuccessPacket : SockChatS2CPacket {
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly Colour UserColour; private readonly Colour UserColour;

View file

@ -1,20 +1,17 @@
using System; using System.Text;
using System.Text;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class BanListResponsePacket : ServerPacket { public class BanListResponsePacket : SockChatTimedS2CPacket {
private readonly long Timestamp;
private readonly string[] Bans; private readonly string[] Bans;
public BanListResponsePacket(string[] bans) { public BanListResponsePacket(string[] bans) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
Bans = bans; Bans = bans;
} }
public override string Pack() { public override string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.AppendFormat("2\t{0}\t-1\t0\fbanlist\f", Timestamp); sb.AppendFormat("2\t{0}\t-1\t0\fbanlist\f", TimeStamp.ToUnixTimeSeconds());
foreach(string ban in Bans) foreach(string ban in Bans)
sb.AppendFormat(@"<a href=""javascript:void(0);"" onclick=""Chat.SendMessageWrapper('/unban '+ this.innerHTML);"">{0}</a>, ", ban); sb.AppendFormat(@"<a href=""javascript:void(0);"" onclick=""Chat.SendMessageWrapper('/unban '+ this.innerHTML);"">{0}</a>, ", ban);
@ -22,7 +19,7 @@ namespace SharpChat.Packet {
if(Bans.Length > 0) if(Bans.Length > 0)
sb.Length -= 2; sb.Length -= 2;
sb.AppendFormat("\t{0}\t10010", SequenceId); sb.AppendFormat("\t{0}\t10010", MessageId);
return sb.ToString(); return sb.ToString();
} }

View file

@ -1,5 +1,5 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class ChannelCreatePacket : ServerPacket { public class ChannelCreatePacket : SockChatS2CPacket {
private readonly string ChannelName; private readonly string ChannelName;
private readonly bool ChannelHasPassword; private readonly bool ChannelHasPassword;
private readonly bool ChannelIsTemporary; private readonly bool ChannelIsTemporary;

View file

@ -1,21 +1,17 @@
using System; namespace SharpChat.Packet {
public class ChannelCreateResponsePacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelCreateResponsePacket : ServerPacket {
private readonly long Timestamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelCreateResponsePacket(string channelName) { public ChannelCreateResponsePacket(string channelName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseChannelName(ChannelName), SockChatUtility.SanitiseChannelName(ChannelName),
SequenceId MessageId
); );
} }
} }

View file

@ -1,21 +1,17 @@
using System; namespace SharpChat.Packet {
public class ChannelDeleteNotAllowedErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelDeleteNotAllowedErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelDeleteNotAllowedErrorPacket(string channelName) { public ChannelDeleteNotAllowedErrorPacket(string channelName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseChannelName(ChannelName), SockChatUtility.SanitiseChannelName(ChannelName),
SequenceId MessageId
); );
} }
} }

View file

@ -1,5 +1,5 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class ChannelDeletePacket : ServerPacket { public class ChannelDeletePacket : SockChatS2CPacket {
private readonly string ChannelName; private readonly string ChannelName;
public ChannelDeletePacket(string channelName) { public ChannelDeletePacket(string channelName) {

View file

@ -1,21 +1,17 @@
using System; namespace SharpChat.Packet {
public class ChannelDeleteResponsePacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelDeleteResponsePacket : ServerPacket {
private readonly long Timestamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelDeleteResponsePacket(string channelName) { public ChannelDeleteResponsePacket(string channelName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseChannelName(ChannelName), SockChatUtility.SanitiseChannelName(ChannelName),
SequenceId MessageId
); );
} }
} }

View file

@ -1,15 +1,11 @@
using System; namespace SharpChat.Packet {
public class ChannelNameFormatErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelNameFormatErrorPacket : ServerPacket {
private readonly long Timestamp;
public ChannelNameFormatErrorPacket() {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
}
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t1\finchan\t{1}\t10010", Timestamp, SequenceId); return string.Format(
"2\t{0}\t-1\t1\finchan\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),
MessageId
);
} }
} }
} }

View file

@ -1,21 +1,17 @@
using System; namespace SharpChat.Packet {
public class ChannelNameInUseErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelNameInUseErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelNameInUseErrorPacket(string channelName) { public ChannelNameInUseErrorPacket(string channelName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseChannelName(ChannelName), SockChatUtility.SanitiseChannelName(ChannelName),
SequenceId MessageId
); );
} }
} }

View file

@ -1,21 +1,17 @@
using System; namespace SharpChat.Packet {
public class ChannelNotFoundErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelNotFoundErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelNotFoundErrorPacket(string channelName) { public ChannelNotFoundErrorPacket(string channelName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseChannelName(ChannelName), SockChatUtility.SanitiseChannelName(ChannelName),
SequenceId MessageId
); );
} }
} }

View file

@ -1,15 +1,11 @@
using System; namespace SharpChat.Packet {
public class ChannelPasswordChangedResponsePacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelPasswordChangedResponsePacket : ServerPacket {
private readonly long Timestamp;
public ChannelPasswordChangedResponsePacket() {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
}
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t0\fcpwdchan\t{1}\t10010", Timestamp, SequenceId); return string.Format(
"2\t{0}\t-1\t0\fcpwdchan\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),
MessageId
);
} }
} }
} }

View file

@ -1,21 +1,17 @@
using System; namespace SharpChat.Packet {
public class ChannelPasswordWrongErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelPasswordWrongErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelPasswordWrongErrorPacket(string channelName) { public ChannelPasswordWrongErrorPacket(string channelName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseChannelName(ChannelName), SockChatUtility.SanitiseChannelName(ChannelName),
SequenceId MessageId
); );
} }
} }

View file

@ -1,15 +1,11 @@
using System; namespace SharpChat.Packet {
public class ChannelRankChangedResponsePacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelRankChangedResponsePacket : ServerPacket {
private readonly long Timestamp;
public ChannelRankChangedResponsePacket() {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
}
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t0\fcprivchan\t{1}\t10010", Timestamp, SequenceId); return string.Format(
"2\t{0}\t-1\t0\fcprivchan\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),
MessageId
);
} }
} }
} }

View file

@ -1,15 +1,11 @@
using System; namespace SharpChat.Packet {
public class ChannelRankTooHighErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelRankTooHighErrorPacket : ServerPacket {
private readonly long Timestamp;
public ChannelRankTooHighErrorPacket() {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
}
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t1\frankerr\t{1}\t10010", Timestamp, SequenceId); return string.Format(
"2\t{0}\t-1\t1\frankerr\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),
MessageId
);
} }
} }
} }

View file

@ -1,21 +1,17 @@
using System; namespace SharpChat.Packet {
public class ChannelRankTooLowErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class ChannelRankTooLowErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string ChannelName; private readonly string ChannelName;
public ChannelRankTooLowErrorPacket(string channelName) { public ChannelRankTooLowErrorPacket(string channelName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseChannelName(ChannelName), SockChatUtility.SanitiseChannelName(ChannelName),
SequenceId MessageId
); );
} }
} }

View file

@ -1,5 +1,5 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class ChannelUpdatePacket : ServerPacket { public class ChannelUpdatePacket : SockChatS2CPacket {
private readonly string ChannelNamePrevious; private readonly string ChannelNamePrevious;
private readonly string ChannelNameNew; private readonly string ChannelNameNew;
private readonly bool ChannelHasPassword; private readonly bool ChannelHasPassword;

View file

@ -1,7 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class ChannelsPopulatePacket : ServerPacket { public class ChannelsPopulatePacket : SockChatS2CPacket {
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;

View file

@ -1,15 +1,11 @@
using System; namespace SharpChat.Packet {
public class CommandFormatErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class CommandFormatErrorPacket : ServerPacket {
private readonly long Timestamp;
public CommandFormatErrorPacket() {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
}
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t1\fcmdna\t{1}\t10010", Timestamp, SequenceId); return string.Format(
"2\t{0}\t-1\t1\fcmdna\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),
MessageId
);
} }
} }
} }

View file

@ -1,21 +1,17 @@
using System; namespace SharpChat.Packet {
public class CommandNotAllowedErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class CommandNotAllowedErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string CommandName; private readonly string CommandName;
public CommandNotAllowedErrorPacket(string commandName) { public CommandNotAllowedErrorPacket(string commandName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
CommandName = commandName; CommandName = commandName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
CommandName, CommandName,
SequenceId MessageId
); );
} }
} }

View file

@ -1,5 +1,5 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class ContextClearPacket : ServerPacket { public class ContextClearPacket : SockChatS2CPacket {
public enum ClearMode { public enum ClearMode {
Messages = 0, Messages = 0,
Users = 1, Users = 1,

View file

@ -1,15 +1,11 @@
using System; namespace SharpChat.Packet {
public class FloodWarningPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class FloodWarningPacket : ServerPacket {
private readonly long Timestamp;
public FloodWarningPacket() {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
}
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t0\fflwarn\t{1}\t10010", Timestamp, SequenceId); return string.Format(
"2\t{0}\t-1\t0\fflwarn\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),
MessageId
);
} }
} }
} }

View file

@ -1,7 +1,7 @@
using System; using System;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class ForceDisconnectPacket : ServerPacket { public class ForceDisconnectPacket : SockChatS2CPacket {
private readonly long Expires; private readonly long Expires;
public ForceDisconnectPacket() {} public ForceDisconnectPacket() {}

View file

@ -1,17 +1,18 @@
using System; namespace SharpChat.Packet {
public class KickBanNoRecordErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class KickBanNoRecordErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string TargetName; private readonly string TargetName;
public KickBanNoRecordErrorPacket(string targetName) { public KickBanNoRecordErrorPacket(string targetName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
TargetName = targetName; TargetName = targetName;
} }
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t1\fnotban\f{1}\t{2}\t10010", Timestamp, TargetName, SequenceId); return string.Format(
"2\t{0}\t-1\t1\fnotban\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(),
TargetName,
MessageId
);
} }
} }
} }

View file

@ -1,17 +1,18 @@
using System; namespace SharpChat.Packet {
public class KickBanNotAllowedErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class KickBanNotAllowedErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string UserName; private readonly string UserName;
public KickBanNotAllowedErrorPacket(string userName) { public KickBanNotAllowedErrorPacket(string userName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
UserName = userName; UserName = userName;
} }
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t1\fkickna\f{1}\t{2}\t10010", Timestamp, UserName, SequenceId); return string.Format(
"2\t{0}\t-1\t1\fkickna\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(),
UserName,
MessageId
);
} }
} }
} }

View file

@ -1,19 +1,16 @@
using System; namespace SharpChat.Packet {
public class MOTDPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class MOTDPacket : ServerPacket {
private readonly long Timestamp;
private readonly string Body; private readonly string Body;
public MOTDPacket(string body) { public MOTDPacket(string body) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
Body = body; Body = body;
} }
public override string Pack() { public override 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, SockChatUtility.SanitiseMessageBody(Body) TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseMessageBody(Body)
); );
} }
} }

View file

@ -1,8 +1,7 @@
using System; using System;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class MessageAddLogPacket : ServerPacket { public class MessageAddLogPacket : SockChatTimedS2CPacket {
private readonly long Created;
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly Colour UserColour; private readonly Colour UserColour;
@ -15,8 +14,8 @@ namespace SharpChat.Packet {
private readonly bool Notify; private readonly bool Notify;
public MessageAddLogPacket( public MessageAddLogPacket(
long msgId, long messageId,
DateTimeOffset created, DateTimeOffset timeStamp,
long userId, long userId,
string userName, string userName,
Colour userColour, Colour userColour,
@ -27,8 +26,7 @@ namespace SharpChat.Packet {
bool isPrivate, bool isPrivate,
bool isBroadcast, bool isBroadcast,
bool notify bool notify
) : base(msgId) { ) : base(messageId, timeStamp) {
Created = created.ToUnixTimeSeconds();
UserId = userId < 0 ? -1 : userId; UserId = userId < 0 ? -1 : userId;
UserName = userName; UserName = userName;
UserColour = userColour; UserColour = userColour;
@ -62,13 +60,13 @@ namespace SharpChat.Packet {
return string.Format( return string.Format(
"7\t1\t{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}{9}{10}{11}{12}", "7\t1\t{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}{9}{10}{11}{12}",
Created, TimeStamp.ToUnixTimeSeconds(),
UserId, UserId,
UserName, UserName,
UserColour, UserColour,
userPerms, userPerms,
body, body,
SequenceId, MessageId,
Notify ? 1 : 0, Notify ? 1 : 0,
1, 1,
IsAction ? 1 : 0, IsAction ? 1 : 0,

View file

@ -1,22 +1,20 @@
using System; using System;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class MessageAddPacket : ServerPacket { public class MessageAddPacket : SockChatTimedS2CPacket {
private readonly long Created;
private readonly long UserId; private readonly long UserId;
private readonly string Body; private readonly string Body;
private readonly bool IsAction; private readonly bool IsAction;
private readonly bool IsPrivate; private readonly bool IsPrivate;
public MessageAddPacket( public MessageAddPacket(
long msgId, long messageId,
DateTimeOffset created, DateTimeOffset timeStamp,
long userId, long userId,
string body, string body,
bool isAction, bool isAction,
bool isPrivate bool isPrivate
) : base(msgId) { ) : base(messageId, timeStamp) {
Created = created.ToUnixTimeSeconds();
UserId = userId < 0 ? -1 : userId; UserId = userId < 0 ? -1 : userId;
Body = body; Body = body;
IsAction = isAction; IsAction = isAction;
@ -30,10 +28,10 @@ namespace SharpChat.Packet {
return string.Format( return string.Format(
"2\t{0}\t{1}\t{2}\t{3}\t{4}{5}{6}{7}{8}", "2\t{0}\t{1}\t{2}\t{3}\t{4}{5}{6}{7}{8}",
Created, TimeStamp.ToUnixTimeSeconds(),
UserId, UserId,
body, body,
SequenceId, MessageId,
1, 1,
IsAction ? 1 : 0, IsAction ? 1 : 0,
0, 0,

View file

@ -1,21 +1,17 @@
using System; namespace SharpChat.Packet {
public class MessageBroadcastPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class MessageBroadcastPacket : ServerPacket {
private readonly long Timestamp;
private readonly string Body; private readonly string Body;
public MessageBroadcastPacket(string body) { public MessageBroadcastPacket(string body) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
Body = body; Body = body;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseMessageBody(Body), SockChatUtility.SanitiseMessageBody(Body),
SequenceId MessageId
); );
} }
} }

View file

@ -1,15 +1,11 @@
using System; namespace SharpChat.Packet {
public class MessageDeleteNotAllowedErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class MessageDeleteNotAllowedErrorPacket : ServerPacket {
private readonly long Timestamp;
public MessageDeleteNotAllowedErrorPacket() {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
}
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t1\fdelerr\t{1}\t10010", Timestamp, SequenceId); return string.Format(
"2\t{0}\t-1\t1\fdelerr\t{1}\t10010",
TimeStamp.ToUnixTimeSeconds(),
MessageId
);
} }
} }
} }

View file

@ -1,13 +1,13 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class MessageDeletePacket : ServerPacket { public class MessageDeletePacket : SockChatS2CPacket {
private readonly long MessageId; private readonly long DeletedMessageId;
public MessageDeletePacket(long msgId) { public MessageDeletePacket(long deletedMessageId) {
MessageId = msgId; DeletedMessageId = deletedMessageId;
} }
public override string Pack() { public override string Pack() {
return string.Format("6\t{0}", MessageId); return string.Format("6\t{0}", DeletedMessageId);
} }
} }
} }

View file

@ -1,17 +1,18 @@
using System; namespace SharpChat.Packet {
public class PardonResponsePacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class PardonResponsePacket : ServerPacket {
private readonly long Timestamp;
private readonly string Subject; private readonly string Subject;
public PardonResponsePacket(string subject) { public PardonResponsePacket(string subject) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
Subject = subject; Subject = subject;
} }
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t0\funban\f{1}\t{2}\t10010", Timestamp, Subject, SequenceId); return string.Format(
"2\t{0}\t-1\t0\funban\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(),
Subject,
MessageId
);
} }
} }
} }

View file

@ -1,5 +1,5 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class PongPacket : ServerPacket { public class PongPacket : SockChatS2CPacket {
public override string Pack() { public override string Pack() {
return "0\tpong"; return "0\tpong";
} }

View file

@ -1,5 +1,5 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class UserChannelForceJoinPacket : ServerPacket { public class UserChannelForceJoinPacket : SockChatS2CPacket {
private readonly string ChannelName; private readonly string ChannelName;
public UserChannelForceJoinPacket(string channelName) { public UserChannelForceJoinPacket(string channelName) {

View file

@ -1,24 +1,23 @@
using System; using System;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class UserChannelJoinLogPacket : ServerPacket { public class UserChannelJoinLogPacket : SockChatTimedS2CPacket {
private readonly long Timestamp;
private readonly string UserName; private readonly string UserName;
public UserChannelJoinLogPacket( public UserChannelJoinLogPacket(
DateTimeOffset timestamp, long messageId,
DateTimeOffset timeStamp,
string userName string userName
) { ) : base(messageId, timeStamp) {
Timestamp = timestamp.ToUnixTimeSeconds();
UserName = userName; UserName = userName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
UserName, UserName,
SequenceId MessageId
); );
} }
} }

View file

@ -1,5 +1,5 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class UserChannelJoinPacket : ServerPacket { public class UserChannelJoinPacket : SockChatS2CPacket {
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly Colour UserColour; private readonly Colour UserColour;
@ -33,7 +33,7 @@
UserPerms.HasFlag(UserPermissions.CreateChannel) ? ( UserPerms.HasFlag(UserPermissions.CreateChannel) ? (
UserPerms.HasFlag(UserPermissions.SetChannelPermanent) ? 2 : 1 UserPerms.HasFlag(UserPermissions.SetChannelPermanent) ? 2 : 1
) : 0, ) : 0,
SequenceId MessageId
); );
} }
} }

View file

@ -1,24 +1,23 @@
using System; using System;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class UserChannelLeaveLogPacket : ServerPacket { public class UserChannelLeaveLogPacket : SockChatTimedS2CPacket {
private readonly long Timestamp;
private readonly string UserName; private readonly string UserName;
public UserChannelLeaveLogPacket( public UserChannelLeaveLogPacket(
DateTimeOffset timestamp, long messageId,
DateTimeOffset timeStamp,
string userName string userName
) { ) : base(messageId, timeStamp) {
Timestamp = timestamp.ToUnixTimeSeconds();
UserName = userName; UserName = userName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
UserName, UserName,
SequenceId MessageId
); );
} }
} }

View file

@ -1,5 +1,5 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class UserChannelLeavePacket : ServerPacket { public class UserChannelLeavePacket : SockChatS2CPacket {
private readonly long UserId; private readonly long UserId;
public UserChannelLeavePacket(long userId) { public UserChannelLeavePacket(long userId) {
@ -7,7 +7,11 @@
} }
public override string Pack() { public override string Pack() {
return string.Format("5\t1\t{0}\t{1}", UserId, SequenceId); return string.Format(
"5\t1\t{0}\t{1}",
UserId,
MessageId
);
} }
} }
} }

View file

@ -1,24 +1,23 @@
using System; using System;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class UserConnectLogPacket : ServerPacket { public class UserConnectLogPacket : SockChatTimedS2CPacket {
private readonly long Timestamp;
private readonly string UserName; private readonly string UserName;
public UserConnectLogPacket( public UserConnectLogPacket(
DateTimeOffset timestamp, long messageId,
DateTimeOffset timeStamp,
string userName string userName
) { ) : base(messageId, timeStamp) {
Timestamp = timestamp.ToUnixTimeSeconds();
UserName = userName; UserName = userName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
UserName, UserName,
SequenceId MessageId
); );
} }
} }

View file

@ -1,8 +1,5 @@
using System; namespace SharpChat.Packet {
public class UserConnectPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class UserConnectPacket : ServerPacket {
private readonly DateTimeOffset Joined;
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly Colour UserColour; private readonly Colour UserColour;
@ -10,14 +7,12 @@ namespace SharpChat.Packet {
private readonly UserPermissions UserPerms; private readonly UserPermissions UserPerms;
public UserConnectPacket( public UserConnectPacket(
DateTimeOffset joined,
long userId, long userId,
string userName, string userName,
Colour userColour, Colour userColour,
int userRank, int userRank,
UserPermissions userPerms UserPermissions userPerms
) { ) {
Joined = joined;
UserId = userId; UserId = userId;
UserName = userName; UserName = userName;
UserColour = userColour; UserColour = userColour;
@ -28,7 +23,7 @@ namespace SharpChat.Packet {
public override string Pack() { public override 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}",
Joined.ToUnixTimeSeconds(), TimeStamp.ToUnixTimeSeconds(),
UserId, UserId,
UserName, UserName,
UserColour, UserColour,
@ -39,7 +34,7 @@ namespace SharpChat.Packet {
UserPerms.HasFlag(UserPermissions.CreateChannel) ? ( UserPerms.HasFlag(UserPermissions.CreateChannel) ? (
UserPerms.HasFlag(UserPermissions.SetChannelPermanent) ? 2 : 1 UserPerms.HasFlag(UserPermissions.SetChannelPermanent) ? 2 : 1
) : 0, ) : 0,
SequenceId MessageId
); );
} }
} }

View file

@ -1,17 +1,16 @@
using System; using System;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class UserDisconnectLogPacket : ServerPacket { public class UserDisconnectLogPacket : SockChatTimedS2CPacket {
private readonly long Timestamp;
private readonly string UserName; private readonly string UserName;
private readonly UserDisconnectReason Reason; private readonly UserDisconnectReason Reason;
public UserDisconnectLogPacket( public UserDisconnectLogPacket(
DateTimeOffset timestamp, long messageId,
DateTimeOffset timeStamp,
string userName, string userName,
UserDisconnectReason reason UserDisconnectReason reason
) { ) : base(messageId, timeStamp) {
Timestamp = timestamp.ToUnixTimeSeconds();
UserName = userName; UserName = userName;
Reason = reason; Reason = reason;
} }
@ -19,7 +18,7 @@ namespace SharpChat.Packet {
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
Reason switch { Reason switch {
UserDisconnectReason.Leave => "leave", UserDisconnectReason.Leave => "leave",
UserDisconnectReason.TimeOut => "timeout", UserDisconnectReason.TimeOut => "timeout",
@ -28,7 +27,7 @@ namespace SharpChat.Packet {
_ => "leave", _ => "leave",
}, },
UserName, UserName,
SequenceId MessageId
); );
} }
} }

View file

@ -1,19 +1,14 @@
using System; namespace SharpChat.Packet {
public class UserDisconnectPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class UserDisconnectPacket : ServerPacket {
private readonly long 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 UserDisconnectPacket( public UserDisconnectPacket(
DateTimeOffset timestamp,
long userId, long userId,
string userName, string userName,
UserDisconnectReason reason UserDisconnectReason reason
) { ) {
Timestamp = timestamp.ToUnixTimeSeconds();
UserId = userId; UserId = userId;
UserName = userName; UserName = userName;
Reason = reason; Reason = reason;
@ -31,8 +26,8 @@ namespace SharpChat.Packet {
UserDisconnectReason.Flood => "flood", UserDisconnectReason.Flood => "flood",
_ => "leave", _ => "leave",
}, },
Timestamp, TimeStamp.ToUnixTimeSeconds(),
SequenceId MessageId
); );
} }
} }

View file

@ -1,17 +1,18 @@
using System; namespace SharpChat.Packet {
public class UserNameInUseErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class UserNameInUseErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string UserName; private readonly string UserName;
public UserNameInUseErrorPacket(string userName) { public UserNameInUseErrorPacket(string userName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
UserName = userName; UserName = userName;
} }
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t1\fnameinuse\f{1}\t{2}\t10010", Timestamp, UserName, SequenceId); return string.Format(
"2\t{0}\t-1\t1\fnameinuse\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(),
UserName,
MessageId
);
} }
} }
} }

View file

@ -1,17 +1,18 @@
using System; namespace SharpChat.Packet {
public class UserNotFoundErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class UserNotFoundErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string UserName; private readonly string UserName;
public UserNotFoundErrorPacket(string userName) { public UserNotFoundErrorPacket(string userName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
UserName = userName; UserName = userName;
} }
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t1\fusernf\f{1}\t{2}\t10010", Timestamp, UserName, SequenceId); return string.Format(
"2\t{0}\t-1\t1\fusernf\f{1}\t{2}\t10010",
TimeStamp.ToUnixTimeSeconds(),
UserName,
MessageId
);
} }
} }
} }

View file

@ -1,24 +1,20 @@
using System; namespace SharpChat.Packet {
public class UserUpdateNotificationPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class UserUpdateNotificationPacket : ServerPacket {
private readonly string PreviousName; private readonly string PreviousName;
private readonly string NewName; private readonly string NewName;
private readonly long Timestamp;
public UserUpdateNotificationPacket(string previousName, string newName) { public UserUpdateNotificationPacket(string previousName, string newName) {
PreviousName = previousName; PreviousName = previousName;
NewName = newName; NewName = newName;
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
PreviousName, PreviousName,
NewName, NewName,
SequenceId MessageId
); );
} }
} }

View file

@ -1,5 +1,5 @@
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class UserUpdatePacket : ServerPacket { public class UserUpdatePacket : SockChatS2CPacket {
private readonly long UserId; private readonly long UserId;
private readonly string UserName; private readonly string UserName;
private readonly Colour UserColour; private readonly Colour UserColour;

View file

@ -1,7 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class UsersPopulatePacket : ServerPacket { public class UsersPopulatePacket : SockChatS2CPacket {
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;

View file

@ -1,21 +1,17 @@
using System; namespace SharpChat.Packet {
public class WhoChannelNotFoundErrorPacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class WhoChannelNotFoundErrorPacket : ServerPacket {
private readonly long Timestamp;
private readonly string ChannelName; private readonly string ChannelName;
public WhoChannelNotFoundErrorPacket(string channelName) { public WhoChannelNotFoundErrorPacket(string channelName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
ChannelName = channelName; ChannelName = channelName;
} }
public override string Pack() { public override 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, TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseChannelName(ChannelName), SockChatUtility.SanitiseChannelName(ChannelName),
SequenceId MessageId
); );
} }
} }

View file

@ -2,14 +2,12 @@
using System.Text; using System.Text;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class WhoChannelResponsePacket : ServerPacket { public class WhoChannelResponsePacket : SockChatTimedS2CPacket {
private readonly long 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 WhoChannelResponsePacket(string channelName, string[] users, string selfName) { public WhoChannelResponsePacket(string channelName, string[] users, string selfName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
ChannelName = channelName; ChannelName = channelName;
Users = users; Users = users;
SelfName = selfName; SelfName = selfName;
@ -20,7 +18,7 @@ namespace SharpChat.Packet {
sb.AppendFormat( sb.AppendFormat(
"2\t{0}\t-1\t0\fwhochan\f{1}\f", "2\t{0}\t-1\t0\fwhochan\f{1}\f",
Timestamp, TimeStamp.ToUnixTimeSeconds(),
SockChatUtility.SanitiseChannelName(ChannelName) SockChatUtility.SanitiseChannelName(ChannelName)
); );
@ -36,7 +34,7 @@ namespace SharpChat.Packet {
if(Users.Length > 0) if(Users.Length > 0)
sb.Length -= 2; sb.Length -= 2;
sb.AppendFormat("\t{0}\t10010", SequenceId); sb.AppendFormat("\t{0}\t10010", MessageId);
return sb.ToString(); return sb.ToString();
} }

View file

@ -2,13 +2,11 @@
using System.Text; using System.Text;
namespace SharpChat.Packet { namespace SharpChat.Packet {
public class WhoServerResponsePacket : ServerPacket { public class WhoServerResponsePacket : SockChatTimedS2CPacket {
private readonly long Timestamp;
private readonly string[] Users; private readonly string[] Users;
private readonly string SelfName; private readonly string SelfName;
public WhoServerResponsePacket(string[] users, string selfName) { public WhoServerResponsePacket(string[] users, string selfName) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
Users = users; Users = users;
SelfName = selfName; SelfName = selfName;
} }
@ -16,7 +14,7 @@ namespace SharpChat.Packet {
public override string Pack() { public override string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.AppendFormat("2\t{0}\t-1\t0\fwho\f", Timestamp); sb.AppendFormat("2\t{0}\t-1\t0\fwho\f", TimeStamp.ToUnixTimeSeconds());
foreach(string userName in Users) { foreach(string userName in Users) {
sb.Append(@"<a href=""javascript:void(0);"" onclick=""UI.InsertChatText(this.innerHTML);"""); sb.Append(@"<a href=""javascript:void(0);"" onclick=""UI.InsertChatText(this.innerHTML);""");
@ -30,7 +28,7 @@ namespace SharpChat.Packet {
if(Users.Length > 0) if(Users.Length > 0)
sb.Length -= 2; sb.Length -= 2;
sb.AppendFormat("\t{0}\t10010", SequenceId); sb.AppendFormat("\t{0}\t10010", MessageId);
return sb.ToString(); return sb.ToString();
} }

View file

@ -1,19 +1,21 @@
using System; namespace SharpChat.Packet {
public class WhoisResponsePacket : SockChatTimedS2CPacket {
namespace SharpChat.Packet {
public class WhoisResponsePacket : ServerPacket {
private readonly long Timestamp;
private readonly string UserName; private readonly string UserName;
private readonly string RemoteAddress; private readonly string RemoteAddress;
public WhoisResponsePacket(string userName, string remoteAddress) { public WhoisResponsePacket(string userName, string remoteAddress) {
Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
UserName = userName; UserName = userName;
RemoteAddress = remoteAddress; RemoteAddress = remoteAddress;
} }
public override string Pack() { public override string Pack() {
return string.Format("2\t{0}\t-1\t0\fipaddr\f{1}\f{2}\t{3}\t10010", Timestamp, UserName, RemoteAddress, SequenceId); return string.Format(
"2\t{0}\t-1\t0\fipaddr\f{1}\f{2}\t{3}\t10010",
TimeStamp.ToUnixTimeSeconds(),
UserName,
RemoteAddress,
MessageId
);
} }
} }
} }

View file

@ -0,0 +1,15 @@
namespace SharpChat {
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

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