/// <summary> /// Constructor /// </summary> /// <param name="moduleManager"></param> public JSOnTick(IModuleManager moduleManager) { ModuleManager = moduleManager; Logger = ModuleManager.GetLogger(); TickInterval = moduleManager.GetConfiguration() .GetSection("Modules") .GetSection("Script") .GetSection("Managers") .GetSection("Javascript") .GetValue <int>("TickInterval"); Definition = new JavascriptFunctionDefinition() { Global = true, Prototype = "onTick [event]", Description = "Opportunity to execute code at regular intervals", Example = @"var onTick = function() {\n};\n" }; ModuleManager.ModuleManagerReadyEvent += () => { ItemManager = ModuleManager.GetManager <IItemManager>(); JavascriptItemDataManager = ModuleManager.GetManager <IJavascriptItemDataManager>(); JavascriptItemDataRepo = ModuleManager.GetRepository <IJavascriptItemDataRepo>(); JavascriptItemDataManager.AddFunctionDefinition(Definition); ModuleManager.Ticks += OnTick; }; }
/// <summary> /// Execute onTick javascript function on all items that have it /// </summary> public void OnTick() { if (TickCount++ >= TickInterval) { Logger.LogInformation("Running item scripts"); var javascriptDatas = JavascriptItemDataRepo.Read(); javascriptDatas.ForEach(data => { if (data.ScriptFunctions.Contains(":onTick:", StringComparison.InvariantCultureIgnoreCase)) { var item = ItemManager.Read(data.DataItemId); if (item == null) { throw new BeforeOurTimeException($"No item ({data.DataItemId}) found for javascript data ({data.Id})"); } JavascriptItemDataManager.ExecuteFunction(item, "onTick"); } }); TickCount = 0; } }