using System; using System.Collections.Generic; using System.Linq; namespace SharpChat { public class UsersContext { [Flags] public enum NameTarget { None = 0, UserName = 1, NickName = 2, UserAndNickName = UserName | NickName, } private readonly Dictionary Users = new(); public int TotalCount { get; private set; } public UserInfo[] All => Users.Values.ToArray(); public UserInfo? Get( long? userId = null, string? name = null, NameTarget nameTarget = NameTarget.UserName ) { foreach(UserInfo info in Users.Values) { if(userId != null && info.UserId != userId) continue; if(name != null) { // this could probably all fit in a single if condition, but it'd be massive and disgusting // and require more thinking power than my goldfish brain can muster bool match = false; if(nameTarget.HasFlag(NameTarget.UserName) && info.UserName.Equals(name, StringComparison.InvariantCultureIgnoreCase)) match = true; else if(nameTarget.HasFlag(NameTarget.NickName) && info.NickName.Equals(name, StringComparison.InvariantCultureIgnoreCase)) match = true; if(!match) continue; } return info; } return null; } public UserInfo[] GetMany( long[]? userIds = null, string[]? names = null, NameTarget namesTarget = NameTarget.UserName, int? minRank = null ) { List users = new(); foreach(UserInfo info in Users.Values) { if(minRank != null && info.Rank < minRank) continue; if(userIds != null && !userIds.Contains(info.UserId)) continue; if(names?.Length > 0) { bool match = false; foreach(string name in names) { if(namesTarget.HasFlag(NameTarget.UserName) && info.UserName.Equals(name, StringComparison.InvariantCultureIgnoreCase)) match = true; else if(namesTarget.HasFlag(NameTarget.NickName) && info.NickName.Equals(name, StringComparison.InvariantCultureIgnoreCase)) match = true; } if(!match) continue; } users.Add(info); } return users.ToArray(); } public void Add(UserInfo info) { if(Users.ContainsKey(info.UserId)) return; Users.Add(info.UserId, info); ++TotalCount; } public void Remove(UserInfo info) { Remove(info.UserId); } public void Remove(long userId) { if(!Users.ContainsKey(userId)) return; Users.Remove(userId); --TotalCount; } public void Remove( string name, NameTarget nameTarget = NameTarget.UserName ) { UserInfo? info = Get(name: name, nameTarget: nameTarget); if(info != null) Remove(info.UserId); } } }