diff --git a/IPA.Loader/Config/Config.cs b/IPA.Loader/Config/Config.cs
index a2232fd7..68169fca 100644
--- a/IPA.Loader/Config/Config.cs
+++ b/IPA.Loader/Config/Config.cs
@@ -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
}
}
+ ///
+ ///
+ /// Specifies a preferred config name, instead of using the plugin's name.
+ ///
+ public class NameAttribute : Attribute
+ {
+ ///
+ /// The name to use for the config.
+ ///
+ // ReSharper disable once UnusedAutoPropertyAccessor.Global
+ public string Name { get; private set; }
+
+ ///
+ ///
+ /// Constructs the attribute with a specific name.
+ ///
+ /// the name to use for the config.
+ public NameAttribute(string name)
+ {
+ Name = name;
+ }
+ }
+
private static readonly Dictionary registeredProviders = new Dictionary();
///
@@ -96,36 +120,32 @@ namespace IPA.Config
///
/// Gets an using the specified list pf preferred config types.
///
- /// the name of the file to associate it with
+ /// the name of the mod for this config
/// the preferred config types to try to get
/// an of the requested type, or of type JSON.
- 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;
}
-
- ///
- /// Gets an using the specified list pf preferred config types.
- ///
- /// the name of the file to associate it with
- /// the parameter info to try and get info for
- /// an of the requested type, or of type JSON.
- 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() is PreferAttribute prefer)
prefs = prefer.PreferenceOrder;
+ if (info.GetCustomAttribute() is NameAttribute name)
+ modName = name.Name;
- return GetProviderFor(filename, prefs);
+ return GetProviderFor(modName, prefs);
}
private static Dictionary linkedProviders =
diff --git a/IPA.Loader/Config/ConfigProviders/JsonConfigProvider.cs b/IPA.Loader/Config/ConfigProviders/JsonConfigProvider.cs
index 84396786..be81baea 100644
--- a/IPA.Loader/Config/ConfigProviders/JsonConfigProvider.cs
+++ b/IPA.Loader/Config/ConfigProviders/JsonConfigProvider.cs
@@ -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;
diff --git a/IPA.Loader/Config/ModPrefs.cs b/IPA.Loader/Config/ModPrefs.cs
index 16dd5c7b..e63002f7 100644
--- a/IPA.Loader/Config/ModPrefs.cs
+++ b/IPA.Loader/Config/ModPrefs.cs
@@ -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 ModPrefss { get; set; } = new Dictionary();
-
private readonly IniFile _instance;
///
/// Constructs a ModPrefs object for the provide plugin.
///
/// the plugin to get the preferences file for
- 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);
}
-
- ///
- /// An extension class for IBeatSaberPlugins.
- ///
- public static class ModPrefsExtensions {
- ///
- /// Gets the ModPrefs object for the provided plugin.
- ///
- /// the plugin wanting the prefrences
- /// the ModPrefs object
- public static IModPrefs GetModPrefs(this IBeatSaberPlugin plugin) {
- return ModPrefs.ModPrefss.First(o => o.Key == plugin).Value;
- }
- }
}