using System; using System.Collections.Generic; using System.IO; using System.Text; using TweetDuck.Plugins.Events; namespace TweetDuck.Plugins{ sealed class PluginConfig{ public event EventHandler<PluginChangedStateEventArgs> PluginChangedState; public IEnumerable<string> DisabledPlugins => disabled; public bool AnyDisabled => disabled.Count > 0; private static readonly string[] DefaultDisabled = { "official/clear-columns", "official/reply-account" }; private readonly HashSet<string> disabled = new HashSet<string>(); public void SetEnabled(Plugin plugin, bool enabled){ if ((enabled && disabled.Remove(plugin.Identifier)) || (!enabled && disabled.Add(plugin.Identifier))){ PluginChangedState?.Invoke(this, new PluginChangedStateEventArgs(plugin, enabled)); } } public void ToggleEnabled(Plugin plugin){ SetEnabled(plugin, !IsEnabled(plugin)); } public bool IsEnabled(Plugin plugin){ return !disabled.Contains(plugin.Identifier); } public void Save(string file){ try{ using(StreamWriter writer = new StreamWriter(new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None), Encoding.UTF8)){ writer.WriteLine("#Disabled"); foreach(string identifier in disabled){ writer.WriteLine(identifier); } } }catch(Exception e){ Program.Reporter.HandleException("Plugin Configuration Error", "Could not save the plugin configuration file.", true, e); } } public void Load(string file){ try{ using(StreamReader reader = new StreamReader(new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read), Encoding.UTF8)){ string line = reader.ReadLine(); if (line == "#Disabled"){ disabled.Clear(); while((line = reader.ReadLine()) != null){ disabled.Add(line); } } } }catch(FileNotFoundException){ disabled.Clear(); disabled.UnionWith(DefaultDisabled); Save(file); }catch(DirectoryNotFoundException){ }catch(Exception e){ Program.Reporter.HandleException("Plugin Configuration Error", "Could not read the plugin configuration file. If you continue, the list of disabled plugins will be reset to default.", true, e); } } } }