using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace DiscordBotCore.Others.Settings; public abstract class CustomSettingsDictionaryBase : ICustomSettingsDictionary { protected readonly IDictionary _InternalDictionary = new Dictionary(); protected readonly string _DiskLocation; protected CustomSettingsDictionaryBase(string diskLocation) { this._DiskLocation = diskLocation; } public virtual void Add(TKey key, TValue value) { if (_InternalDictionary.ContainsKey(key)) return; if (value is null) return; _InternalDictionary.Add(key, value); } public virtual void Set(TKey key, TValue value) { _InternalDictionary[key] = value; } public virtual TValue Get(TKey key) { return _InternalDictionary[key]; } public virtual T Get(TKey key, T defaultValue) { if (_InternalDictionary.TryGetValue(key, out var value)) { return (T)Convert.ChangeType(value, typeof(T)); } return defaultValue; } public virtual T? Get(TKey key) { if (_InternalDictionary.TryGetValue(key, out var value)) { return (T)Convert.ChangeType(value, typeof(T)); } return default; } public virtual IDictionary GetDictionary(TKey key) { if (_InternalDictionary.TryGetValue(key, out var value)) { if (value is not IDictionary) { throw new Exception("The value is not a dictionary"); } var dictionary = new Dictionary(); foreach (DictionaryEntry item in (IDictionary)value) { dictionary.Add((TSubKey)Convert.ChangeType(item.Key, typeof(TSubKey)), (TSubValue)Convert.ChangeType(item.Value, typeof(TSubValue))); } return dictionary; } return new Dictionary(); } public virtual List GetList(TKey key, List defaultValue) { if(_InternalDictionary.TryGetValue(key, out var value)) { if (value is not IList) { throw new Exception("The value is not a list"); } var list = new List(); foreach (object? item in (IList)value) { list.Add((T)Convert.ChangeType(item, typeof(T))); } return list; } Application.CurrentApplication.Logger.Log($"Key '{key}' not found in settings dictionary. Adding default value.", LogType.Warning); return defaultValue; } public virtual void Remove(TKey key) { _InternalDictionary.Remove(key); } public virtual IEnumerator> GetEnumerator() { return _InternalDictionary.GetEnumerator(); } public virtual void Clear() { _InternalDictionary.Clear(); } public virtual bool ContainsKey(TKey key) { return _InternalDictionary.ContainsKey(key); } public virtual IEnumerable> Where(Func, bool> predicate) { return _InternalDictionary.Where(predicate); } public virtual IEnumerable> Where(Func, int, bool> predicate) { return _InternalDictionary.Where(predicate); } public virtual IEnumerable Where(Func, TResult> selector) { return _InternalDictionary.Select(selector); } public virtual IEnumerable Where(Func, int, TResult> selector) { return _InternalDictionary.Select(selector); } public virtual KeyValuePair FirstOrDefault(Func, bool> predicate) { return _InternalDictionary.FirstOrDefault(predicate); } public virtual KeyValuePair FirstOrDefault() { return _InternalDictionary.FirstOrDefault(); } public virtual bool ContainsAllKeys(params TKey[] keys) { return keys.All(ContainsKey); } public virtual bool TryGetValue(TKey key, out TValue? value) { return _InternalDictionary.TryGetValue(key, out value); } public abstract Task SaveToFile(); public abstract Task LoadFromFile(); }