Browse Source

Changed config to take PluginMetadata

pull/46/head
DaNike 5 years ago
parent
commit
54bcf2e30e
3 changed files with 37 additions and 34 deletions
  1. +33
    -13
      IPA.Loader/Config/Config.cs
  2. +2
    -0
      IPA.Loader/Config/ConfigProviders/JsonConfigProvider.cs
  3. +2
    -21
      IPA.Loader/Config/ModPrefs.cs

+ 33
- 13
IPA.Loader/Config/Config.cs View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using IPA.Config.ConfigProviders;
@ -65,6 +66,29 @@ namespace IPA.Config
}
}
/// <inheritdoc />
/// <summary>
/// Specifies a preferred config name, instead of using the plugin's name.
/// </summary>
public class NameAttribute : Attribute
{
/// <summary>
/// The name to use for the config.
/// </summary>
// ReSharper disable once UnusedAutoPropertyAccessor.Global
public string Name { get; private set; }
/// <inheritdoc />
/// <summary>
/// Constructs the attribute with a specific name.
/// </summary>
/// <param name="name">the name to use for the config.</param>
public NameAttribute(string name)
{
Name = name;
}
}
private static readonly Dictionary<string, Type> registeredProviders = new Dictionary<string, Type>();
/// <summary>
@ -96,36 +120,32 @@ namespace IPA.Config
/// <summary>
/// Gets an <see cref="IConfigProvider"/> using the specified list pf preferred config types.
/// </summary>
/// <param name="filename">the name of the file to associate it with</param>
/// <param name="configName">the name of the mod for this config</param>
/// <param name="extensions">the preferred config types to try to get</param>
/// <returns>an <see cref="IConfigProvider"/> of the requested type, or of type JSON.</returns>
public static IConfigProvider GetProviderFor(string filename, params string[] extensions)
public static IConfigProvider GetProviderFor(string configName, params string[] extensions)
{
var chosenExt = extensions.FirstOrDefault(s => registeredProviders.ContainsKey(s)) ?? "json";
var type = registeredProviders[chosenExt];
var provider = Activator.CreateInstance(type) as IConfigProvider;
if (provider != null)
{
provider.Filename = filename;
provider.Filename = Path.Combine(BeatSaber.UserDataPath, configName);
configProviders.Add(provider.LastModified, provider);
}
return provider;
}
/// <summary>
/// Gets an <see cref="IConfigProvider"/> using the specified list pf preferred config types.
/// </summary>
/// <param name="filename">the name of the file to associate it with</param>
/// <param name="info">the parameter info to try and get info for</param>
/// <returns>an <see cref="IConfigProvider"/> of the requested type, or of type JSON.</returns>
public static IConfigProvider GetProviderFor(string filename, ParameterInfo info)
internal static IConfigProvider GetProviderFor(string modName, ParameterInfo info)
{
var prefs = new string[0];
if (info.GetCustomAttribute(typeof(PreferAttribute)) is PreferAttribute prefer)
if (info.GetCustomAttribute<PreferAttribute>() is PreferAttribute prefer)
prefs = prefer.PreferenceOrder;
if (info.GetCustomAttribute<NameAttribute>() is NameAttribute name)
modName = name.Name;
return GetProviderFor(filename, prefs);
return GetProviderFor(modName, prefs);
}
private static Dictionary<IConfigProvider, Action> linkedProviders =


+ 2
- 0
IPA.Loader/Config/ConfigProviders/JsonConfigProvider.cs View File

@ -103,6 +103,8 @@ namespace IPA.Config.ConfigProviders
public void Save()
{
Logger.config.Debug($"Saving file {Filename}.json");
if (!Directory.Exists(Path.GetDirectoryName(Filename)))
Directory.CreateDirectory(Path.GetDirectoryName(Filename) ?? throw new InvalidOperationException());
File.WriteAllText(Filename + ".json", JsonConvert.SerializeObject(jsonObj, Formatting.Indented));
HasChanged = false;


+ 2
- 21
IPA.Loader/Config/ModPrefs.cs View File

@ -1,8 +1,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using IPA.Loader;
namespace IPA.Config
{
@ -93,19 +92,15 @@ namespace IPA.Config
private static ModPrefs _staticInstance;
private static IModPrefs StaticInstance => _staticInstance ?? (_staticInstance = new ModPrefs());
// ReSharper disable once IdentifierTypo
internal static Dictionary<IBeatSaberPlugin, ModPrefs> ModPrefss { get; set; } = new Dictionary<IBeatSaberPlugin, ModPrefs>();
private readonly IniFile _instance;
/// <summary>
/// Constructs a ModPrefs object for the provide plugin.
/// </summary>
/// <param name="plugin">the plugin to get the preferences file for</param>
public ModPrefs(IBeatSaberPlugin plugin) {
public ModPrefs(PluginLoader.PluginMetadata plugin) {
_instance = new IniFile(Path.Combine(Environment.CurrentDirectory, "UserData", "ModPrefs",
$"{plugin.Name}.ini"));
ModPrefss.Add(plugin, this);
}
private ModPrefs()
@ -263,18 +258,4 @@ namespace IPA.Config
public static void SetBool(string section, string name, bool value)
=> StaticInstance.SetBool(section, name, value);
}
/// <summary>
/// An extension class for IBeatSaberPlugins.
/// </summary>
public static class ModPrefsExtensions {
/// <summary>
/// Gets the ModPrefs object for the provided plugin.
/// </summary>
/// <param name="plugin">the plugin wanting the prefrences</param>
/// <returns>the ModPrefs object</returns>
public static IModPrefs GetModPrefs(this IBeatSaberPlugin plugin) {
return ModPrefs.ModPrefss.First(o => o.Key == plugin).Value;
}
}
}

Loading…
Cancel
Save