118 lines
3.0 KiB
C#
118 lines
3.0 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 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 void Add(string name, string token)
|
|
{
|
|
// Find first available position
|
|
var usedStarts = _users.Select(u => u.Start).ToHashSet();
|
|
int start;
|
|
|
|
for (start = 0; start < ushort.MaxValue; start += RangeLength)
|
|
{
|
|
if (!usedStarts.Contains((ushort)start))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Add user
|
|
_users.Add(new User(name, token, (ushort)start));
|
|
|
|
Save();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
private 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}");
|
|
}
|
|
}
|
|
}
|
|
}
|