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;
_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 = JsonConvert.SerializeObject(defaultValue)};
_pluginRepository.AddSetting(settingEntity);
}
PluginSetting pluginSetting = new PluginSetting(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;
}
}
}
}