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}]>.");
}
}
}
}