S2C packer methods now just return a single string.

This commit is contained in:
flash 2025-04-25 20:33:42 +00:00
parent 626951ad10
commit 3fc94c425e
Signed by: flash
GPG key ID: 2C9C2C574D47FE3E
26 changed files with 55 additions and 77 deletions

View file

@ -45,12 +45,9 @@ namespace SharpChat {
if(!Socket.IsAvailable) if(!Socket.IsAvailable)
return; return;
IEnumerable<string> data = packet.Pack(); string data = packet.Pack();
if(!string.IsNullOrWhiteSpace(data))
if(data != null) Socket.Send(data);
foreach(string line in data)
if(!string.IsNullOrWhiteSpace(line))
Socket.Send(line);
} }
public void BumpPing() { public void BumpPing() {

View file

@ -138,7 +138,6 @@ namespace SharpChat {
string? statusText = null, string? statusText = null,
int? rank = null, int? rank = null,
ChatUserPermissions? perms = null, ChatUserPermissions? perms = null,
bool? isSuper = null,
bool silent = false bool silent = false
) { ) {
ArgumentNullException.ThrowIfNull(user); ArgumentNullException.ThrowIfNull(user);
@ -153,7 +152,7 @@ namespace SharpChat {
if(nickName != null && !user.NickName.Equals(nickName)) { if(nickName != null && !user.NickName.Equals(nickName)) {
if(!silent) if(!silent)
previousName = string.IsNullOrWhiteSpace(user.NickName) ? user.UserName : user.NickName; previousName = user.LegacyName;
user.NickName = nickName; user.NickName = nickName;
hasChanged = true; hasChanged = true;
@ -184,13 +183,12 @@ namespace SharpChat {
hasChanged = true; hasChanged = true;
} }
if(isSuper.HasValue) { if(hasChanged) {
user.IsSuper = isSuper.Value; if(!string.IsNullOrWhiteSpace(previousName))
hasChanged = true; SendToUserChannels(user, new CommandResponseS2CPacket(RandomSnowflake.Next(), LCR.NICKNAME_CHANGE, false, previousName, user.LegacyNameWithStatus));
}
if(hasChanged) SendToUserChannels(user, new UserUpdateS2CPacket(user));
SendToUserChannels(user, new UserUpdateS2CPacket(RandomSnowflake.Next(), user, previousName)); }
} }
public void BanUser(ChatUser user, TimeSpan duration, UserDisconnectReason reason = UserDisconnectReason.Kicked) { public void BanUser(ChatUser user, TimeSpan duration, UserDisconnectReason reason = UserDisconnectReason.Kicked) {

View file

@ -22,7 +22,6 @@ namespace SharpChat {
public ChatColour Colour { get; set; } = colour; public ChatColour Colour { get; set; } = colour;
public int Rank { get; set; } = rank; public int Rank { get; set; } = rank;
public ChatUserPermissions Permissions { get; set; } = perms; public ChatUserPermissions Permissions { get; set; } = perms;
public bool IsSuper { get; set; }
public string NickName { get; set; } = nickName; public string NickName { get; set; } = nickName;
public ChatUserStatus Status { get; set; } = status; public ChatUserStatus Status { get; set; } = status;
public string StatusText { get; set; } = statusText; public string StatusText { get; set; } = statusText;

View file

@ -29,7 +29,7 @@ namespace SharpChat.Commands {
return; return;
} }
if(!ctx.User.IsSuper && banUser.Rank >= ctx.User.Rank && banUser != ctx.User) { if(banUser.Rank >= ctx.User.Rank && banUser != ctx.User) {
ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.KICK_NOT_ALLOWED, true, banUser.LegacyName)); ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.KICK_NOT_ALLOWED, true, banUser.LegacyName));
return; return;
} }

View file

@ -1,5 +1,5 @@
namespace SharpChat { namespace SharpChat {
public interface S2CPacket { public interface S2CPacket {
IEnumerable<string> Pack(); string Pack();
} }
} }

View file

@ -19,7 +19,7 @@ namespace SharpChat.S2CPackets {
BanInfo = fbi ?? throw new ArgumentNullException(nameof(fbi)); BanInfo = fbi ?? throw new ArgumentNullException(nameof(fbi));
} }
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('1'); sb.Append('1');
@ -47,7 +47,7 @@ namespace SharpChat.S2CPackets {
sb.Append(BanInfo?.ExpiresAt.ToUnixTimeSeconds() ?? 0); sb.Append(BanInfo?.ExpiresAt.ToUnixTimeSeconds() ?? 0);
} }
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -9,7 +9,7 @@ namespace SharpChat.S2CPackets {
public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user)); public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user));
public ChatChannel Channel { get; private set; } = channel ?? throw new ArgumentNullException(nameof(channel)); public ChatChannel Channel { get; private set; } = channel ?? throw new ArgumentNullException(nameof(channel));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('1'); sb.Append('1');
@ -20,7 +20,7 @@ namespace SharpChat.S2CPackets {
sb.Append('\t'); sb.Append('\t');
sb.Append(maxMsgLength); sb.Append(maxMsgLength);
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -8,7 +8,7 @@ namespace SharpChat.S2CPackets {
) : S2CPacket { ) : S2CPacket {
public IEnumerable<MisuzuBanInfo> Bans { get; private set; } = bans ?? throw new ArgumentNullException(nameof(bans)); public IEnumerable<MisuzuBanInfo> Bans { get; private set; } = bans ?? throw new ArgumentNullException(nameof(bans));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('2'); sb.Append('2');
@ -28,7 +28,7 @@ namespace SharpChat.S2CPackets {
sb.Append(msgId); sb.Append(msgId);
sb.Append("\t10010"); sb.Append("\t10010");
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -4,7 +4,7 @@ namespace SharpChat.S2CPackets {
public class ChannelCreateS2CPacket(ChatChannel channel) : S2CPacket { public class ChannelCreateS2CPacket(ChatChannel channel) : S2CPacket {
public ChatChannel Channel { get; private set; } = channel ?? throw new ArgumentNullException(nameof(channel)); public ChatChannel Channel { get; private set; } = channel ?? throw new ArgumentNullException(nameof(channel));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('4'); sb.Append('4');
@ -13,7 +13,7 @@ namespace SharpChat.S2CPackets {
sb.Append('\t'); sb.Append('\t');
sb.Append(Channel.Pack()); sb.Append(Channel.Pack());
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -4,7 +4,7 @@ namespace SharpChat.S2CPackets {
public class ChannelDeleteS2CPacket(ChatChannel channel) : S2CPacket { public class ChannelDeleteS2CPacket(ChatChannel channel) : S2CPacket {
public ChatChannel Channel { get; private set; } = channel ?? throw new ArgumentNullException(nameof(channel)); public ChatChannel Channel { get; private set; } = channel ?? throw new ArgumentNullException(nameof(channel));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('4'); sb.Append('4');
@ -13,7 +13,7 @@ namespace SharpChat.S2CPackets {
sb.Append('\t'); sb.Append('\t');
sb.Append(Channel.Name); sb.Append(Channel.Name);
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -5,7 +5,7 @@ namespace SharpChat.S2CPackets {
public string PreviousName { get; private set; } = previousName ?? throw new ArgumentNullException(nameof(previousName)); public string PreviousName { get; private set; } = previousName ?? throw new ArgumentNullException(nameof(previousName));
public ChatChannel Channel { get; private set; } = channel ?? throw new ArgumentNullException(nameof(channel)); public ChatChannel Channel { get; private set; } = channel ?? throw new ArgumentNullException(nameof(channel));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('4'); sb.Append('4');
@ -16,7 +16,7 @@ namespace SharpChat.S2CPackets {
sb.Append('\t'); sb.Append('\t');
sb.Append(Channel.Pack()); sb.Append(Channel.Pack());
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -11,7 +11,7 @@ namespace SharpChat.S2CPackets {
) : S2CPacket { ) : S2CPacket {
public string Text { get; } = text ?? throw new ArgumentNullException(nameof(text)); public string Text { get; } = text ?? throw new ArgumentNullException(nameof(text));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('2'); sb.Append('2');
@ -45,7 +45,7 @@ namespace SharpChat.S2CPackets {
isPrivate ? '1' : '0' isPrivate ? '1' : '0'
); );
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -2,14 +2,14 @@
namespace SharpChat.S2CPackets { namespace SharpChat.S2CPackets {
public class ChatMessageDeleteS2CPacket(long eventId) : S2CPacket { public class ChatMessageDeleteS2CPacket(long eventId) : S2CPacket {
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('6'); sb.Append('6');
sb.Append('\t'); sb.Append('\t');
sb.Append(eventId); sb.Append(eventId);
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -9,7 +9,7 @@ namespace SharpChat.S2CPackets {
) : S2CPacket { ) : S2CPacket {
public string StringId { get; private set; } = stringId ?? throw new ArgumentNullException(nameof(stringId)); public string StringId { get; private set; } = stringId ?? throw new ArgumentNullException(nameof(stringId));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
if(StringId == LCR.WELCOME) { if(StringId == LCR.WELCOME) {
@ -52,7 +52,7 @@ namespace SharpChat.S2CPackets {
Flags.HasFlag(ChatMessageFlags.Private) ? '1' : '0' Flags.HasFlag(ChatMessageFlags.Private) ? '1' : '0'
);*/ );*/
yield return sb.ToString(); return sb.ToString();
} }
} }
@ -86,5 +86,6 @@ namespace SharpChat.S2CPackets {
public const string USER_NOT_BANNED = "notban"; public const string USER_NOT_BANNED = "notban";
public const string USER_UNBANNED = "unban"; public const string USER_UNBANNED = "unban";
public const string FLOOD_WARN = "flwarn"; public const string FLOOD_WARN = "flwarn";
public const string NICKNAME_CHANGE = "nick";
} }
} }

View file

@ -4,7 +4,7 @@ namespace SharpChat.S2CPackets {
public class ContextChannelsS2CPacket(IEnumerable<ChatChannel> channels) : S2CPacket { public class ContextChannelsS2CPacket(IEnumerable<ChatChannel> channels) : S2CPacket {
public IEnumerable<ChatChannel> Channels { get; private set; } = channels?.Where(c => c != null) ?? throw new ArgumentNullException(nameof(channels)); public IEnumerable<ChatChannel> Channels { get; private set; } = channels?.Where(c => c != null) ?? throw new ArgumentNullException(nameof(channels));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('7'); sb.Append('7');
@ -18,7 +18,7 @@ namespace SharpChat.S2CPackets {
sb.Append(channel.Pack()); sb.Append(channel.Pack());
} }
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -10,14 +10,14 @@ namespace SharpChat.S2CPackets {
} }
public class ContextClearS2CPacket(ContextClearMode mode) : S2CPacket { public class ContextClearS2CPacket(ContextClearMode mode) : S2CPacket {
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('8'); sb.Append('8');
sb.Append('\t'); sb.Append('\t');
sb.Append((int)mode); sb.Append((int)mode);
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -8,7 +8,7 @@ namespace SharpChat.S2CPackets
private const string V1_CHATBOT = "-1\tChatBot\tinherit\t\t"; private const string V1_CHATBOT = "-1\tChatBot\tinherit\t\t";
public IEnumerable<string> Pack() { public string Pack() {
bool isAction = Event.Flags.HasFlag(StoredEventFlags.Action); bool isAction = Event.Flags.HasFlag(StoredEventFlags.Action);
bool isBroadcast = Event.Flags.HasFlag(StoredEventFlags.Broadcast); bool isBroadcast = Event.Flags.HasFlag(StoredEventFlags.Broadcast);
bool isPrivate = Event.Flags.HasFlag(StoredEventFlags.Private); bool isPrivate = Event.Flags.HasFlag(StoredEventFlags.Private);
@ -106,7 +106,7 @@ namespace SharpChat.S2CPackets
isPrivate ? '1' : '0' isPrivate ? '1' : '0'
); );
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -4,7 +4,7 @@ namespace SharpChat.S2CPackets {
public class ContextUsersS2CPacket(IEnumerable<ChatUser> users) : S2CPacket { public class ContextUsersS2CPacket(IEnumerable<ChatUser> users) : S2CPacket {
public IEnumerable<ChatUser> Users { get; private set; } = users?.Where(u => u != null) ?? throw new ArgumentNullException(nameof(users)); public IEnumerable<ChatUser> Users { get; private set; } = users?.Where(u => u != null) ?? throw new ArgumentNullException(nameof(users));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('7'); sb.Append('7');
@ -20,7 +20,7 @@ namespace SharpChat.S2CPackets {
sb.Append('1'); // visibility flag sb.Append('1'); // visibility flag
} }
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -20,7 +20,7 @@ namespace SharpChat.S2CPackets {
} }
} }
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('9'); sb.Append('9');
@ -35,7 +35,7 @@ namespace SharpChat.S2CPackets {
sb.Append(Expires.ToUnixTimeSeconds()); sb.Append(Expires.ToUnixTimeSeconds());
} }
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -1,7 +1,7 @@
namespace SharpChat.S2CPackets { namespace SharpChat.S2CPackets {
public class PongS2CPacket : S2CPacket { public class PongS2CPacket : S2CPacket {
public IEnumerable<string> Pack() { public string Pack() {
yield return "0\tpong"; return "0\tpong";
} }
} }
} }

View file

@ -4,7 +4,7 @@ namespace SharpChat.S2CPackets {
public class UserChannelForceJoinS2CPacket(ChatChannel channel) : S2CPacket { public class UserChannelForceJoinS2CPacket(ChatChannel channel) : S2CPacket {
public ChatChannel Channel { get; private set; } = channel ?? throw new ArgumentNullException(nameof(channel)); public ChatChannel Channel { get; private set; } = channel ?? throw new ArgumentNullException(nameof(channel));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('5'); sb.Append('5');
@ -13,7 +13,7 @@ namespace SharpChat.S2CPackets {
sb.Append('\t'); sb.Append('\t');
sb.Append(Channel.Name); sb.Append(Channel.Name);
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -4,7 +4,7 @@ namespace SharpChat.S2CPackets {
public class UserChannelJoinS2CPacket(long msgId, ChatUser user) : S2CPacket { public class UserChannelJoinS2CPacket(long msgId, ChatUser user) : S2CPacket {
public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user)); public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('5'); sb.Append('5');
@ -15,7 +15,7 @@ namespace SharpChat.S2CPackets {
sb.Append('\t'); sb.Append('\t');
sb.Append(msgId); sb.Append(msgId);
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -4,7 +4,7 @@ namespace SharpChat.S2CPackets {
public class UserChannelLeaveS2CPacket(long msgId, ChatUser user) : S2CPacket { public class UserChannelLeaveS2CPacket(long msgId, ChatUser user) : S2CPacket {
public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user)); public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('5'); sb.Append('5');
@ -15,7 +15,7 @@ namespace SharpChat.S2CPackets {
sb.Append('\t'); sb.Append('\t');
sb.Append(msgId); sb.Append(msgId);
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -4,7 +4,7 @@ namespace SharpChat.S2CPackets {
public class UserConnectS2CPacket(long msgId, DateTimeOffset joined, ChatUser user) : S2CPacket { public class UserConnectS2CPacket(long msgId, DateTimeOffset joined, ChatUser user) : S2CPacket {
public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user)); public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('1'); sb.Append('1');
@ -15,7 +15,7 @@ namespace SharpChat.S2CPackets {
sb.Append('\t'); sb.Append('\t');
sb.Append(msgId); sb.Append(msgId);
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -16,7 +16,7 @@ namespace SharpChat.S2CPackets {
) : S2CPacket { ) : S2CPacket {
public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user)); public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
sb.Append('3'); sb.Append('3');
@ -47,7 +47,7 @@ namespace SharpChat.S2CPackets {
sb.Append('\t'); sb.Append('\t');
sb.Append(msgId); sb.Append(msgId);
yield return sb.ToString(); return sb.ToString();
} }
} }
} }

View file

@ -1,34 +1,17 @@
using System.Text; using System.Text;
namespace SharpChat.S2CPackets { namespace SharpChat.S2CPackets {
public class UserUpdateS2CPacket(long msgId, ChatUser user, string previousName = "") : S2CPacket { public class UserUpdateS2CPacket(ChatUser user) : S2CPacket {
public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user)); public ChatUser User { get; private set; } = user ?? throw new ArgumentNullException(nameof(user));
public IEnumerable<string> Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
bool isSilent = string.IsNullOrEmpty(previousName);
if(!isSilent) {
sb.Append('2');
sb.Append('\t');
sb.Append(DateTimeOffset.Now.ToUnixTimeSeconds());
sb.Append("\t-1\t0\fnick\f");
sb.Append(previousName);
sb.Append('\f');
sb.Append(User.LegacyNameWithStatus);
sb.Append('\t');
sb.Append(msgId);
sb.Append("\t10010");
yield return sb.ToString();
sb.Clear();
}
sb.Append("10"); sb.Append("10");
sb.Append('\t'); sb.Append('\t');
sb.Append(User.Pack()); sb.Append(User.Pack());
yield return sb.ToString(); return sb.ToString();
} }
} }
} }