using System; 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 { public static IConfiguration AppSettingsHandler { get; set; } private static readonly string ServersTable = "ServerConfigurationFlags"; /// /// Get global configuration option /// /// /// /// public static T GetValue(string configurationFlag) { return AppSettingsHandler.GetValue(configurationFlag); } /// /// Get guild specific configuration option /// /// /// /// /// public static T GetValue(string configurationFlag, ulong guildId) { if (Program._logger == null) return AppSettingsHandler.GetValue($"Servers:{guildId}:{configurationFlag}"); string valueSerialized = GetValueRaw(configurationFlag, Convert.ToInt64(guildId)); if (valueSerialized != null) return ServerConfigurationFlag.Deserialize(valueSerialized); return AppSettingsHandler.GetValue($"Servers:{guildId}:{configurationFlag}"); } public static string GetValueRaw(string configurationFlag, long guildId) { Dictionary filterColumns = new Dictionary(); filterColumns.Add("key", configurationFlag); filterColumns.Add("guildId", guildId); DataTable valueTable = Controller.SelectQuery(ServersTable, filterColumns: filterColumns); if (valueTable.Rows.Count == 1) { return valueTable.Rows[0]["serializedValue"].ToString(); } 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 /// /// /// /// /// public static void SetValue(string configurationFlag, ulong guildId, T value) { SetValueRaw(configurationFlag, Convert.ToInt64(guildId), ServerConfigurationFlag.Serialize(value)); } public static void SetValueRaw(string configurationFlag, long guildId, string serializedValue) { try { Dictionary filterColumns = new Dictionary(); filterColumns.Add("key", configurationFlag); filterColumns.Add("guildId", guildId); Dictionary newValue = new Dictionary(); newValue.Add("key", configurationFlag); newValue.Add("guildId", guildId); newValue.Add("serializedValue", serializedValue); DataTable valueTable = Controller.SelectQuery(ServersTable, "COUNT(*)", filterColumns); if ((long) valueTable.Rows[0]["COUNT(*)"] == 1) { Controller.UpdateQuery(ServersTable, newValue, filterColumns); return; } Controller.InsertQuery(ServersTable, newValue); } catch (Exception ex) { Program._logger.Fatal($"ConfigurationRepository.SetValueRaw: Exception [{ex}] thrown, <[{ex.Message}]>."); } } } }