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.
108 lines
2.6 KiB
108 lines
2.6 KiB
require "util"
|
|
|
|
plugin = {}
|
|
plugin.loaders = {}
|
|
plugin.path = fs.ydwe_path() / "plugin"
|
|
plugin.blacklist = { 'YDTileLimitBreaker', 'YDCustomObjectId' }
|
|
|
|
function plugin.load (self, plugin_config_path)
|
|
log.trace("Load plugin config " .. plugin_config_path:string())
|
|
|
|
local plugin_config = sys.ini_load(plugin_config_path)
|
|
if not plugin_config then
|
|
log.error("Cannot found plugin config.")
|
|
return
|
|
end
|
|
|
|
local plugin_name = plugin_config['Info']['PluginName']
|
|
|
|
if plugin_name == '' then
|
|
log.error("Cannot plugin name.")
|
|
return
|
|
end
|
|
|
|
for _, v in pairs(plugin.blacklist) do
|
|
if v == plugin_name then
|
|
log.trace("Blacklist.")
|
|
return
|
|
end
|
|
end
|
|
|
|
if self.loaders[plugin_name] then
|
|
log.error(plugin_name .. " already exists.")
|
|
return
|
|
end
|
|
|
|
if 0 == tonumber(plugin_config['Load']['Enable']) then
|
|
log.debug("Disable " .. plugin_name .. ".")
|
|
return
|
|
end
|
|
|
|
local plugin_loader_path = plugin_config['Load']['Loader']
|
|
if plugin_loader_path == '' then
|
|
log.error("Cannot find " .. plugin_name .. "'s loader.")
|
|
return
|
|
end
|
|
plugin_loader_path = plugin_config_path:parent_path() / plugin_loader_path
|
|
if not fs.exists(plugin_loader_path) then
|
|
log.error(plugin_name .. "'loader does not exist.")
|
|
return
|
|
end
|
|
|
|
local s, r = pcall(dofile, __(plugin_loader_path:string()))
|
|
if not s then
|
|
log.error("Error in initialize " .. plugin_name .. "'s loader: ".. r)
|
|
return
|
|
end
|
|
|
|
self.loaders[plugin_name] = r
|
|
|
|
local plugin_dll_path = plugin_config['Load']['Dll']
|
|
if plugin_dll_path == '' then
|
|
log.error("Cannot find " .. plugin_name .. "'s dll.")
|
|
return
|
|
end
|
|
plugin_dll_path = plugin_config_path:parent_path() / plugin_dll_path
|
|
if not fs.exists(plugin_dll_path) then
|
|
log.error(plugin_name .. "'dll does not exist. " .. plugin_dll_path:string())
|
|
return
|
|
end
|
|
|
|
s, r = pcall(self.loaders[plugin_name].load, plugin_dll_path)
|
|
|
|
if not s then
|
|
log.error("Error in load " .. plugin_name .. ": ".. r)
|
|
self.loaders[plugin_name] = nil
|
|
return
|
|
end
|
|
|
|
if not r then
|
|
self.loaders[plugin_name] = nil
|
|
return
|
|
end
|
|
|
|
log.debug(plugin_name .. " loaded successfully.")
|
|
return
|
|
end
|
|
|
|
function plugin.load_directory (self, plugin_dir)
|
|
-- 遍历目录
|
|
for full_path in plugin_dir:list_directory() do
|
|
if fs.is_directory(full_path) then
|
|
self:load_directory(full_path)
|
|
elseif full_path:extension():string() == ".plcfg" then
|
|
self:load(full_path)
|
|
end
|
|
end
|
|
end
|
|
|
|
function plugin.load_all (self)
|
|
self:load_directory(self.path)
|
|
end
|
|
|
|
function plugin.unload_all (self)
|
|
for name, loader in pairs(self.loaders) do
|
|
log.trace("Unload plugin " .. name .. ".")
|
|
pcall(loader.unload)
|
|
end
|
|
end
|
|
|