From 0ecf7c24cc034dea890daf25231bdea3a8e38341 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Sun, 10 Jun 2018 19:48:23 +0000 Subject: [PATCH] [NF] Refactoring Hue-Bot [NF] Now Running as Service --- Bot.cs | 24 ++++++++++++------------ Moduls/AModul.cs | 2 +- Moduls/Mqtt.cs | 8 ++++---- Moduls/Overtaker.cs | 2 +- Moduls/Statuspolling.cs | 8 ++++---- bin/Release/Bot-Utils.dll | Bin 20480 -> 20480 bytes 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Bot.cs b/Bot.cs index ddde4fe..80251ea 100644 --- a/Bot.cs +++ b/Bot.cs @@ -7,11 +7,11 @@ using BlubbFish.Utils.IoT.Bots.Events; using BlubbFish.Utils.IoT.Bots.Interfaces; namespace BlubbFish.Utils.IoT.Bots { - public abstract class Bot { + public abstract class Bot { private Thread sig_thread; private Boolean RunningProcess = true; protected ProgramLogger logger = new ProgramLogger(); - protected readonly Dictionary moduls = new Dictionary(); + protected readonly Dictionary> moduls = new Dictionary>(); protected void WaitForShutdown() { if (Type.GetType("Mono.Runtime") != null) { @@ -44,9 +44,9 @@ namespace BlubbFish.Utils.IoT.Bots { this.RunningProcess = false; } - protected void ModulDispose() { - foreach (KeyValuePair item in this.moduls) { - ((AModul)item.Value).Dispose(); + protected void ModulDispose() { + foreach (KeyValuePair> item in this.moduls) { + item.Value.Dispose(); Console.WriteLine("Modul entladen: " + item.Key); } if (this.sig_thread != null && this.sig_thread.IsAlive) { @@ -54,7 +54,7 @@ namespace BlubbFish.Utils.IoT.Bots { } } - protected void ModulLoader(String @namespace, Object library) { + protected void ModulLoader(String @namespace, Object library) { Assembly asm = Assembly.GetEntryAssembly(); foreach (Type item in asm.GetTypes()) { if (item.Namespace == @namespace) { @@ -71,15 +71,15 @@ namespace BlubbFish.Utils.IoT.Bots { } } - protected void ModulInterconnect() { - foreach (KeyValuePair item in this.moduls) { - ((AModul)item.Value).Interconnect(this.moduls); + protected void ModulInterconnect() { + foreach (KeyValuePair> item in this.moduls) { + item.Value.Interconnect(this.moduls); } } - protected void ModulEvents() { - foreach (KeyValuePair item in this.moduls) { - ((AModul)item.Value).Update += this.ModulUpdate; + protected void ModulEvents() { + foreach (KeyValuePair> item in this.moduls) { + item.Value.Update += this.ModulUpdate; } } diff --git a/Moduls/AModul.cs b/Moduls/AModul.cs index 2745e60..e7ec1a5 100644 --- a/Moduls/AModul.cs +++ b/Moduls/AModul.cs @@ -45,7 +45,7 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls { return new Dictionary>(); } - public virtual void Interconnect(Dictionary moduls) { } + public virtual void Interconnect(Dictionary> moduls) { } public virtual void SetInterconnection(String param, Action hook, Object data) { } diff --git a/Moduls/Mqtt.cs b/Moduls/Mqtt.cs index 62424ab..920f70f 100644 --- a/Moduls/Mqtt.cs +++ b/Moduls/Mqtt.cs @@ -11,7 +11,7 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls { public abstract class Mqtt : AModul, IDisposable { protected readonly Thread connectionWatcher; protected ABackend mqtt; - protected Dictionary modules; + protected Dictionary> modules; #region Constructor public Mqtt(T lib, InIReader settings) : base(lib, settings) { @@ -45,7 +45,7 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls { #endregion #region AModul - public override void Interconnect(Dictionary moduls) { + public override void Interconnect(Dictionary> moduls) { this.modules = moduls; } @@ -61,9 +61,9 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls { return new Tuple(false, null); } AModul modul = null; - foreach (KeyValuePair item in this.modules) { + foreach (KeyValuePair> item in this.modules) { if (item.Key.ToLower() == m.Groups[1].Value) { - modul = ((AModul)item.Value); + modul = item.Value; } } if (modul == null) { diff --git a/Moduls/Overtaker.cs b/Moduls/Overtaker.cs index 1a31a04..4760187 100644 --- a/Moduls/Overtaker.cs +++ b/Moduls/Overtaker.cs @@ -59,7 +59,7 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls { #endregion #region AModul - public override void Interconnect(Dictionary moduls) { } + public override void Interconnect(Dictionary> moduls) { } protected override void UpdateConfig() { this.ParseIni(); } diff --git a/Moduls/Statuspolling.cs b/Moduls/Statuspolling.cs index 974cb54..d2fa153 100644 --- a/Moduls/Statuspolling.cs +++ b/Moduls/Statuspolling.cs @@ -16,14 +16,14 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls { #endregion #region AModul - public override void Interconnect(Dictionary moduls) { - foreach (KeyValuePair item in moduls) { + public override void Interconnect(Dictionary> moduls) { + foreach (KeyValuePair> item in moduls) { if (item.Value is CronJob) { - ((AModul)item.Value).SetInterconnection("0 0 * * *", new Action(this.PollAll), null); + item.Value.SetInterconnection("0 0 * * *", new Action(this.PollAll), null); if (this.config.Count != 0) { foreach (KeyValuePair> section in this.config) { if (section.Value.ContainsKey("cron") && section.Value.ContainsKey("devices")) { - ((AModul)item.Value).SetInterconnection(section.Value["cron"], new Action(this.PollSpecific), section.Value["devices"]); + item.Value.SetInterconnection(section.Value["cron"], new Action(this.PollSpecific), section.Value["devices"]); } } } diff --git a/bin/Release/Bot-Utils.dll b/bin/Release/Bot-Utils.dll index 0498511d487ab0c891fadc5e16edd220584d517f..2d216bb7c32456a33cdbabcc12f13d5d0c6e9389 100644 GIT binary patch literal 20480 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 E5AeVSFaQ7m literal 20480 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 J