Add Start and Position to User

This commit is contained in:
2021-01-23 13:12:47 +01:00
parent 18e627873f
commit 79df07e7fc
2 changed files with 55 additions and 14 deletions

View File

@@ -3,25 +3,51 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using YamlDotNet.Serialization;
namespace Akari.Provider.WaveshareUART.Users namespace Akari.Provider.WaveshareUART.Users
{ {
public class User public class User
{ {
public string Name { get; private set; } public string Name { get; private set; }
public string Token { get; private set; } public string Token { get; private set; }
public ushort RangeStart { get; private set; }
public ushort Start { get; private set; }
public ushort Position { get; private set; }
[YamlIgnore()]
public int Count => Position - Start;
[YamlIgnore()]
public IEnumerable<int> ValidPositions => Enumerable.Range(Start, Count);
public User() public User()
{ {
} }
public User(string name, string token, ushort rangeStart) public User(string name, string token, ushort start)
{ {
Name = name; Name = name;
Token = token; Token = token;
RangeStart = rangeStart; Start = start;
Position = Start;
} }
public bool IncrementPosition()
{
if (Position - Start < UsersManager.RangeLength)
{
Position++;
return true;
}
return false;
}
public bool IsInRange(int position) => position >= Start && position < Position;
public override string ToString() => Name;
} }
} }

View File

@@ -11,13 +11,15 @@ namespace Akari.Provider.WaveshareUART.Users
{ {
public class UsersManager public class UsersManager
{ {
public const int RangeLength = 20;
public const string UsersFilePath = "users.yaml"; public const string UsersFilePath = "users.yaml";
private readonly List<User> _users;
private IDeserializer _deserializer;
private ISerializer _serializer;
public int Count => _users.Count; 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() public UsersManager()
{ {
@@ -43,23 +45,34 @@ namespace Akari.Provider.WaveshareUART.Users
} }
public User this[string name] => _users.FirstOrDefault(u => u.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); 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(User user) public void Add(string name, string token)
{ {
_users.Add(user); // 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(); Save();
} }
public IReadOnlyCollection<User> GetAll()
{
return _users.AsReadOnly();
}
public void Remove(User user) public void Remove(User user)
{ {
_users.Remove(user); _users.Remove(user);
// TODO Remove fingerprints
Save(); Save();
} }
@@ -67,6 +80,8 @@ namespace Akari.Provider.WaveshareUART.Users
{ {
_users.Clear(); _users.Clear();
// TODO Remove fingerprints
Save(); Save();
} }