using System.Collections.Generic; using Artemis.Storage.Entities.Plugins; using Artemis.Storage.Repositories.Interfaces; using Newtonsoft.Json; namespace Artemis.Core { /// /// This contains all the settings for your plugin. To access a setting use . /// To use this class, inject it into the constructor of your plugin. /// public class PluginSettings { private readonly IPluginRepository _pluginRepository; private readonly Dictionary _settingEntities; internal PluginSettings(Plugin plugin, IPluginRepository pluginRepository) { Plugin = plugin; Plugin.Settings = this; _pluginRepository = pluginRepository; _settingEntities = new Dictionary(); } /// /// Gets the plugin these settings belong to /// public Plugin Plugin { get; } /// /// Gets the setting with the provided name. If the setting does not exist yet, it is created. /// /// The type of the setting, can be any serializable type /// The name of the setting /// The default value to use if the setting does not exist yet /// public PluginSetting GetSetting(string name, T? defaultValue = default) { lock (_settingEntities) { // Return cached value if available if (_settingEntities.ContainsKey(name)) return (PluginSetting) _settingEntities[name]; // Try to find in database PluginSettingEntity settingEntity = _pluginRepository.GetSettingByNameAndGuid(name, Plugin.Guid); // If not found, create a new one if (settingEntity == null) { settingEntity = new PluginSettingEntity { Name = name, PluginGuid = Plugin.Guid, Value = CoreJson.SerializeObject(defaultValue) }; _pluginRepository.AddSetting(settingEntity); } PluginSetting pluginSetting = new(Plugin, _pluginRepository, settingEntity); // This overrides null with the default value, I'm not sure if that's desirable because you // might expect something to go null and you might not // if (pluginSetting.Value == null && defaultValue != null) // pluginSetting.Value = defaultValue; _settingEntities.Add(name, pluginSetting); return pluginSetting; } } internal void ClearSettings() { _settingEntities.Clear(); } } }