using Microsoft.Extensions.Logging;
using System.Net.Sockets;
using WIDESEAWCS_Common;
using WIDESEAWCS_Core.Caches;
using WIDESEAWCS_Tasks.Workflow.Abstractions;
namespace WIDESEAWCS_Tasks
{
///
/// 机器人消息路由入口:负责缓存状态读取、命令分发和回包触发。
///
public class RobotMessageHandler : IRobotMessageRouter
{
private readonly ISocketClientGateway _socketClientGateway;
private readonly RobotStateManager _stateManager;
private readonly ICacheService _cache;
private readonly IRobotSimpleCommandHandler _simpleCommandHandler;
private readonly IRobotPrefixCommandHandler _prefixCommandHandler;
private readonly ILogger _logger;
public RobotMessageHandler(
ISocketClientGateway socketClientGateway,
RobotStateManager stateManager,
ICacheService cache,
IRobotSimpleCommandHandler simpleCommandHandler,
IRobotPrefixCommandHandler prefixCommandHandler,
ILogger logger)
{
_socketClientGateway = socketClientGateway;
_stateManager = stateManager;
_cache = cache;
_simpleCommandHandler = simpleCommandHandler;
_prefixCommandHandler = prefixCommandHandler;
_logger = logger;
}
///
/// 处理接收到的消息。保持原有行为:简单命令和前缀命令都回写原消息。
///
public async Task HandleMessageReceivedAsync(string message, bool isJson, TcpClient client, RobotSocketState state)
{
_logger.LogInformation($"接收到客户端【{state.RobotCrane.DeviceName}】发送消息【{message}】");
var cacheKey = $"{RedisPrefix.Code}:{RedisName.SocketDevices}:{client.Client.RemoteEndPoint}";
if (!_cache.TryGetValue(cacheKey, out RobotSocketState? cachedState) || cachedState == null)
{
return null;
}
var activeState = cachedState;
string messageLower = message.ToLowerInvariant();
if (await _simpleCommandHandler.HandleAsync(messageLower, activeState))
{
await _socketClientGateway.SendMessageAsync(client, message);
_stateManager.TryUpdateStateSafely(activeState.IPAddress, activeState);
return null;
}
if (_prefixCommandHandler.IsPrefixCommand(messageLower))
{
await _prefixCommandHandler.HandleAsync(message, activeState, client);
}
return null;
}
}
}