using OwnChar.Api.Exceptions; using OwnChar.Client.Data; using OwnChar.Client.Data.Model; using OwnChar.Client.Managers; using Pilz.Cryptography; using System.Diagnostics.CodeAnalysis; namespace OwnChar.Client; internal class OwnCharManager : IOwnCharManager { // User public bool IsLoggedIn => Api is not null && Api.IsLoggedIn; // Data Provider public OwnCharApiClient? Api { get; private set; } // Manager public IUserManager Users { get; } public IGroupsManager Groups { get; } public ICharacterManager Characters { get; } public OwnCharManager() { Users = new UserManager(this); Groups = new GroupsManager(this); Characters = new CharacterManager(this); } [MemberNotNull(nameof(Api))] internal protected void CheckLogin() { if (!IsLoggedIn) throw new LoginException("You are already logged in!"); } /// /// Tries to login on the given data provider. /// /// Returns if the login was successfull and if not. public Task Login(string? username, SecureString? password) { ArgumentNullException.ThrowIfNull(Api, nameof(Api)); ArgumentException.ThrowIfNullOrWhiteSpace(username, nameof(username)); ArgumentException.ThrowIfNullOrWhiteSpace(password, nameof(password)); username = username.Trim().ToLower(); return Api.Auth.Login(username, OwnCharUtils.HashPassword(username, password)); } /// /// Closes the session on the current data provider. /// /// public async Task Logout() { if (Api is null) return true; return await Api.Auth.Logout(); } }