using Serein.Library;
using Serein.Library.Utils;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Serein.Proto.WebSocket.Handle
{
///
/// Json消息处理模块
///
public class WebSocketHandleModule
{
///
/// Json消息处理模块
///
public WebSocketHandleModule(WebSocketHandleModuleConfig config)
{
moduleConfig = config;
}
///
/// 模块的处理配置
///
private readonly WebSocketHandleModuleConfig moduleConfig;
///
/// 用来判断消息是否重复
///
private HashSet _myMsgIdHash = new HashSet();
///
/// 存储处理数据的配置
///
public ConcurrentDictionary MyHandleConfigs = new ConcurrentDictionary();
///
/// 添加处理配置
///
/// 处理模块
internal bool AddHandleConfigs(WebSocketHandleConfiguration config)
{
if (!MyHandleConfigs.ContainsKey(config.ThemeValue))
{
MyHandleConfigs[config.ThemeValue] = config;
return true;
}
else
{
return false;
}
}
///
/// 移除某个处理模块
///
///
///
public bool RemoveConfig(ISocketHandleModule socketControlBase)
{
foreach (var kv in MyHandleConfigs.ToArray())
{
var config = kv.Value;
MyHandleConfigs.TryRemove(kv.Key, out _);
}
return MyHandleConfigs.Count == 0;
}
///
/// 卸载当前模块的所有配置
///
public void UnloadConfig()
{
var temp = MyHandleConfigs.Values;
MyHandleConfigs.Clear();
}
///
/// 处理JSON数据
///
public async Task HandleAsync(WebSocketMsgContext context)
{
var jsonObject = context.MsgRequest; // 获取到消息
if (jsonObject is null)
{
// SereinEnv.WriteLine(InfoType.WARN, "没有获取到消息");
return; // 没有获取到消息
}
// 验证主题
if (!jsonObject.TryGetValue(moduleConfig.ThemeJsonKey, out var themeToken)
|| themeToken.ToString() is not string theme
|| !MyHandleConfigs.TryGetValue(theme, out var handldConfig))
{
// SereinEnv.WriteLine(InfoType.WARN, $"{theme} 主题不存在");
return;
}
// 验证消息ID
if (!jsonObject.TryGetValue(moduleConfig.MsgIdJsonKey, out var msgIdToken)
|| msgIdToken.ToString() is not string msgId)
{
// SereinEnv.WriteLine(InfoType.WARN, $"[{msgId}]{theme} 没有消息Id");
return;
}
// 验证消息ID是否重复
if (!_myMsgIdHash.Add(msgId))
{
// SereinEnv.WriteLine(InfoType.WARN, $"[{msgId}]{theme} 消息重复");
return; // 消息重复
}
// 验证数据
if (!jsonObject.TryGetValue(moduleConfig.DataJsonKey, out var dataToken))
{
// SereinEnv.WriteLine(InfoType.WARN, $"[{msgId}]{theme} 消息重复");
return; // 没有主题
}
context.MsgTheme = theme; // 添加主题
context.MsgId = msgId; // 添加 ID
context.MsgData = dataToken; // 添加消息
context.MsgRequest = jsonObject; // 添加原始消息
try
{
if (TryGetParameters(handldConfig, context, out var args))
{
var result = await HandleAsync(handldConfig, args);
if (handldConfig.IsReturnValue)
{
await context.RepliedAsync(moduleConfig, context, result);
}
}
else
{
SereinEnv.WriteLine(InfoType.WARN, $"[{msgId}]{theme} 参数获取失败");
}
}
catch (Exception ex)
{
SereinEnv.WriteLine(InfoType.ERROR, $"error in ws : {ex.Message}{Environment.NewLine}json value:{jsonObject}");
}
finally
{
context.Handle = true;
}
}
///
/// 调用
///
///
///
///
public static async Task