From 33e8b74813b61b5b21be4d7f4c5a9f5c64e82a15 Mon Sep 17 00:00:00 2001 From: Daniel-I-Am Date: Thu, 18 Jun 2020 21:03:24 +0200 Subject: [PATCH] Start dependency injection --- ChaosBot/Attribute/AssemblyController.cs | 2 +- ChaosBot/Database/Controller.cs | 2 +- .../Repository/ConfigurationRepository.cs | 16 +++------- ChaosBot/Dependency.cs | 29 +++++++++++++++++++ ChaosBot/Discord/DiscordConnect.cs | 2 +- ChaosBot/Discord/Modules/AdminCommands.cs | 2 +- ChaosBot/Discord/Modules/ConfigCommands.cs | 2 +- ChaosBot/Discord/Modules/DiceCommands.cs | 2 +- ChaosBot/Discord/Modules/InfoCommands.cs | 2 +- ChaosBot/Discord/Modules/LodestoneCommands.cs | 2 +- ChaosBot/Discord/Modules/PointsCommands.cs | 2 +- ChaosBot/Discord/Modules/RaffleSystem.cs | 2 +- .../Discord/PreConditions/CheckCommandPerm.cs | 7 +++-- ChaosBot/Discord/Services/CommandHandler.cs | 2 +- ChaosBot/Discord/Services/TimerHandler.cs | 4 +-- ChaosBot/Logging.cs | 5 ++-- ChaosBot/Program.cs | 29 +++++++++++-------- ChaosBot/Services/LodestoneHttpProxy.cs | 2 +- .../App/Controller/ConfigurationController.cs | 2 +- ChaosBot/WebServer/Startup.cs | 2 +- ChaosBot/WebServer/WebServer.cs | 2 +- 21 files changed, 75 insertions(+), 45 deletions(-) create mode 100644 ChaosBot/Dependency.cs diff --git a/ChaosBot/Attribute/AssemblyController.cs b/ChaosBot/Attribute/AssemblyController.cs index 1c5cdd9..8e6c5b8 100644 --- a/ChaosBot/Attribute/AssemblyController.cs +++ b/ChaosBot/Attribute/AssemblyController.cs @@ -10,7 +10,7 @@ namespace ChaosBot.Attribute { public static class AssemblyController { - private static Logger _logger = Program._logger; + private static ILogger _logger = Dependency.GetInstance(); public static void RegisterAll() { Assembly dbEntityAssembly = Assembly.GetAssembly(typeof(DBEntity)); diff --git a/ChaosBot/Database/Controller.cs b/ChaosBot/Database/Controller.cs index b9f5d3a..62716ef 100644 --- a/ChaosBot/Database/Controller.cs +++ b/ChaosBot/Database/Controller.cs @@ -13,7 +13,7 @@ namespace ChaosBot.Database public static class Controller { static SqliteConnection _conn = new SqliteConnection($"Data Source={System.IO.Directory.GetCurrentDirectory()}/{ConfigurationRepository.GetValue("Bot:Database")}"); - private static Logger _logger = Program._logger; + private static ILogger _logger = Dependency.GetInstance(); /// /// Run a raw query on the database diff --git a/ChaosBot/Database/Repository/ConfigurationRepository.cs b/ChaosBot/Database/Repository/ConfigurationRepository.cs index 3f0ce88..89aae34 100644 --- a/ChaosBot/Database/Repository/ConfigurationRepository.cs +++ b/ChaosBot/Database/Repository/ConfigurationRepository.cs @@ -3,11 +3,13 @@ using System.Collections.Generic; using System.Data; using ChaosBot.Database.Entity; using Microsoft.Extensions.Configuration; +using NLog; namespace ChaosBot.Database.Repository { public static class ConfigurationRepository { + private static ILogger _logger = Dependency.GetInstance(); public static IConfiguration AppSettingsHandler { get; set; } private static readonly string ServersTable = "ServerConfigurationFlags"; @@ -32,7 +34,7 @@ namespace ChaosBot.Database.Repository /// public static T GetValue(string configurationFlag, ulong guildId) { - if (Program._logger == null) return AppSettingsHandler.GetValue($"Servers:{guildId}:{configurationFlag}"); + if (_logger == null) return AppSettingsHandler.GetValue($"Servers:{guildId}:{configurationFlag}"); string valueSerialized = GetValueRaw(configurationFlag, Convert.ToInt64(guildId)); if (valueSerialized != null) @@ -54,16 +56,6 @@ namespace ChaosBot.Database.Repository return null; } - /// - /// Grab configuration from appsettings.json, method does not look at the database - /// - /// - /// - public static IConfigurationSection GetSection(string configurationFlag) - { - return AppSettingsHandler.GetSection(configurationFlag); - } - /// /// Get guild specific configuration option /// @@ -99,7 +91,7 @@ namespace ChaosBot.Database.Repository } catch (Exception ex) { - Program._logger.Fatal($"ConfigurationRepository.SetValueRaw: Exception [{ex}] thrown, <[{ex.Message}]>."); + _logger.Fatal($"ConfigurationRepository.SetValueRaw: Exception [{ex}] thrown, <[{ex.Message}]>."); } } } diff --git a/ChaosBot/Dependency.cs b/ChaosBot/Dependency.cs new file mode 100644 index 0000000..8eae4e8 --- /dev/null +++ b/ChaosBot/Dependency.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using Microsoft.Extensions.Configuration; +using NLog; + +namespace ChaosBot +{ + public static class Dependency + { + private static Dictionary InstanceList; + + public static void Initialize(IConfiguration appSettingsHandler) + { + InstanceList = new Dictionary + { + {typeof(ILogger), Logging.GenLog(appSettingsHandler)} + }; + } + + public static T GetInstance() + { + if (InstanceList.TryGetValue(typeof(T), out object obj)) + { + return (T) obj; + } + throw new KeyNotFoundException($"Could not find dependency of type {typeof(T)}"); + } + } +} \ No newline at end of file diff --git a/ChaosBot/Discord/DiscordConnect.cs b/ChaosBot/Discord/DiscordConnect.cs index d82cd7b..1b6913c 100644 --- a/ChaosBot/Discord/DiscordConnect.cs +++ b/ChaosBot/Discord/DiscordConnect.cs @@ -15,7 +15,7 @@ namespace ChaosBot.Discord public class DiscordConnect { private static DiscordSocketClient _client; - private static Logger _logger = Program._logger; + private static ILogger _logger = Dependency.GetInstance(); public static async Task StartUp() { diff --git a/ChaosBot/Discord/Modules/AdminCommands.cs b/ChaosBot/Discord/Modules/AdminCommands.cs index 37ebec9..ae2e0bb 100644 --- a/ChaosBot/Discord/Modules/AdminCommands.cs +++ b/ChaosBot/Discord/Modules/AdminCommands.cs @@ -11,7 +11,7 @@ namespace ChaosBot.Discord.Modules { public class AdminCommands : ModuleBase { - private static readonly Logger _logger = Program._logger; + private static readonly ILogger _logger = Dependency.GetInstance(); [Command("clear")] diff --git a/ChaosBot/Discord/Modules/ConfigCommands.cs b/ChaosBot/Discord/Modules/ConfigCommands.cs index 709d462..aeab70d 100644 --- a/ChaosBot/Discord/Modules/ConfigCommands.cs +++ b/ChaosBot/Discord/Modules/ConfigCommands.cs @@ -11,7 +11,7 @@ namespace ChaosBot.Discord.Modules { public class ConfigCommands : ModuleBase { - private static readonly Logger _logger = Program._logger; + private static readonly ILogger _logger = Dependency.GetInstance(); private static readonly string _prefix = ConfigurationRepository.GetValue("Discord:Prefix"); [Command("config")] diff --git a/ChaosBot/Discord/Modules/DiceCommands.cs b/ChaosBot/Discord/Modules/DiceCommands.cs index 7386aec..55f967a 100644 --- a/ChaosBot/Discord/Modules/DiceCommands.cs +++ b/ChaosBot/Discord/Modules/DiceCommands.cs @@ -12,7 +12,7 @@ namespace ChaosBot.Discord.Modules { public class DiceCommands : ModuleBase { - private static Logger _logger = Program._logger; + private static ILogger _logger = Dependency.GetInstance(); [Command("roll")] public async Task Roll(params string[] args) diff --git a/ChaosBot/Discord/Modules/InfoCommands.cs b/ChaosBot/Discord/Modules/InfoCommands.cs index 46b15ff..969b891 100644 --- a/ChaosBot/Discord/Modules/InfoCommands.cs +++ b/ChaosBot/Discord/Modules/InfoCommands.cs @@ -12,7 +12,7 @@ namespace ChaosBot.Discord.Modules { public class InfoCommands : ModuleBase { - private static readonly Logger _logger = Program._logger; + private static readonly ILogger _logger = Dependency.GetInstance(); [Command("info")] diff --git a/ChaosBot/Discord/Modules/LodestoneCommands.cs b/ChaosBot/Discord/Modules/LodestoneCommands.cs index 52c20ab..166dd34 100644 --- a/ChaosBot/Discord/Modules/LodestoneCommands.cs +++ b/ChaosBot/Discord/Modules/LodestoneCommands.cs @@ -17,7 +17,7 @@ namespace ChaosBot.Discord.Modules { public class LodestoneCommands : ModuleBase { - private static readonly Logger _logger = Program._logger; + private static readonly ILogger _logger = Dependency.GetInstance(); [Command("lodestone character")] diff --git a/ChaosBot/Discord/Modules/PointsCommands.cs b/ChaosBot/Discord/Modules/PointsCommands.cs index e7d5652..963cc87 100644 --- a/ChaosBot/Discord/Modules/PointsCommands.cs +++ b/ChaosBot/Discord/Modules/PointsCommands.cs @@ -15,7 +15,7 @@ namespace ChaosBot.Discord.Modules { public class PointsCommands : ModuleBase { - private static Logger _logger = Program._logger; + private static ILogger _logger = Dependency.GetInstance(); [Command("points help")] public async Task PointsCommandInfo() diff --git a/ChaosBot/Discord/Modules/RaffleSystem.cs b/ChaosBot/Discord/Modules/RaffleSystem.cs index 07ad48e..da519c3 100644 --- a/ChaosBot/Discord/Modules/RaffleSystem.cs +++ b/ChaosBot/Discord/Modules/RaffleSystem.cs @@ -13,7 +13,7 @@ namespace ChaosBot.Discord.Modules public class RaffleSystem : ModuleBase { - private static Logger _logger = Program._logger; + private static ILogger _logger = Dependency.GetInstance(); [Command("raffle")] public async Task RaffleStatus() diff --git a/ChaosBot/Discord/PreConditions/CheckCommandPerm.cs b/ChaosBot/Discord/PreConditions/CheckCommandPerm.cs index 061c72b..e69b870 100644 --- a/ChaosBot/Discord/PreConditions/CheckCommandPerm.cs +++ b/ChaosBot/Discord/PreConditions/CheckCommandPerm.cs @@ -4,15 +4,18 @@ using System.Threading.Tasks; using ChaosBot.Database.Repository; using Discord.Commands; using Discord.WebSocket; +using NLog; namespace ChaosBot.Discord.PreConditions { public class CheckCommandPerm : PreconditionAttribute { + private static ILogger _logger = Dependency.GetInstance(); + public override Task CheckPermissionsAsync(ICommandContext context, CommandInfo command, IServiceProvider services) { // Debug information - Program._logger.Trace($"CheckCommandPerm.CheckPermissionsAsync|Checking permissions for command: {command.Name}"); + _logger.Trace($"CheckCommandPerm.CheckPermissionsAsync|Checking permissions for command: {command.Name}"); // If user is not SocketGuildUser, then return error if (!(context.User is SocketGuildUser gUser)) return Task.FromResult(PreconditionResult.FromError("You must be in a guild to run this command.")); @@ -46,7 +49,7 @@ namespace ChaosBot.Discord.PreConditions } else { - Program._logger.Info("CheckCommandperm.CheckPermissionsAsync|commandPermissions: Null Value"); + _logger.Info("CheckCommandperm.CheckPermissionsAsync|commandPermissions: Null Value"); } // Permission denied diff --git a/ChaosBot/Discord/Services/CommandHandler.cs b/ChaosBot/Discord/Services/CommandHandler.cs index f0bece2..3aa43d6 100644 --- a/ChaosBot/Discord/Services/CommandHandler.cs +++ b/ChaosBot/Discord/Services/CommandHandler.cs @@ -16,7 +16,7 @@ namespace ChaosBot.Discord.Services private readonly CommandService _commands; private readonly DiscordSocketClient _client; private readonly IServiceProvider _services; - private readonly Logger _logger = Program._logger; + private readonly ILogger _logger = Dependency.GetInstance(); public CommandHandler(IServiceProvider services) { diff --git a/ChaosBot/Discord/Services/TimerHandler.cs b/ChaosBot/Discord/Services/TimerHandler.cs index 7182a8a..30a4629 100644 --- a/ChaosBot/Discord/Services/TimerHandler.cs +++ b/ChaosBot/Discord/Services/TimerHandler.cs @@ -12,14 +12,14 @@ namespace ChaosBot.Discord.Services { public static class TimerHandler { - private static readonly Logger _logger = Program._logger; + private static readonly ILogger _logger = Dependency.GetInstance(); private static DiscordSocketClient _client; public static void Initialize(IServiceProvider services) { _client = services.GetRequiredService(); - foreach (IConfigurationSection serverConfig in ConfigurationRepository.GetSection("Servers").GetChildren()) + foreach (IConfigurationSection serverConfig in ConfigurationRepository.AppSettingsHandler.GetSection("Servers").GetChildren()) { long? lodestoneChannelSloganDescriptionId = serverConfig.GetValue("Lodestone:SloganDescription:Channel", null); int refreshMinutes = serverConfig.GetValue("Lodestone:SloganDescription:RefreshMinutes", 60); diff --git a/ChaosBot/Logging.cs b/ChaosBot/Logging.cs index b6557e4..5bc6f1b 100644 --- a/ChaosBot/Logging.cs +++ b/ChaosBot/Logging.cs @@ -1,5 +1,6 @@ using System; using ChaosBot.Database.Repository; +using Microsoft.Extensions.Configuration; using NLog; using NLog.Extensions.Logging; @@ -7,11 +8,11 @@ namespace ChaosBot { public class Logging { - public static Logger GenLog() + public static Logger GenLog(IConfiguration appSettingsHandler) { try { - LogManager.Configuration = new NLogLoggingConfiguration(ConfigurationRepository.GetSection("NLog")); + LogManager.Configuration = new NLogLoggingConfiguration(appSettingsHandler.GetSection("NLog")); return LogManager.GetCurrentClassLogger(); } diff --git a/ChaosBot/Program.cs b/ChaosBot/Program.cs index 3b8015f..2b049e7 100644 --- a/ChaosBot/Program.cs +++ b/ChaosBot/Program.cs @@ -12,12 +12,12 @@ namespace ChaosBot { internal class Program { - public static Logger _logger; - private static string appsettingsPath; + private ILogger _logger; + private static string _appsettingsPath; private static void Main(string[] args) { - appsettingsPath = args.Length > 0 ? args[0] : "./appsettings.json"; + _appsettingsPath = args.Length > 0 ? args[0] : "./appsettings.json"; new Program().MainFunction().GetAwaiter().GetResult(); } @@ -28,12 +28,22 @@ namespace ChaosBot /* * Load configuration from AppSettings.Json and save as Cfg */ - LoadConfiguration(appsettingsPath); + IConfiguration configurationHandler = LoadConfiguration(_appsettingsPath); + + /* + * Initialize dependency injector + */ + Dependency.Initialize(configurationHandler); + + /* + * Set AppSettingsHandler on ConfigurationRepository + */ + ConfigurationRepository.AppSettingsHandler = configurationHandler; /* * Initialize the _logger for logging purposes */ - LoadLogger(); + _logger = Dependency.GetInstance(); /* * Attempt to load our custom assemblies @@ -56,18 +66,13 @@ namespace ChaosBot } } - public static void LoadConfiguration(string appsettingsPath) + public static IConfiguration LoadConfiguration(string appsettingsPath) { - ConfigurationRepository.AppSettingsHandler = new ConfigurationBuilder() + return new ConfigurationBuilder() .SetBasePath(System.IO.Directory.GetCurrentDirectory()) .AddJsonFile(appsettingsPath, optional: false, reloadOnChange: true).Build(); } - public static void LoadLogger() - { - _logger = Logging.GenLog(); - } - public static void RegisterAssemblyController() { AssemblyController.RegisterAll(); diff --git a/ChaosBot/Services/LodestoneHttpProxy.cs b/ChaosBot/Services/LodestoneHttpProxy.cs index 4075a9a..bdd9291 100644 --- a/ChaosBot/Services/LodestoneHttpProxy.cs +++ b/ChaosBot/Services/LodestoneHttpProxy.cs @@ -29,7 +29,7 @@ namespace ChaosBot.Services static class LodestoneHttpConnection { - private static readonly Logger _logger = Program._logger; + private static readonly ILogger _logger = Dependency.GetInstance(); static HttpClient client = new HttpClient(); private static bool _firstRun = true; diff --git a/ChaosBot/WebServer/App/Controller/ConfigurationController.cs b/ChaosBot/WebServer/App/Controller/ConfigurationController.cs index a499e30..68378c5 100644 --- a/ChaosBot/WebServer/App/Controller/ConfigurationController.cs +++ b/ChaosBot/WebServer/App/Controller/ConfigurationController.cs @@ -9,7 +9,7 @@ namespace ChaosBot.WebServer.App.Controller [Route("/config/{guildId}/{flag}")] public class ConfigurationController { - private readonly Logger _logger = Program._logger; + private readonly ILogger _logger = Dependency.GetInstance(); [HttpGet] public string GetConfigurationFlag(long guildId, string flag) diff --git a/ChaosBot/WebServer/Startup.cs b/ChaosBot/WebServer/Startup.cs index 52a1234..207a668 100644 --- a/ChaosBot/WebServer/Startup.cs +++ b/ChaosBot/WebServer/Startup.cs @@ -10,7 +10,7 @@ namespace ChaosBot.WebServer { class Startup { - private readonly Logger _logger = Program._logger; + private readonly ILogger _logger = Dependency.GetInstance(); public IConfiguration Configuration { get; } diff --git a/ChaosBot/WebServer/WebServer.cs b/ChaosBot/WebServer/WebServer.cs index b31b836..613a64d 100644 --- a/ChaosBot/WebServer/WebServer.cs +++ b/ChaosBot/WebServer/WebServer.cs @@ -31,7 +31,7 @@ namespace ChaosBot.WebServer { logging.ClearProviders(); logging.SetMinimumLevel(LogLevel.Trace); - logging.AddNLog(new NLogLoggingConfiguration(ConfigurationRepository.GetSection("NLog"))); + logging.AddNLog(new NLogLoggingConfiguration(ConfigurationRepository.AppSettingsHandler.GetSection("NLog"))); }) .UseStartup(); });