diff --git a/ChaosBot/Database/Entity/ServerConfigurationFlag.cs b/ChaosBot/Database/Entity/ServerConfigurationFlag.cs new file mode 100644 index 0000000..1a5e28a --- /dev/null +++ b/ChaosBot/Database/Entity/ServerConfigurationFlag.cs @@ -0,0 +1,43 @@ +using System; +using System.IO; +using System.Text; +using System.Text.Json; +using System.Xml.Serialization; +using ChaosBot.Attribute; + +namespace ChaosBot.Database.Entity +{ + [DBEntity("ServerConfigurationFlags")] + public class ServerConfigurationFlag + { + [DBUnique] + public string key { get; } + + public string serializedValue { get; } + + [DBUnique] + public long guildId { get; } + + public ServerConfigurationFlag(string key, T value, ulong guildId) + { + this.serializedValue = Serialize(value); + this.key = key; + this.guildId = Convert.ToInt64(guildId); + } + + public T GetValue() + { + return Deserialize(serializedValue); + } + + public static string Serialize(T value) + { + return JsonSerializer.Serialize(value); + } + + public static T Deserialize(string serializedValue) + { + return JsonSerializer.Deserialize(serializedValue); + } + } +} \ No newline at end of file diff --git a/ChaosBot/Database/Repository/ConfigurationRepository.cs b/ChaosBot/Database/Repository/ConfigurationRepository.cs index ce942b1..85e475c 100644 --- a/ChaosBot/Database/Repository/ConfigurationRepository.cs +++ b/ChaosBot/Database/Repository/ConfigurationRepository.cs @@ -1,3 +1,7 @@ +using System; +using System.Collections.Generic; +using System.Data; +using ChaosBot.Database.Entity; using Microsoft.Extensions.Configuration; using NLog; @@ -5,24 +9,49 @@ namespace ChaosBot.Database.Repository { public static class ConfigurationRepository { - private static Logger _logger = Program._logger; 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}"); + + Program._logger.Info($"===> called for {configurationFlag} in {guildId}"); + Dictionary filterColumns = new Dictionary(); + filterColumns.Add("key", configurationFlag); + filterColumns.Add("guildId", Convert.ToInt64(guildId)); + DataTable valueTable = Controller.SelectQuery(ServersTable, filterColumns: filterColumns); + if (valueTable.Rows.Count == 1) + { + return ServerConfigurationFlag.Deserialize(valueTable.Rows[0]["serializedValue"].ToString()); + } return AppSettingsHandler.GetValue($"Servers:{guildId}:{configurationFlag}"); } - public static T SetValue(string configurationFlag, T value) - { - return AppSettingsHandler.GetValue(configurationFlag); - } - + /// + /// Grab configuration from appsettings.json, method does not look at the database + /// + /// + /// public static IConfigurationSection GetSection(string configurationFlag) { return AppSettingsHandler.GetSection(configurationFlag);