mirror of https://github.com/kepler155c/opus
cleanup
This commit is contained in:
parent
852ad193f0
commit
f9221e67be
|
@ -21,7 +21,12 @@ function NFT.parse(imageText)
|
||||||
}
|
}
|
||||||
|
|
||||||
local num = 1
|
local num = 1
|
||||||
for _,sLine in ipairs(Util.split(imageText)) do
|
local lines = Util.split(imageText)
|
||||||
|
while #lines[#lines] == 0 do
|
||||||
|
table.remove(lines, #lines)
|
||||||
|
end
|
||||||
|
|
||||||
|
for _,sLine in ipairs(lines) do
|
||||||
table.insert(image.fg, { })
|
table.insert(image.fg, { })
|
||||||
table.insert(image.bg, { })
|
table.insert(image.bg, { })
|
||||||
table.insert(image.text, { })
|
table.insert(image.text, { })
|
||||||
|
|
|
@ -380,15 +380,11 @@ function Util.download(url, filename)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Util.loadUrl(url, env) -- loadfile equivalent
|
function Util.loadUrl(url, env) -- loadfile equivalent
|
||||||
local s, m = pcall(function()
|
local c, msg = Util.httpGet(url)
|
||||||
local c = Util.download(url)
|
if not c then
|
||||||
return load(c, url, nil, env)
|
return c, msg
|
||||||
end)
|
|
||||||
|
|
||||||
if s then
|
|
||||||
return m
|
|
||||||
end
|
end
|
||||||
return s, m
|
return load(c, url, nil, env)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Util.runUrl(env, url, ...) -- os.run equivalent
|
function Util.runUrl(env, url, ...) -- os.run equivalent
|
||||||
|
|
|
@ -9,6 +9,7 @@ local colors = _G.colors
|
||||||
local device = _G.device
|
local device = _G.device
|
||||||
local multishell = _ENV.multishell
|
local multishell = _ENV.multishell
|
||||||
local network = _G.network
|
local network = _G.network
|
||||||
|
local os = _G.os
|
||||||
local shell = _ENV.shell
|
local shell = _ENV.shell
|
||||||
|
|
||||||
multishell.setTitle(multishell.getCurrent(), 'Network')
|
multishell.setTitle(multishell.getCurrent(), 'Network')
|
||||||
|
@ -112,7 +113,7 @@ function page:eventHandler(event)
|
||||||
elseif event.type == 'chat' then
|
elseif event.type == 'chat' then
|
||||||
multishell.openTab({
|
multishell.openTab({
|
||||||
path = 'sys/apps/shell',
|
path = 'sys/apps/shell',
|
||||||
args = { 'chat join opusChat-' .. t.id .. ' guest'},
|
args = { 'chat join opusChat-' .. t.id .. ' guest-' .. os.getComputerID() },
|
||||||
title = 'Chatroom',
|
title = 'Chatroom',
|
||||||
focused = true,
|
focused = true,
|
||||||
})
|
})
|
||||||
|
|
160
sys/apps/shell
160
sys/apps/shell
|
@ -1,16 +1,20 @@
|
||||||
local parentShell = shell
|
local parentShell = _ENV.shell
|
||||||
|
|
||||||
shell = { }
|
_ENV.shell = { }
|
||||||
multishell = multishell or { }
|
_ENV.multishell = _ENV.multishell or { }
|
||||||
|
|
||||||
|
local fs = _G.fs
|
||||||
|
local shell = _ENV.shell
|
||||||
|
local multishell = _ENV.multishell
|
||||||
|
|
||||||
local sandboxEnv = setmetatable({ }, { __index = _G })
|
local sandboxEnv = setmetatable({ }, { __index = _G })
|
||||||
for k,v in pairs(getfenv(1)) do
|
for k,v in pairs(_ENV) do
|
||||||
sandboxEnv[k] = v
|
sandboxEnv[k] = v
|
||||||
end
|
end
|
||||||
sandboxEnv.shell = shell
|
sandboxEnv.shell = shell
|
||||||
sandboxEnv.multishell = multishell
|
sandboxEnv.multishell = multishell
|
||||||
|
|
||||||
requireInjector(getfenv(1))
|
_G.requireInjector()
|
||||||
|
|
||||||
local Util = require('util')
|
local Util = require('util')
|
||||||
|
|
||||||
|
@ -40,42 +44,59 @@ local function parseCommandLine( ... )
|
||||||
return table.remove(tWords, 1), tWords
|
return table.remove(tWords, 1), tWords
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Install shell API
|
local function run(env, ...)
|
||||||
function shell.run(...)
|
|
||||||
|
|
||||||
local path, args = parseCommandLine(...)
|
local path, args = parseCommandLine(...)
|
||||||
local isUrl = not not path:match("^(https?:)//(([^/:]+):?([0-9]*))(/?.*)$")
|
|
||||||
|
|
||||||
|
if not path then
|
||||||
|
error('No such program')
|
||||||
|
end
|
||||||
|
|
||||||
|
local isUrl = not not path:match("^(https?:)//(([^/:]+):?([0-9]*))(/?.*)$")
|
||||||
if not isUrl then
|
if not isUrl then
|
||||||
path = shell.resolveProgram(path)
|
path = shell.resolveProgram(path)
|
||||||
|
if not path then
|
||||||
|
error('No such program')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if path then
|
local fn, err
|
||||||
|
|
||||||
|
if isUrl then
|
||||||
|
fn, err = Util.loadUrl(path, env)
|
||||||
|
else
|
||||||
|
fn, err = loadfile(path, env)
|
||||||
|
end
|
||||||
|
|
||||||
|
if not fn then
|
||||||
|
error(err)
|
||||||
|
end
|
||||||
|
|
||||||
|
local oldTitle
|
||||||
|
|
||||||
|
if multishell and multishell.getTitle then
|
||||||
|
oldTitle = multishell.getTitle(multishell.getCurrent())
|
||||||
|
multishell.setTitle(multishell.getCurrent(), fs.getName(path))
|
||||||
|
end
|
||||||
|
|
||||||
|
if isUrl then
|
||||||
|
tProgramStack[#tProgramStack + 1] = path:match("^https?://([^/:]+:?[0-9]*/?.*)$")
|
||||||
|
else
|
||||||
tProgramStack[#tProgramStack + 1] = path
|
tProgramStack[#tProgramStack + 1] = path
|
||||||
local oldTitle
|
|
||||||
|
|
||||||
if multishell and multishell.getTitle then
|
|
||||||
oldTitle = multishell.getTitle(multishell.getCurrent())
|
|
||||||
multishell.setTitle(multishell.getCurrent(), fs.getName(path))
|
|
||||||
end
|
|
||||||
|
|
||||||
local result, err
|
|
||||||
|
|
||||||
local env = Util.shallowCopy(sandboxEnv)
|
|
||||||
if isUrl then
|
|
||||||
result, err = Util.runUrl(env, path, unpack(args))
|
|
||||||
else
|
|
||||||
result, err = Util.run(env, path, unpack(args))
|
|
||||||
end
|
|
||||||
tProgramStack[#tProgramStack] = nil
|
|
||||||
|
|
||||||
if multishell and multishell.getTitle then
|
|
||||||
multishell.setTitle(multishell.getCurrent(), oldTitle or 'shell')
|
|
||||||
end
|
|
||||||
|
|
||||||
return result, err
|
|
||||||
end
|
end
|
||||||
return false, 'No such program'
|
local r = { fn(table.unpack(args)) }
|
||||||
|
|
||||||
|
tProgramStack[#tProgramStack] = nil
|
||||||
|
|
||||||
|
if multishell and multishell.getTitle then
|
||||||
|
multishell.setTitle(multishell.getCurrent(), oldTitle or 'shell')
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.unpack(r)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Install shell API
|
||||||
|
function shell.run(...)
|
||||||
|
return pcall(run, setmetatable(Util.shallowCopy(sandboxEnv), { __index = _G }), ...)
|
||||||
end
|
end
|
||||||
|
|
||||||
function shell.exit()
|
function shell.exit()
|
||||||
|
@ -119,7 +140,7 @@ function shell.resolveProgram( _sCommand )
|
||||||
end
|
end
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Otherwise, look on the path variable
|
-- Otherwise, look on the path variable
|
||||||
for sPath in string.gmatch(PATH or '', "[^:]+") do
|
for sPath in string.gmatch(PATH or '', "[^:]+") do
|
||||||
sPath = fs.combine(sPath, _sCommand )
|
sPath = fs.combine(sPath, _sCommand )
|
||||||
|
@ -130,20 +151,19 @@ function shell.resolveProgram( _sCommand )
|
||||||
return sPath .. '.lua'
|
return sPath .. '.lua'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Not found
|
-- Not found
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
function shell.programs( _bIncludeHidden )
|
function shell.programs( _bIncludeHidden )
|
||||||
local tItems = {}
|
local tItems = {}
|
||||||
|
|
||||||
-- Add programs from the path
|
-- Add programs from the path
|
||||||
for sPath in string.gmatch(PATH, "[^:]+") do
|
for sPath in string.gmatch(PATH, "[^:]+") do
|
||||||
sPath = shell.resolve(sPath)
|
sPath = shell.resolve(sPath)
|
||||||
if fs.isDir( sPath ) then
|
if fs.isDir( sPath ) then
|
||||||
local tList = fs.list( sPath )
|
local tList = fs.list( sPath )
|
||||||
for n,sFile in pairs( tList ) do
|
for _,sFile in pairs( tList ) do
|
||||||
if not fs.isDir( fs.combine( sPath, sFile ) ) and
|
if not fs.isDir( fs.combine( sPath, sFile ) ) and
|
||||||
(_bIncludeHidden or string.sub( sFile, 1, 1 ) ~= ".") then
|
(_bIncludeHidden or string.sub( sFile, 1, 1 ) ~= ".") then
|
||||||
tItems[ sFile ] = true
|
tItems[ sFile ] = true
|
||||||
|
@ -154,7 +174,7 @@ function shell.programs( _bIncludeHidden )
|
||||||
|
|
||||||
-- Sort and return
|
-- Sort and return
|
||||||
local tItemList = {}
|
local tItemList = {}
|
||||||
for sItem, b in pairs( tItems ) do
|
for sItem in pairs( tItems ) do
|
||||||
table.insert( tItemList, sItem )
|
table.insert( tItemList, sItem )
|
||||||
end
|
end
|
||||||
table.sort( tItemList )
|
table.sort( tItemList )
|
||||||
|
@ -229,40 +249,18 @@ end
|
||||||
|
|
||||||
local tArgs = { ... }
|
local tArgs = { ... }
|
||||||
if #tArgs > 0 then
|
if #tArgs > 0 then
|
||||||
|
return run(_ENV, ...)
|
||||||
local path, args = parseCommandLine(...)
|
|
||||||
|
|
||||||
if not path then
|
|
||||||
error('No such program')
|
|
||||||
end
|
|
||||||
|
|
||||||
local isUrl = not not path:match("^(https?:)//(([^/:]+):?([0-9]*))(/?.*)$")
|
|
||||||
if not isUrl then
|
|
||||||
path = shell.resolveProgram(path)
|
|
||||||
if not path then
|
|
||||||
error('No such program')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local fn, err
|
|
||||||
|
|
||||||
if isUrl then
|
|
||||||
fn, err = Util.loadUrl(path, getfenv(1))
|
|
||||||
else
|
|
||||||
fn, err = loadfile(path, getfenv(1))
|
|
||||||
end
|
|
||||||
|
|
||||||
if not fn then
|
|
||||||
error(err)
|
|
||||||
end
|
|
||||||
|
|
||||||
tProgramStack[#tProgramStack + 1] = path
|
|
||||||
return fn(table.unpack(args))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local Config = require('config')
|
local Config = require('config')
|
||||||
local History = require('history')
|
local History = require('history')
|
||||||
|
|
||||||
|
local colors = _G.colors
|
||||||
|
local keys = _G.keys
|
||||||
|
local os = _G.os
|
||||||
|
local term = _G.term
|
||||||
|
local textutils = _G.textutils
|
||||||
|
|
||||||
local config = {
|
local config = {
|
||||||
standard = {
|
standard = {
|
||||||
textColor = colors.white,
|
textColor = colors.white,
|
||||||
|
@ -285,7 +283,7 @@ local config = {
|
||||||
displayDirectory = true,
|
displayDirectory = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
--Config.load('shell', config)
|
Config.load('shellprompt', config)
|
||||||
|
|
||||||
local _colors = config.standard
|
local _colors = config.standard
|
||||||
if term.isColor() then
|
if term.isColor() then
|
||||||
|
@ -384,6 +382,7 @@ local function autocomplete(line, suggestions)
|
||||||
end
|
end
|
||||||
|
|
||||||
local results = { }
|
local results = { }
|
||||||
|
local files = { }
|
||||||
|
|
||||||
if #words == 0 then
|
if #words == 0 then
|
||||||
files = autocompleteFile(results, words)
|
files = autocompleteFile(results, words)
|
||||||
|
@ -398,7 +397,6 @@ local function autocomplete(line, suggestions)
|
||||||
end
|
end
|
||||||
|
|
||||||
local match = words[#words] or ''
|
local match = words[#words] or ''
|
||||||
local files = { }
|
|
||||||
for f in pairs(results) do
|
for f in pairs(results) do
|
||||||
if f:sub(1, #match) == match then
|
if f:sub(1, #match) == match then
|
||||||
table.insert(files, f)
|
table.insert(files, f)
|
||||||
|
@ -406,7 +404,7 @@ local function autocomplete(line, suggestions)
|
||||||
end
|
end
|
||||||
|
|
||||||
if #files == 1 then
|
if #files == 1 then
|
||||||
words[#words] = files[1]
|
words[#words] = files[1]
|
||||||
return table.concat(words, ' ')
|
return table.concat(words, ' ')
|
||||||
elseif #files > 1 and suggestions then
|
elseif #files > 1 and suggestions then
|
||||||
print()
|
print()
|
||||||
|
@ -438,12 +436,12 @@ local function autocomplete(line, suggestions)
|
||||||
if #tDirs > 0 and #tDirs < #tFiles then
|
if #tDirs > 0 and #tDirs < #tFiles then
|
||||||
local w = term.getSize()
|
local w = term.getSize()
|
||||||
local nMaxLen = w / 8
|
local nMaxLen = w / 8
|
||||||
for n, sItem in pairs(files) do
|
for _,sItem in pairs(files) do
|
||||||
nMaxLen = math.max(string.len(sItem) + 1, nMaxLen)
|
nMaxLen = math.max(string.len(sItem) + 1, nMaxLen)
|
||||||
end
|
end
|
||||||
local nCols = math.floor(w / nMaxLen)
|
local nCols = math.floor(w / nMaxLen)
|
||||||
if #tDirs < nCols then
|
if #tDirs < nCols then
|
||||||
for i = #tDirs + 1, nCols do
|
for _ = #tDirs + 1, nCols do
|
||||||
table.insert(tDirs, '')
|
table.insert(tDirs, '')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -457,7 +455,7 @@ local function autocomplete(line, suggestions)
|
||||||
|
|
||||||
term.setTextColour(_colors.promptTextColor)
|
term.setTextColour(_colors.promptTextColor)
|
||||||
term.setBackgroundColor(_colors.promptBackgroundColor)
|
term.setBackgroundColor(_colors.promptBackgroundColor)
|
||||||
write("$ " )
|
term.write("$ " )
|
||||||
|
|
||||||
term.setTextColour(_colors.commandTextColor)
|
term.setTextColour(_colors.commandTextColor)
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
|
@ -507,7 +505,7 @@ local function shellRead(history)
|
||||||
nScroll = (sx + nPos) - w
|
nScroll = (sx + nPos) - w
|
||||||
end
|
end
|
||||||
|
|
||||||
local cx,cy = term.getCursorPos()
|
local _,cy = term.getCursorPos()
|
||||||
term.setCursorPos( sx, cy )
|
term.setCursorPos( sx, cy )
|
||||||
if sReplace then
|
if sReplace then
|
||||||
term.write( string.rep( sReplace, math.max( string.len(sLine) - nScroll, 0 ) ) )
|
term.write( string.rep( sReplace, math.max( string.len(sLine) - nScroll, 0 ) ) )
|
||||||
|
@ -518,7 +516,7 @@ local function shellRead(history)
|
||||||
end
|
end
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
local sEvent, param, param2 = os.pullEventRaw()
|
local sEvent, param = os.pullEventRaw()
|
||||||
|
|
||||||
if sEvent == "char" then
|
if sEvent == "char" then
|
||||||
sLine = string.sub( sLine, 1, nPos ) .. param .. string.sub( sLine, nPos + 1 )
|
sLine = string.sub( sLine, 1, nPos ) .. param .. string.sub( sLine, nPos + 1 )
|
||||||
|
@ -581,7 +579,7 @@ local function shellRead(history)
|
||||||
if nPos > 0 then
|
if nPos > 0 then
|
||||||
redraw(" ")
|
redraw(" ")
|
||||||
sLine = string.sub( sLine, 1, nPos - 1 ) .. string.sub( sLine, nPos + 1 )
|
sLine = string.sub( sLine, 1, nPos - 1 ) .. string.sub( sLine, nPos + 1 )
|
||||||
nPos = nPos - 1
|
nPos = nPos - 1
|
||||||
redraw()
|
redraw()
|
||||||
end
|
end
|
||||||
elseif param == keys.home then
|
elseif param == keys.home then
|
||||||
|
@ -605,7 +603,7 @@ local function shellRead(history)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local cx, cy = term.getCursorPos()
|
local _, cy = term.getCursorPos()
|
||||||
term.setCursorPos( w + 1, cy )
|
term.setCursorPos( w + 1, cy )
|
||||||
print()
|
print()
|
||||||
term.setCursorBlink( false )
|
term.setCursorBlink( false )
|
||||||
|
@ -622,7 +620,7 @@ while not bExit do
|
||||||
end
|
end
|
||||||
term.setTextColour(_colors.promptTextColor)
|
term.setTextColour(_colors.promptTextColor)
|
||||||
term.setBackgroundColor(_colors.promptBackgroundColor)
|
term.setBackgroundColor(_colors.promptBackgroundColor)
|
||||||
write("$ " )
|
term.write("$ " )
|
||||||
term.setTextColour(_colors.commandTextColor)
|
term.setTextColour(_colors.commandTextColor)
|
||||||
term.setBackgroundColor(colors.black)
|
term.setBackgroundColor(colors.black)
|
||||||
local sLine = shellRead(history)
|
local sLine = shellRead(history)
|
||||||
|
@ -635,9 +633,9 @@ while not bExit do
|
||||||
end
|
end
|
||||||
term.setTextColour(_colors.textColor)
|
term.setTextColour(_colors.textColor)
|
||||||
if #sLine > 0 then
|
if #sLine > 0 then
|
||||||
local result, err = shell.run( sLine )
|
local result, err = shell.run(sLine)
|
||||||
if not result and err then
|
if not result and err then
|
||||||
printError(err)
|
_G.printError(err)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
|
@ -88,6 +88,16 @@
|
||||||
run = "simpleMiner.lua",
|
run = "simpleMiner.lua",
|
||||||
requires = 'turtle',
|
requires = 'turtle',
|
||||||
},
|
},
|
||||||
|
[ "131260cbfbb0c821f8eae5e7c3c296c7aa4d50b9" ] = {
|
||||||
|
title = "Music",
|
||||||
|
category = "Apps",
|
||||||
|
icon = "\030 \031f === \
|
||||||
|
\030 \031f | |\
|
||||||
|
\030 \031fo| o|\
|
||||||
|
",
|
||||||
|
run = "usr/apps/music.lua",
|
||||||
|
requires = 'turtle',
|
||||||
|
},
|
||||||
c47ae15370cfe1ed2781eedc1dc2547d12d9e972 = {
|
c47ae15370cfe1ed2781eedc1dc2547d12d9e972 = {
|
||||||
title = "Help",
|
title = "Help",
|
||||||
category = "Apps",
|
category = "Apps",
|
||||||
|
|
|
@ -46,8 +46,8 @@ if device.wireless_modem then
|
||||||
function()
|
function()
|
||||||
os.sleep(3)
|
os.sleep(3)
|
||||||
local tabId = multishell.openTab({
|
local tabId = multishell.openTab({
|
||||||
fn = chatClient,
|
fn = chatClient,
|
||||||
title = 'Chatroom',
|
title = 'Chat',
|
||||||
hidden = true,
|
hidden = true,
|
||||||
})
|
})
|
||||||
tab = multishell.getTab(tabId)
|
tab = multishell.getTab(tabId)
|
||||||
|
|
Loading…
Reference in New Issue