diff --git a/SharpChat/ChatContext.cs b/SharpChat/ChatContext.cs index 9afb90c..3b54454 100644 --- a/SharpChat/ChatContext.cs +++ b/SharpChat/ChatContext.cs @@ -1,6 +1,6 @@ using SharpChat.Events; using SharpChat.EventStorage; -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System; using System.Collections.Generic; using System.Linq; @@ -24,7 +24,7 @@ namespace SharpChat { public void DispatchEvent(IChatEvent eventInfo) { if(eventInfo is MessageCreateEvent mce) { if(mce.IsBroadcast) { - Send(new MessageBroadcastPacket(mce.MessageText)); + Send(new MessageBroadcastS2CPacket(mce.MessageText)); } else if(mce.IsPrivate) { // The channel name returned by GetDMChannelName should not be exposed to the user, instead @ should be displayed // e.g. nook sees @Arysil and Arysil sees @nook @@ -43,7 +43,7 @@ namespace SharpChat { return; foreach(UserInfo user in users) - SendTo(user, new MessageAddPacket( + SendTo(user, new MessageAddS2CPacket( mce.MessageId, DateTimeOffset.Now, mce.SenderId, @@ -54,7 +54,7 @@ namespace SharpChat { } else { ChannelInfo? channel = Channels.Get(mce.ChannelName, SockChatUtility.SanitiseChannelName); if(channel != null) - SendTo(channel, new MessageAddPacket( + SendTo(channel, new MessageAddS2CPacket( mce.MessageId, DateTimeOffset.Now, mce.SenderId, @@ -170,9 +170,9 @@ namespace SharpChat { if(hasChanged) { if(previousName != null) - SendToUserChannels(user, new UserUpdateNotificationPacket(previousName, SockChatUtility.GetUserNameWithStatus(user))); + SendToUserChannels(user, new UserUpdateNotificationS2CPacket(previousName, SockChatUtility.GetUserNameWithStatus(user))); - SendToUserChannels(user, new UserUpdatePacket( + SendToUserChannels(user, new UserUpdateS2CPacket( user.UserId, SockChatUtility.GetUserNameWithStatus(user), user.Colour, @@ -185,9 +185,9 @@ namespace SharpChat { public void BanUser(UserInfo user, TimeSpan duration, UserDisconnectReason reason = UserDisconnectReason.Kicked) { if(duration > TimeSpan.Zero) { DateTimeOffset expires = duration >= TimeSpan.MaxValue ? DateTimeOffset.MaxValue : DateTimeOffset.Now + duration; - SendTo(user, new ForceDisconnectPacket(expires)); + SendTo(user, new ForceDisconnectS2CPacket(expires)); } else - SendTo(user, new ForceDisconnectPacket()); + SendTo(user, new ForceDisconnectS2CPacket()); ConnectionInfo[] conns = Connections.GetUser(user); foreach(ConnectionInfo conn in conns) { @@ -203,7 +203,7 @@ namespace SharpChat { public void HandleChannelEventLog(string channelName, Action handler) { foreach(StoredEventInfo msg in Events.GetChannelEventLog(channelName)) handler(msg.Type switch { - "msg:add" => new MessageAddLogPacket( + "msg:add" => new MessageAddLogS2CPacket( msg.Id, msg.Created, msg.Sender?.UserId ?? -1, @@ -217,23 +217,23 @@ namespace SharpChat { msg.Flags.HasFlag(StoredEventFlags.Broadcast), false ), - "user:connect" => new UserConnectLogPacket( + "user:connect" => new UserConnectLogS2CPacket( msg.Id, msg.Created, msg.Sender == null ? string.Empty : SockChatUtility.GetUserName(msg.Sender) ), - "user:disconnect" => new UserDisconnectLogPacket( + "user:disconnect" => new UserDisconnectLogS2CPacket( msg.Id, msg.Created, msg.Sender == null ? string.Empty : SockChatUtility.GetUserNameWithStatus(msg.Sender), (UserDisconnectReason)msg.Data.RootElement.GetProperty("reason").GetByte() ), - "chan:join" => new UserChannelJoinLogPacket( + "chan:join" => new UserChannelJoinLogS2CPacket( msg.Id, msg.Created, msg.Sender == null ? string.Empty : SockChatUtility.GetUserName(msg.Sender) ), - "chan:leave" => new UserChannelLeaveLogPacket( + "chan:leave" => new UserChannelLeaveLogS2CPacket( msg.Id, msg.Created, msg.Sender == null ? string.Empty : SockChatUtility.GetUserName(msg.Sender) @@ -244,7 +244,7 @@ namespace SharpChat { public void HandleJoin(UserInfo user, ChannelInfo chan, ConnectionInfo conn, int maxMsgLength) { if(!ChannelsUsers.Has(chan, user)) { - SendTo(chan, new UserConnectPacket( + SendTo(chan, new UserConnectS2CPacket( user.UserId, SockChatUtility.GetUserNameWithStatus(user), user.Colour, @@ -254,7 +254,7 @@ namespace SharpChat { Events.AddEvent("user:connect", user, chan, flags: StoredEventFlags.Log); } - conn.Send(new AuthSuccessPacket( + conn.Send(new AuthSuccessS2CPacket( user.UserId, SockChatUtility.GetUserNameWithStatus(user), user.Colour, @@ -263,8 +263,8 @@ namespace SharpChat { chan.Name, maxMsgLength )); - conn.Send(new UsersPopulatePacket(GetChannelUsers(chan).Except(new[] { user }).Select( - user => new UsersPopulatePacket.ListEntry( + conn.Send(new UsersPopulateS2CPacket(GetChannelUsers(chan).Except(new[] { user }).Select( + user => new UsersPopulateS2CPacket.ListEntry( user.UserId, SockChatUtility.GetUserNameWithStatus(user), user.Colour, @@ -276,8 +276,8 @@ namespace SharpChat { HandleChannelEventLog(chan.Name, p => conn.Send(p)); - conn.Send(new ChannelsPopulatePacket(Channels.GetMany(isPublic: true, minRank: user.Rank).Select( - channel => new ChannelsPopulatePacket.ListEntry(channel.Name, channel.HasPassword, channel.IsTemporary) + conn.Send(new ChannelsPopulateS2CPacket(Channels.GetMany(isPublic: true, minRank: user.Rank).Select( + channel => new ChannelsPopulateS2CPacket.ListEntry(channel.Name, channel.HasPassword, channel.IsTemporary) ).ToArray())); if(Users.Get(userId: user.UserId) == null) @@ -294,7 +294,7 @@ namespace SharpChat { ChannelsUsers.DeleteUser(user); foreach(ChannelInfo chan in channels) { - SendTo(chan, new UserDisconnectPacket( + SendTo(chan, new UserDisconnectS2CPacket( user.UserId, SockChatUtility.GetUserNameWithStatus(user), reason @@ -314,13 +314,13 @@ namespace SharpChat { if(!user.Permissions.HasFlag(UserPermissions.JoinAnyChannel) && chan.IsOwner(user)) { if(chan.Rank > user.Rank) { - SendTo(user, new ChannelRankTooLowErrorPacket(chan.Name)); + SendTo(user, new ChannelRankTooLowErrorS2CPacket(chan.Name)); ForceChannel(user); return; } if(!string.IsNullOrEmpty(chan.Password) && chan.Password.Equals(password)) { - SendTo(user, new ChannelPasswordWrongErrorPacket(chan.Name)); + SendTo(user, new ChannelPasswordWrongErrorS2CPacket(chan.Name)); ForceChannel(user); return; } @@ -333,11 +333,11 @@ namespace SharpChat { ChannelInfo? oldChan = Channels.Get(ChannelsUsers.GetUserLastChannel(user)); if(oldChan != null) { - SendTo(oldChan, new UserChannelLeavePacket(user.UserId)); + SendTo(oldChan, new UserChannelLeaveS2CPacket(user.UserId)); Events.AddEvent("chan:leave", user, oldChan, flags: StoredEventFlags.Log); } - SendTo(chan, new UserChannelJoinPacket( + SendTo(chan, new UserChannelJoinS2CPacket( user.UserId, SockChatUtility.GetUserNameWithStatus(user), user.Colour, @@ -348,9 +348,9 @@ namespace SharpChat { if(oldChan != null) Events.AddEvent("chan:join", user, oldChan, flags: StoredEventFlags.Log); - SendTo(user, new ContextClearPacket(ContextClearPacket.ClearMode.MessagesUsers)); - SendTo(user, new UsersPopulatePacket(GetChannelUsers(chan).Except(new[] { user }).Select( - user => new UsersPopulatePacket.ListEntry( + SendTo(user, new ContextClearS2CPacket(ContextClearS2CPacket.ClearMode.MessagesUsers)); + SendTo(user, new UsersPopulateS2CPacket(GetChannelUsers(chan).Except(new[] { user }).Select( + user => new UsersPopulateS2CPacket.ListEntry( user.UserId, SockChatUtility.GetUserNameWithStatus(user), user.Colour, @@ -401,7 +401,7 @@ namespace SharpChat { public void ForceChannel(UserInfo user, ChannelInfo? chan = null) { chan ??= Channels.Get(ChannelsUsers.GetUserLastChannel(user)); if(chan != null) - SendTo(user, new UserChannelForceJoinPacket(chan.Name)); + SendTo(user, new UserChannelForceJoinS2CPacket(chan.Name)); } public void UpdateChannel( @@ -424,7 +424,7 @@ namespace SharpChat { // TODO: Users that no longer have access to the channel/gained access to the channel by the rank change should receive delete and create packets respectively // the server currently doesn't keep track of what channels a user is already aware of so can't really simulate this yet. foreach(UserInfo user in Users.GetMany(minRank: channel.Rank)) - SendTo(user, new ChannelUpdatePacket(prevName, channel.Name, channel.HasPassword, channel.IsTemporary)); + SendTo(user, new ChannelUpdateS2CPacket(prevName, channel.Name, channel.HasPassword, channel.IsTemporary)); } public void RemoveChannel(ChannelInfo channel) { @@ -445,7 +445,7 @@ namespace SharpChat { // Broadcast deletion of channel foreach(UserInfo user in Users.GetMany(minRank: channel.Rank)) - SendTo(user, new ChannelDeletePacket(channel.Name)); + SendTo(user, new ChannelDeleteS2CPacket(channel.Name)); } } } diff --git a/SharpChat/Commands/BanListCommand.cs b/SharpChat/Commands/BanListCommand.cs index de491a9..2bc4328 100644 --- a/SharpChat/Commands/BanListCommand.cs +++ b/SharpChat/Commands/BanListCommand.cs @@ -1,31 +1,31 @@ using SharpChat.Misuzu; -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System; using System.Linq; using System.Threading.Tasks; namespace SharpChat.Commands { - public class BanListCommand : IUserCommand { + public class BanListCommand : ISockChatClientCommand { private readonly MisuzuClient Misuzu; public BanListCommand(MisuzuClient msz) { Misuzu = msz; } - public bool IsMatch(UserCommandContext ctx) { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("bans") || ctx.NameEquals("banned"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.User.Permissions.HasFlag(UserPermissions.KickUser) && !ctx.User.Permissions.HasFlag(UserPermissions.BanUser)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } Task.Run(async () => { - ctx.Chat.SendTo(ctx.User, new BanListResponsePacket( + ctx.Chat.SendTo(ctx.User, new BanListResponseS2CPacket( (await Misuzu.GetBanListAsync() ?? Array.Empty()).Select( ban => string.IsNullOrEmpty(ban.UserName) ? (string.IsNullOrEmpty(ban.RemoteAddress) ? string.Empty : ban.RemoteAddress) : ban.UserName ).ToArray() diff --git a/SharpChat/Commands/ChannelCreateCommand.cs b/SharpChat/Commands/ChannelCreateCommand.cs index 203ac07..9726bea 100644 --- a/SharpChat/Commands/ChannelCreateCommand.cs +++ b/SharpChat/Commands/ChannelCreateCommand.cs @@ -1,15 +1,15 @@ -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System.Linq; namespace SharpChat.Commands { - public class ChannelCreateCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class ChannelCreateCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("create"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.User.Permissions.HasFlag(UserPermissions.CreateChannel)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } @@ -17,7 +17,7 @@ namespace SharpChat.Commands { bool createChanHasHierarchy; if(!ctx.Args.Any() || (createChanHasHierarchy = firstArg.All(char.IsDigit) && ctx.Args.Length < 2)) { - ctx.Chat.SendTo(ctx.User, new CommandFormatErrorPacket()); + ctx.Chat.SendTo(ctx.User, new CommandFormatErrorS2CPacket()); return; } @@ -27,19 +27,19 @@ namespace SharpChat.Commands { createChanHierarchy = 0; if(createChanHierarchy > ctx.User.Rank) { - ctx.Chat.SendTo(ctx.User, new ChannelRankTooHighErrorPacket()); + ctx.Chat.SendTo(ctx.User, new ChannelRankTooHighErrorS2CPacket()); return; } string createChanName = string.Join('_', ctx.Args.Skip(createChanHasHierarchy ? 1 : 0)); if(!SockChatUtility.CheckChannelName(createChanName)) { - ctx.Chat.SendTo(ctx.User, new ChannelNameFormatErrorPacket()); + ctx.Chat.SendTo(ctx.User, new ChannelNameFormatErrorS2CPacket()); return; } if(ctx.Chat.Channels.Get(createChanName, SockChatUtility.SanitiseChannelName) != null) { - ctx.Chat.SendTo(ctx.User, new ChannelNameInUseErrorPacket(createChanName)); + ctx.Chat.SendTo(ctx.User, new ChannelNameInUseErrorS2CPacket(createChanName)); return; } @@ -52,14 +52,14 @@ namespace SharpChat.Commands { ctx.Chat.Channels.Add(createChan, sanitiseName: SockChatUtility.SanitiseChannelName); foreach(UserInfo ccu in ctx.Chat.Users.GetMany(minRank: ctx.Channel.Rank)) - ctx.Chat.SendTo(ccu, new ChannelCreatePacket( + ctx.Chat.SendTo(ccu, new ChannelCreateS2CPacket( ctx.Channel.Name, ctx.Channel.HasPassword, ctx.Channel.IsTemporary )); ctx.Chat.SwitchChannel(ctx.User, createChan, createChan.Password); - ctx.Chat.SendTo(ctx.User, new ChannelCreateResponsePacket(createChan.Name)); + ctx.Chat.SendTo(ctx.User, new ChannelCreateResponseS2CPacket(createChan.Name)); } } } diff --git a/SharpChat/Commands/ChannelDeleteCommand.cs b/SharpChat/Commands/ChannelDeleteCommand.cs index 8abe99e..ab3b1f6 100644 --- a/SharpChat/Commands/ChannelDeleteCommand.cs +++ b/SharpChat/Commands/ChannelDeleteCommand.cs @@ -1,18 +1,18 @@ -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System.Linq; namespace SharpChat.Commands { - public class ChannelDeleteCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class ChannelDeleteCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("delchan") || ( ctx.NameEquals("delete") && ctx.Args.FirstOrDefault()?.All(char.IsDigit) == false ); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.Args.Any() || string.IsNullOrWhiteSpace(ctx.Args.FirstOrDefault())) { - ctx.Chat.SendTo(ctx.User, new CommandFormatErrorPacket()); + ctx.Chat.SendTo(ctx.User, new CommandFormatErrorS2CPacket()); return; } @@ -20,17 +20,17 @@ namespace SharpChat.Commands { ChannelInfo? delChan = ctx.Chat.Channels.Get(delChanName, SockChatUtility.SanitiseChannelName); if(delChan == null) { - ctx.Chat.SendTo(ctx.User, new ChannelNotFoundErrorPacket(delChanName)); + ctx.Chat.SendTo(ctx.User, new ChannelNotFoundErrorS2CPacket(delChanName)); return; } if(!ctx.User.Permissions.HasFlag(UserPermissions.DeleteChannel) || !delChan.IsOwner(ctx.User)) { - ctx.Chat.SendTo(ctx.User, new ChannelDeleteNotAllowedErrorPacket(delChan.Name)); + ctx.Chat.SendTo(ctx.User, new ChannelDeleteNotAllowedErrorS2CPacket(delChan.Name)); return; } ctx.Chat.RemoveChannel(delChan); - ctx.Chat.SendTo(ctx.User, new ChannelDeleteResponsePacket(delChan.Name)); + ctx.Chat.SendTo(ctx.User, new ChannelDeleteResponseS2CPacket(delChan.Name)); } } } diff --git a/SharpChat/Commands/ChannelJoinCommand.cs b/SharpChat/Commands/ChannelJoinCommand.cs index 0664e0b..8a0f28e 100644 --- a/SharpChat/Commands/ChannelJoinCommand.cs +++ b/SharpChat/Commands/ChannelJoinCommand.cs @@ -1,18 +1,18 @@ -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System.Linq; namespace SharpChat.Commands { - public class ChannelJoinCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class ChannelJoinCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("join"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { string joinChanStr = ctx.Args.FirstOrDefault() ?? string.Empty; ChannelInfo? joinChan = ctx.Chat.Channels.Get(joinChanStr, SockChatUtility.SanitiseChannelName); if(joinChan == null) { - ctx.Chat.SendTo(ctx.User, new ChannelNotFoundErrorPacket(joinChanStr)); + ctx.Chat.SendTo(ctx.User, new ChannelNotFoundErrorS2CPacket(joinChanStr)); ctx.Chat.ForceChannel(ctx.User); return; } diff --git a/SharpChat/Commands/ChannelPasswordCommand.cs b/SharpChat/Commands/ChannelPasswordCommand.cs index 1be107e..b059420 100644 --- a/SharpChat/Commands/ChannelPasswordCommand.cs +++ b/SharpChat/Commands/ChannelPasswordCommand.cs @@ -1,15 +1,15 @@ -using SharpChat.Packet; +using SharpChat.PacketsS2C; namespace SharpChat.Commands { - public class ChannelPasswordCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class ChannelPasswordCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("pwd") || ctx.NameEquals("password"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.User.Permissions.HasFlag(UserPermissions.SetChannelPassword) || !ctx.Channel.IsOwner(ctx.User)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } @@ -19,7 +19,7 @@ namespace SharpChat.Commands { chanPass = string.Empty; ctx.Chat.UpdateChannel(ctx.Channel, password: chanPass); - ctx.Chat.SendTo(ctx.User, new ChannelPasswordChangedResponsePacket()); + ctx.Chat.SendTo(ctx.User, new ChannelPasswordChangedResponseS2CPacket()); } } } diff --git a/SharpChat/Commands/ChannelRankCommand.cs b/SharpChat/Commands/ChannelRankCommand.cs index a1ac3ea..0822dc6 100644 --- a/SharpChat/Commands/ChannelRankCommand.cs +++ b/SharpChat/Commands/ChannelRankCommand.cs @@ -1,27 +1,27 @@ -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System.Linq; namespace SharpChat.Commands { - public class ChannelRankCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class ChannelRankCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("rank") || ctx.NameEquals("privilege") || ctx.NameEquals("priv"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.User.Permissions.HasFlag(UserPermissions.SetChannelHierarchy) || !ctx.Channel.IsOwner(ctx.User)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } if(!ctx.Args.Any() || !int.TryParse(ctx.Args.First(), out int chanHierarchy) || chanHierarchy > ctx.User.Rank) { - ctx.Chat.SendTo(ctx.User, new ChannelRankTooHighErrorPacket()); + ctx.Chat.SendTo(ctx.User, new ChannelRankTooHighErrorS2CPacket()); return; } ctx.Chat.UpdateChannel(ctx.Channel, minRank: chanHierarchy); - ctx.Chat.SendTo(ctx.User, new ChannelRankChangedResponsePacket()); + ctx.Chat.SendTo(ctx.User, new ChannelRankChangedResponseS2CPacket()); } } } diff --git a/SharpChat/Commands/ISockChatClientCommand.cs b/SharpChat/Commands/ISockChatClientCommand.cs new file mode 100644 index 0000000..fc03beb --- /dev/null +++ b/SharpChat/Commands/ISockChatClientCommand.cs @@ -0,0 +1,6 @@ +namespace SharpChat.Commands { + public interface ISockChatClientCommand { + bool IsMatch(SockChatClientCommandContext ctx); + void Dispatch(SockChatClientCommandContext ctx); + } +} diff --git a/SharpChat/Commands/KickBanCommand.cs b/SharpChat/Commands/KickBanCommand.cs index d950715..8705cd6 100644 --- a/SharpChat/Commands/KickBanCommand.cs +++ b/SharpChat/Commands/KickBanCommand.cs @@ -1,27 +1,27 @@ using SharpChat.Misuzu; -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System; using System.Linq; using System.Threading.Tasks; namespace SharpChat.Commands { - public class KickBanCommand : IUserCommand { + public class KickBanCommand : ISockChatClientCommand { private readonly MisuzuClient Misuzu; public KickBanCommand(MisuzuClient msz) { Misuzu = msz; } - public bool IsMatch(UserCommandContext ctx) { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("kick") || ctx.NameEquals("ban"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { bool isBanning = ctx.NameEquals("ban"); if(!ctx.User.Permissions.HasFlag(isBanning ? UserPermissions.BanUser : UserPermissions.KickUser)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } @@ -32,19 +32,19 @@ namespace SharpChat.Commands { (string name, UsersContext.NameTarget target) = SockChatUtility.ExplodeUserName(banUserTarget); if(string.IsNullOrEmpty(name) || (banUser = ctx.Chat.Users.Get(name: name, nameTarget: target)) == null) { - ctx.Chat.SendTo(ctx.User, new UserNotFoundErrorPacket(banUserTarget)); + ctx.Chat.SendTo(ctx.User, new UserNotFoundErrorS2CPacket(banUserTarget)); return; } if(!ctx.User.IsSuper && banUser.Rank >= ctx.User.Rank && banUser != ctx.User) { - ctx.Chat.SendTo(ctx.User, new KickBanNotAllowedErrorPacket(SockChatUtility.GetUserName(banUser))); + ctx.Chat.SendTo(ctx.User, new KickBanNotAllowedErrorS2CPacket(SockChatUtility.GetUserName(banUser))); return; } TimeSpan duration = isBanning ? TimeSpan.MaxValue : TimeSpan.Zero; if(!string.IsNullOrWhiteSpace(banDurationStr) && double.TryParse(banDurationStr, out double durationSeconds)) { if(durationSeconds < 0) { - ctx.Chat.SendTo(ctx.User, new CommandFormatErrorPacket()); + ctx.Chat.SendTo(ctx.User, new CommandFormatErrorS2CPacket()); return; } @@ -64,7 +64,7 @@ namespace SharpChat.Commands { MisuzuBanInfo? fbi = await Misuzu.CheckBanAsync(userId); if(fbi != null && fbi.IsBanned && !fbi.HasExpired) { - ctx.Chat.SendTo(ctx.User, new KickBanNotAllowedErrorPacket(SockChatUtility.GetUserName(banUser))); + ctx.Chat.SendTo(ctx.User, new KickBanNotAllowedErrorS2CPacket(SockChatUtility.GetUserName(banUser))); return; } diff --git a/SharpChat/Commands/MessageActionCommand.cs b/SharpChat/Commands/MessageActionCommand.cs index bc8cf80..4fc11fe 100644 --- a/SharpChat/Commands/MessageActionCommand.cs +++ b/SharpChat/Commands/MessageActionCommand.cs @@ -3,13 +3,13 @@ using System; using System.Linq; namespace SharpChat.Commands { - public class MessageActionCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class MessageActionCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("action") || ctx.NameEquals("me"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.Args.Any()) return; diff --git a/SharpChat/Commands/MessageBroadcastCommand.cs b/SharpChat/Commands/MessageBroadcastCommand.cs index 4ba14fb..d53d9d4 100644 --- a/SharpChat/Commands/MessageBroadcastCommand.cs +++ b/SharpChat/Commands/MessageBroadcastCommand.cs @@ -1,17 +1,17 @@ using SharpChat.Events; -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System; namespace SharpChat.Commands { - public class MessageBroadcastCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class MessageBroadcastCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("say") || ctx.NameEquals("broadcast"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.User.Permissions.HasFlag(UserPermissions.Broadcast)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } diff --git a/SharpChat/Commands/MessageDeleteCommand.cs b/SharpChat/Commands/MessageDeleteCommand.cs index 69a17b6..f7497b5 100644 --- a/SharpChat/Commands/MessageDeleteCommand.cs +++ b/SharpChat/Commands/MessageDeleteCommand.cs @@ -1,41 +1,40 @@ using SharpChat.EventStorage; -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System.Linq; -namespace SharpChat.Commands -{ - public class MessageDeleteCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { +namespace SharpChat.Commands { + public class MessageDeleteCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("delmsg") || ( ctx.NameEquals("delete") && ctx.Args.FirstOrDefault()?.All(char.IsDigit) == true ); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { bool deleteAnyMessage = ctx.User.Permissions.HasFlag(UserPermissions.DeleteAnyMessage); if(!deleteAnyMessage && !ctx.User.Permissions.HasFlag(UserPermissions.DeleteOwnMessage)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } string? firstArg = ctx.Args.FirstOrDefault(); if(string.IsNullOrWhiteSpace(firstArg) || !firstArg.All(char.IsDigit) || !long.TryParse(firstArg, out long delSeqId)) { - ctx.Chat.SendTo(ctx.User, new CommandFormatErrorPacket()); + ctx.Chat.SendTo(ctx.User, new CommandFormatErrorS2CPacket()); return; } StoredEventInfo? delMsg = ctx.Chat.Events.GetEvent(delSeqId); if(delMsg == null || delMsg.Sender?.Rank > ctx.User.Rank || (!deleteAnyMessage && delMsg.Sender?.UserId != ctx.User.UserId)) { - ctx.Chat.SendTo(ctx.User, new MessageDeleteNotAllowedErrorPacket()); + ctx.Chat.SendTo(ctx.User, new MessageDeleteNotAllowedErrorS2CPacket()); return; } ctx.Chat.Events.RemoveEvent(delMsg); - ctx.Chat.Send(new MessageDeletePacket(delMsg.Id)); + ctx.Chat.Send(new MessageDeleteS2CPacket(delMsg.Id)); } } } diff --git a/SharpChat/Commands/MessageWhisperCommand.cs b/SharpChat/Commands/MessageWhisperCommand.cs index b557a26..782e8ba 100644 --- a/SharpChat/Commands/MessageWhisperCommand.cs +++ b/SharpChat/Commands/MessageWhisperCommand.cs @@ -1,18 +1,18 @@ using SharpChat.Events; -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System; using System.Linq; namespace SharpChat.Commands { - public class MessageWhisperCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class MessageWhisperCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("whisper") || ctx.NameEquals("msg"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(ctx.Args.Length < 2) { - ctx.Chat.SendTo(ctx.User, new CommandFormatErrorPacket()); + ctx.Chat.SendTo(ctx.User, new CommandFormatErrorS2CPacket()); return; } @@ -21,7 +21,7 @@ namespace SharpChat.Commands { UserInfo? whisperUser = ctx.Chat.Users.Get(name: name, nameTarget: target); if(whisperUser == null) { - ctx.Chat.SendTo(ctx.User, new UserNotFoundErrorPacket(whisperUserStr)); + ctx.Chat.SendTo(ctx.User, new UserNotFoundErrorS2CPacket(whisperUserStr)); return; } diff --git a/SharpChat/Commands/PardonAddressCommand.cs b/SharpChat/Commands/PardonAddressCommand.cs index 047d655..bb270a4 100644 --- a/SharpChat/Commands/PardonAddressCommand.cs +++ b/SharpChat/Commands/PardonAddressCommand.cs @@ -1,32 +1,32 @@ using SharpChat.Misuzu; -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System.Linq; using System.Net; using System.Threading.Tasks; namespace SharpChat.Commands { - public class PardonAddressCommand : IUserCommand { + public class PardonAddressCommand : ISockChatClientCommand { private readonly MisuzuClient Misuzu; public PardonAddressCommand(MisuzuClient msz) { Misuzu = msz; } - public bool IsMatch(UserCommandContext ctx) { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("pardonip") || ctx.NameEquals("unbanip"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.User.Permissions.HasFlag(UserPermissions.KickUser) && !ctx.User.Permissions.HasFlag(UserPermissions.BanUser)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } string? unbanAddrTarget = ctx.Args.FirstOrDefault(); if(string.IsNullOrWhiteSpace(unbanAddrTarget) || !IPAddress.TryParse(unbanAddrTarget, out IPAddress? unbanAddr)) { - ctx.Chat.SendTo(ctx.User, new CommandFormatErrorPacket()); + ctx.Chat.SendTo(ctx.User, new CommandFormatErrorS2CPacket()); return; } @@ -36,15 +36,15 @@ namespace SharpChat.Commands { MisuzuBanInfo? banInfo = await Misuzu.CheckBanAsync(ipAddr: unbanAddrTarget); if(banInfo?.IsBanned != true || banInfo.HasExpired) { - ctx.Chat.SendTo(ctx.User, new KickBanNoRecordErrorPacket(unbanAddrTarget)); + ctx.Chat.SendTo(ctx.User, new KickBanNoRecordErrorS2CPacket(unbanAddrTarget)); return; } bool wasBanned = await Misuzu.RevokeBanAsync(banInfo, MisuzuClient.BanRevokeKind.RemoteAddress); if(wasBanned) - ctx.Chat.SendTo(ctx.User, new PardonResponsePacket(unbanAddrTarget)); + ctx.Chat.SendTo(ctx.User, new PardonResponseS2CPacket(unbanAddrTarget)); else - ctx.Chat.SendTo(ctx.User, new KickBanNoRecordErrorPacket(unbanAddrTarget)); + ctx.Chat.SendTo(ctx.User, new KickBanNoRecordErrorS2CPacket(unbanAddrTarget)); }).Wait(); } } diff --git a/SharpChat/Commands/PardonUserCommand.cs b/SharpChat/Commands/PardonUserCommand.cs index 9421e78..d251f21 100644 --- a/SharpChat/Commands/PardonUserCommand.cs +++ b/SharpChat/Commands/PardonUserCommand.cs @@ -1,32 +1,32 @@ using SharpChat.Misuzu; -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System.Linq; using System.Threading.Tasks; namespace SharpChat.Commands { - public class PardonUserCommand : IUserCommand { + public class PardonUserCommand : ISockChatClientCommand { private readonly MisuzuClient Misuzu; public PardonUserCommand(MisuzuClient msz) { Misuzu = msz; } - public bool IsMatch(UserCommandContext ctx) { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("pardon") || ctx.NameEquals("unban"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.User.Permissions.HasFlag(UserPermissions.KickUser) && !ctx.User.Permissions.HasFlag(UserPermissions.BanUser)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } bool unbanUserTargetIsName = true; string? unbanUserTarget = ctx.Args.FirstOrDefault(); if(string.IsNullOrWhiteSpace(unbanUserTarget)) { - ctx.Chat.SendTo(ctx.User, new CommandFormatErrorPacket()); + ctx.Chat.SendTo(ctx.User, new CommandFormatErrorS2CPacket()); return; } @@ -44,15 +44,15 @@ namespace SharpChat.Commands { MisuzuBanInfo? banInfo = await Misuzu.CheckBanAsync(unbanUserTarget, userIdIsName: unbanUserTargetIsName); if(banInfo?.IsBanned != true || banInfo.HasExpired) { - ctx.Chat.SendTo(ctx.User, new KickBanNoRecordErrorPacket(unbanUserTarget)); + ctx.Chat.SendTo(ctx.User, new KickBanNoRecordErrorS2CPacket(unbanUserTarget)); return; } bool wasBanned = await Misuzu.RevokeBanAsync(banInfo, MisuzuClient.BanRevokeKind.UserId); if(wasBanned) - ctx.Chat.SendTo(ctx.User, new PardonResponsePacket(unbanUserTarget)); + ctx.Chat.SendTo(ctx.User, new PardonResponseS2CPacket(unbanUserTarget)); else - ctx.Chat.SendTo(ctx.User, new KickBanNoRecordErrorPacket(unbanUserTarget)); + ctx.Chat.SendTo(ctx.User, new KickBanNoRecordErrorS2CPacket(unbanUserTarget)); }).Wait(); } } diff --git a/SharpChat/Commands/ShutdownRestartCommand.cs b/SharpChat/Commands/ShutdownRestartCommand.cs index c8db58e..72f975a 100644 --- a/SharpChat/Commands/ShutdownRestartCommand.cs +++ b/SharpChat/Commands/ShutdownRestartCommand.cs @@ -1,9 +1,9 @@ -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System; using System.Threading; namespace SharpChat.Commands { - public class ShutdownRestartCommand : IUserCommand { + public class ShutdownRestartCommand : ISockChatClientCommand { private readonly ManualResetEvent WaitHandle; private readonly Func ShuttingDown; private readonly Action SetShutdown; @@ -18,14 +18,14 @@ namespace SharpChat.Commands { SetShutdown = setShutdown; } - public bool IsMatch(UserCommandContext ctx) { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("shutdown") || ctx.NameEquals("restart"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(ctx.User.UserId != 1) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } diff --git a/SharpChat/UserCommandContext.cs b/SharpChat/Commands/SockChatClientCommandContext.cs similarity index 87% rename from SharpChat/UserCommandContext.cs rename to SharpChat/Commands/SockChatClientCommandContext.cs index 46f5434..9c0a1d7 100644 --- a/SharpChat/UserCommandContext.cs +++ b/SharpChat/Commands/SockChatClientCommandContext.cs @@ -1,8 +1,8 @@ using System; using System.Linq; -namespace SharpChat { - public class UserCommandContext { +namespace SharpChat.Commands { + public class SockChatClientCommandContext { public string Name { get; } public string[] Args { get; } public ChatContext Chat { get; } @@ -10,7 +10,7 @@ namespace SharpChat { public ConnectionInfo Connection { get; } public ChannelInfo Channel { get; } - public UserCommandContext( + public SockChatClientCommandContext( string text, ChatContext chat, UserInfo user, diff --git a/SharpChat/Commands/UserAFKCommand.cs b/SharpChat/Commands/UserAFKCommand.cs index c751cf9..12e2925 100644 --- a/SharpChat/Commands/UserAFKCommand.cs +++ b/SharpChat/Commands/UserAFKCommand.cs @@ -1,15 +1,15 @@ using System.Linq; namespace SharpChat.Commands { - public class UserAFKCommand : IUserCommand { + public class UserAFKCommand : ISockChatClientCommand { private const string DEFAULT = "AFK"; private const int MAX_LENGTH = 5; - public bool IsMatch(UserCommandContext ctx) { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("afk"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { string? statusText = ctx.Args.FirstOrDefault(); if(string.IsNullOrWhiteSpace(statusText)) statusText = DEFAULT; diff --git a/SharpChat/Commands/UserNickCommand.cs b/SharpChat/Commands/UserNickCommand.cs index 4ddc570..46f9424 100644 --- a/SharpChat/Commands/UserNickCommand.cs +++ b/SharpChat/Commands/UserNickCommand.cs @@ -1,17 +1,17 @@ -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System.Linq; namespace SharpChat.Commands { - public class UserNickCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class UserNickCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("nick"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { bool setOthersNick = ctx.User.Permissions.HasFlag(UserPermissions.SetOthersNickname); if(!setOthersNick && !ctx.User.Permissions.HasFlag(UserPermissions.SetOwnNickname)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } @@ -26,7 +26,7 @@ namespace SharpChat.Commands { targetUser ??= ctx.User; if(ctx.Args.Length < offset) { - ctx.Chat.SendTo(ctx.User, new CommandFormatErrorPacket()); + ctx.Chat.SendTo(ctx.User, new CommandFormatErrorS2CPacket()); return; } @@ -43,7 +43,7 @@ namespace SharpChat.Commands { nickStr = string.Empty; if(!string.IsNullOrWhiteSpace(nickStr) && ctx.Chat.Users.Get(name: nickStr, nameTarget: UsersContext.NameTarget.UserAndNickName) != null) { - ctx.Chat.SendTo(ctx.User, new UserNameInUseErrorPacket(nickStr)); + ctx.Chat.SendTo(ctx.User, new UserNameInUseErrorS2CPacket(nickStr)); return; } diff --git a/SharpChat/Commands/WhoCommand.cs b/SharpChat/Commands/WhoCommand.cs index df0f284..2c2139a 100644 --- a/SharpChat/Commands/WhoCommand.cs +++ b/SharpChat/Commands/WhoCommand.cs @@ -1,17 +1,17 @@ -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System.Linq; namespace SharpChat.Commands { - public class WhoCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class WhoCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("who"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { string? channelName = ctx.Args.FirstOrDefault(); if(string.IsNullOrEmpty(channelName)) { - ctx.Chat.SendTo(ctx.User, new WhoServerResponsePacket( + ctx.Chat.SendTo(ctx.User, new WhoServerResponseS2CPacket( ctx.Chat.Users.All.Select(u => SockChatUtility.GetUserNameWithStatus(u)).ToArray(), SockChatUtility.GetUserName(ctx.User) )); @@ -21,16 +21,16 @@ namespace SharpChat.Commands { ChannelInfo? channel = ctx.Chat.Channels.Get(channelName, SockChatUtility.SanitiseChannelName); if(channel == null) { - ctx.Chat.SendTo(ctx.User, new ChannelNotFoundErrorPacket(channelName)); + ctx.Chat.SendTo(ctx.User, new ChannelNotFoundErrorS2CPacket(channelName)); return; } if(channel.Rank > ctx.User.Rank || (channel.HasPassword && !ctx.User.Permissions.HasFlag(UserPermissions.JoinAnyChannel))) { - ctx.Chat.SendTo(ctx.User, new WhoChannelNotFoundErrorPacket(channelName)); + ctx.Chat.SendTo(ctx.User, new WhoChannelNotFoundErrorS2CPacket(channelName)); return; } - ctx.Chat.SendTo(ctx.User, new WhoChannelResponsePacket( + ctx.Chat.SendTo(ctx.User, new WhoChannelResponseS2CPacket( channel.Name, ctx.Chat.GetChannelUsers(channel).Select(user => SockChatUtility.GetUserNameWithStatus(user)).ToArray(), SockChatUtility.GetUserNameWithStatus(ctx.User) diff --git a/SharpChat/Commands/WhoisCommand.cs b/SharpChat/Commands/WhoisCommand.cs index 14ee228..5045db2 100644 --- a/SharpChat/Commands/WhoisCommand.cs +++ b/SharpChat/Commands/WhoisCommand.cs @@ -1,16 +1,16 @@ -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System.Linq; namespace SharpChat.Commands { - public class WhoisCommand : IUserCommand { - public bool IsMatch(UserCommandContext ctx) { + public class WhoisCommand : ISockChatClientCommand { + public bool IsMatch(SockChatClientCommandContext ctx) { return ctx.NameEquals("ip") || ctx.NameEquals("whois"); } - public void Dispatch(UserCommandContext ctx) { + public void Dispatch(SockChatClientCommandContext ctx) { if(!ctx.User.Permissions.HasFlag(UserPermissions.SeeIPAddress)) { - ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorPacket(ctx.Name)); + ctx.Chat.SendTo(ctx.User, new CommandNotAllowedErrorS2CPacket(ctx.Name)); return; } @@ -19,12 +19,12 @@ namespace SharpChat.Commands { (string name, UsersContext.NameTarget target) = SockChatUtility.ExplodeUserName(ipUserStr); if(string.IsNullOrWhiteSpace(name) || (ipUser = ctx.Chat.Users.Get(name: name, nameTarget: target)) == null) { - ctx.Chat.SendTo(ctx.User, new UserNotFoundErrorPacket(ipUserStr)); + ctx.Chat.SendTo(ctx.User, new UserNotFoundErrorS2CPacket(ipUserStr)); return; } foreach(string remoteAddr in ctx.Chat.Connections.GetUserRemoteAddresses(ipUser)) - ctx.Chat.SendTo(ctx.User, new WhoisResponsePacket(ipUser.UserName, remoteAddr)); + ctx.Chat.SendTo(ctx.User, new WhoisResponseS2CPacket(ipUser.UserName, remoteAddr)); } } } diff --git a/SharpChat/ConnectionInfo.cs b/SharpChat/ConnectionInfo.cs index aba6311..8fedf25 100644 --- a/SharpChat/ConnectionInfo.cs +++ b/SharpChat/ConnectionInfo.cs @@ -1,4 +1,5 @@ using Fleck; +using SharpChat.PacketsS2C; using System; using System.Net; diff --git a/SharpChat/EventStorage/IEventStorage.cs b/SharpChat/EventStorage/IEventStorage.cs index 52c692e..2865fea 100644 --- a/SharpChat/EventStorage/IEventStorage.cs +++ b/SharpChat/EventStorage/IEventStorage.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; -namespace SharpChat.EventStorage -{ +namespace SharpChat.EventStorage { public interface IEventStorage { void AddEvent( long id, string type, diff --git a/SharpChat/EventStorage/StoredEventFlags.cs b/SharpChat/EventStorage/StoredEventFlags.cs index 57a3331..e84b684 100644 --- a/SharpChat/EventStorage/StoredEventFlags.cs +++ b/SharpChat/EventStorage/StoredEventFlags.cs @@ -1,10 +1,8 @@ using System; -namespace SharpChat.EventStorage -{ +namespace SharpChat.EventStorage { [Flags] - public enum StoredEventFlags - { + public enum StoredEventFlags { None = 0, Action = 1, Broadcast = 1 << 1, diff --git a/SharpChat/IPacketHandler.cs b/SharpChat/IPacketHandler.cs deleted file mode 100644 index 7bc61db..0000000 --- a/SharpChat/IPacketHandler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace SharpChat { - public interface IPacketHandler { - bool IsMatch(PacketHandlerContext ctx); - void Handle(PacketHandlerContext ctx); - } -} diff --git a/SharpChat/IUserCommand.cs b/SharpChat/IUserCommand.cs deleted file mode 100644 index 328c93e..0000000 --- a/SharpChat/IUserCommand.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace SharpChat { - public interface IUserCommand { - bool IsMatch(UserCommandContext ctx); - void Dispatch(UserCommandContext ctx); - } -} diff --git a/SharpChat/Packet/PongPacket.cs b/SharpChat/Packet/PongPacket.cs deleted file mode 100644 index e4470e9..0000000 --- a/SharpChat/Packet/PongPacket.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace SharpChat.Packet { - public class PongPacket : SockChatS2CPacket { - public override string Pack() { - return "0\tpong"; - } - } -} diff --git a/SharpChat/PacketHandlers/AuthHandler.cs b/SharpChat/PacketsC2S/AuthC2SPacketHandler.cs similarity index 79% rename from SharpChat/PacketHandlers/AuthHandler.cs rename to SharpChat/PacketsC2S/AuthC2SPacketHandler.cs index 22a59f5..50bce6a 100644 --- a/SharpChat/PacketHandlers/AuthHandler.cs +++ b/SharpChat/PacketsC2S/AuthC2SPacketHandler.cs @@ -1,14 +1,14 @@ using SharpChat.Config; using SharpChat.Misuzu; -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; -namespace SharpChat.PacketHandlers { - public class AuthHandler : IPacketHandler { +namespace SharpChat.PacketsC2S { + public class AuthC2SPacketHandler : IC2SPacketHandler { public const string MOTD_FILE = @"welcome.txt"; private readonly DateTimeOffset Started; @@ -17,7 +17,7 @@ namespace SharpChat.PacketHandlers { private readonly CachedValue MaxMessageLength; private readonly CachedValue MaxConnections; - public AuthHandler( + public AuthC2SPacketHandler( DateTimeOffset started, MisuzuClient msz, ChannelInfo? defaultChannel, @@ -31,23 +31,23 @@ namespace SharpChat.PacketHandlers { MaxConnections = maxConns; } - public bool IsMatch(PacketHandlerContext ctx) { + public bool IsMatch(C2SPacketHandlerContext ctx) { return ctx.CheckPacketId("1"); } - public void Handle(PacketHandlerContext ctx) { + public void Handle(C2SPacketHandlerContext ctx) { string[] args = ctx.SplitText(3); string? authMethod = args.ElementAtOrDefault(1); if(string.IsNullOrWhiteSpace(authMethod)) { - ctx.Connection.Send(new AuthFailPacket(AuthFailPacket.FailReason.AuthInvalid)); + ctx.Connection.Send(new AuthFailS2CPacket(AuthFailS2CPacket.FailReason.AuthInvalid)); ctx.Connection.Close(1000); return; } string? authToken = args.ElementAtOrDefault(2); if(string.IsNullOrWhiteSpace(authToken)) { - ctx.Connection.Send(new AuthFailPacket(AuthFailPacket.FailReason.AuthInvalid)); + ctx.Connection.Send(new AuthFailS2CPacket(AuthFailS2CPacket.FailReason.AuthInvalid)); ctx.Connection.Close(1000); return; } @@ -66,7 +66,7 @@ namespace SharpChat.PacketHandlers { fai = await Misuzu.AuthVerifyAsync(authMethod, authToken, ipAddr); } catch(Exception ex) { Logger.Write($"<{ctx.Connection.RemoteEndPoint}> Failed to authenticate: {ex}"); - ctx.Connection.Send(new AuthFailPacket(AuthFailPacket.FailReason.AuthInvalid)); + ctx.Connection.Send(new AuthFailS2CPacket(AuthFailS2CPacket.FailReason.AuthInvalid)); ctx.Connection.Close(1000); #if DEBUG throw; @@ -77,14 +77,14 @@ namespace SharpChat.PacketHandlers { if(fai == null) { Logger.Debug($"<{ctx.Connection.RemoteEndPoint}> Auth fail: "); - ctx.Connection.Send(new AuthFailPacket(AuthFailPacket.FailReason.Null)); + ctx.Connection.Send(new AuthFailS2CPacket(AuthFailS2CPacket.FailReason.Null)); ctx.Connection.Close(1000); return; } if(!fai.Success) { Logger.Debug($"<{ctx.Connection.RemoteEndPoint}> Auth fail: {fai.Reason}"); - ctx.Connection.Send(new AuthFailPacket(AuthFailPacket.FailReason.AuthInvalid)); + ctx.Connection.Send(new AuthFailS2CPacket(AuthFailS2CPacket.FailReason.AuthInvalid)); ctx.Connection.Close(1000); return; } @@ -94,7 +94,7 @@ namespace SharpChat.PacketHandlers { fbi = await Misuzu.CheckBanAsync(fai.UserId.ToString(), ipAddr); } catch(Exception ex) { Logger.Write($"<{ctx.Connection.RemoteEndPoint}> Failed auth ban check: {ex}"); - ctx.Connection.Send(new AuthFailPacket(AuthFailPacket.FailReason.AuthInvalid)); + ctx.Connection.Send(new AuthFailS2CPacket(AuthFailS2CPacket.FailReason.AuthInvalid)); ctx.Connection.Close(1000); #if DEBUG throw; @@ -105,14 +105,14 @@ namespace SharpChat.PacketHandlers { if(fbi == null) { Logger.Debug($"<{ctx.Connection.RemoteEndPoint}> Ban check fail: "); - ctx.Connection.Send(new AuthFailPacket(AuthFailPacket.FailReason.Null)); + ctx.Connection.Send(new AuthFailS2CPacket(AuthFailS2CPacket.FailReason.Null)); ctx.Connection.Close(1000); return; } if(fbi.IsBanned && !fbi.HasExpired) { Logger.Write($"<{ctx.Connection.RemoteEndPoint}> User is banned."); - ctx.Connection.Send(new AuthFailPacket(fbi.ExpiresAt)); + ctx.Connection.Send(new AuthFailS2CPacket(fbi.ExpiresAt)); ctx.Connection.Close(1000); return; } @@ -142,21 +142,21 @@ namespace SharpChat.PacketHandlers { // Enforce a maximum amount of connections per user if(ctx.Chat.Connections.GetCountForUser(user) >= MaxConnections) { - ctx.Connection.Send(new AuthFailPacket(AuthFailPacket.FailReason.MaxSessions)); + ctx.Connection.Send(new AuthFailS2CPacket(AuthFailS2CPacket.FailReason.MaxSessions)); ctx.Connection.Close(1000); return; } ctx.Connection.BumpPing(); ctx.Chat.Connections.SetUser(ctx.Connection, user); - ctx.Connection.Send(new MOTDPacket(Started, $"Welcome to Flashii Chat, {user.UserName}!")); + ctx.Connection.Send(new MOTDS2CPacket(Started, $"Welcome to Flashii Chat, {user.UserName}!")); if(File.Exists(MOTD_FILE)) { IEnumerable lines = File.ReadAllLines(MOTD_FILE).Where(x => !string.IsNullOrWhiteSpace(x)); string? line = lines.ElementAtOrDefault(RNG.Next(lines.Count())); if(!string.IsNullOrWhiteSpace(line)) - ctx.Connection.Send(new MOTDPacket(File.GetLastWriteTimeUtc(MOTD_FILE), line)); + ctx.Connection.Send(new MOTDS2CPacket(File.GetLastWriteTimeUtc(MOTD_FILE), line)); } ctx.Chat.HandleJoin(user, DefaultChannel, ctx.Connection, MaxMessageLength); diff --git a/SharpChat/PacketHandlerContext.cs b/SharpChat/PacketsC2S/C2SPacketHandlerContext.cs similarity index 69% rename from SharpChat/PacketHandlerContext.cs rename to SharpChat/PacketsC2S/C2SPacketHandlerContext.cs index 0245528..f567e5c 100644 --- a/SharpChat/PacketHandlerContext.cs +++ b/SharpChat/PacketsC2S/C2SPacketHandlerContext.cs @@ -1,14 +1,10 @@ -namespace SharpChat { - public class PacketHandlerContext { +namespace SharpChat.PacketsC2S { + public class C2SPacketHandlerContext { public string Text { get; } public ChatContext Chat { get; } public ConnectionInfo Connection { get; } - public PacketHandlerContext( - string text, - ChatContext chat, - ConnectionInfo connection - ) { + public C2SPacketHandlerContext(string text, ChatContext chat, ConnectionInfo connection) { Text = text; Chat = chat; Connection = connection; diff --git a/SharpChat/PacketsC2S/IC2SPacketHandler.cs b/SharpChat/PacketsC2S/IC2SPacketHandler.cs new file mode 100644 index 0000000..844e8b9 --- /dev/null +++ b/SharpChat/PacketsC2S/IC2SPacketHandler.cs @@ -0,0 +1,6 @@ +namespace SharpChat.PacketsC2S { + public interface IC2SPacketHandler { + bool IsMatch(C2SPacketHandlerContext ctx); + void Handle(C2SPacketHandlerContext ctx); + } +} diff --git a/SharpChat/PacketHandlers/PingHandler.cs b/SharpChat/PacketsC2S/PingC2SPacketHandler.cs similarity index 82% rename from SharpChat/PacketHandlers/PingHandler.cs rename to SharpChat/PacketsC2S/PingC2SPacketHandler.cs index 178ca93..f2509b8 100644 --- a/SharpChat/PacketHandlers/PingHandler.cs +++ b/SharpChat/PacketsC2S/PingC2SPacketHandler.cs @@ -1,33 +1,33 @@ using SharpChat.Misuzu; -using SharpChat.Packet; +using SharpChat.PacketsS2C; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace SharpChat.PacketHandlers { - public class PingHandler : IPacketHandler { +namespace SharpChat.PacketsC2S { + public class PingC2SPacketHandler : IC2SPacketHandler { private readonly MisuzuClient Misuzu; private readonly TimeSpan BumpInterval = TimeSpan.FromMinutes(1); private DateTimeOffset LastBump = DateTimeOffset.MinValue; - public PingHandler(MisuzuClient msz) { + public PingC2SPacketHandler(MisuzuClient msz) { Misuzu = msz; } - public bool IsMatch(PacketHandlerContext ctx) { + public bool IsMatch(C2SPacketHandlerContext ctx) { return ctx.CheckPacketId("0"); } - public void Handle(PacketHandlerContext ctx) { + public void Handle(C2SPacketHandlerContext ctx) { string[] parts = ctx.SplitText(2); if(!int.TryParse(parts.FirstOrDefault(), out int pTime)) return; ctx.Connection.BumpPing(); - ctx.Connection.Send(new PongPacket()); + ctx.Connection.Send(new PongS2CPacket()); ctx.Chat.ContextAccess.Wait(); try { diff --git a/SharpChat/PacketHandlers/SendMessageHandler.cs b/SharpChat/PacketsC2S/SendMessageC2SPacketHandler.cs similarity index 75% rename from SharpChat/PacketHandlers/SendMessageHandler.cs rename to SharpChat/PacketsC2S/SendMessageC2SPacketHandler.cs index 5cdea96..676639a 100644 --- a/SharpChat/PacketHandlers/SendMessageHandler.cs +++ b/SharpChat/PacketsC2S/SendMessageC2SPacketHandler.cs @@ -1,32 +1,33 @@ -using SharpChat.Config; +using SharpChat.Commands; +using SharpChat.Config; using SharpChat.Events; using System; using System.Collections.Generic; using System.Linq; -namespace SharpChat.PacketHandlers { - public class SendMessageHandler : IPacketHandler { +namespace SharpChat.PacketsC2S { + public class SendMessageC2SPacketHandler : IC2SPacketHandler { private readonly CachedValue MaxMessageLength; - private List Commands { get; } = new(); + private List Commands { get; } = new(); - public SendMessageHandler(CachedValue maxMsgLength) { + public SendMessageC2SPacketHandler(CachedValue maxMsgLength) { MaxMessageLength = maxMsgLength; } - public void AddCommand(IUserCommand command) { + public void AddCommand(ISockChatClientCommand command) { Commands.Add(command); } - public void AddCommands(IEnumerable commands) { + public void AddCommands(IEnumerable commands) { Commands.AddRange(commands); } - public bool IsMatch(PacketHandlerContext ctx) { + public bool IsMatch(C2SPacketHandlerContext ctx) { return ctx.CheckPacketId("2"); } - public void Handle(PacketHandlerContext ctx) { + public void Handle(C2SPacketHandlerContext ctx) { string[] args = ctx.SplitText(3); UserInfo? user = ctx.Chat.Users.Get(ctx.Connection.UserId); @@ -63,11 +64,11 @@ namespace SharpChat.PacketHandlers { #endif if(messageText.StartsWith("/")) { - UserCommandContext context = new(messageText, ctx.Chat, user, ctx.Connection, channelInfo); + SockChatClientCommandContext context = new(messageText, ctx.Chat, user, ctx.Connection, channelInfo); - IUserCommand? command = null; + ISockChatClientCommand? command = null; - foreach(IUserCommand cmd in Commands) + foreach(ISockChatClientCommand cmd in Commands) if(cmd.IsMatch(context)) { command = cmd; break; diff --git a/SharpChat/Packet/AuthFailPacket.cs b/SharpChat/PacketsS2C/AuthFailS2CPacket.cs similarity index 80% rename from SharpChat/Packet/AuthFailPacket.cs rename to SharpChat/PacketsS2C/AuthFailS2CPacket.cs index b3504d2..38140c6 100644 --- a/SharpChat/Packet/AuthFailPacket.cs +++ b/SharpChat/PacketsS2C/AuthFailS2CPacket.cs @@ -1,7 +1,7 @@ using System; -namespace SharpChat.Packet { - public class AuthFailPacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class AuthFailS2CPacket : SockChatS2CPacket { public enum FailReason { AuthInvalid, MaxSessions, @@ -12,11 +12,11 @@ namespace SharpChat.Packet { private readonly FailReason Reason; private readonly long Expires; - public AuthFailPacket(FailReason reason) { + public AuthFailS2CPacket(FailReason reason) { Reason = reason; } - public AuthFailPacket(DateTimeOffset expires) { + public AuthFailS2CPacket(DateTimeOffset expires) { Reason = FailReason.Banned; Expires = expires.Year >= 2100 ? -1 : expires.ToUnixTimeSeconds(); } diff --git a/SharpChat/Packet/AuthSuccessPacket.cs b/SharpChat/PacketsS2C/AuthSuccessS2CPacket.cs similarity index 92% rename from SharpChat/Packet/AuthSuccessPacket.cs rename to SharpChat/PacketsS2C/AuthSuccessS2CPacket.cs index 023559a..6844139 100644 --- a/SharpChat/Packet/AuthSuccessPacket.cs +++ b/SharpChat/PacketsS2C/AuthSuccessS2CPacket.cs @@ -1,5 +1,5 @@ -namespace SharpChat.Packet { - public class AuthSuccessPacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class AuthSuccessS2CPacket : SockChatS2CPacket { private readonly long UserId; private readonly string UserName; private readonly Colour UserColour; @@ -8,7 +8,7 @@ private readonly string ChannelName; private readonly int MaxMessageLength; - public AuthSuccessPacket( + public AuthSuccessS2CPacket( long userId, string userName, Colour userColour, diff --git a/SharpChat/Packet/BanListResponsePacket.cs b/SharpChat/PacketsS2C/BanListResponseS2CPacket.cs similarity index 79% rename from SharpChat/Packet/BanListResponsePacket.cs rename to SharpChat/PacketsS2C/BanListResponseS2CPacket.cs index a832cd9..5ea307f 100644 --- a/SharpChat/Packet/BanListResponsePacket.cs +++ b/SharpChat/PacketsS2C/BanListResponseS2CPacket.cs @@ -1,10 +1,10 @@ using System.Text; -namespace SharpChat.Packet { - public class BanListResponsePacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class BanListResponseS2CPacket : SockChatTimedS2CPacket { private readonly string[] Bans; - public BanListResponsePacket(string[] bans) { + public BanListResponseS2CPacket(string[] bans) { Bans = bans; } diff --git a/SharpChat/Packet/ChannelCreateResponsePacket.cs b/SharpChat/PacketsS2C/ChannelCreateResponseS2CPacket.cs similarity index 69% rename from SharpChat/Packet/ChannelCreateResponsePacket.cs rename to SharpChat/PacketsS2C/ChannelCreateResponseS2CPacket.cs index c91b17c..5a8c32b 100644 --- a/SharpChat/Packet/ChannelCreateResponsePacket.cs +++ b/SharpChat/PacketsS2C/ChannelCreateResponseS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class ChannelCreateResponsePacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelCreateResponseS2CPacket : SockChatTimedS2CPacket { private readonly string ChannelName; - public ChannelCreateResponsePacket(string channelName) { + public ChannelCreateResponseS2CPacket(string channelName) { ChannelName = channelName; } diff --git a/SharpChat/Packet/ChannelCreatePacket.cs b/SharpChat/PacketsS2C/ChannelCreateS2CPacket.cs similarity index 83% rename from SharpChat/Packet/ChannelCreatePacket.cs rename to SharpChat/PacketsS2C/ChannelCreateS2CPacket.cs index 58d075b..b9d6021 100644 --- a/SharpChat/Packet/ChannelCreatePacket.cs +++ b/SharpChat/PacketsS2C/ChannelCreateS2CPacket.cs @@ -1,10 +1,10 @@ -namespace SharpChat.Packet { - public class ChannelCreatePacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelCreateS2CPacket : SockChatS2CPacket { private readonly string ChannelName; private readonly bool ChannelHasPassword; private readonly bool ChannelIsTemporary; - public ChannelCreatePacket( + public ChannelCreateS2CPacket( string channelName, bool channelHasPassword, bool channelIsTemporary diff --git a/SharpChat/Packet/ChannelDeleteNotAllowedErrorPacket.cs b/SharpChat/PacketsS2C/ChannelDeleteNotAllowedErrorS2CPacket.cs similarity index 67% rename from SharpChat/Packet/ChannelDeleteNotAllowedErrorPacket.cs rename to SharpChat/PacketsS2C/ChannelDeleteNotAllowedErrorS2CPacket.cs index 1ec1e1d..b22f40c 100644 --- a/SharpChat/Packet/ChannelDeleteNotAllowedErrorPacket.cs +++ b/SharpChat/PacketsS2C/ChannelDeleteNotAllowedErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class ChannelDeleteNotAllowedErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelDeleteNotAllowedErrorS2CPacket : SockChatTimedS2CPacket { private readonly string ChannelName; - public ChannelDeleteNotAllowedErrorPacket(string channelName) { + public ChannelDeleteNotAllowedErrorS2CPacket(string channelName) { ChannelName = channelName; } diff --git a/SharpChat/Packet/ChannelDeleteResponsePacket.cs b/SharpChat/PacketsS2C/ChannelDeleteResponseS2CPacket.cs similarity index 69% rename from SharpChat/Packet/ChannelDeleteResponsePacket.cs rename to SharpChat/PacketsS2C/ChannelDeleteResponseS2CPacket.cs index e83822c..19ca5e4 100644 --- a/SharpChat/Packet/ChannelDeleteResponsePacket.cs +++ b/SharpChat/PacketsS2C/ChannelDeleteResponseS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class ChannelDeleteResponsePacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelDeleteResponseS2CPacket : SockChatTimedS2CPacket { private readonly string ChannelName; - public ChannelDeleteResponsePacket(string channelName) { + public ChannelDeleteResponseS2CPacket(string channelName) { ChannelName = channelName; } diff --git a/SharpChat/Packet/ChannelDeletePacket.cs b/SharpChat/PacketsS2C/ChannelDeleteS2CPacket.cs similarity index 65% rename from SharpChat/Packet/ChannelDeletePacket.cs rename to SharpChat/PacketsS2C/ChannelDeleteS2CPacket.cs index 9db562e..aadac7e 100644 --- a/SharpChat/Packet/ChannelDeletePacket.cs +++ b/SharpChat/PacketsS2C/ChannelDeleteS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class ChannelDeletePacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelDeleteS2CPacket : SockChatS2CPacket { private readonly string ChannelName; - public ChannelDeletePacket(string channelName) { + public ChannelDeleteS2CPacket(string channelName) { ChannelName = channelName; } diff --git a/SharpChat/Packet/ChannelNameFormatErrorPacket.cs b/SharpChat/PacketsS2C/ChannelNameFormatErrorS2CPacket.cs similarity index 67% rename from SharpChat/Packet/ChannelNameFormatErrorPacket.cs rename to SharpChat/PacketsS2C/ChannelNameFormatErrorS2CPacket.cs index aafc17a..74f2f41 100644 --- a/SharpChat/Packet/ChannelNameFormatErrorPacket.cs +++ b/SharpChat/PacketsS2C/ChannelNameFormatErrorS2CPacket.cs @@ -1,5 +1,5 @@ -namespace SharpChat.Packet { - public class ChannelNameFormatErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelNameFormatErrorS2CPacket : SockChatTimedS2CPacket { public override string Pack() { return string.Format( "2\t{0}\t-1\t1\finchan\t{1}\t10010", diff --git a/SharpChat/Packet/ChannelNameInUseErrorPacket.cs b/SharpChat/PacketsS2C/ChannelNameInUseErrorS2CPacket.cs similarity index 69% rename from SharpChat/Packet/ChannelNameInUseErrorPacket.cs rename to SharpChat/PacketsS2C/ChannelNameInUseErrorS2CPacket.cs index 50f758a..4c6a9ae 100644 --- a/SharpChat/Packet/ChannelNameInUseErrorPacket.cs +++ b/SharpChat/PacketsS2C/ChannelNameInUseErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class ChannelNameInUseErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelNameInUseErrorS2CPacket : SockChatTimedS2CPacket { private readonly string ChannelName; - public ChannelNameInUseErrorPacket(string channelName) { + public ChannelNameInUseErrorS2CPacket(string channelName) { ChannelName = channelName; } diff --git a/SharpChat/Packet/ChannelNotFoundErrorPacket.cs b/SharpChat/PacketsS2C/ChannelNotFoundErrorS2CPacket.cs similarity index 69% rename from SharpChat/Packet/ChannelNotFoundErrorPacket.cs rename to SharpChat/PacketsS2C/ChannelNotFoundErrorS2CPacket.cs index 2046676..3a18830 100644 --- a/SharpChat/Packet/ChannelNotFoundErrorPacket.cs +++ b/SharpChat/PacketsS2C/ChannelNotFoundErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class ChannelNotFoundErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelNotFoundErrorS2CPacket : SockChatTimedS2CPacket { private readonly string ChannelName; - public ChannelNotFoundErrorPacket(string channelName) { + public ChannelNotFoundErrorS2CPacket(string channelName) { ChannelName = channelName; } diff --git a/SharpChat/Packet/ChannelPasswordChangedResponsePacket.cs b/SharpChat/PacketsS2C/ChannelPasswordChangedResponseS2CPacket.cs similarity index 66% rename from SharpChat/Packet/ChannelPasswordChangedResponsePacket.cs rename to SharpChat/PacketsS2C/ChannelPasswordChangedResponseS2CPacket.cs index 5e1774f..282729b 100644 --- a/SharpChat/Packet/ChannelPasswordChangedResponsePacket.cs +++ b/SharpChat/PacketsS2C/ChannelPasswordChangedResponseS2CPacket.cs @@ -1,5 +1,5 @@ -namespace SharpChat.Packet { - public class ChannelPasswordChangedResponsePacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelPasswordChangedResponseS2CPacket : SockChatTimedS2CPacket { public override string Pack() { return string.Format( "2\t{0}\t-1\t0\fcpwdchan\t{1}\t10010", diff --git a/SharpChat/Packet/ChannelPasswordWrongErrorPacket.cs b/SharpChat/PacketsS2C/ChannelPasswordWrongErrorS2CPacket.cs similarity index 68% rename from SharpChat/Packet/ChannelPasswordWrongErrorPacket.cs rename to SharpChat/PacketsS2C/ChannelPasswordWrongErrorS2CPacket.cs index 2723cf2..18d513c 100644 --- a/SharpChat/Packet/ChannelPasswordWrongErrorPacket.cs +++ b/SharpChat/PacketsS2C/ChannelPasswordWrongErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class ChannelPasswordWrongErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelPasswordWrongErrorS2CPacket : SockChatTimedS2CPacket { private readonly string ChannelName; - public ChannelPasswordWrongErrorPacket(string channelName) { + public ChannelPasswordWrongErrorS2CPacket(string channelName) { ChannelName = channelName; } diff --git a/SharpChat/Packet/ChannelRankChangedResponsePacket.cs b/SharpChat/PacketsS2C/ChannelRankChangedResponseS2CPacket.cs similarity index 67% rename from SharpChat/Packet/ChannelRankChangedResponsePacket.cs rename to SharpChat/PacketsS2C/ChannelRankChangedResponseS2CPacket.cs index db597a4..c5635b0 100644 --- a/SharpChat/Packet/ChannelRankChangedResponsePacket.cs +++ b/SharpChat/PacketsS2C/ChannelRankChangedResponseS2CPacket.cs @@ -1,5 +1,5 @@ -namespace SharpChat.Packet { - public class ChannelRankChangedResponsePacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelRankChangedResponseS2CPacket : SockChatTimedS2CPacket { public override string Pack() { return string.Format( "2\t{0}\t-1\t0\fcprivchan\t{1}\t10010", diff --git a/SharpChat/Packet/ChannelRankTooHighErrorPacket.cs b/SharpChat/PacketsS2C/ChannelRankTooHighErrorS2CPacket.cs similarity index 67% rename from SharpChat/Packet/ChannelRankTooHighErrorPacket.cs rename to SharpChat/PacketsS2C/ChannelRankTooHighErrorS2CPacket.cs index 457af0d..c8c9d53 100644 --- a/SharpChat/Packet/ChannelRankTooHighErrorPacket.cs +++ b/SharpChat/PacketsS2C/ChannelRankTooHighErrorS2CPacket.cs @@ -1,5 +1,5 @@ -namespace SharpChat.Packet { - public class ChannelRankTooHighErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelRankTooHighErrorS2CPacket : SockChatTimedS2CPacket { public override string Pack() { return string.Format( "2\t{0}\t-1\t1\frankerr\t{1}\t10010", diff --git a/SharpChat/Packet/ChannelRankTooLowErrorPacket.cs b/SharpChat/PacketsS2C/ChannelRankTooLowErrorS2CPacket.cs similarity index 68% rename from SharpChat/Packet/ChannelRankTooLowErrorPacket.cs rename to SharpChat/PacketsS2C/ChannelRankTooLowErrorS2CPacket.cs index b79ad3c..e13e17a 100644 --- a/SharpChat/Packet/ChannelRankTooLowErrorPacket.cs +++ b/SharpChat/PacketsS2C/ChannelRankTooLowErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class ChannelRankTooLowErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelRankTooLowErrorS2CPacket : SockChatTimedS2CPacket { private readonly string ChannelName; - public ChannelRankTooLowErrorPacket(string channelName) { + public ChannelRankTooLowErrorS2CPacket(string channelName) { ChannelName = channelName; } diff --git a/SharpChat/Packet/ChannelUpdatePacket.cs b/SharpChat/PacketsS2C/ChannelUpdateS2CPacket.cs similarity index 87% rename from SharpChat/Packet/ChannelUpdatePacket.cs rename to SharpChat/PacketsS2C/ChannelUpdateS2CPacket.cs index c84d0d1..2fb687b 100644 --- a/SharpChat/Packet/ChannelUpdatePacket.cs +++ b/SharpChat/PacketsS2C/ChannelUpdateS2CPacket.cs @@ -1,11 +1,11 @@ -namespace SharpChat.Packet { - public class ChannelUpdatePacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelUpdateS2CPacket : SockChatS2CPacket { private readonly string ChannelNamePrevious; private readonly string ChannelNameNew; private readonly bool ChannelHasPassword; private readonly bool ChannelIsTemporary; - public ChannelUpdatePacket( + public ChannelUpdateS2CPacket( string channelNamePrevious, string channelNameNew, bool channelHasPassword, diff --git a/SharpChat/Packet/ChannelsPopulatePacket.cs b/SharpChat/PacketsS2C/ChannelsPopulateS2CPacket.cs similarity index 80% rename from SharpChat/Packet/ChannelsPopulatePacket.cs rename to SharpChat/PacketsS2C/ChannelsPopulateS2CPacket.cs index a075bd7..b5d7dc5 100644 --- a/SharpChat/Packet/ChannelsPopulatePacket.cs +++ b/SharpChat/PacketsS2C/ChannelsPopulateS2CPacket.cs @@ -1,12 +1,12 @@ using System.Text; -namespace SharpChat.Packet { - public class ChannelsPopulatePacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class ChannelsPopulateS2CPacket : SockChatS2CPacket { public record ListEntry(string Name, bool HasPassword, bool IsTemporary); private readonly ListEntry[] Entries; - public ChannelsPopulatePacket(ListEntry[] entries) { + public ChannelsPopulateS2CPacket(ListEntry[] entries) { Entries = entries; } diff --git a/SharpChat/Packet/CommandFormatErrorPacket.cs b/SharpChat/PacketsS2C/CommandFormatErrorS2CPacket.cs similarity index 68% rename from SharpChat/Packet/CommandFormatErrorPacket.cs rename to SharpChat/PacketsS2C/CommandFormatErrorS2CPacket.cs index 0284bb3..91814e1 100644 --- a/SharpChat/Packet/CommandFormatErrorPacket.cs +++ b/SharpChat/PacketsS2C/CommandFormatErrorS2CPacket.cs @@ -1,5 +1,5 @@ -namespace SharpChat.Packet { - public class CommandFormatErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class CommandFormatErrorS2CPacket : SockChatTimedS2CPacket { public override string Pack() { return string.Format( "2\t{0}\t-1\t1\fcmdna\t{1}\t10010", diff --git a/SharpChat/Packet/CommandNotAllowedErrorPacket.cs b/SharpChat/PacketsS2C/CommandNotAllowedErrorS2CPacket.cs similarity index 66% rename from SharpChat/Packet/CommandNotAllowedErrorPacket.cs rename to SharpChat/PacketsS2C/CommandNotAllowedErrorS2CPacket.cs index ab807fa..33a4743 100644 --- a/SharpChat/Packet/CommandNotAllowedErrorPacket.cs +++ b/SharpChat/PacketsS2C/CommandNotAllowedErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class CommandNotAllowedErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class CommandNotAllowedErrorS2CPacket : SockChatTimedS2CPacket { private readonly string CommandName; - public CommandNotAllowedErrorPacket(string commandName) { + public CommandNotAllowedErrorS2CPacket(string commandName) { CommandName = commandName; } diff --git a/SharpChat/Packet/ContextClearPacket.cs b/SharpChat/PacketsS2C/ContextClearS2CPacket.cs similarity index 71% rename from SharpChat/Packet/ContextClearPacket.cs rename to SharpChat/PacketsS2C/ContextClearS2CPacket.cs index 10b8838..a9b5803 100644 --- a/SharpChat/Packet/ContextClearPacket.cs +++ b/SharpChat/PacketsS2C/ContextClearS2CPacket.cs @@ -1,5 +1,5 @@ -namespace SharpChat.Packet { - public class ContextClearPacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class ContextClearS2CPacket : SockChatS2CPacket { public enum ClearMode { Messages = 0, Users = 1, @@ -10,7 +10,7 @@ private readonly ClearMode Mode; - public ContextClearPacket(ClearMode mode) { + public ContextClearS2CPacket(ClearMode mode) { Mode = mode; } diff --git a/SharpChat/Packet/FloodWarningPacket.cs b/SharpChat/PacketsS2C/FloodWarningS2CPacket.cs similarity index 69% rename from SharpChat/Packet/FloodWarningPacket.cs rename to SharpChat/PacketsS2C/FloodWarningS2CPacket.cs index 616780c..f29f84e 100644 --- a/SharpChat/Packet/FloodWarningPacket.cs +++ b/SharpChat/PacketsS2C/FloodWarningS2CPacket.cs @@ -1,5 +1,5 @@ -namespace SharpChat.Packet { - public class FloodWarningPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class FloodWarningS2CPacket : SockChatTimedS2CPacket { public override string Pack() { return string.Format( "2\t{0}\t-1\t0\fflwarn\t{1}\t10010", diff --git a/SharpChat/Packet/ForceDisconnectPacket.cs b/SharpChat/PacketsS2C/ForceDisconnectS2CPacket.cs similarity index 60% rename from SharpChat/Packet/ForceDisconnectPacket.cs rename to SharpChat/PacketsS2C/ForceDisconnectS2CPacket.cs index 11f4263..1880c10 100644 --- a/SharpChat/Packet/ForceDisconnectPacket.cs +++ b/SharpChat/PacketsS2C/ForceDisconnectS2CPacket.cs @@ -1,12 +1,12 @@ using System; -namespace SharpChat.Packet { - public class ForceDisconnectPacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class ForceDisconnectS2CPacket : SockChatS2CPacket { private readonly long Expires; - public ForceDisconnectPacket() {} + public ForceDisconnectS2CPacket() { } - public ForceDisconnectPacket(DateTimeOffset expires) { + public ForceDisconnectS2CPacket(DateTimeOffset expires) { Expires = expires.Year >= 2100 ? -1 : expires.ToUnixTimeSeconds(); } diff --git a/SharpChat/Packet/KickBanNoRecordErrorPacket.cs b/SharpChat/PacketsS2C/KickBanNoRecordErrorS2CPacket.cs similarity index 67% rename from SharpChat/Packet/KickBanNoRecordErrorPacket.cs rename to SharpChat/PacketsS2C/KickBanNoRecordErrorS2CPacket.cs index 4f6cf8f..3d740a1 100644 --- a/SharpChat/Packet/KickBanNoRecordErrorPacket.cs +++ b/SharpChat/PacketsS2C/KickBanNoRecordErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class KickBanNoRecordErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class KickBanNoRecordErrorS2CPacket : SockChatTimedS2CPacket { private readonly string TargetName; - public KickBanNoRecordErrorPacket(string targetName) { + public KickBanNoRecordErrorS2CPacket(string targetName) { TargetName = targetName; } diff --git a/SharpChat/Packet/KickBanNotAllowedErrorPacket.cs b/SharpChat/PacketsS2C/KickBanNotAllowedErrorS2CPacket.cs similarity index 66% rename from SharpChat/Packet/KickBanNotAllowedErrorPacket.cs rename to SharpChat/PacketsS2C/KickBanNotAllowedErrorS2CPacket.cs index abc87f8..41dca46 100644 --- a/SharpChat/Packet/KickBanNotAllowedErrorPacket.cs +++ b/SharpChat/PacketsS2C/KickBanNotAllowedErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class KickBanNotAllowedErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class KickBanNotAllowedErrorS2CPacket : SockChatTimedS2CPacket { private readonly string UserName; - public KickBanNotAllowedErrorPacket(string userName) { + public KickBanNotAllowedErrorS2CPacket(string userName) { UserName = userName; } diff --git a/SharpChat/Packet/MOTDPacket.cs b/SharpChat/PacketsS2C/MOTDS2CPacket.cs similarity index 68% rename from SharpChat/Packet/MOTDPacket.cs rename to SharpChat/PacketsS2C/MOTDS2CPacket.cs index 44d12aa..d4afb0e 100644 --- a/SharpChat/Packet/MOTDPacket.cs +++ b/SharpChat/PacketsS2C/MOTDS2CPacket.cs @@ -1,10 +1,10 @@ using System; -namespace SharpChat.Packet { - public class MOTDPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class MOTDS2CPacket : SockChatTimedS2CPacket { private readonly string Body; - public MOTDPacket(DateTimeOffset timeStamp, string body) : base(timeStamp) { + public MOTDS2CPacket(DateTimeOffset timeStamp, string body) : base(timeStamp) { Body = body; } diff --git a/SharpChat/Packet/MessageAddLogPacket.cs b/SharpChat/PacketsS2C/MessageAddLogS2CPacket.cs similarity index 94% rename from SharpChat/Packet/MessageAddLogPacket.cs rename to SharpChat/PacketsS2C/MessageAddLogS2CPacket.cs index 623d150..625a72d 100644 --- a/SharpChat/Packet/MessageAddLogPacket.cs +++ b/SharpChat/PacketsS2C/MessageAddLogS2CPacket.cs @@ -1,7 +1,7 @@ using System; -namespace SharpChat.Packet { - public class MessageAddLogPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class MessageAddLogS2CPacket : SockChatTimedS2CPacket { private readonly long UserId; private readonly string UserName; private readonly Colour UserColour; @@ -13,7 +13,7 @@ namespace SharpChat.Packet { private readonly bool IsBroadcast; // this should be MessageBroadcastLogPacket private readonly bool Notify; - public MessageAddLogPacket( + public MessageAddLogS2CPacket( long messageId, DateTimeOffset timeStamp, long userId, diff --git a/SharpChat/Packet/MessageAddPacket.cs b/SharpChat/PacketsS2C/MessageAddS2CPacket.cs similarity index 89% rename from SharpChat/Packet/MessageAddPacket.cs rename to SharpChat/PacketsS2C/MessageAddS2CPacket.cs index 281d277..4fb3295 100644 --- a/SharpChat/Packet/MessageAddPacket.cs +++ b/SharpChat/PacketsS2C/MessageAddS2CPacket.cs @@ -1,13 +1,13 @@ using System; -namespace SharpChat.Packet { - public class MessageAddPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class MessageAddS2CPacket : SockChatTimedS2CPacket { private readonly long UserId; private readonly string Body; private readonly bool IsAction; private readonly bool IsPrivate; - public MessageAddPacket( + public MessageAddS2CPacket( long messageId, DateTimeOffset timeStamp, long userId, diff --git a/SharpChat/Packet/MessageBroadcastPacket.cs b/SharpChat/PacketsS2C/MessageBroadcastS2CPacket.cs similarity index 69% rename from SharpChat/Packet/MessageBroadcastPacket.cs rename to SharpChat/PacketsS2C/MessageBroadcastS2CPacket.cs index face92c..6feec92 100644 --- a/SharpChat/Packet/MessageBroadcastPacket.cs +++ b/SharpChat/PacketsS2C/MessageBroadcastS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class MessageBroadcastPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class MessageBroadcastS2CPacket : SockChatTimedS2CPacket { private readonly string Body; - public MessageBroadcastPacket(string body) { + public MessageBroadcastS2CPacket(string body) { Body = body; } diff --git a/SharpChat/Packet/MessageDeleteNotAllowedErrorPacket.cs b/SharpChat/PacketsS2C/MessageDeleteNotAllowedErrorS2CPacket.cs similarity index 66% rename from SharpChat/Packet/MessageDeleteNotAllowedErrorPacket.cs rename to SharpChat/PacketsS2C/MessageDeleteNotAllowedErrorS2CPacket.cs index 195e9d6..e68c29b 100644 --- a/SharpChat/Packet/MessageDeleteNotAllowedErrorPacket.cs +++ b/SharpChat/PacketsS2C/MessageDeleteNotAllowedErrorS2CPacket.cs @@ -1,5 +1,5 @@ -namespace SharpChat.Packet { - public class MessageDeleteNotAllowedErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class MessageDeleteNotAllowedErrorS2CPacket : SockChatTimedS2CPacket { public override string Pack() { return string.Format( "2\t{0}\t-1\t1\fdelerr\t{1}\t10010", diff --git a/SharpChat/Packet/MessageDeletePacket.cs b/SharpChat/PacketsS2C/MessageDeleteS2CPacket.cs similarity index 58% rename from SharpChat/Packet/MessageDeletePacket.cs rename to SharpChat/PacketsS2C/MessageDeleteS2CPacket.cs index 9e24a6b..6309e21 100644 --- a/SharpChat/Packet/MessageDeletePacket.cs +++ b/SharpChat/PacketsS2C/MessageDeleteS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class MessageDeletePacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class MessageDeleteS2CPacket : SockChatS2CPacket { private readonly long DeletedMessageId; - public MessageDeletePacket(long deletedMessageId) { + public MessageDeleteS2CPacket(long deletedMessageId) { DeletedMessageId = deletedMessageId; } diff --git a/SharpChat/Packet/PardonResponsePacket.cs b/SharpChat/PacketsS2C/PardonResponseS2CPacket.cs similarity index 68% rename from SharpChat/Packet/PardonResponsePacket.cs rename to SharpChat/PacketsS2C/PardonResponseS2CPacket.cs index ceddaef..e3a3ce0 100644 --- a/SharpChat/Packet/PardonResponsePacket.cs +++ b/SharpChat/PacketsS2C/PardonResponseS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class PardonResponsePacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class PardonResponseS2CPacket : SockChatTimedS2CPacket { private readonly string Subject; - public PardonResponsePacket(string subject) { + public PardonResponseS2CPacket(string subject) { Subject = subject; } diff --git a/SharpChat/PacketsS2C/PongS2CPacket.cs b/SharpChat/PacketsS2C/PongS2CPacket.cs new file mode 100644 index 0000000..ebcdc7e --- /dev/null +++ b/SharpChat/PacketsS2C/PongS2CPacket.cs @@ -0,0 +1,7 @@ +namespace SharpChat.PacketsS2C { + public class PongS2CPacket : SockChatS2CPacket { + public override string Pack() { + return "0\tpong"; + } + } +} diff --git a/SharpChat/SockChatS2CPacket.cs b/SharpChat/PacketsS2C/SockChatS2CPacket.cs similarity index 89% rename from SharpChat/SockChatS2CPacket.cs rename to SharpChat/PacketsS2C/SockChatS2CPacket.cs index f87dde4..9a01b89 100644 --- a/SharpChat/SockChatS2CPacket.cs +++ b/SharpChat/PacketsS2C/SockChatS2CPacket.cs @@ -1,4 +1,4 @@ -namespace SharpChat { +namespace SharpChat.PacketsS2C { public abstract class SockChatS2CPacket { protected readonly long MessageId; diff --git a/SharpChat/SockChatTimedS2CPacket.cs b/SharpChat/PacketsS2C/SockChatTimedS2CPacket.cs similarity index 94% rename from SharpChat/SockChatTimedS2CPacket.cs rename to SharpChat/PacketsS2C/SockChatTimedS2CPacket.cs index 3c29d62..79d55b8 100644 --- a/SharpChat/SockChatTimedS2CPacket.cs +++ b/SharpChat/PacketsS2C/SockChatTimedS2CPacket.cs @@ -1,6 +1,6 @@ using System; -namespace SharpChat { +namespace SharpChat.PacketsS2C { public abstract class SockChatTimedS2CPacket : SockChatS2CPacket { protected readonly DateTimeOffset TimeStamp; diff --git a/SharpChat/Packet/UserChannelForceJoinPacket.cs b/SharpChat/PacketsS2C/UserChannelForceJoinS2CPacket.cs similarity index 63% rename from SharpChat/Packet/UserChannelForceJoinPacket.cs rename to SharpChat/PacketsS2C/UserChannelForceJoinS2CPacket.cs index c1f0cda..abe538b 100644 --- a/SharpChat/Packet/UserChannelForceJoinPacket.cs +++ b/SharpChat/PacketsS2C/UserChannelForceJoinS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class UserChannelForceJoinPacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserChannelForceJoinS2CPacket : SockChatS2CPacket { private readonly string ChannelName; - public UserChannelForceJoinPacket(string channelName) { + public UserChannelForceJoinS2CPacket(string channelName) { ChannelName = channelName; } diff --git a/SharpChat/Packet/UserChannelJoinLogPacket.cs b/SharpChat/PacketsS2C/UserChannelJoinLogS2CPacket.cs similarity index 78% rename from SharpChat/Packet/UserChannelJoinLogPacket.cs rename to SharpChat/PacketsS2C/UserChannelJoinLogS2CPacket.cs index 95686f0..37cfb8f 100644 --- a/SharpChat/Packet/UserChannelJoinLogPacket.cs +++ b/SharpChat/PacketsS2C/UserChannelJoinLogS2CPacket.cs @@ -1,10 +1,10 @@ using System; -namespace SharpChat.Packet { - public class UserChannelJoinLogPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserChannelJoinLogS2CPacket : SockChatTimedS2CPacket { private readonly string UserName; - public UserChannelJoinLogPacket( + public UserChannelJoinLogS2CPacket( long messageId, DateTimeOffset timeStamp, string userName diff --git a/SharpChat/Packet/UserChannelJoinPacket.cs b/SharpChat/PacketsS2C/UserChannelJoinS2CPacket.cs similarity index 89% rename from SharpChat/Packet/UserChannelJoinPacket.cs rename to SharpChat/PacketsS2C/UserChannelJoinS2CPacket.cs index 9ac707c..d003992 100644 --- a/SharpChat/Packet/UserChannelJoinPacket.cs +++ b/SharpChat/PacketsS2C/UserChannelJoinS2CPacket.cs @@ -1,12 +1,12 @@ -namespace SharpChat.Packet { - public class UserChannelJoinPacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserChannelJoinS2CPacket : SockChatS2CPacket { private readonly long UserId; private readonly string UserName; private readonly Colour UserColour; private readonly int UserRank; private readonly UserPermissions UserPerms; - public UserChannelJoinPacket( + public UserChannelJoinS2CPacket( long userId, string userName, Colour userColour, diff --git a/SharpChat/Packet/UserChannelLeaveLogPacket.cs b/SharpChat/PacketsS2C/UserChannelLeaveLogS2CPacket.cs similarity index 77% rename from SharpChat/Packet/UserChannelLeaveLogPacket.cs rename to SharpChat/PacketsS2C/UserChannelLeaveLogS2CPacket.cs index 205f02f..48a2ba8 100644 --- a/SharpChat/Packet/UserChannelLeaveLogPacket.cs +++ b/SharpChat/PacketsS2C/UserChannelLeaveLogS2CPacket.cs @@ -1,10 +1,10 @@ using System; -namespace SharpChat.Packet { - public class UserChannelLeaveLogPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserChannelLeaveLogS2CPacket : SockChatTimedS2CPacket { private readonly string UserName; - public UserChannelLeaveLogPacket( + public UserChannelLeaveLogS2CPacket( long messageId, DateTimeOffset timeStamp, string userName diff --git a/SharpChat/Packet/UserChannelLeavePacket.cs b/SharpChat/PacketsS2C/UserChannelLeaveS2CPacket.cs similarity index 63% rename from SharpChat/Packet/UserChannelLeavePacket.cs rename to SharpChat/PacketsS2C/UserChannelLeaveS2CPacket.cs index e2bb348..eb83820 100644 --- a/SharpChat/Packet/UserChannelLeavePacket.cs +++ b/SharpChat/PacketsS2C/UserChannelLeaveS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class UserChannelLeavePacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserChannelLeaveS2CPacket : SockChatS2CPacket { private readonly long UserId; - public UserChannelLeavePacket(long userId) { + public UserChannelLeaveS2CPacket(long userId) { UserId = userId; } diff --git a/SharpChat/Packet/UserConnectLogPacket.cs b/SharpChat/PacketsS2C/UserConnectLogS2CPacket.cs similarity index 78% rename from SharpChat/Packet/UserConnectLogPacket.cs rename to SharpChat/PacketsS2C/UserConnectLogS2CPacket.cs index 1f87e42..9f2219d 100644 --- a/SharpChat/Packet/UserConnectLogPacket.cs +++ b/SharpChat/PacketsS2C/UserConnectLogS2CPacket.cs @@ -1,10 +1,10 @@ using System; -namespace SharpChat.Packet { - public class UserConnectLogPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserConnectLogS2CPacket : SockChatTimedS2CPacket { private readonly string UserName; - public UserConnectLogPacket( + public UserConnectLogS2CPacket( long messageId, DateTimeOffset timeStamp, string userName diff --git a/SharpChat/Packet/UserConnectPacket.cs b/SharpChat/PacketsS2C/UserConnectS2CPacket.cs similarity index 90% rename from SharpChat/Packet/UserConnectPacket.cs rename to SharpChat/PacketsS2C/UserConnectS2CPacket.cs index aafb68d..c6e090c 100644 --- a/SharpChat/Packet/UserConnectPacket.cs +++ b/SharpChat/PacketsS2C/UserConnectS2CPacket.cs @@ -1,12 +1,12 @@ -namespace SharpChat.Packet { - public class UserConnectPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserConnectS2CPacket : SockChatTimedS2CPacket { private readonly long UserId; private readonly string UserName; private readonly Colour UserColour; private readonly int UserRank; private readonly UserPermissions UserPerms; - public UserConnectPacket( + public UserConnectS2CPacket( long userId, string userName, Colour userColour, diff --git a/SharpChat/Packet/UserDisconnectLogPacket.cs b/SharpChat/PacketsS2C/UserDisconnectLogS2CPacket.cs similarity index 86% rename from SharpChat/Packet/UserDisconnectLogPacket.cs rename to SharpChat/PacketsS2C/UserDisconnectLogS2CPacket.cs index 409081b..8343a6e 100644 --- a/SharpChat/Packet/UserDisconnectLogPacket.cs +++ b/SharpChat/PacketsS2C/UserDisconnectLogS2CPacket.cs @@ -1,11 +1,11 @@ using System; -namespace SharpChat.Packet { - public class UserDisconnectLogPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserDisconnectLogS2CPacket : SockChatTimedS2CPacket { private readonly string UserName; private readonly UserDisconnectReason Reason; - public UserDisconnectLogPacket( + public UserDisconnectLogS2CPacket( long messageId, DateTimeOffset timeStamp, string userName, diff --git a/SharpChat/Packet/UserDisconnectPacket.cs b/SharpChat/PacketsS2C/UserDisconnectS2CPacket.cs similarity index 86% rename from SharpChat/Packet/UserDisconnectPacket.cs rename to SharpChat/PacketsS2C/UserDisconnectS2CPacket.cs index 547ee7f..2d365c7 100644 --- a/SharpChat/Packet/UserDisconnectPacket.cs +++ b/SharpChat/PacketsS2C/UserDisconnectS2CPacket.cs @@ -1,10 +1,10 @@ -namespace SharpChat.Packet { - public class UserDisconnectPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserDisconnectS2CPacket : SockChatTimedS2CPacket { private readonly long UserId; private readonly string UserName; private readonly UserDisconnectReason Reason; - public UserDisconnectPacket( + public UserDisconnectS2CPacket( long userId, string userName, UserDisconnectReason reason diff --git a/SharpChat/Packet/UserNameInUseErrorPacket.cs b/SharpChat/PacketsS2C/UserNameInUseErrorS2CPacket.cs similarity index 67% rename from SharpChat/Packet/UserNameInUseErrorPacket.cs rename to SharpChat/PacketsS2C/UserNameInUseErrorS2CPacket.cs index b804336..a166623 100644 --- a/SharpChat/Packet/UserNameInUseErrorPacket.cs +++ b/SharpChat/PacketsS2C/UserNameInUseErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class UserNameInUseErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserNameInUseErrorS2CPacket : SockChatTimedS2CPacket { private readonly string UserName; - public UserNameInUseErrorPacket(string userName) { + public UserNameInUseErrorS2CPacket(string userName) { UserName = userName; } diff --git a/SharpChat/Packet/UserNotFoundErrorPacket.cs b/SharpChat/PacketsS2C/UserNotFoundErrorS2CPacket.cs similarity index 67% rename from SharpChat/Packet/UserNotFoundErrorPacket.cs rename to SharpChat/PacketsS2C/UserNotFoundErrorS2CPacket.cs index 9ab72fd..7967f8a 100644 --- a/SharpChat/Packet/UserNotFoundErrorPacket.cs +++ b/SharpChat/PacketsS2C/UserNotFoundErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class UserNotFoundErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserNotFoundErrorS2CPacket : SockChatTimedS2CPacket { private readonly string UserName; - public UserNotFoundErrorPacket(string userName) { + public UserNotFoundErrorS2CPacket(string userName) { UserName = userName; } diff --git a/SharpChat/Packet/UserUpdateNotificationPacket.cs b/SharpChat/PacketsS2C/UserUpdateNotificationS2CPacket.cs similarity index 70% rename from SharpChat/Packet/UserUpdateNotificationPacket.cs rename to SharpChat/PacketsS2C/UserUpdateNotificationS2CPacket.cs index 2b02233..17c084c 100644 --- a/SharpChat/Packet/UserUpdateNotificationPacket.cs +++ b/SharpChat/PacketsS2C/UserUpdateNotificationS2CPacket.cs @@ -1,9 +1,9 @@ -namespace SharpChat.Packet { - public class UserUpdateNotificationPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserUpdateNotificationS2CPacket : SockChatTimedS2CPacket { private readonly string PreviousName; private readonly string NewName; - public UserUpdateNotificationPacket(string previousName, string newName) { + public UserUpdateNotificationS2CPacket(string previousName, string newName) { PreviousName = previousName; NewName = newName; } diff --git a/SharpChat/Packet/UserUpdatePacket.cs b/SharpChat/PacketsS2C/UserUpdateS2CPacket.cs similarity index 90% rename from SharpChat/Packet/UserUpdatePacket.cs rename to SharpChat/PacketsS2C/UserUpdateS2CPacket.cs index b0c34e9..891fb93 100644 --- a/SharpChat/Packet/UserUpdatePacket.cs +++ b/SharpChat/PacketsS2C/UserUpdateS2CPacket.cs @@ -1,12 +1,12 @@ -namespace SharpChat.Packet { - public class UserUpdatePacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class UserUpdateS2CPacket : SockChatS2CPacket { private readonly long UserId; private readonly string UserName; private readonly Colour UserColour; private readonly int UserRank; private readonly UserPermissions UserPerms; - public UserUpdatePacket( + public UserUpdateS2CPacket( long userId, string userName, Colour userColour, diff --git a/SharpChat/Packet/UsersPopulatePacket.cs b/SharpChat/PacketsS2C/UsersPopulateS2CPacket.cs similarity index 88% rename from SharpChat/Packet/UsersPopulatePacket.cs rename to SharpChat/PacketsS2C/UsersPopulateS2CPacket.cs index d319a32..c0ddbf8 100644 --- a/SharpChat/Packet/UsersPopulatePacket.cs +++ b/SharpChat/PacketsS2C/UsersPopulateS2CPacket.cs @@ -1,12 +1,12 @@ using System.Text; -namespace SharpChat.Packet { - public class UsersPopulatePacket : SockChatS2CPacket { +namespace SharpChat.PacketsS2C { + public class UsersPopulateS2CPacket : SockChatS2CPacket { public record ListEntry(long Id, string Name, Colour Colour, int Rank, UserPermissions Perms, bool Visible); private readonly ListEntry[] Entries; - public UsersPopulatePacket(ListEntry[] entries) { + public UsersPopulateS2CPacket(ListEntry[] entries) { Entries = entries; } diff --git a/SharpChat/Packet/WhoChannelNotFoundErrorPacket.cs b/SharpChat/PacketsS2C/WhoChannelNotFoundErrorS2CPacket.cs similarity index 68% rename from SharpChat/Packet/WhoChannelNotFoundErrorPacket.cs rename to SharpChat/PacketsS2C/WhoChannelNotFoundErrorS2CPacket.cs index e8f609a..5a87faa 100644 --- a/SharpChat/Packet/WhoChannelNotFoundErrorPacket.cs +++ b/SharpChat/PacketsS2C/WhoChannelNotFoundErrorS2CPacket.cs @@ -1,8 +1,8 @@ -namespace SharpChat.Packet { - public class WhoChannelNotFoundErrorPacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class WhoChannelNotFoundErrorS2CPacket : SockChatTimedS2CPacket { private readonly string ChannelName; - public WhoChannelNotFoundErrorPacket(string channelName) { + public WhoChannelNotFoundErrorS2CPacket(string channelName) { ChannelName = channelName; } diff --git a/SharpChat/Packet/WhoChannelResponsePacket.cs b/SharpChat/PacketsS2C/WhoChannelResponseS2CPacket.cs similarity index 84% rename from SharpChat/Packet/WhoChannelResponsePacket.cs rename to SharpChat/PacketsS2C/WhoChannelResponseS2CPacket.cs index d74c6e3..824ba26 100644 --- a/SharpChat/Packet/WhoChannelResponsePacket.cs +++ b/SharpChat/PacketsS2C/WhoChannelResponseS2CPacket.cs @@ -1,13 +1,13 @@ using System; using System.Text; -namespace SharpChat.Packet { - public class WhoChannelResponsePacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class WhoChannelResponseS2CPacket : SockChatTimedS2CPacket { private readonly string ChannelName; private readonly string[] Users; private readonly string SelfName; - public WhoChannelResponsePacket(string channelName, string[] users, string selfName) { + public WhoChannelResponseS2CPacket(string channelName, string[] users, string selfName) { ChannelName = channelName; Users = users; SelfName = selfName; diff --git a/SharpChat/Packet/WhoServerResponsePacket.cs b/SharpChat/PacketsS2C/WhoServerResponseS2CPacket.cs similarity index 83% rename from SharpChat/Packet/WhoServerResponsePacket.cs rename to SharpChat/PacketsS2C/WhoServerResponseS2CPacket.cs index ebbd3d0..d369248 100644 --- a/SharpChat/Packet/WhoServerResponsePacket.cs +++ b/SharpChat/PacketsS2C/WhoServerResponseS2CPacket.cs @@ -1,12 +1,12 @@ using System; using System.Text; -namespace SharpChat.Packet { - public class WhoServerResponsePacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class WhoServerResponseS2CPacket : SockChatTimedS2CPacket { private readonly string[] Users; private readonly string SelfName; - public WhoServerResponsePacket(string[] users, string selfName) { + public WhoServerResponseS2CPacket(string[] users, string selfName) { Users = users; SelfName = selfName; } diff --git a/SharpChat/Packet/WhoisResponsePacket.cs b/SharpChat/PacketsS2C/WhoisResponseS2CPacket.cs similarity index 72% rename from SharpChat/Packet/WhoisResponsePacket.cs rename to SharpChat/PacketsS2C/WhoisResponseS2CPacket.cs index b1657cd..7faedd5 100644 --- a/SharpChat/Packet/WhoisResponsePacket.cs +++ b/SharpChat/PacketsS2C/WhoisResponseS2CPacket.cs @@ -1,9 +1,9 @@ -namespace SharpChat.Packet { - public class WhoisResponsePacket : SockChatTimedS2CPacket { +namespace SharpChat.PacketsS2C { + public class WhoisResponseS2CPacket : SockChatTimedS2CPacket { private readonly string UserName; private readonly string RemoteAddress; - public WhoisResponsePacket(string userName, string remoteAddress) { + public WhoisResponseS2CPacket(string userName, string remoteAddress) { UserName = userName; RemoteAddress = remoteAddress; } diff --git a/SharpChat/Program.cs b/SharpChat/Program.cs index 0932252..cd2fbb6 100644 --- a/SharpChat/Program.cs +++ b/SharpChat/Program.cs @@ -17,7 +17,8 @@ namespace SharpChat { Console.WriteLine(@" \__ \/ __ \/ __ `/ ___/ __ \/ / / __ \/ __ `/ __/"); Console.WriteLine(@" ___/ / / / / /_/ / / / /_/ / /___/ / / / /_/ / /_ "); Console.WriteLine(@"/____/_/ /_/\__,_/_/ / .___/\____/_/ /_/\__,_/\__/ "); - /**/Console.Write(@" /__/"); + /**/ + Console.Write(@" /__/"); if(BuildInfo.IsDebugBuild) { Console.WriteLine(); Console.Write(@"== "); @@ -37,7 +38,8 @@ namespace SharpChat { }; Console.CancelKeyPress += cancelKeyPressHandler; - if(hasCancelled) return; + if(hasCancelled) + return; string configFile = CONFIG; @@ -47,18 +49,21 @@ namespace SharpChat { using IConfig config = new StreamConfig(configFile); - if(hasCancelled) return; + if(hasCancelled) + return; using HttpClient httpClient = new(new HttpClientHandler() { UseProxy = false, }); httpClient.DefaultRequestHeaders.Add("User-Agent", BuildInfo.ProgramName); - if(hasCancelled) return; + if(hasCancelled) + return; MisuzuClient msz = new(httpClient, config.ScopeTo("msz")); - if(hasCancelled) return; + if(hasCancelled) + return; IEventStorage evtStore; if(string.IsNullOrWhiteSpace(config.SafeReadValue("mariadb:host", string.Empty))) { @@ -69,7 +74,8 @@ namespace SharpChat { mdbes.RunMigrations(); } - if(hasCancelled) return; + if(hasCancelled) + return; using SockChatServer scs = new(httpClient, msz, evtStore, config.ScopeTo("chat")); scs.Listen(mre); diff --git a/SharpChat/SharpChatWebSocketServer.cs b/SharpChat/SharpChatWebSocketServer.cs index 2633344..e2ec842 100644 --- a/SharpChat/SharpChatWebSocketServer.cs +++ b/SharpChat/SharpChatWebSocketServer.cs @@ -117,7 +117,8 @@ namespace SharpChat { } private void OnClientConnect(ISocket clientSocket) { - if(clientSocket == null) return; // socket closed + if(clientSocket == null) + return; // socket closed FleckLog.Debug(string.Format("Client connected from {0}:{1}", clientSocket.RemoteIpAddress, clientSocket.RemotePort.ToString())); ListenForClients(); diff --git a/SharpChat/SockChatServer.cs b/SharpChat/SockChatServer.cs index 53fe732..725a8de 100644 --- a/SharpChat/SockChatServer.cs +++ b/SharpChat/SockChatServer.cs @@ -3,8 +3,8 @@ using SharpChat.Commands; using SharpChat.Config; using SharpChat.EventStorage; using SharpChat.Misuzu; -using SharpChat.Packet; -using SharpChat.PacketHandlers; +using SharpChat.PacketsS2C; +using SharpChat.PacketsC2S; using System; using System.Collections.Generic; using System.Linq; @@ -28,9 +28,9 @@ namespace SharpChat { private readonly CachedValue MaxConnections; private readonly CachedValue FloodKickLength; - private readonly List GuestHandlers = new(); - private readonly List AuthedHandlers = new(); - private readonly SendMessageHandler SendMessageHandler; + private readonly List GuestHandlers = new(); + private readonly List AuthedHandlers = new(); + private readonly SendMessageC2SPacketHandler SendMessageHandler; private bool IsShuttingDown = false; private bool IsRestarting = false; @@ -70,7 +70,7 @@ namespace SharpChat { if(Context.Channels.PublicCount < 1) Context.Channels.Add(new ChannelInfo("Default")); - GuestHandlers.Add(new AuthHandler( + GuestHandlers.Add(new AuthC2SPacketHandler( started, Misuzu, Context.Channels.MainChannel, @@ -78,12 +78,12 @@ namespace SharpChat { MaxConnections )); - AuthedHandlers.AddRange(new IPacketHandler[] { - new PingHandler(Misuzu), - SendMessageHandler = new SendMessageHandler(MaxMessageLength), + AuthedHandlers.AddRange(new IC2SPacketHandler[] { + new PingC2SPacketHandler(Misuzu), + SendMessageHandler = new SendMessageC2SPacketHandler(MaxMessageLength), }); - SendMessageHandler.AddCommands(new IUserCommand[] { + SendMessageHandler.AddCommands(new ISockChatClientCommand[] { new UserAFKCommand(), new UserNickCommand(), new MessageWhisperCommand(), @@ -197,7 +197,7 @@ namespace SharpChat { UserInfo? userInfo = Context.Users.Get(banUserId); if(userInfo != null) { if(banDuration == TimeSpan.MinValue) { - Context.SendTo(userInfo, new FloodWarningPacket()); + Context.SendTo(userInfo, new FloodWarningS2CPacket()); } else { Context.BanUser(userInfo, banDuration, UserDisconnectReason.Flood); @@ -218,8 +218,8 @@ namespace SharpChat { } } - PacketHandlerContext context = new(msg, Context, conn); - IPacketHandler? handler = conn.UserId > 0 + C2SPacketHandlerContext context = new(msg, Context, conn); + IC2SPacketHandler? handler = conn.UserId > 0 ? AuthedHandlers.FirstOrDefault(h => h.IsMatch(context)) : GuestHandlers.FirstOrDefault(h => h.IsMatch(context)); diff --git a/SharpChat/UserPermissions.cs b/SharpChat/UserPermissions.cs index 43b1ddf..76ee177 100644 --- a/SharpChat/UserPermissions.cs +++ b/SharpChat/UserPermissions.cs @@ -3,24 +3,24 @@ namespace SharpChat { [Flags] public enum UserPermissions : int { - KickUser = 0x00000001, - BanUser = 0x00000002, + KickUser = 0x00000001, + BanUser = 0x00000002, //SilenceUser = 0x00000004, - Broadcast = 0x00000008, - SetOwnNickname = 0x00000010, - SetOthersNickname = 0x00000020, - CreateChannel = 0x00000040, - DeleteChannel = 0x00010000, + Broadcast = 0x00000008, + SetOwnNickname = 0x00000010, + SetOthersNickname = 0x00000020, + CreateChannel = 0x00000040, + DeleteChannel = 0x00010000, SetChannelPermanent = 0x00000080, - SetChannelPassword = 0x00000100, + SetChannelPassword = 0x00000100, SetChannelHierarchy = 0x00000200, - JoinAnyChannel = 0x00020000, - SendMessage = 0x00000400, - DeleteOwnMessage = 0x00000800, - DeleteAnyMessage = 0x00001000, - EditOwnMessage = 0x00002000, - EditAnyMessage = 0x00004000, - SeeIPAddress = 0x00008000, - ViewLogs = 0x00040000, + JoinAnyChannel = 0x00020000, + SendMessage = 0x00000400, + DeleteOwnMessage = 0x00000800, + DeleteAnyMessage = 0x00001000, + EditOwnMessage = 0x00002000, + EditAnyMessage = 0x00004000, + SeeIPAddress = 0x00008000, + ViewLogs = 0x00040000, } }