using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Reflection; namespace ProxyCore.Scripting { public static class PluginMgr { internal static void LoadAll() { if(Plugins.Count != 0) return; try { if(!Directory.Exists("plugins")) { Directory.CreateDirectory("plugins"); return; } } catch { return; } string[] files = Directory.GetFiles("plugins", "*.dll"); if(files.Length != 0) { foreach(string file in files) { try { Assembly assembly = Assembly.LoadFrom(Path.GetFullPath(file)); foreach(Type type in assembly.GetTypes()) { if(!type.IsClass || type.IsNotPublic) continue; if(type.BaseType == typeof(Plugin)) { try { Plugin obj = (Plugin) Activator.CreateInstance(type); obj.ClassName = type.ToString(); if(obj.RequiredCoreVersion > World.Version) throw new Exception("Newer version of core is needed! (" + obj.RequiredCoreVersion + ")"); if(string.IsNullOrEmpty(obj.Keyword.Trim()) || string.IsNullOrEmpty(obj.Name.Trim())) throw new Exception("Plugin has invalid parameters!"); if(Plugins.ContainsKey(obj.Keyword.ToLower().Trim())) { Plugin prev = Plugins[obj.Keyword.ToLower().Trim()]; if(prev.Version >= obj.Version) throw new Exception("A newer version of this plugin was already loaded!"); } if(obj.Keyword.ToLower().Trim() == "core" || obj.Keyword.ToLower().Trim() == "server") throw new Exception("Plugin has invalid keyword!"); if(obj.Config != null) { obj.Config.Load(obj.Keyword.ToLower().Trim()); obj.OnLoadedConfig(obj.Config.DidLoad); } Plugins[obj.Keyword.ToLower().Trim()] = obj; Log.Write("Loaded: [" + obj.Keyword.ToLower().Trim() + "] " + obj.Name + ", version " + obj.Version.ToString() + "."); } catch(Exception e) { Log.Write("Failed: [" + type.ToString() + "] in " + file + "!"); Log.Write(" " + e.Message); continue; } } } } catch { continue; } } } Log.Write("Done."); } internal static Dictionary Plugins = new Dictionary(); /// /// Get plugin by keyword. /// /// Keyword of plugin. /// public static Plugin GetPlugin(string Keyword) { Keyword = Keyword.ToLower().Trim(); return Plugins.ContainsKey(Keyword) ? Plugins[Keyword] : null; } } }