1
0
mirror of https://github.com/kepler155c/opus synced 2024-06-14 09:26:54 +00:00
opus/sys/apis/injector.lua

166 lines
3.6 KiB
Lua
Raw Normal View History

2016-12-18 19:38:48 +00:00
local DEFAULT_UPATH = 'https://raw.githubusercontent.com/kepler155c/opus/master/sys/apis'
local PASTEBIN_URL = 'http://pastebin.com/raw'
2016-12-23 04:22:04 +00:00
local GIT_URL = 'https://raw.githubusercontent.com'
local function standardSearcher(modname, env, shell)
if package.loaded[modname] then
return function()
return package.loaded[modname]
end
end
end
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
local function shellSearcher(modname, env, shell)
local fname = modname:gsub('%.', '/') .. '.lua'
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
if shell and type(shell.dir) == 'function' then
local path = shell.resolve(fname)
if fs.exists(path) and not fs.isDir(path) then
return loadfile(path, env)
2016-12-11 19:24:52 +00:00
end
end
2016-12-18 19:38:48 +00:00
end
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
local function pathSearcher(modname, env, shell)
local fname = modname:gsub('%.', '/') .. '.lua'
for dir in string.gmatch(package.path, "[^:]+") do
local path = fs.combine(dir, fname)
2016-12-11 19:24:52 +00:00
if fs.exists(path) and not fs.isDir(path) then
2016-12-18 19:38:48 +00:00
return loadfile(path, env)
2016-12-11 19:24:52 +00:00
end
end
2016-12-18 19:38:48 +00:00
end
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
-- fix broken http get
local syncLocks = { }
local function sync(obj, fn)
local key = tostring(obj)
if syncLocks[key] then
local cos = tostring(coroutine.running())
table.insert(syncLocks[key], cos)
repeat
local _, co = os.pullEvent('sync_lock')
until co == cos
else
syncLocks[key] = { }
end
local s, m = pcall(fn)
local co = table.remove(syncLocks[key], 1)
if co then
os.queueEvent('sync_lock', co)
else
syncLocks[key] = nil
2016-12-11 19:24:52 +00:00
end
2016-12-18 19:38:48 +00:00
if not s then
error(m)
end
end
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
local function loadUrl(url)
local c
sync(url, function()
local h = http.get(url)
if h then
c = h.readAll()
h.close()
end
end)
if c and #c > 0 then
return c
end
2016-12-11 19:24:52 +00:00
end
2016-12-18 19:38:48 +00:00
-- require('BniCQPVf')
local function pastebinSearcher(modname, env, shell)
if #modname == 8 and not modname:match('%W') then
local url = PASTEBIN_URL .. '/' .. modname
local c = loadUrl(url)
if c then
return load(c, modname, nil, env)
end
end
end
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
-- require('kepler155c.opus.master.sys.apis.util')
local function gitSearcher(modname, env, shell)
local fname = modname:gsub('%.', '/') .. '.lua'
local _, count = fname:gsub("/", "")
if count >= 3 then
2016-12-23 04:22:04 +00:00
local url = GIT_URL .. '/' .. fname
2016-12-18 19:38:48 +00:00
local c = loadUrl(url)
if c then
return load(c, modname, nil, env)
end
end
end
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
local function urlSearcher(modname, env, shell)
local fname = modname:gsub('%.', '/') .. '.lua'
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
if fname:sub(1, 1) ~= '/' then
for entry in string.gmatch(package.upath, "[^;]+") do
local url = entry .. '/' .. fname
local c = loadUrl(url)
if c then
return load(c, modname, nil, env)
end
2016-12-11 19:24:52 +00:00
end
2016-12-18 19:38:48 +00:00
end
end
_G.package = {
path = LUA_PATH or 'sys/apis',
upath = LUA_UPATH or DEFAULT_UPATH,
2016-12-23 04:22:04 +00:00
config = '/\n:\n?\n!\n-',
loaded = {
math = math,
string = string,
table = table,
io = io,
os = os,
},
2016-12-18 19:38:48 +00:00
loaders = {
2016-12-23 04:22:04 +00:00
standardSearcher,
2016-12-18 19:38:48 +00:00
shellSearcher,
pathSearcher,
pastebinSearcher,
gitSearcher,
urlSearcher,
}
}
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
local function requireWrapper(env)
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
local loaded = { }
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
return function(modname)
2016-12-11 19:24:52 +00:00
2016-12-18 19:38:48 +00:00
if loaded[modname] then
return loaded[modname]
2016-12-11 19:24:52 +00:00
end
2016-12-18 19:38:48 +00:00
for _,searcher in ipairs(package.loaders) do
2016-12-23 04:22:04 +00:00
local fn, msg = searcher(modname, env, shell)
2016-12-18 19:38:48 +00:00
if fn then
local module, msg = fn(modname, env)
if not module then
error(msg)
end
loaded[modname] = module
return module
end
2016-12-23 04:22:04 +00:00
if msg then
2016-12-27 03:26:43 +00:00
error(msg, 2)
2016-12-23 04:22:04 +00:00
end
2016-12-18 19:38:48 +00:00
end
error('Unable to find module ' .. modname)
2016-12-11 19:24:52 +00:00
end
end
return function(env)
setfenv(requireWrapper, env)
return requireWrapper(env)
end