| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | using System;using System.Collections.Generic;using InABox.Core;namespace InABox.Configuration{    public enum ConfigurationCacheType    {        Local,        Global,        User    }    public static class ConfigurationCache    {        private static readonly Dictionary<Type, Dictionary<string, string>> _localcache = new Dictionary<Type, Dictionary<string, string>>();        private static readonly Dictionary<Type, Dictionary<string, string>> _globalcache = new Dictionary<Type, Dictionary<string, string>>();        private static readonly Dictionary<Type, Dictionary<string, string>> _usercache = new Dictionary<Type, Dictionary<string, string>>();        private static readonly bool _shouldLog = false;        private static Dictionary<Type, Dictionary<string, string>> GetCache(ConfigurationCacheType type)        {            return type == ConfigurationCacheType.Local                ? _localcache                : type == ConfigurationCacheType.Global                    ? _globalcache                    : _usercache;        }        private static void Log(LogType type, string message)        {            if (_shouldLog)            {                Logger.Send(type, "", message);            }        }        public static T Check<T>(ConfigurationCacheType type, string section)        {            Log(LogType.Information, $"- Checking {typeof(T)}({type},{section})");            var _cache = GetCache(type);            if (_cache.ContainsKey(typeof(T)))            {                var subcache = _cache[typeof(T)];                if (subcache.ContainsKey(section))                {                    var data = subcache[section];                    if (!string.IsNullOrWhiteSpace(data))                    {                        Log(LogType.Information, $"- Checking: Found {typeof(T)}({type},{section}) -> {subcache[section]}");                        var result = Serialization.Deserialize<T>(subcache[section]);                        if(result is BaseObject obj)                        {                            obj.CommitChanges();                        }                        return result;                    }                }            }            return default;        }        public static void Add<T>(ConfigurationCacheType type, string section, T config)        {            Log(LogType.Information, $"- Adding {typeof(T)}({type},{section})");            var _cache = GetCache(type);            if (!_cache.ContainsKey(typeof(T)))                _cache[typeof(T)] = new Dictionary<string, string>();            var subcache = _cache[typeof(T)];            subcache[section] = Serialization.Serialize(config);        }        public static void Clear<T>(ConfigurationCacheType type, string section)        {            Log(LogType.Information, $"- Clearing {typeof(T)}({type},{section})");            var _cache = GetCache(type);            if (_cache.ContainsKey(typeof(T)))            {                var subcache = _cache[typeof(T)];                if (subcache.ContainsKey(section))                {                    Log(LogType.Information, $"- Clearing: Removing {typeof(T)}({type},{section})");                    subcache[section] = "";                }            }        }        /// <summary>        ///     Clear the entire cache for a given cache type <see cref="ConfigurationCacheType" />. Intended for use when the        ///     database server has changed and therefore the entire cache needs to be reset.        /// </summary>        /// <param name="type">The type of cache to clear. </param>        public static void ClearAll(ConfigurationCacheType type)        {            var _cache = GetCache(type);            _cache.Clear();        }    }}
 |