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

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;
}
}
}