Files
Akari.Provider.WaveshareUART/Users/UsersManager.cs

123 lines
3.1 KiB
C#

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<User> Users => _users.AsReadOnly();
private readonly List<User> _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<User>();
}
else
{
_users = _deserializer.Deserialize<List<User>>(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<User> 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}");
}
}
}
}