using Application.Domain.Entities; using CSScriptLib; using Hangfire; using Infrastructure.Data; using Infrastructure.Events; using Infrastructure.Extensions; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Concurrent; using System.Linq; namespace IoTCenter.Services { public class IoTCenterEventHandler : IEventHander>, IEventHander>, IEventHander>, IEventHander>, IEventHander> { public static ConcurrentDictionary Tiggers = new ConcurrentDictionary(); private readonly IServiceProvider _sp; public IoTCenterEventHandler(IServiceProvider sp) { this._sp = sp; } public void Handle(EntityUpdatedEvent message) { var timer = message.Data; if (timer.NodeId == null) { RecurringJob.AddOrUpdate(timer.Id.ToString(), o => o.TimerHanle(timer.Id), timer.Cron); } } public void Handle(EntityDeletedEvent message) { var timer = message.Data; if (timer.NodeId == null) { RecurringJob.RemoveIfExists(timer.Id.ToString()); } } public void Handle(EntityUpdatedEvent message) { var tigger = message.Data; if (tigger.NodeId == null) { Tiggers.TryRemove(message.Data.Id, out IoTTigger iotTigger); Tiggers.TryAdd(tigger.Id, tigger); } } public void Handle(EntityDeletedEvent message) { var tigger = message.Data; if (tigger.NodeId == null) { Tiggers.TryRemove(tigger.Id, out IoTTigger iotTigger); } } public void Handle(EntityUpdatedEvent message) { var data = message.Data; using var scope = this._sp.CreateScope(); foreach (var item in Tiggers) { var tigger = item.Value; if (tigger.DataId == data.Id) { var methodText = $"bool Valid(string name,string key,{data.Type.ToString().ToLower()} value,string description){{ return {tigger.Condition};}}"; try { dynamic method = CSScript.Evaluator.LoadMethod(methodText); dynamic value = data.GetValue(); var result = method.Valid(data.Name, data.Key, value, data.Description); if (result) { var job = scope.ServiceProvider.GetService(); job.TiggerHandle(tigger.Id); } } catch (Exception ex) { ex.PrintStack(); } } } } } }