diff --git a/Plugins/Enums/PluginEnvironment.cs b/Plugins/Enums/PluginEnvironment.cs index 23702dba..bd4fb2c0 100644 --- a/Plugins/Enums/PluginEnvironment.cs +++ b/Plugins/Enums/PluginEnvironment.cs @@ -1,5 +1,8 @@ using System; +using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace TweetDuck.Plugins.Enums{ [Flags] @@ -45,5 +48,50 @@ public static string GetPluginScriptVariables(this PluginEnvironment environment default: return string.Empty; } } + + public static IReadOnlyDictionary<PluginEnvironment, T> Map<T>(T forNone, T forBrowser, T forNotification){ + return new PluginEnvironmentDictionary<T>(forNone, forBrowser, forNotification); + } + + [SuppressMessage("ReSharper", "MemberHidesStaticFromOuterClass")] + private sealed class PluginEnvironmentDictionary<T> : IReadOnlyDictionary<PluginEnvironment, T>{ + private const int TotalKeys = 3; + + public IEnumerable<PluginEnvironment> Keys => Enum.GetValues(typeof(PluginEnvironment)).Cast<PluginEnvironment>(); + public IEnumerable<T> Values => data; + public int Count => TotalKeys; + + public T this[PluginEnvironment key] => data[(int)key]; + + private readonly T[] data; + + public PluginEnvironmentDictionary(T forNone, T forBrowser, T forNotification){ + this.data = new T[TotalKeys]; + this.data[(int)PluginEnvironment.None] = forNone; + this.data[(int)PluginEnvironment.Browser] = forBrowser; + this.data[(int)PluginEnvironment.Notification] = forNotification; + } + + public bool ContainsKey(PluginEnvironment key){ + return key >= 0 && (int)key < TotalKeys; + } + + public bool TryGetValue(PluginEnvironment key, out T value){ + if (ContainsKey(key)){ + value = this[key]; + return true; + } + else{ + value = default(T); + return false; + } + } + + public IEnumerator<KeyValuePair<PluginEnvironment, T>> GetEnumerator(){ + return Keys.Select(key => new KeyValuePair<PluginEnvironment, T>(key, this[key])).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + } } } diff --git a/Plugins/PluginManager.cs b/Plugins/PluginManager.cs index 53a85bf3..351bfccf 100644 --- a/Plugins/PluginManager.cs +++ b/Plugins/PluginManager.cs @@ -12,11 +12,15 @@ namespace TweetDuck.Plugins{ sealed class PluginManager{ - private static readonly Dictionary<PluginEnvironment, string> PluginSetupScripts = new Dictionary<PluginEnvironment, string>(4){ - { PluginEnvironment.None, ScriptLoader.LoadResource("plugins.js") }, - { PluginEnvironment.Browser, ScriptLoader.LoadResource("plugins.browser.js") }, - { PluginEnvironment.Notification, ScriptLoader.LoadResource("plugins.notification.js") } - }; + private static IReadOnlyDictionary<PluginEnvironment, string> LoadSetupScripts(){ + return PluginEnvironmentExtensions.Map( + ScriptLoader.LoadResource("plugins.js"), + ScriptLoader.LoadResource("plugins.browser.js"), + ScriptLoader.LoadResource("plugins.notification.js") + ); + } + + private static readonly IReadOnlyDictionary<PluginEnvironment, string> PluginSetupScripts = LoadSetupScripts(); public string PathOfficialPlugins => Path.Combine(rootPath, "official"); public string PathCustomPlugins => Path.Combine(rootPath, "user");