using System.Collections.Generic; using Artemis.Storage.Entities.Plugins; using Artemis.Storage.Repositories.Interfaces; using Newtonsoft.Json; namespace Artemis.Core.Plugins.Models { /// /// 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 PluginInfo _pluginInfo; private readonly IPluginRepository _pluginRepository; private readonly Dictionary _settingEntities; internal PluginSettings(PluginInfo pluginInfo, IPluginRepository pluginRepository) { _pluginInfo = pluginInfo; _pluginRepository = pluginRepository; _settingEntities = new Dictionary(); } /// /// 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 var settingEntity = _pluginRepository.GetSettingByNameAndGuid(name, _pluginInfo.Guid); // If not found, create a new one if (settingEntity == null) { settingEntity = new PluginSettingEntity {Name = name, PluginGuid = _pluginInfo.Guid, Value = JsonConvert.SerializeObject(defaultValue)}; _pluginRepository.AddSetting(settingEntity); } var pluginSetting = new PluginSetting(_pluginInfo, _pluginRepository, settingEntity); _settingEntities.Add(name, pluginSetting); return pluginSetting; } } } }