sharp-chat/SharpChat/ChatUser.cs

150 lines
4.7 KiB
C#
Raw Normal View History

using SharpChat.Misuzu;
2022-08-30 15:00:58 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
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)
sb.AppendFormat("&lt;{0}&gt;_", 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');
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();
}
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
private readonly List<ChatChannel> Channels = new();
2022-08-30 15:00:58 +00:00
2023-02-07 15:01:56 +00:00
public readonly ChatRateLimiter RateLimiter = new();
2022-08-30 15:00:58 +00:00
public ChatChannel Channel => Channels.FirstOrDefault();
2022-08-30 15:00:58 +00:00
// This needs to be a session thing
public ChatChannel CurrentChannel { get; private set; }
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
public ChatUser(MisuzuAuthInfo auth) {
2022-08-30 15:00:58 +00:00
UserId = auth.UserId;
ApplyAuth(auth, true);
}
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;
}
public bool InChannel(ChatChannel chan) {
return Channels.Contains(chan);
2022-08-30 15:00:58 +00:00
}
public void JoinChannel(ChatChannel chan) {
if(!InChannel(chan)) {
Channels.Add(chan);
CurrentChannel = chan;
2022-08-30 15:00:58 +00:00
}
}
public void LeaveChannel(ChatChannel chan) {
Channels.Remove(chan);
CurrentChannel = Channels.FirstOrDefault();
2022-08-30 15:00:58 +00:00
}
public IEnumerable<ChatChannel> GetChannels() {
return Channels.ToList();
2022-08-30 15:00:58 +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
}
}