2023-02-08 23:53:42 +00:00
|
|
|
|
using SharpChat.Misuzu;
|
2022-08-30 15:00:58 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace SharpChat {
|
|
|
|
|
public class BasicUser : IEquatable<BasicUser> {
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
public string DisplayName {
|
|
|
|
|
get {
|
2023-02-07 15:01:56 +00:00
|
|
|
|
StringBuilder sb = new();
|
2022-08-30 15:00:58 +00:00
|
|
|
|
|
|
|
|
|
if(Status == ChatUserStatus.Away)
|
2023-02-08 03:17:07 +00:00
|
|
|
|
sb.AppendFormat("<{0}>_", StatusMessage[..Math.Min(StatusMessage.Length, 5)].ToUpperInvariant());
|
2022-08-30 15:00:58 +00:00
|
|
|
|
|
|
|
|
|
if(string.IsNullOrWhiteSpace(Nickname))
|
|
|
|
|
sb.Append(Username);
|
|
|
|
|
else {
|
|
|
|
|
sb.Append('~');
|
|
|
|
|
sb.Append(Nickname);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool Can(ChatUserPermissions perm, bool strict = false) {
|
|
|
|
|
ChatUserPermissions perms = Permissions & perm;
|
|
|
|
|
return strict ? perms == perm : perms > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string Pack() {
|
2023-02-07 15:01:56 +00:00
|
|
|
|
StringBuilder sb = new();
|
2022-08-30 15:00:58 +00:00
|
|
|
|
|
|
|
|
|
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');
|
2023-02-08 03:17:07 +00:00
|
|
|
|
sb.Append(" 0 "); // view logs
|
2022-08-30 15:00:58 +00:00
|
|
|
|
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();
|
|
|
|
|
}
|
2023-02-10 06:07:59 +00:00
|
|
|
|
|
|
|
|
|
public override int GetHashCode() {
|
|
|
|
|
return UserId.GetHashCode();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool Equals(object obj) {
|
|
|
|
|
return Equals(obj as BasicUser);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool Equals(BasicUser other) {
|
|
|
|
|
return UserId == other?.UserId;
|
|
|
|
|
}
|
2022-08-30 15:00:58 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-02-16 22:47:30 +00:00
|
|
|
|
public class ChatUser : BasicUser {
|
2022-08-30 15:00:58 +00:00
|
|
|
|
public DateTimeOffset SilencedUntil { get; set; }
|
|
|
|
|
|
2023-02-07 15:01:56 +00:00
|
|
|
|
public readonly ChatRateLimiter RateLimiter = new();
|
2022-08-30 15:00:58 +00:00
|
|
|
|
|
|
|
|
|
// This needs to be a session thing
|
2023-02-17 19:02:35 +00:00
|
|
|
|
public ChatChannel CurrentChannel { get; set; }
|
2022-08-30 15:00:58 +00:00
|
|
|
|
|
|
|
|
|
public bool IsSilenced
|
2022-08-30 15:28:46 +00:00
|
|
|
|
=> DateTimeOffset.UtcNow - SilencedUntil <= TimeSpan.Zero;
|
2022-08-30 15:00:58 +00:00
|
|
|
|
|
2023-02-16 21:25:41 +00:00
|
|
|
|
public ChatUser() {}
|
2022-08-30 15:00:58 +00:00
|
|
|
|
|
2023-02-08 23:53:42 +00:00
|
|
|
|
public ChatUser(MisuzuAuthInfo auth) {
|
2022-08-30 15:00:58 +00:00
|
|
|
|
UserId = auth.UserId;
|
|
|
|
|
ApplyAuth(auth, true);
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-08 23:53:42 +00:00
|
|
|
|
public void ApplyAuth(MisuzuAuthInfo auth, bool invalidateRestrictions = false) {
|
2022-08-30 15:00:58 +00:00
|
|
|
|
Username = auth.Username;
|
|
|
|
|
|
2023-02-07 15:01:56 +00:00
|
|
|
|
if(Status == ChatUserStatus.Offline)
|
2022-08-30 15:00:58 +00:00
|
|
|
|
Status = ChatUserStatus.Online;
|
2023-02-07 15:01:56 +00:00
|
|
|
|
|
2023-02-07 15:13:38 +00:00
|
|
|
|
Colour = ChatColour.FromMisuzu(auth.ColourRaw);
|
2022-08-30 15:00:58 +00:00
|
|
|
|
Rank = auth.Rank;
|
|
|
|
|
Permissions = auth.Permissions;
|
|
|
|
|
|
2023-02-07 15:01:56 +00:00
|
|
|
|
if(invalidateRestrictions || !IsSilenced)
|
2022-08-30 15:00:58 +00:00
|
|
|
|
SilencedUntil = auth.SilencedUntil;
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-10 06:07:59 +00:00
|
|
|
|
public bool NameEquals(string name) {
|
|
|
|
|
return string.Equals(name, Username, StringComparison.InvariantCultureIgnoreCase)
|
|
|
|
|
|| string.Equals(name, Nickname, StringComparison.InvariantCultureIgnoreCase)
|
|
|
|
|
|| string.Equals(name, DisplayName, StringComparison.InvariantCultureIgnoreCase);
|
2022-08-30 15:00:58 +00:00
|
|
|
|
}
|
2023-02-16 22:56:50 +00:00
|
|
|
|
|
|
|
|
|
public static string GetDMChannelName(ChatUser user1, ChatUser user2) {
|
|
|
|
|
return user1.UserId < user2.UserId
|
|
|
|
|
? $"@{user1.UserId}-{user2.UserId}"
|
|
|
|
|
: $"@{user2.UserId}-{user1.UserId}";
|
|
|
|
|
}
|
2022-08-30 15:00:58 +00:00
|
|
|
|
}
|
|
|
|
|
}
|