diff --git a/SharpChat/C2SPacketHandlers/AuthC2SPacketHandler.cs b/SharpChat/C2SPacketHandlers/AuthC2SPacketHandler.cs index e9369ee..5312efd 100644 --- a/SharpChat/C2SPacketHandlers/AuthC2SPacketHandler.cs +++ b/SharpChat/C2SPacketHandlers/AuthC2SPacketHandler.cs @@ -2,6 +2,8 @@ using SharpChat.Auth; using SharpChat.Bans; using SharpChat.Channels; using SharpChat.Configuration; +using SharpChat.Messages; +using SharpChat.Snowflake; using SharpChat.SockChat.S2CPackets; namespace SharpChat.C2SPacketHandlers; @@ -10,6 +12,7 @@ public class AuthC2SPacketHandler( AuthClient authClient, BansClient bansClient, ChannelsContext channelsCtx, + RandomSnowflake snowflake, CachedValue<int> maxMsgLength, CachedValue<int> maxConns ) : C2SPacketHandler { @@ -90,7 +93,48 @@ public class AuthC2SPacketHandler( await ctx.Connection.Send(new CommandResponseS2CPacket(0, LCR.WELCOME, false, line)); } - await ctx.Chat.HandleJoin(user, channelsCtx.DefaultChannel, ctx.Connection, maxMsgLength); + Channel channel = channelsCtx.DefaultChannel; + + if(!ctx.Chat.IsInChannel(user, channel)) { + long msgId = snowflake.Next(); + await ctx.Chat.SendTo(channel, new UserConnectS2CPacket(msgId, DateTimeOffset.Now, user.UserId, user.LegacyNameWithStatus, user.Colour, user.Rank, user.Permissions)); + await ctx.Chat.Messages.LogMessage(msgId, "user:connect", channel.Name, user.UserId, user.UserName, user.Colour, user.Rank, user.NickName, user.Permissions, null, MessageFlags.Log); + } + + await ctx.Connection.Send(new AuthSuccessS2CPacket( + user.UserId, + user.LegacyNameWithStatus, + user.Colour, + user.Rank, + user.Permissions, + channel.Name, + maxMsgLength + )); + await ctx.Connection.Send(new ContextUsersS2CPacket( + ctx.Chat.GetChannelUsers(channel).Except([user]).OrderByDescending(u => u.Rank) + .Select(u => new ContextUsersS2CPacket.Entry( + u.UserId, + u.LegacyNameWithStatus, + u.Colour, + u.Rank, + u.Permissions, + true + )) + )); + + IEnumerable<Message> msgs = await ctx.Chat.Messages.GetMessages(channel.Name); + foreach(Message msg in msgs) + await ctx.Connection.Send(new ContextMessageS2CPacket(msg)); + + await ctx.Connection.Send(new ContextChannelsS2CPacket( + ctx.Chat.Channels.GetChannels(user.Rank) + .Select(c => new ContextChannelsS2CPacket.Entry(c.Name, c.HasPassword, c.IsTemporary)) + )); + + ctx.Chat.Users.Add(user); + + ctx.Chat.ChannelUsers.Add(new Context.ChannelUserAssoc(user.UserId, channel.Name)); + ctx.Chat.UserLastChannel[user.UserId] = channel; } finally { ctx.Chat.ContextAccess.Release(); } diff --git a/SharpChat/Context.cs b/SharpChat/Context.cs index 423a7f8..b1740dc 100644 --- a/SharpChat/Context.cs +++ b/SharpChat/Context.cs @@ -208,49 +208,6 @@ public class Context { await HandleDisconnect(user, reason); } - public async Task HandleJoin(User user, Channel chan, Connection conn, int maxMsgLength) { - if(!IsInChannel(user, chan)) { - long msgId = RandomSnowflake.Next(); - await SendTo(chan, new UserConnectS2CPacket(msgId, DateTimeOffset.Now, user.UserId, user.LegacyNameWithStatus, user.Colour, user.Rank, user.Permissions)); - await Messages.LogMessage(msgId, "user:connect", chan.Name, user.UserId, user.UserName, user.Colour, user.Rank, user.NickName, user.Permissions, null, MessageFlags.Log); - } - - await conn.Send(new AuthSuccessS2CPacket( - user.UserId, - user.LegacyNameWithStatus, - user.Colour, - user.Rank, - user.Permissions, - chan.Name, - maxMsgLength - )); - await conn.Send(new ContextUsersS2CPacket( - GetChannelUsers(chan).Except([user]).OrderByDescending(u => u.Rank) - .Select(u => new ContextUsersS2CPacket.Entry( - u.UserId, - u.LegacyNameWithStatus, - u.Colour, - u.Rank, - u.Permissions, - true - )) - )); - - IEnumerable<Message> msgs = await Messages.GetMessages(chan.Name); - foreach(Message msg in msgs) - await conn.Send(new ContextMessageS2CPacket(msg)); - - await conn.Send(new ContextChannelsS2CPacket( - Channels.GetChannels(user.Rank) - .Select(c => new ContextChannelsS2CPacket.Entry(c.Name, c.HasPassword, c.IsTemporary)) - )); - - Users.Add(user); - - ChannelUsers.Add(new ChannelUserAssoc(user.UserId, chan.Name)); - UserLastChannel[user.UserId] = chan; - } - public async Task HandleDisconnect(User user, UserDisconnectS2CPacket.Reason reason = UserDisconnectS2CPacket.Reason.Leave) { await UpdateUser(user, status: UserStatus.Offline); Users.Remove(user); @@ -290,10 +247,6 @@ public class Context { } } - await ForceChannelSwitch(user, chan); - } - - public async Task ForceChannelSwitch(User user, Channel chan) { Channel oldChan = UserLastChannel[user.UserId]; long leaveId = RandomSnowflake.Next(); diff --git a/SharpChat/SockChatServer.cs b/SharpChat/SockChatServer.cs index 3e9b6de..9f7baaf 100644 --- a/SharpChat/SockChatServer.cs +++ b/SharpChat/SockChatServer.cs @@ -2,7 +2,6 @@ using Fleck; using SharpChat.Auth; using SharpChat.Bans; using SharpChat.C2SPacketHandlers; -using SharpChat.Channels; using SharpChat.ClientCommands; using SharpChat.Configuration; using SharpChat.Messages; @@ -69,7 +68,14 @@ public class SockChatServer : IDisposable { ); } - GuestHandlers.Add(new AuthC2SPacketHandler(authClient, bansClient, Context.Channels, MaxMessageLength, MaxConnections)); + GuestHandlers.Add(new AuthC2SPacketHandler( + authClient, + bansClient, + Context.Channels, + Context.RandomSnowflake, + MaxMessageLength, + MaxConnections + )); AuthedHandlers.AddRange([ new PingC2SPacketHandler(authClient),