You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
4.1 KiB
104 lines
4.1 KiB
8 years ago
|
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<string, Plugin> Plugins = new Dictionary<string, Plugin>();
|
||
|
|
||
|
/// <summary>
|
||
|
/// Get plugin by keyword.
|
||
|
/// </summary>
|
||
|
/// <param name="Keyword">Keyword of plugin.</param>
|
||
|
/// <returns></returns>
|
||
|
public static Plugin GetPlugin(string Keyword)
|
||
|
{
|
||
|
Keyword = Keyword.ToLower().Trim();
|
||
|
return Plugins.ContainsKey(Keyword) ? Plugins[Keyword] : null;
|
||
|
}
|
||
|
}
|
||
|
}
|