using SharpChat.Misuzu; using System.Text; namespace SharpChat.S2CPackets { public enum AuthFailReason { AuthInvalid, MaxSessions, Banned, } public class AuthFailS2CPacket : S2CPacket { public AuthFailReason Reason { get; private set; } public MisuzuBanInfo? BanInfo { get; private set; } public AuthFailS2CPacket(AuthFailReason reason, MisuzuBanInfo? fbi = null) { Reason = reason; if(reason == AuthFailReason.Banned) BanInfo = fbi ?? throw new ArgumentNullException(nameof(fbi)); } public IEnumerable<string> Pack() { StringBuilder sb = new(); sb.Append('1'); sb.Append("\tn\t"); switch(Reason) { case AuthFailReason.AuthInvalid: default: sb.Append("authfail"); break; case AuthFailReason.MaxSessions: sb.Append("sockfail"); break; case AuthFailReason.Banned: sb.Append("joinfail"); break; } if(Reason == AuthFailReason.Banned) { sb.Append('\t'); if(BanInfo?.IsPermanent == true) sb.Append("-1"); else sb.Append(BanInfo?.ExpiresAt.ToUnixTimeSeconds() ?? 0); } yield return sb.ToString(); } } }