using System; using System.Collections.Generic; using System.IO; using System.Linq; using Terminal.Gui; using YamlDotNet.Serialization; namespace Akari.Provider.WaveshareUART.Users { public class UsersManager { public const int RangeStart = 1; public const int RangeLength = 20; public const string UsersFilePath = "users.yaml"; public int Count => _users.Count; public IReadOnlyList Users => _users.AsReadOnly(); private readonly List _users; private readonly IDeserializer _deserializer; private readonly ISerializer _serializer; public UsersManager() { _serializer = new SerializerBuilder().Build(); _deserializer = new DeserializerBuilder().Build(); try { if (!File.Exists(UsersFilePath)) { _users = new List(); } else { _users = _deserializer.Deserialize>(File.ReadAllText(UsersFilePath)); } } catch (Exception e) { Console.WriteLine($"Can't load users: {e.Message}"); Console.WriteLine(e.StackTrace); } } public User this[string name] => _users.FirstOrDefault(u => u.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); public User this[ushort start] => _users.FirstOrDefault(u => u.Start == start); public User Add(string name, string token) { // Find first available position var usedStarts = _users.Select(u => u.Start).ToHashSet(); int start; for (start = RangeStart; start < ushort.MaxValue; start += RangeLength) { if (!usedStarts.Contains((ushort)start)) { break; } } // Add user var user = new User(name, token, (ushort)start); _users.Add(user); Save(); return user; } public bool Remove(User user) { if (_users.Remove(user)) { Save(); return true; } return false; } public bool Remove(IEnumerable users) { foreach (var user in users) { if (!Remove(user)) { return false; } } return true; } public bool Clear() { _users.Clear(); Save(); return true; } public void Save() { try { File.WriteAllText(UsersFilePath, _serializer.Serialize(_users)); } catch (Exception e) { Console.WriteLine($"Can't save users: {e.Message}"); Console.WriteLine(e.StackTrace); MessageBox.ErrorQuery("Users", $"Can't save users: {e.Message}"); } } } }