using CppCompatibilityModule.Extern; using DiscordBotCore; using DiscordBotCore.Logging; namespace CppCompatibilityModule; internal class ExternalApplicationManager { private readonly ILogger _Logger; private List _ExternalApplications; public ExternalApplicationManager(ILogger logger) { _Logger = logger; _ExternalApplications = new List(); } public bool TryCreateApplication(string applicationFileName, out Guid applicationId) { ExternalApplication? externalApplication = ExternalApplication.CreateFromDllFile(_Logger, applicationFileName); if(externalApplication is null) { applicationId = Guid.Empty; return false; } _ExternalApplications.Add(externalApplication); applicationId = externalApplication.ApplicationId; return true; } public void FreeApplication(Guid applicationId) { var application = _ExternalApplications.FirstOrDefault(app => app.ApplicationId == applicationId, null); if(application is null) { _Logger.Log($"Couldn't find application with id {applicationId}"); return; } application.FreeLibrary(); _ExternalApplications.Remove(application); _Logger.Log($"Application with id {applicationId} freed successfully"); } public T GetFunctionDelegate(Guid applicationId, string functionName) where T : Delegate { var application = _ExternalApplications.FirstOrDefault(app => app.ApplicationId == applicationId, null); if(application is null) { _Logger.Log($"Couldn't find application with id {applicationId}"); return default!; } return application.GetDelegateForFunctionPointer(functionName); } public object? SetExternFunctionToPointToFunction(Guid applicationId, string externalFunctionName, TLocalFunctionDelegate localFunction) where TLocalFunctionDelegate : Delegate { var application = _ExternalApplications.FirstOrDefault(app => app.ApplicationId == applicationId, null); if(application is null) { _Logger.Log($"Couldn't find application with id {applicationId}"); return null; } return application.SetExternFunctionToPointToFunction(externalFunctionName, localFunction); } }