Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local DEFAULT_UPATH = 'https://raw.githubusercontent.com/kepler155c/opus/master/sys/apis'
- local PASTEBIN_URL = 'http://pastebin.com/raw'
- local GIT_URL = 'https://raw.githubusercontent.com'
- -- 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
- end
- if not s then
- error(m)
- end
- end
- 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
- end
- local function requireWrapper(env)
- local function standardSearcher(modname, env, shell)
- if package.loaded[modname] then
- return function()
- return package.loaded[modname]
- end
- end
- end
- local function shellSearcher(modname, env, shell)
- local fname = modname:gsub('%.', '/') .. '.lua'
- 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)
- end
- end
- end
- 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)
- if fs.exists(path) and not fs.isDir(path) then
- return loadfile(path, env)
- end
- end
- end
- -- 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
- -- 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
- local url = GIT_URL .. '/' .. fname
- local c = loadUrl(url)
- if c then
- return load(c, modname, nil, env)
- end
- end
- end
- local function urlSearcher(modname, env, shell)
- local fname = modname:gsub('%.', '/') .. '.lua'
- 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
- end
- end
- end
- -- place package and require function into env
- package = {
- path = LUA_PATH or 'sys/apis',
- upath = LUA_UPATH or DEFAULT_UPATH,
- config = '/\n:\n?\n!\n-',
- loaded = {
- math = math,
- string = string,
- table = table,
- io = io,
- os = os,
- },
- loaders = {
- standardSearcher,
- shellSearcher,
- pathSearcher,
- pastebinSearcher,
- gitSearcher,
- urlSearcher,
- }
- }
- function require(modname)
- for _,searcher in ipairs(package.loaders) do
- local fn, msg = searcher(modname, env, shell)
- if fn then
- local module, msg = fn(modname, env)
- if not module then
- error(msg or (modname .. ' module returned nil'), 2)
- end
- package.loaded[modname] = module
- return module
- end
- if msg then
- error(msg, 2)
- end
- end
- error('Unable to find module ' .. modname)
- end
- return require -- backwards compatible
- end
- return function(env)
- setfenv(requireWrapper, env)
- return requireWrapper(env)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement