diff --git a/apps/Ale32bit/bluecloud.spk b/apps/Ale32bit/bluecloud.spk new file mode 100644 index 0000000..3b23b4b --- /dev/null +++ b/apps/Ale32bit/bluecloud.spk @@ -0,0 +1,769 @@ +-- +-- sPhone Application Package +-- Built with SPK builder 1 +-- +{ + files = "{\ + [ \"bluecloud.lua\" ] = \"local oldPullEvent = os.pullEvent\\\ +os.pullEvent = os.pullEventRaw\\\ +\\\ +local args = {...}\\\ +\\\ +local argData = {\\\ + [\\\"-c\\\"] = false,\\\ + [\\\"--classic\\\"] = false,\\\ +}\\\ +\\\ +if #args > 0 then\\\ + while #args > 0 do\\\ + local arg = table.remove(args, 1)\\\ + if argData[arg] ~= nil then\\\ + argData[arg] = true\\\ + end\\\ + end\\\ +end\\\ +\\\ +local w, h = term.getSize()\\\ +local bar = window.create(term.current(),1,1, w, 1, true)\\\ +local newT = window.create(term.current(),1,2,w,h-1,true)\\\ +local oldTerm = term.current()\\\ +local version = 1\\\ +local oldColor = term.isColor\\\ +local channel = 47500\\\ +\\\ +if argData[\\\"-c\\\"] or argData[\\\"--classic\\\"] then\\\ + term.isColor = function() return false end\\\ +end\\\ +\\\ +local background, text, headerbackground, headertext, buttonbackground, buttontext, closebackground, closetext,windowside, dircolor\\\ +if term.isColor() then\\\ + background = colors.white\\\ + text = colors.black\\\ + headerbackground = colors.blue\\\ + headertext = colors.white\\\ + buttonbackground = colors.blue\\\ + buttontext = colors.white\\\ + closebackground = colors.red\\\ + closetext = colors.white\\\ + windowside = colors.lightBlue\\\ + dircolor = colors.lime\\\ +else\\\ + background = colors.black\\\ + text = colors.white\\\ + headerbackground = colors.white\\\ + headertext = colors.black\\\ + buttonbackground = colors.white\\\ + buttontext = colors.black\\\ + closebackground = colors.gray\\\ + closetext = colors.white\\\ + windowside = colors.lightGray\\\ + dircolor = colors.gray\\\ +end\\\ +\\\ +local tr = {}\\\ +if term.isColor() then\\\ + tr.upload = \\\"Upload\\\"\\\ + tr.download = \\\"Download\\\"\\\ + tr.delete = \\\"Delete\\\"\\\ + tr.list = \\\"List\\\"\\\ + tr.account = \\\"Account\\\"\\\ + tr.login = \\\"Login\\\"\\\ + tr.register = \\\"Register\\\"\\\ +else\\\ + tr.upload = \\\"[1] Upload\\\"\\\ + tr.download = \\\"[2] Download\\\"\\\ + tr.delete = \\\"[3] Delete\\\"\\\ + tr.list = \\\"[4] List\\\"\\\ + tr.account = \\\"[5] Account\\\"\\\ + tr.login = \\\"[1] Login\\\"\\\ + tr.register = \\\"[2] Register\\\"\\\ +end\\\ +\\\ +term.setBackgroundColor(background)\\\ +term.setTextColor(text)\\\ +term.clear()\\\ +term.setCursorPos(1,1)\\\ +print(\\\"Starting up BlueCloud Client \\\"..version..\\\"...\\\")\\\ +if not fs.exists(spk.getDataPath()..\\\"/.cred\\\") then\\\ + local tab = {\\\ + username = false,\\\ + password = false,\\\ + }\\\ + local f = spk.open(\\\".cred\\\",\\\"w\\\")\\\ + f.write(textutils.serialize(tab))\\\ + f.close()\\\ +end\\\ +\\\ +local modem = peripheral.find(\\\"modem\\\")\\\ +if not modem then\\\ + print(\\\"Cannot find modem\\\")\\\ + return\\\ +end\\\ +\\\ +term.redirect(newT)\\\ +\\\ +\\\ +local function redrawBar()\\\ + bar.setBackgroundColor(headerbackground)\\\ + bar.setTextColor(headertext)\\\ + bar.clear()\\\ + bar.setCursorPos(2,1)\\\ + bar.write(\\\"BlueCloud \\\"..version)\\\ + bar.setCursorPos(w,1)\\\ + bar.setBackgroundColor(closebackground)\\\ + bar.setTextColor(closetext)\\\ + bar.write(\\\"X\\\")\\\ +end\\\ +\\\ +local function list(path, opt)\\\ + term.redirect(oldTerm)\\\ + opt = opt or {}\\\ + opt.bg1 = opt.bg1 or colors.white\\\ + opt.fg1 = opt.fg1 or text\\\ + opt.fg1b = opt.fg1b or dircolor\\\ + opt.bg2 = opt.bg2 or headerbackground\\\ + opt.fg2 = opt.fg2 or headertext\\\ + opt.bg3 = opt.bg3 or closebackground\\\ + opt.fg3 = opt.fg3 or closetext\\\ + opt.output = opt.output or true\\\ + opt.list = opt.list or false\\\ + if not path then\\\ + path = \\\"\\\"\\\ + end\\\ + if not fs.isDir(path) and not opt.list then\\\ + error(\\\"Invalid path\\\")\\\ + end\\\ + local scroll = 0\\\ + local items\\\ + local w, h\\\ + local function rebuild()\\\ + local files, dirs = {}, {}\\\ + items = {}\\\ + local flist\\\ + if not opt.list then\\\ + flist = fs.list(path)\\\ + else\\\ + flist = opt.list\\\ + end\\\ + for i, v in ipairs(flist) do\\\ + if fs.isDir(fs.combine(path, v)) then\\\ + table.insert(dirs, v)\\\ + else\\\ + table.insert(files, v)\\\ + end\\\ + end\\\ + table.sort(files)\\\ + table.sort(dirs)\\\ + for i, v in ipairs(dirs) do\\\ + table.insert(items, v)\\\ + end\\\ + for i, v in ipairs(files) do\\\ + table.insert(items, v)\\\ + end\\\ + scroll = 0\\\ + end\\\ + rebuild()\\\ + local setVisible = term.current().setVisible\\\ + or function()end\\\ + local function redraw()\\\ + w, h = term.getSize()\\\ + setVisible(false)\\\ + term.setBackgroundColor(opt.bg1)\\\ + term.clear()\\\ + for i = scroll + 1, h + scroll - 1 do\\\ + local str = items[i]\\\ + if str then\\\ + term.setCursorPos(2, 1 + i - scroll)\\\ + local isDir = fs.isDir(fs.combine(path, str))\\\ + term.setTextColor(isDir and opt.fg1b or opt.fg1)\\\ + local _w = w - (isDir and 2 or 1)\\\ + if #str > _w then\\\ + str = str:sub(1, _w - 2) .. \\\"..\\\"\\\ + end\\\ + if isDir then\\\ + str = str .. \\\"/\\\"\\\ + end\\\ + term.write(str)\\\ + end\\\ + end\\\ + term.setBackgroundColor(opt.bg2)\\\ + term.setTextColor(opt.fg2)\\\ + term.setCursorPos(1, 1)\\\ + term.clearLine()\\\ + local _path = path .. \\\"/\\\"\\\ + if #_path > w - 2 then\\\ + _path = \\\"..\\\" .. _path:sub(-w + 4)\\\ + end\\\ + term.write(_path)\\\ + term.setBackgroundColor(opt.bg3)\\\ + term.setTextColor(opt.fg3)\\\ + term.setCursorPos(w, 1)\\\ + term.write(\\\"X\\\")\\\ + term.setCursorPos(w, 2)\\\ + term.write(\\\"^\\\")\\\ + term.setCursorPos(w, h)\\\ + term.write(\\\"v\\\")\\\ + setVisible(true)\\\ + end\\\ + while true do\\\ + redraw()\\\ + local ev = {os.pullEventRaw()}\\\ + if ev[1] == \\\"terminate\\\" then\\\ + return nil\\\ + elseif ev[1] == \\\"mouse_scroll\\\" and ev[4] > 1 then\\\ + scroll = scroll + ev[2]\\\ + elseif ev[1] == \\\"mouse_click\\\" and ev[2] == 1 then\\\ + if ev[3] == w then\\\ + if ev[4] == 1 then\\\ + return nil\\\ + elseif ev[4] == 2 then\\\ + scroll = scroll - 1\\\ + elseif ev[4] == h then\\\ + scroll = scroll + 1\\\ + end\\\ + elseif ev[3] < w and ev[4] == 1 then\\\ + path = fs.getDir(path)\\\ + if path == \\\"..\\\" then\\\ + path = \\\"\\\"\\\ + end\\\ + rebuild()\\\ + elseif ev[3] < w and ev[4] > 1 then\\\ + local item = items[ev[4] + scroll - 1]\\\ + if item then\\\ + local fullPath = fs.combine(path, item)\\\ + if fs.isDir(fullPath) then\\\ + path = fullPath\\\ + rebuild()\\\ + else\\\ + if opt.output then\\\ + return fullPath\\\ + end\\\ + end\\\ + end\\\ + end\\\ + end\\\ + scroll = math.min(math.max(0, scroll), math.max(0, #items - h + 1))\\\ + end\\\ +end\\\ +\\\ +local function info(messages, title)\\\ + local w,h = term.getSize()\\\ + local sx = 4\\\ + local sy = 2\\\ + local ex = w - 6\\\ + local ey = sx + 2 + #messages\\\ + \\\ + local win = window.create(term.current(),sx,sy,ex,ey,true)\\\ + local old = term.current()\\\ + term.redirect(win)\\\ + \\\ + local w,h = term.getSize()\\\ + \\\ + paintutils.drawBox(1,1,w,h,windowside)\\\ + paintutils.drawFilledBox(2,2,w-1,h-1,background)\\\ + if not title then\\\ + title = \\\"BlueCloud\\\"\\\ + end\\\ + if pocket then\\\ + term.setCursorPos(math.ceil(w/2)-math.ceil(#title/2)+1,1)\\\ + else\\\ + term.setCursorPos(math.ceil(w/2)-math.ceil(#title/2),1)\\\ + end\\\ + \\\ + term.setBackgroundColor(windowside)\\\ + term.setTextColor(buttontext)\\\ + write(title)\\\ + \\\ + if pocket then\\\ + term.setCursorPos(math.ceil(w/2),h)\\\ + else\\\ + term.setCursorPos(math.ceil(w/2)-1,h)\\\ + end\\\ + \\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(buttonbackground)\\\ + \\\ + write(\\\"OK\\\")\\\ + \\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + local y = sy+2\\\ + for i = 1,#messages do\\\ + if pocket then\\\ + term.setCursorPos(math.ceil(w/2)-math.ceil(#messages[i]/2)+1,y)\\\ + else\\\ + term.setCursorPos(math.ceil(w/2)-math.ceil(#messages[i]/2),y)\\\ + end\\\ + write(messages[i])\\\ + y = y + 1\\\ + end\\\ + \\\ + local w,h = term.getSize()\\\ + \\\ + local minOk\\\ + if pocket then\\\ + minOk = math.ceil(w/2)\\\ + else\\\ + minOk = math.ceil(w/2)-1\\\ + end\\\ + local maxOk = minOk+1\\\ + term.redirect(old)\\\ + while true do\\\ + local e = {os.pullEvent()}\\\ + if e[1] == \\\"key\\\" and e[2] == 28 then\\\ + return\\\ + elseif e[1] == \\\"mouse_click\\\" and e[3] >= minOk and e[3] <= maxOk and e[4] == h then\\\ + return\\\ + end\\\ + end\\\ +end\\\ +\\\ +local function send(message)\\\ + local f = spk.open(\\\".cred\\\",\\\"r\\\")\\\ + local cred = textutils.unserialize(f.readAll())\\\ + f.close()\\\ + \\\ + if not cred.username or not cred.password then\\\ + return false, \\\"Wrong credentials\\\"\\\ + end\\\ + local tab = {\\\ + user = cred.username,\\\ + password = cred.password,\\\ + }\\\ + \\\ + if type(message) ~= \\\"table\\\" then\\\ + return false, \\\"invalid argument\\\"\\\ + end\\\ + \\\ + for k,v in pairs(message) do\\\ + tab[k] = v\\\ + end\\\ + \\\ + modem.open(channel)\\\ + modem.transmit(channel,os.getComputerID(),base64.encode(\\\ + textutils.serialize(tab)\\\ + ))\\\ + local timeout = os.startTimer(5)\\\ + while true do\\\ + local e = {os.pullEvent()}\\\ + if e[1] == \\\"timer\\\" and e[2] == timeout then\\\ + return false, \\\"timeout\\\"\\\ + elseif e[1] == \\\"terminate\\\" then\\\ + return false, \\\"timeout\\\"\\\ + elseif e[1] == \\\"modem_message\\\" then\\\ + if e[3] == channel and e[4] == os.getComputerID() then\\\ + return true, textutils.unserialize(base64.decode(e[5])).result\\\ + end\\\ + end\\\ + end\\\ + modem.close(channel)\\\ +end\\\ +\\\ +local function center(text,y)\\\ + if not text then\\\ + error(\\\"bad argument: string expected, got nil\\\",2)\\\ + end\\\ + if not y then\\\ + local _, y = term.getCursorPos()\\\ + end\\\ + local w, h = term.getSize()\\\ + if pocket then\\\ + term.setCursorPos(math.ceil(w/2) - math.ceil(#text/2) + 1, y)\\\ + else\\\ + term.setCursorPos(math.ceil(w/2) - math.ceil(#text/2), y)\\\ + end\\\ + write(text)\\\ +end\\\ +\\\ +local function upload()\\\ + local file\\\ + if term.isColor() then\\\ + file = list()\\\ + term.redirect(newT)\\\ + redrawBar()\\\ + if not file then\\\ + return\\\ + end\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + center(\\\"Upload\\\", 2)\\\ + else\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + center(\\\"Upload\\\", 2)\\\ + term.setCursorPos(2,4)\\\ + write(\\\"File: /\\\")\\\ + file = read()\\\ + if not fs.exists(file) or fs.isDir(file) then\\\ + print(\\\" No such file\\\")\\\ + sleep(2)\\\ + return\\\ + end\\\ + end\\\ + \\\ + if term.isColor() then\\\ + term.setCursorPos(2,4)\\\ + else\\\ + term.setCursorPos(2,6)\\\ + end\\\ + write(\\\"Save as: \\\")\\\ + local name = read()\\\ + \\\ + if not fs.exists(file) or fs.isDir(file) then\\\ + info({\\\"File not found\\\",file},\\\"Upload Result\\\")\\\ + return\\\ + end\\\ + \\\ + local f = fs.open(file,\\\"r\\\")\\\ + content = f.readAll()\\\ + f.close()\\\ + \\\ + local status, msg = send({\\\ + protocol = \\\"upload\\\",\\\ + name = name,\\\ + content = content,\\\ + })\\\ + info({msg},\\\"Upload Status\\\")\\\ +end\\\ +\\\ +local function download()\\\ + local file\\\ + if term.isColor() then\\\ + local status, msg = send({\\\ + protocol = \\\"list\\\",\\\ + })\\\ + if not status then\\\ + info({\\\"Cannot show list\\\"},\\\"List Result\\\")\\\ + return\\\ + end\\\ + file = list(nil,{list = msg})\\\ + term.redirect(newT)\\\ + redrawBar()\\\ + if not file then\\\ + return\\\ + end\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + center(\\\"Download\\\", 2)\\\ + else\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + \\\ + center(\\\"Download\\\", 2)\\\ + term.setCursorPos(2,4)\\\ + write(\\\"File: \\\")\\\ + local file = read()\\\ + if file == \\\"\\\" then\\\ + return\\\ + end\\\ + end\\\ + local status, msg = send({\\\ + protocol = \\\"download\\\",\\\ + name = file,\\\ + })\\\ + \\\ + if not status then\\\ + info({\\\"File not found\\\"},\\\"Download Status\\\")\\\ + end\\\ + if term.isColor() then\\\ + term.setCursorPos(2,4)\\\ + else\\\ + term.setCursorPos(2,6)\\\ + end\\\ + \\\ + write(\\\"Save as: /\\\")\\\ + local save = read()\\\ + if save == \\\"\\\" then\\\ + return\\\ + end\\\ + local f = fs.open(save,\\\"w\\\")\\\ + f.write(msg)\\\ + f.close()\\\ + info({\\\"Downloaded as\\\",save},\\\"Download Status\\\")\\\ +end\\\ +\\\ +local function delete()\\\ + local file\\\ + local msg\\\ + if term.isColor() then\\\ + status, msg = send({\\\ + protocol = \\\"list\\\",\\\ + })\\\ + if not status then\\\ + info({\\\"Cannot show list\\\"},\\\"List Result\\\")\\\ + return\\\ + end\\\ + file = list(nil,{list = msg})\\\ + term.redirect(newT)\\\ + redrawBar()\\\ + if not file then\\\ + return\\\ + end\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + center(\\\"Delete\\\", 2)\\\ + else\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + \\\ + center(\\\"Delete\\\", 2)\\\ + term.setCursorPos(2,4)\\\ + write(\\\"File: \\\")\\\ + local file = read()\\\ + if file == \\\"\\\" then\\\ + return\\\ + end\\\ + end\\\ + \\\ + local status, msg = send({\\\ + protocol = \\\"delete\\\",\\\ + name = file,\\\ + })\\\ + \\\ + if not status then\\\ + info({\\\"File not found\\\"},\\\"Delete Status\\\")\\\ + return\\\ + end\\\ + info({file,\\\"deleted\\\"},\\\"Delete Status\\\")\\\ +end\\\ +\\\ +local function getList()\\\ + local w,h = term.getSize()\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + term.setCursorPos(1,1)\\\ + local status, msg = send({\\\ + protocol = \\\"list\\\",\\\ + })\\\ + if not status then\\\ + info({\\\"Cannot show list\\\"},\\\"List Result\\\")\\\ + return\\\ + end\\\ + if term.isColor() then\\\ + list(nil,{list = msg, output = false})\\\ + term.redirect(newT)\\\ + redrawBar()\\\ + else\\\ + textutils.pagedTabulate(msg)\\\ + while true do\\\ + local e = {os.pullEvent()}\\\ + if e[1] == \\\"key\\\" and e[2] == 45 then\\\ + return\\\ + elseif e[1] == \\\"mouse_click\\\" and e[3] == w and e[4] == 1 then\\\ + return\\\ + end\\\ + end\\\ + end\\\ +end\\\ +\\\ +local function account()\\\ +\\\ + local function redraw()\\\ + redrawBar()\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + paintutils.drawFilledBox(2,2,w-1,4,buttonbackground)\\\ + term.setTextColor(buttontext)\\\ + center(tr.login,3)\\\ + \\\ + paintutils.drawFilledBox(2,6,w-1,8,buttonbackground)\\\ + term.setTextColor(buttontext)\\\ + center(tr.register,7)\\\ + end\\\ + \\\ + local function login()\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + term.setCursorPos(2,2)\\\ + write(\\\"Username: \\\")\\\ + local user = read()\\\ + term.setCursorPos(2,4)\\\ + write(\\\"Password: \\\")\\\ + local pw = sha256.sha256(read(\\\"*\\\"))\\\ + \\\ + local f = spk.open(\\\".cred\\\",\\\"w\\\")\\\ + f.write(textutils.serialize({\\\ + username = user,\\\ + password = pw,\\\ + }))\\\ + f.close()\\\ + \\\ + end\\\ + \\\ + local function register()\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + term.setCursorPos(2,2)\\\ + write(\\\"Username: \\\")\\\ + local user = read()\\\ + term.setCursorPos(2,4)\\\ + write(\\\"Password: \\\")\\\ + local pw = sha256.sha256(read(\\\"*\\\"))\\\ + term.setCursorPos(2,6)\\\ + write(\\\"Repeat: \\\")\\\ + local rp = sha256.sha256(read(\\\"*\\\"))\\\ + if pw ~= rp then\\\ + info({\\\"Passwords\\\", \\\"do not\\\", \\\"match\\\"},\\\"Register Status\\\")\\\ + return\\\ + end\\\ + \\\ + local status, msg = send({\\\ + protocol = \\\"register\\\",\\\ + user = user,\\\ + password = pw,\\\ + })\\\ + \\\ + local msg\\\ + if status then\\\ + msg = {\\\"Account\\\",\\\"created\\\"}\\\ + else\\\ + msg = {\\\"Account\\\",\\\"already\\\",\\\"exists\\\"}\\\ + end\\\ + info(msg,\\\"Register Status\\\")\\\ + \\\ + if status then\\\ + local f = spk.open(\\\".cred\\\",\\\"w\\\")\\\ + f.write(textutils.serialize({\\\ + username = user,\\\ + password = pw,\\\ + }))\\\ + f.close()\\\ + end\\\ + \\\ + end\\\ + \\\ + \\\ + \\\ + while true do\\\ + redraw()\\\ + local e = {os.pullEvent()}\\\ + local event = e[1]\\\ + if event == \\\"mouse_click\\\" then\\\ + if e[3] == w and e[4] == 1 then\\\ + break\\\ + end\\\ + local x, y = e[3], e[4]\\\ + if (x >= 2 and y >= 3) and (x <= w-1 and y <= 5) then\\\ + login()\\\ + elseif (x >= 2 and y >= 7) and (x <= w-1 and y <= 9) then\\\ + register()\\\ + end\\\ + elseif event == \\\"key\\\" then\\\ + key = e[2]\\\ + if key == (45 or 14 or 56 or 29) then\\\ + sleep(0)\\\ + break\\\ + elseif key == 2 then\\\ + sleep(0)\\\ + login()\\\ + elseif key == 3 then\\\ + sleep(0)\\\ + register()\\\ + end\\\ + elseif event == \\\"terminate\\\" then\\\ + break\\\ + end\\\ + end\\\ +end\\\ +\\\ +local function redraw()\\\ + redrawBar()\\\ + term.setBackgroundColor(background)\\\ + term.setTextColor(text)\\\ + term.clear()\\\ + \\\ + local newW = math.ceil(w/2)\\\ + paintutils.drawFilledBox(2,2,newW-1,4,buttonbackground)\\\ + term.setTextColor(buttontext)\\\ + local text = tr.upload\\\ + term.setCursorPos(math.ceil(newW/2)-math.ceil(#text/2),3)\\\ + write(text)\\\ + \\\ + local newW = math.ceil(w/2)\\\ + paintutils.drawFilledBox(newW+1,2,w-1,4,buttonbackground)\\\ + term.setTextColor(buttontext)\\\ + local text = tr.download\\\ + term.setCursorPos(newW + math.ceil(newW/2)-math.ceil(#text/2),3)\\\ + write(text)\\\ + \\\ + paintutils.drawFilledBox(2,6,w-1,8,buttonbackground)\\\ + term.setTextColor(buttontext)\\\ + center(tr.delete,7)\\\ + \\\ + paintutils.drawFilledBox(2,10,w-1,12,buttonbackground)\\\ + term.setTextColor(buttontext)\\\ + center(tr.list,11)\\\ + \\\ + paintutils.drawFilledBox(2,14,w-1,16,buttonbackground)\\\ + term.setTextColor(buttontext)\\\ + center(tr.account,15)\\\ +end\\\ +\\\ +while true do\\\ + redraw()\\\ + local e = {os.pullEvent()}\\\ + local event = e[1]\\\ + if event == \\\"mouse_click\\\" then\\\ + local x = e[3]\\\ + local y = e[4]\\\ + if x == w and y == 1 then\\\ + break\\\ + end\\\ + \\\ + local newW = math.ceil(w/2)\\\ + if (x >= 2 and y >= 3) and (x <= newW-1 and y <= 5) then\\\ + upload()\\\ + elseif (x >= newW+2 and y >= 3) and (x <= w-1 and y <= 5) then\\\ + download()\\\ + elseif (x >= 2 and y >= 7) and (x <= w-1 and y <= 9) then\\\ + delete()\\\ + elseif (x >= 2 and y >= 11) and (x <= w-1 and y <= 13) then\\\ + getList()\\\ + elseif (x >= 2 and y >= 15) and (x <= w-1 and y <= 17) then\\\ + account()\\\ + end\\\ + elseif event == \\\"key\\\" then\\\ + key = e[2]\\\ + if key == (45 or 14 or 56 or 29) then\\\ + sleep(0)\\\ + break\\\ + elseif key == 2 then\\\ + upload()\\\ + elseif key == 3 then\\\ + download()\\\ + elseif key == 4 then\\\ + delete()\\\ + elseif key == 5 then\\\ + getList()\\\ + elseif key == 6 then\\\ + account()\\\ + end\\\ + elseif event == \\\"terminate\\\" then\\\ + break\\\ + end\\\ +end\\\ +\\\ +term.redirect(oldTerm)\\\ +\\\ +term.isColor = oldColor\\\ +os.pullEvent = oldPullEvent\\\ +\",\ +}", + config = "{\ + main = \"bluecloud.lua\",\ + name = \"BlueCloud\",\ + id = \"ale32bit.bluecloud\",\ + author = \"Ale32bit\",\ + version = 1,\ +}", +}