slabOS/lib/basalt/plugin.lua
2025-06-02 10:23:40 +03:00

112 lines
3.8 KiB
Lua

local args = {...}
local plugins = {}
local pluginNames = {}
local dir = fs.getDir(args[2] or "Basalt")
local pluginDir = fs.combine(dir, "plugins")
if(packaged)then
for k,v in pairs(getProject("plugins"))do
table.insert(pluginNames, k)
local newPlugin = v()
if(type(newPlugin)=="table")then
for a,b in pairs(newPlugin)do
if(type(a)=="string")then
if(plugins[a]==nil)then plugins[a] = {} end
table.insert(plugins[a], b)
end
end
end
end
else
if(fs.exists(pluginDir))then
for _,v in pairs(fs.list(pluginDir))do
local newPlugin
if(fs.isDir(fs.combine(pluginDir, v)))then
table.insert(pluginNames, fs.combine(pluginDir, v))
newPlugin = require(v.."/init")
else
table.insert(pluginNames, v)
newPlugin = require(v:gsub(".lua", ""))
end
if(type(newPlugin)=="table")then
for a,b in pairs(newPlugin)do
if(type(a)=="string")then
if(plugins[a]==nil)then plugins[a] = {} end
table.insert(plugins[a], b)
end
end
end
end
end
end
local function get(name)
return plugins[name]
end
return {
--- Gets a plugin list
--- @param name string name of plugin list
--- @return table plugins
get = get,
getAvailablePlugins = function()
return pluginNames
end,
--- Adds a plugin to basalt's plugin list
--- @param path string path to plugin
addPlugin = function(path)
if(fs.exists(path))then
if(fs.isDir(path))then
for _,v in pairs(fs.list(path))do
table.insert(pluginNames, v)
if not(fs.isDir(fs.combine(path, v)))then
local pluginName = v:gsub(".lua", "")
local newPlugin = require(fs.combine(path, pluginName))
if(type(newPlugin)=="table")then
for a,b in pairs(newPlugin)do
if(type(a)=="string")then
if(plugins[a]==nil)then plugins[a] = {} end
table.insert(plugins[a], b)
end
end
end
end
end
else
local newPlugin = require(path:gsub(".lua", ""))
table.insert(pluginNames, path:match("[\\/]?([^\\/]-([^%.]+))$"))
if(type(newPlugin)=="table")then
for a,b in pairs(newPlugin)do
if(type(a)=="string")then
if(plugins[a]==nil)then plugins[a] = {} end
table.insert(plugins[a], b)
end
end
end
end
end
end,
--- Loads all available plugins into basalt's objects
--- @param objects table objects to load plugins into
--- @param basalt table basalt
--- @return table objects modified objects
loadPlugins = function(objects, basalt)
for k,v in pairs(objects)do
local plugList = plugins[k]
if(plugList~=nil)then
objects[k] = function(...)
local moddedObject = v(...)
for _,b in pairs(plugList)do
local ext = b(moddedObject, basalt, ...)
ext.__index = ext
moddedObject = setmetatable(ext, moddedObject)
end
return moddedObject
end
end
end
return objects
end
}