// // MateWalkCommandHandler.cs // // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using Microsoft.Extensions.Options; using NosSmooth.Core.Client; using NosSmooth.Core.Commands; using NosSmooth.Core.Commands.Control; using NosSmooth.Core.Commands.Walking; using NosSmooth.LocalBinding; using NosSmooth.LocalBinding.Errors; using NosSmooth.LocalBinding.Hooks; using NosSmooth.LocalBinding.Objects; using NosSmooth.LocalBinding.Structs; using Remora.Results; namespace NosSmooth.LocalClient.CommandHandlers.Walk; /// /// Handles . /// public class MateWalkCommandHandler : ICommandHandler { /// /// Group that is used for . /// public const string PetWalkControlGroup = "PetWalk"; private readonly Optional _petWalkHook; private readonly Optional _petManagerList; private readonly NosThreadSynchronizer _threadSynchronizer; private readonly UserActionDetector _userActionDetector; private readonly INostaleClient _nostaleClient; private readonly WalkCommandHandlerOptions _options; /// /// Initializes a new instance of the class. /// /// The pet walk hook. /// The pet manager list. /// The thread synchronizer. /// The user action detector. /// The nostale client. /// The options. public MateWalkCommandHandler ( Optional petWalkHook, Optional petManagerList, NosThreadSynchronizer threadSynchronizer, UserActionDetector userActionDetector, INostaleClient nostaleClient, IOptions options ) { _options = options.Value; _petWalkHook = petWalkHook; _petManagerList = petManagerList; _threadSynchronizer = threadSynchronizer; _userActionDetector = userActionDetector; _nostaleClient = nostaleClient; } /// public async Task HandleCommand(MateWalkCommand command, CancellationToken ct = default) { if (!_petManagerList.TryGet(out var petManagerList)) { return new NeededModulesNotInitializedError ("The mate walk command cannot be executed as PetManagerList is not present.", "PetManagerList"); } if (!_petWalkHook.TryGet(out var petWalkHook)) { return new NeededModulesNotInitializedError ("The mate walk command cannot be executed as PetWalkHook is not present.", IHookManager.PetWalkName); } PetManager? selectedPet = petManagerList.FirstOrDefault(x => x.Pet.Id == command.MateId); if (selectedPet is null) { return new NotFoundError($"Mate with id {command.MateId} was not found in the pet manager list."); } var handler = new ControlCommandWalkHandler ( _nostaleClient, async (x, y, ct) => await _threadSynchronizer.SynchronizeAsync ( () => _userActionDetector.NotUserAction> ( () => petWalkHook.WrapperFunction.Get()(selectedPet, (ushort)x, (ushort)y) ), ct ), selectedPet, _options ); return await handler.HandleCommand ( command.TargetX, command.TargetY, command.ReturnDistanceTolerance, command, PetWalkControlGroup + "_" + command.MateId, ct ); } }