mirror of
https://github.com/edubart/otclient.git
synced 2025-10-19 05:53:26 +02:00
add modulemanager module
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <framework/global.h>
|
||||
|
||||
class ModuleManager;
|
||||
class Module;
|
||||
class Event;
|
||||
class ScheduledEvent;
|
||||
|
@@ -31,36 +31,6 @@ Module::Module(const std::string& name)
|
||||
m_name = name;
|
||||
}
|
||||
|
||||
void Module::discover(const OTMLNodePtr& moduleNode)
|
||||
{
|
||||
const static std::string none = "none";
|
||||
m_description = moduleNode->valueAt("description", none);
|
||||
m_author = moduleNode->valueAt("author", none);
|
||||
m_website = moduleNode->valueAt("website", none);
|
||||
m_version = moduleNode->valueAt("version", none);
|
||||
m_autoLoad = moduleNode->valueAt<bool>("autoLoad", false);
|
||||
m_autoLoadAntecedence = moduleNode->valueAt<int>("autoLoadAntecedence", 100);
|
||||
|
||||
if(OTMLNodePtr node = moduleNode->get("dependencies")) {
|
||||
for(const OTMLNodePtr& tmp : node->children())
|
||||
m_dependencies.push_back(tmp->value());
|
||||
}
|
||||
|
||||
// set onLoad callback
|
||||
if(OTMLNodePtr node = moduleNode->get("onLoad")) {
|
||||
g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]");
|
||||
g_lua.useValue();
|
||||
m_loadCallback = g_lua.polymorphicPop<SimpleCallback>();
|
||||
}
|
||||
|
||||
// set onUnload callback
|
||||
if(OTMLNodePtr node = moduleNode->get("onUnload")) {
|
||||
g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]");
|
||||
g_lua.useValue();
|
||||
m_unloadCallback = g_lua.polymorphicPop<SimpleCallback>();
|
||||
}
|
||||
}
|
||||
|
||||
bool Module::load()
|
||||
{
|
||||
if(m_loaded)
|
||||
@@ -95,3 +65,34 @@ void Module::unload()
|
||||
m_loaded = false;
|
||||
}
|
||||
}
|
||||
|
||||
void Module::discover(const OTMLNodePtr& moduleNode)
|
||||
{
|
||||
const static std::string none = "none";
|
||||
m_description = moduleNode->valueAt("description", none);
|
||||
m_author = moduleNode->valueAt("author", none);
|
||||
m_website = moduleNode->valueAt("website", none);
|
||||
m_version = moduleNode->valueAt("version", none);
|
||||
m_autoLoad = moduleNode->valueAt<bool>("autoLoad", false);
|
||||
m_autoLoadAntecedence = moduleNode->valueAt<int>("autoLoadAntecedence", 100);
|
||||
|
||||
if(OTMLNodePtr node = moduleNode->get("dependencies")) {
|
||||
for(const OTMLNodePtr& tmp : node->children())
|
||||
m_dependencies.push_back(tmp->value());
|
||||
}
|
||||
|
||||
// set onLoad callback
|
||||
if(OTMLNodePtr node = moduleNode->get("onLoad")) {
|
||||
g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]");
|
||||
g_lua.useValue();
|
||||
m_loadCallback = g_lua.polymorphicPop<SimpleCallback>();
|
||||
}
|
||||
|
||||
// set onUnload callback
|
||||
if(OTMLNodePtr node = moduleNode->get("onUnload")) {
|
||||
g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]");
|
||||
g_lua.useValue();
|
||||
m_unloadCallback = g_lua.polymorphicPop<SimpleCallback>();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -26,12 +26,12 @@
|
||||
#include "declarations.h"
|
||||
|
||||
#include <framework/otml/declarations.h>
|
||||
#include <framework/luascript/luaobject.h>
|
||||
|
||||
class Module
|
||||
class Module : public LuaObject
|
||||
{
|
||||
public:
|
||||
Module(const std::string& name);
|
||||
void discover(const OTMLNodePtr& moduleNode);
|
||||
|
||||
bool load();
|
||||
void unload();
|
||||
@@ -46,6 +46,10 @@ public:
|
||||
bool isAutoLoad() { return m_autoLoad; }
|
||||
int getAutoLoadAntecedence() { return m_autoLoadAntecedence; }
|
||||
|
||||
protected:
|
||||
void discover(const OTMLNodePtr& moduleNode);
|
||||
friend class ModuleManager;
|
||||
|
||||
private:
|
||||
Boolean<false> m_loaded;
|
||||
Boolean<false> m_autoLoad;
|
||||
|
@@ -30,6 +30,9 @@ ModuleManager g_modules;
|
||||
|
||||
void ModuleManager::discoverModules()
|
||||
{
|
||||
// remove modules that are not loaded
|
||||
m_autoLoadModules.clear();
|
||||
|
||||
auto moduleDirs = g_resources.listDirectoryFiles("/");
|
||||
for(const std::string& moduleDir : moduleDirs) {
|
||||
auto moduleFiles = g_resources.listDirectoryFiles("/" + moduleDir);
|
||||
@@ -85,12 +88,19 @@ ModulePtr ModuleManager::discoverModule(const std::string& moduleFile)
|
||||
OTMLNodePtr moduleNode = doc->at("Module");
|
||||
|
||||
std::string name = moduleNode->valueAt("name");
|
||||
if(getModule(name))
|
||||
Fw::throwException("module '", name, "' already exists, cannot have duplicate module names");
|
||||
//if(getModule(name))
|
||||
// Fw::throwException("module '", name, "' already exists, cannot have duplicate module names");
|
||||
|
||||
module = ModulePtr(new Module(name));
|
||||
bool push = false;
|
||||
module = getModule(name);
|
||||
if(!module) {
|
||||
module = ModulePtr(new Module(name));
|
||||
push = true;
|
||||
}
|
||||
module->discover(moduleNode);
|
||||
m_modules.push_back(module);
|
||||
|
||||
if(push)
|
||||
m_modules.push_back(module);
|
||||
} catch(Exception& e) {
|
||||
logError("Unable to discover module from file '", moduleFile, "': ", e.what());
|
||||
}
|
||||
|
@@ -36,6 +36,7 @@ public:
|
||||
void unloadModules();
|
||||
|
||||
ModulePtr getModule(const std::string& moduleName);
|
||||
std::vector<ModulePtr> getModules() { return m_modules; }
|
||||
|
||||
private:
|
||||
std::vector<ModulePtr> m_modules;
|
||||
|
Reference in New Issue
Block a user