// // ChatPacketInterceptor.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.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Chats; using NosSmooth.Core.Client; using NosSmooth.Core.Commands; using NosSmooth.Core.Extensions; using NosSmooth.LocalClient; using Remora.Results; using WalkCommands.Commands; namespace WalkCommands; /// /// Interceptor of chat commands. /// public class ChatPacketInterceptor : IPacketInterceptor { private readonly IServiceProvider _provider; private readonly ILogger _logger; private readonly INostaleClient _client; /// /// Initializes a new instance of the class. /// /// The service provider. /// The logger. /// The nostale client. public ChatPacketInterceptor(IServiceProvider provider, ILogger logger, INostaleClient client) { _provider = provider; _logger = logger; _client = client; } /// public bool InterceptSend(ref string packet) { if (packet.StartsWith($"say #")) { var packetString = packet; Task.Run(async () => { try { await ExecuteCommand(packetString.Substring(5)); } catch (Exception ex) { _logger.LogError(ex, "Could not execute command."); } }); return false; } return true; } /// public bool InterceptReceive(ref string packet) { return true; } private async Task ExecuteCommand(string command) { await _client.ReceivePacketAsync(new SayPacket { Type = SayColorType.Green, Message = $"Handling a command {command}." }); var splitted = command.Split(new[] { ' ' }); using var scope = _provider.CreateScope(); Result result; switch (splitted[0]) { case "walk": var walkCommand = scope.ServiceProvider.GetRequiredService(); result = await walkCommand.HandleWalkToAsync(int.Parse(splitted[1]), int.Parse(splitted[2]), splitted.Length > 3 ? bool.Parse(splitted[3]) : true); break; case "detach": var detachCommand = scope.ServiceProvider.GetRequiredService(); result = await detachCommand.HandleDetach(); break; default: await _client.ReceivePacketAsync(new SayPacket { Type = SayColorType.Red, Message = $"The command {splitted[0]} was not found." }); return; } if (!result.IsSuccess) { _logger.LogError("Could not execute a command"); _logger.LogResultError(result); } } }