Files
simapi-net/Synapse/EventServer.cs
T

73 lines
2.7 KiB
C#
Raw Normal View History

2023-10-20 12:33:18 +08:00
using System;
using System.Linq;
using System.Text.Json;
2024-07-26 08:11:21 +08:00
using System.Text.RegularExpressions;
2024-07-26 05:03:28 +08:00
using System.Threading.Tasks;
2023-10-20 12:33:18 +08:00
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
2024-07-26 05:03:28 +08:00
using MQTTnet;
2023-10-23 17:39:27 +08:00
using SimApi.Helpers;
2023-10-20 12:33:18 +08:00
namespace SimApi;
public partial class Synapse
{
2024-08-03 19:19:42 +08:00
private string EventServerTopicPrefix => $"{Options.SysName}/event/";
2023-10-20 12:33:18 +08:00
private void RunEventServer()
{
2024-07-26 08:11:21 +08:00
Client!.ApplicationMessageReceivedAsync += e =>
2023-10-20 12:33:18 +08:00
{
2024-08-03 19:19:42 +08:00
if (!e.ApplicationMessage.Topic.StartsWith(EventServerTopicPrefix)) return Task.CompletedTask;
2024-07-26 05:03:28 +08:00
var reqBody = e.ApplicationMessage.ConvertPayloadToString();
2024-08-03 19:19:42 +08:00
var eventName = e.ApplicationMessage.Topic.Replace(EventServerTopicPrefix, string.Empty);
2024-07-26 08:11:21 +08:00
logger.LogDebug("Synapse Event Receive: {EventName}\n{Body}", eventName, reqBody);
var methods = EventRegistry
.Where(x => Regex.IsMatch(eventName,
"^" + Regex.Escape(x.Key!).Replace("\\+", "[^/]+").Replace("\\#", ".*") + "$"))
.ToArray();
foreach (var method in methods)
{
var callClass = sp.CreateScope().ServiceProvider.GetRequiredService(method.Class!);
var mt = callClass.GetType().GetMethod(method.Method!);
try
{
if (mt!.GetParameters().Length == 2)
{
2024-07-26 19:18:59 +08:00
var pt = mt.GetParameters()[1].ParameterType;
2024-07-26 08:11:21 +08:00
mt.Invoke(callClass, pt == typeof(string)
? [eventName, reqBody]
: [eventName, JsonSerializer.Deserialize(reqBody, pt, SimApiUtil.JsonOption)]);
}
else
{
mt.Invoke(callClass, [eventName]);
}
}
catch (Exception ex)
{
2024-07-26 19:18:59 +08:00
logger.LogError("Synapse Event Processor Error: {Err}\n{Stack}", ex.Message,ex.StackTrace);
2024-07-26 08:11:21 +08:00
}
}
2024-07-26 05:03:28 +08:00
return Task.CompletedTask;
2023-10-20 12:33:18 +08:00
};
2024-08-03 19:37:40 +08:00
SubEventServerTopic();
2024-08-03 19:19:42 +08:00
}
private void SubEventServerTopic()
{
2024-07-26 08:11:21 +08:00
foreach (var ev in EventRegistry)
{
2024-08-03 19:19:42 +08:00
var topic = $"{EventServerTopicPrefix}{ev.Key}";
2024-07-27 01:33:17 +08:00
if (Options.EventLoadBalancing)
{
topic = "$queue/" + topic;
}
2024-07-26 08:11:21 +08:00
var evSubOpts = MqttFactory.CreateSubscribeOptionsBuilder()
.WithTopicFilter(o => o.WithTopic(topic)).Build();
2024-08-03 19:19:42 +08:00
Client!.SubscribeAsync(evSubOpts).Wait();
2024-07-26 08:11:21 +08:00
logger.LogDebug("Synapse Event Register Event Success: {EventName}\nFull Topic: {Topic}", ev.Key, topic);
}
2023-10-20 12:33:18 +08:00
}
}