Add project files.
This commit is contained in:
82
PluginManager/Loaders/CommandsLoader.cs
Normal file
82
PluginManager/Loaders/CommandsLoader.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
namespace PluginManager.Loaders
|
||||
{
|
||||
public class CommandsLoader
|
||||
{
|
||||
private readonly string CMDPath;
|
||||
private readonly string CMDExtension;
|
||||
|
||||
public delegate void onCommandLoaded(string name, bool success, DBCommand? command = null, Exception? exception = null);
|
||||
|
||||
public delegate void onCommandFileLoaded(string path);
|
||||
|
||||
public onCommandLoaded? OnCommandLoaded;
|
||||
public onCommandFileLoaded? OnCommandFileLoaded;
|
||||
|
||||
public CommandsLoader(string CommandPath, string CommandExtension)
|
||||
{
|
||||
CMDPath = CommandPath;
|
||||
CMDExtension = CommandExtension;
|
||||
}
|
||||
|
||||
public List<DBCommand>? LoadCommands()
|
||||
{
|
||||
if (!Directory.Exists(CMDPath))
|
||||
{
|
||||
Directory.CreateDirectory(CMDPath);
|
||||
return null;
|
||||
}
|
||||
string[] files = Directory.GetFiles(CMDPath, $"*{CMDExtension}", SearchOption.AllDirectories);
|
||||
|
||||
foreach (var file in files)
|
||||
{
|
||||
Assembly.LoadFile(Path.GetFullPath(file));
|
||||
if (OnCommandFileLoaded != null)
|
||||
OnCommandFileLoaded.Invoke(file);
|
||||
}
|
||||
|
||||
List<DBCommand> plugins = new List<DBCommand>();
|
||||
|
||||
try
|
||||
{
|
||||
Type interfaceType = typeof(DBCommand);
|
||||
Type[] types = AppDomain.CurrentDomain.GetAssemblies()
|
||||
.SelectMany(a => a.GetTypes())
|
||||
.Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass)
|
||||
.ToArray();
|
||||
foreach (Type type in types)
|
||||
{
|
||||
try
|
||||
{
|
||||
DBCommand plugin = (DBCommand)Activator.CreateInstance(type)!;
|
||||
plugins.Add(plugin);
|
||||
|
||||
if (OnCommandLoaded != null)
|
||||
OnCommandLoaded.Invoke(type.FullName!, true, plugin);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (OnCommandLoaded != null)
|
||||
OnCommandLoaded.Invoke(type.FullName!, false, null, e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.Message);
|
||||
return null;
|
||||
}
|
||||
|
||||
return plugins;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
84
PluginManager/Loaders/EventsLoader.cs
Normal file
84
PluginManager/Loaders/EventsLoader.cs
Normal file
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
|
||||
namespace PluginManager.Loaders
|
||||
{
|
||||
public class EventsLoader
|
||||
{
|
||||
|
||||
private readonly string EVPath;
|
||||
private readonly string EVExtension;
|
||||
|
||||
public delegate void onEventLoad(string name, bool success, DBEvent? ev = null, Exception? e = null);
|
||||
public delegate void onEventFileLoaded(string path);
|
||||
|
||||
public onEventLoad? EventLoad;
|
||||
public onEventFileLoaded? EventFileLoaded;
|
||||
|
||||
public EventsLoader(string path, string ext)
|
||||
{
|
||||
EVPath = path;
|
||||
EVExtension = ext;
|
||||
}
|
||||
|
||||
public List<DBEvent>? LoadEvents()
|
||||
{
|
||||
|
||||
if (!Directory.Exists(EVPath))
|
||||
{
|
||||
Directory.CreateDirectory(EVPath);
|
||||
return null;
|
||||
}
|
||||
|
||||
string[] files = Directory.GetFiles(EVPath, $"*{EVExtension}", SearchOption.AllDirectories);
|
||||
|
||||
foreach (var file in files)
|
||||
{
|
||||
Assembly.LoadFile(Path.GetFullPath(file));
|
||||
if (EventFileLoaded != null)
|
||||
EventFileLoaded.Invoke(file);
|
||||
}
|
||||
|
||||
List<DBEvent> events = new List<DBEvent>();
|
||||
|
||||
try
|
||||
{
|
||||
Type interfaceType = typeof(DBEvent);
|
||||
Type[] types = AppDomain.CurrentDomain.GetAssemblies()
|
||||
.SelectMany(a => a.GetTypes())
|
||||
.Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass)
|
||||
.ToArray();
|
||||
foreach (Type type in types)
|
||||
{
|
||||
try
|
||||
{
|
||||
DBEvent ev = (DBEvent)Activator.CreateInstance(type)!;
|
||||
events.Add(ev);
|
||||
|
||||
if (EventLoad != null)
|
||||
EventLoad.Invoke(type.FullName!, true, ev);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
if (EventLoad != null)
|
||||
EventLoad.Invoke(type.FullName!, false, null, e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.Message);
|
||||
return null;
|
||||
}
|
||||
|
||||
return events;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
86
PluginManager/Loaders/PluginLoader.cs
Normal file
86
PluginManager/Loaders/PluginLoader.cs
Normal file
@@ -0,0 +1,86 @@
|
||||
using Discord.WebSocket;
|
||||
|
||||
using PluginManager.Interfaces;
|
||||
using PluginManager.Others;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
namespace PluginManager.Loaders
|
||||
{
|
||||
public class PluginLoader
|
||||
{
|
||||
private DiscordSocketClient client;
|
||||
public PluginLoader(DiscordSocketClient discordSocketClient)
|
||||
{
|
||||
this.client = discordSocketClient;
|
||||
}
|
||||
|
||||
private const string pluginCMDFolder = @"./Data/Plugins/Commands/";
|
||||
private const string pluginEVEFolder = @"./Data/Plugins/Events/";
|
||||
|
||||
private const string pluginCMDExtension = ".dll";
|
||||
private const string pluginEVEExtension = ".dll";
|
||||
|
||||
|
||||
public static List<DBCommand>? Plugins { get; set; }
|
||||
public static List<DBEvent>? Events { get; set; }
|
||||
|
||||
public delegate void CMDLoaded(string name, string typeName, bool success, Exception? e = null);
|
||||
|
||||
public delegate void EVELoaded(string name, string typeName, bool success, Exception? e = null);
|
||||
|
||||
public CMDLoaded? onCMDLoad;
|
||||
public EVELoaded? onEVELoad;
|
||||
|
||||
public void LoadPlugins()
|
||||
{
|
||||
|
||||
Plugins = new List<DBCommand>();
|
||||
Events = new List<DBEvent>();
|
||||
|
||||
Functions.WriteLogFile("Starting plugin loader...");
|
||||
if (LanguageSystem.Language.ActiveLanguage != null)
|
||||
Functions.WriteColorText(LanguageSystem.Language.ActiveLanguage.FormatText(LanguageSystem.Language.ActiveLanguage.LanguageWords["PLUGIN_LOADING_START"]));
|
||||
|
||||
//Load commands
|
||||
CommandsLoader CMDLoader = new CommandsLoader(pluginCMDFolder, pluginCMDExtension);
|
||||
CMDLoader.OnCommandLoaded += OnCommandLoaded!;
|
||||
CMDLoader.OnCommandFileLoaded += OnCommandFileLoaded;
|
||||
Plugins = CMDLoader.LoadCommands();
|
||||
|
||||
|
||||
//Load Events
|
||||
EventsLoader EVLoader = new EventsLoader(pluginEVEFolder, pluginEVEExtension);
|
||||
EVLoader.EventLoad += OnEventLoaded!;
|
||||
EVLoader.EventFileLoaded += EventFileLoaded;
|
||||
Events = EVLoader.LoadEvents();
|
||||
|
||||
}
|
||||
|
||||
private void EventFileLoaded(string path)
|
||||
{
|
||||
if (path != null)
|
||||
Functions.WriteLogFile($"[EVENT] Event from file [{path}] has been successfully created !");
|
||||
}
|
||||
|
||||
private void OnCommandFileLoaded(string path)
|
||||
{
|
||||
if (path != null)
|
||||
Functions.WriteLogFile($"[CMD] Command from file [{path}] has been successfully loaded !");
|
||||
}
|
||||
|
||||
private void OnEventLoaded(string typename, bool success, DBEvent eve, Exception exception)
|
||||
{
|
||||
if (eve != null && success)
|
||||
eve.Start(client);
|
||||
if (onEVELoad != null)
|
||||
onEVELoad.Invoke(eve!.name, typename, success, exception);
|
||||
}
|
||||
|
||||
private void OnCommandLoaded(string name, bool success, DBCommand command, Exception exception)
|
||||
{
|
||||
if (onCMDLoad != null)
|
||||
onCMDLoad.Invoke(command.Command, name, success, exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user