// // WalkCommands.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 NosSmooth.Core.Client; using NosSmooth.Core.Commands; using NosSmooth.Packets.Enums; using NosSmooth.Packets.Enums.Chat; using NosSmooth.Packets.Packets.Server.Chat; using Remora.Results; namespace WalkCommands.Commands; /// /// Represents command group for walking. /// public class WalkCommands { private readonly INostaleClient _client; /// /// Initializes a new instance of the class. /// /// The nostale client. public WalkCommands(INostaleClient client) { _client = client ?? throw new ArgumentNullException(nameof(client)); } /// /// Attempts to walk the character to the specified lcoation. /// /// The x coordinate. /// The y coordinate. /// Whether the user can cancel the operation. /// The cancellation token for cancelling the operation. /// A result that may or may not have succeeded. public async Task HandleWalkToAsync ( int x, int y, bool isCancellable = true, CancellationToken ct = default ) { var receiveResult = await _client.ReceivePacketAsync ( new SayPacket(EntityType.Map, 1, SayColor.Red, $"Going to walk to {x} {y}."), ct ); if (!receiveResult.IsSuccess) { return receiveResult; } var command = new WalkCommand(x, y, isCancellable); var walkResult = await _client.SendCommandAsync(command, ct); if (!walkResult.IsSuccess) { await _client.ReceivePacketAsync ( new SayPacket(EntityType.Map, 1, SayColor.Red, "Could not finish walking."), ct ); return walkResult; } return await _client.ReceivePacketAsync ( new SayPacket(EntityType.Map, 1, SayColor.Red, "Walk has finished successfully."), ct ); } }