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; public RobotMessageHandler( ISocketClientGateway socketClientGateway, RobotStateManager stateManager, ICacheService cache, IRobotSimpleCommandHandler simpleCommandHandler, IRobotPrefixCommandHandler prefixCommandHandler) { _socketClientGateway = socketClientGateway; _stateManager = stateManager; _cache = cache; _simpleCommandHandler = simpleCommandHandler; _prefixCommandHandler = prefixCommandHandler; } /// /// 处理接收到的消息。保持原有行为:简单命令和前缀命令都回写原消息。 /// public async Task HandleMessageReceivedAsync(string message, bool isJson, TcpClient client, RobotSocketState state) { 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; } } }