using SharpChat.Misuzu; using System; using System.Text; namespace SharpChat { public class ChatUser : IEquatable { public const int DEFAULT_SIZE = 30; public const int DEFAULT_MINIMUM_DELAY = 10000; public const int DEFAULT_RISKY_OFFSET = 5; private const int RANK_NO_FLOOD = 9; public long UserId { get; set; } public string Username { get; set; } public ChatColour Colour { get; set; } public int Rank { get; set; } public string Nickname { get; set; } public ChatUserPermissions Permissions { get; set; } public ChatUserStatus Status { get; set; } = ChatUserStatus.Online; public string StatusMessage { get; set; } public bool HasFloodProtection => Rank < RANK_NO_FLOOD; // This needs to be a session thing public ChatChannel CurrentChannel { get; set; } public string DisplayName { get { StringBuilder sb = new(); if(Status == ChatUserStatus.Away) sb.AppendFormat("<{0}>_", StatusMessage[..Math.Min(StatusMessage.Length, 5)].ToUpperInvariant()); if(string.IsNullOrWhiteSpace(Nickname)) sb.Append(Username); else { sb.Append('~'); sb.Append(Nickname); } return sb.ToString(); } } public ChatUser() { } public ChatUser(MisuzuAuthInfo auth) { UserId = auth.UserId; ApplyAuth(auth); } public void ApplyAuth(MisuzuAuthInfo auth) { Username = auth.Username; if(Status == ChatUserStatus.Offline) Status = ChatUserStatus.Online; Colour = ChatColour.FromMisuzu(auth.ColourRaw); Rank = auth.Rank; Permissions = auth.Permissions; } public bool Can(ChatUserPermissions perm, bool strict = false) { ChatUserPermissions perms = Permissions & perm; return strict ? perms == perm : perms > 0; } public string Pack() { StringBuilder sb = new(); sb.Append(UserId); sb.Append('\t'); sb.Append(DisplayName); sb.Append('\t'); sb.Append(Colour); sb.Append('\t'); sb.Append(Rank); sb.Append(' '); sb.Append(Can(ChatUserPermissions.KickUser) ? '1' : '0'); sb.Append(" 0 "); // view logs sb.Append(Can(ChatUserPermissions.SetOwnNickname) ? '1' : '0'); sb.Append(' '); sb.Append(Can(ChatUserPermissions.CreateChannel | ChatUserPermissions.SetChannelPermanent, true) ? 2 : ( Can(ChatUserPermissions.CreateChannel) ? 1 : 0 )); return sb.ToString(); } public bool NameEquals(string name) { return string.Equals(name, Username, StringComparison.InvariantCultureIgnoreCase) || string.Equals(name, Nickname, StringComparison.InvariantCultureIgnoreCase) || string.Equals(name, DisplayName, StringComparison.InvariantCultureIgnoreCase); } public override int GetHashCode() { return UserId.GetHashCode(); } public override bool Equals(object obj) { return Equals(obj as ChatUser); } public bool Equals(ChatUser other) { return UserId == other?.UserId; } public static string GetDMChannelName(ChatUser user1, ChatUser user2) { return user1.UserId < user2.UserId ? $"@{user1.UserId}-{user2.UserId}" : $"@{user2.UserId}-{user1.UserId}"; } } }