Advertisement
Redxone

[CC- NovaExplore] Nova API

Jan 16th, 2017
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 18.15 KB | None | 0 0
  1. local w, h = term.getSize()
  2. local sbc = term.setBackgroundColor
  3. local stc = term.setTextColor
  4. local scp = term.setCursorPos
  5. local clr = term.clear
  6. local clrln = term.clearLine
  7. local shell = {}
  8. local str = ""
  9. local active = true
  10. local inputindex = #str
  11. local cursorX = #str
  12. local viewX = 1
  13.  
  14. local function path_goback(path,amm)
  15.     pathtbl={}
  16.     s=""
  17.     pathsize=0
  18.     -- Divide string and count the number of
  19.     -- divisions.
  20.      for str in string.gmatch(path, "([^/]+)") do
  21.          pathtbl[#pathtbl+1] = str  
  22.      end
  23.      for k, v in pairs(pathtbl) do
  24.          pathsize=k
  25.      end
  26.      pathsize = pathsize - amm
  27.     -- Split string into words based on seperator.
  28.     pathtbl={}
  29.     for str in string.gmatch(path, "([^/]+)") do
  30.         pathtbl[#pathtbl+1] = str  
  31.     end
  32.     -- Based on how large the user wants the string to be
  33.     -- add only the string bits that led up to the user defined
  34.     -- size.
  35.     for k, v in pairs(pathtbl) do
  36.         if(k <= pathsize)then s = s..pathtbl[k].."/" end
  37.     end
  38.     return s
  39. end
  40. local function path_getsize(path)
  41.     pathtbl={}
  42.     pathsize=0
  43.     -- Divide string and count the number of
  44.     -- divisions.
  45.      for str in string.gmatch(path, "([^/]+)") do
  46.          pathtbl[#pathtbl+1] = str  
  47.      end
  48.      for k, v in pairs(pathtbl) do
  49.          pathsize=k
  50.      end
  51.      return pathsize
  52. end
  53.  
  54. function newpath(name,stuckindex)
  55.     if(name == nil or type(name) ~= "string")then error("PathAPI: Name must be provided for new paths. ") end
  56.     if(string.sub(name,#name,#name) ~= "/")then
  57.         name = name .. "/"
  58.     end
  59.     if(type(stuckindex) ~= "number")then stuckindex = 0 end
  60.     local pathobj = {
  61.         path = name,
  62.         stuckind = stuckindex,
  63.         getsize = function(self)
  64.            return path_getsize(self.path)
  65.         end,
  66.         goback = function(self,amm)
  67.             if(self:getsize() - amm >= self.stuckind)then
  68.                self.path = path_goback(self.path,amm)
  69.                return self.path
  70.             else
  71.                 return false
  72.             end
  73.         end,
  74.         getraw = function(self)
  75.             return self.path
  76.         end,
  77.         add = function(self,new)
  78.             self.path = self.path .. new .. "/"
  79.             return self.path
  80.         end,
  81.         set = function(self,npath)
  82.             self.path = npath
  83.             return self.path
  84.         end,
  85.         lockpath = function(self)
  86.             self.stuckind = self:getsize()
  87.         end,
  88.         unlockpath = function(self)
  89.             self.stuckind = 0
  90.         end,
  91.     }
  92.     return pathobj
  93. end
  94.  
  95. ------------------------------------------------
  96. --]] futils - API
  97. ------------------------------------------------
  98.  
  99. function file_readAll(file,s)
  100.     local f = fs.open(file,"r")
  101.     local cont = f.readAll()
  102.     f.close()
  103.     if(s)then return textutils.unserialize(s) end
  104.     return cont
  105. end
  106. function file_readLine(file,s)
  107.     local f = fs.open(file,"r")
  108.     local cont = f.readLine()
  109.     f.close()
  110.     if(s)then return textutils.unserialize(s) end
  111.     return cont
  112. end
  113. function file_write(file,data,s)
  114.     local f = fs.open(file,"w")
  115.     if(s)then f.write(textutils.serialize(data)) else
  116.     f.write(data) end
  117.     f.close()
  118. end
  119. function file_writeline(file,data,s)
  120.     local f = fs.open(file,"w")
  121.     if(s)then f.writeLine(textutils.serialize(data)) else
  122.     f.writeLine(data) end
  123.     f.close()
  124. end
  125. local function formatpath(path)
  126.     local pathtbl={}
  127.     local s=""
  128.     local pathsize=0
  129.     -- Divide string and count the number of
  130.     -- divisions.
  131.      for str in string.gmatch(path, "([^/]+)") do
  132.          pathtbl[#pathtbl+1] = str  
  133.      end
  134.      table.remove(pathtbl,1)
  135.      for i = 1, #pathtbl do
  136.         s = s .. pathtbl[i] .. "/"
  137.      end
  138.     return s
  139. end
  140.  
  141. local function getcontent(data,wdata,ctbl)
  142.     -- Returns a table --
  143.     for k, v in pairs(fs.list(data)) do
  144.      
  145.       if(fs.isDir(data.."/"..v) )then
  146.         getcontent(data..v.."/",v.."/",ctbl)
  147.       else
  148.       --print(data..v)
  149.         local f = fs.open(data..v,"r")
  150.         ctbl[formatpath(data..v)] = {content=f.readAll()}
  151.         f.close()
  152.       end
  153.     end
  154.      return textutils.serialize(ctbl)
  155. end
  156. function archive(data,export)
  157.     local content = {}
  158.     content = getcontent('/' .. data .. "/","/",content)
  159.     file_write(export,content)
  160.     return true
  161. end
  162.  
  163. function extract(file,to)
  164.     local cont = textutils.unserialize(file_readAll(file))
  165.     for k,v in pairs(cont) do
  166.          file_write(to .. "/" .. k,v.content)
  167.     end
  168. end
  169.  
  170. -----------------------------------------------------------------------
  171. --]] Read - API, HUGE thanks to Valithor for pretty much re-writing it
  172. -----------------------------------------------------------------------
  173.  
  174. local function setStartStr(nstr)
  175.     str = nstr
  176. end
  177. function novaread(e,maxlen,mslen,x,y)
  178.     term.setCursorBlink(active)
  179.     local function drawstr()
  180.         term.setCursorPos(x,y)
  181.         write(string.rep(" ",mslen+1))
  182.         term.setCursorPos(x,y)      
  183.       term.write(str:sub(viewX,viewX+mslen))
  184.       if(cursorX ~= #str and (cursorX+1) < mslen)then
  185.           term.setCursorPos((cursorX)+x,y)
  186.       else
  187.           term.setCursorPos((cursorX)+x,y)
  188.       end
  189.     end
  190.     local function undrawstr()
  191.         term.setCursorPos(x,y)
  192.         write(string.rep(" ",mslen))
  193.     end
  194.     local function updatestr()
  195.         inputindex = inputindex + 1
  196.         drawstr()
  197.     end
  198.     if(active)then
  199.         if(e[1] == "char" and #str < maxlen)then
  200.             if cursorX < mslen and cursorX < #str then
  201.               cursorX = cursorX+1
  202.             end
  203.             if cursorX == mslen and viewX <= #str-mslen then
  204.               viewX = viewX+1
  205.             end
  206.             str = str:sub(1,inputindex) .. tostring(e[2]) .. str:sub(inputindex+1,#str)
  207.             updatestr()
  208.         end
  209.         if(e[1] == "key")then
  210.             local key = e[2]
  211.              if(key == keys.enter)then
  212.                 term.setCursorBlink(false)
  213.                 active = false
  214.                 return true
  215.              end
  216.              if(key == keys.backspace and inputindex > 0)then
  217.              undrawstr()
  218.               if cursorX > 0 then
  219.                 cursorX = cursorX-1
  220.               end
  221.               if cursorX == 0 and viewX > 0 then
  222.                 viewX = viewX-1
  223.               end
  224.                  str =  string.sub( str, 1, inputindex - 1 ) .. string.sub( str, inputindex + 1 )
  225.                  inputindex = inputindex - 1
  226.                  drawstr()
  227.              end
  228.              if(key == keys.left and inputindex > 0)then
  229.                  inputindex = inputindex - 1 --
  230.                   if cursorX > 0 then
  231.                     cursorX = cursorX-1
  232.                   end
  233.                   if cursorX == 0 and viewX > 0 then
  234.                     viewX = viewX-1
  235.                   end
  236.                  drawstr()
  237.              end
  238.              if(key == keys.right and inputindex < #str)then
  239.                  inputindex = inputindex + 1
  240.                   if cursorX < mslen and viewX+cursorX<#str+x then
  241.                     cursorX = cursorX+1        
  242.                   end
  243.                   if cursorX == mslen and viewX < #str-mslen then
  244.                     viewX = viewX+1
  245.                   end
  246.                  drawstr()
  247.              end
  248.              if(key == keys.delete and inputindex < #str)then
  249.                   if cursorX > mslen then
  250.                     cursorX = cursorX+1
  251.                   end
  252.                  undrawstr()
  253.                  str = string.sub( str, 1, inputindex ) .. string.sub( str, inputindex + 2 )
  254.                  drawstr()
  255.              end
  256.         end
  257.     end
  258.     if(e[1] == "mouse_click" and (e[4] ~= y or e[3] < x or e[3] > x+maxlen) )then
  259.         active = false
  260.         term.setCursorBlink(false)
  261.     elseif(e[1] == "mouse_click" and e[4] == y)then
  262.         if(not active)then
  263.             active = true
  264.             term.setCursorPos(x+inputindex,y)
  265.             term.setCursorBlink(true)
  266.             drawstr()
  267.         end
  268.         if(e[3]-x >= 0 and e[3]<=#str) then
  269.             -- Broken until furthur notice - Lewisk --
  270.             --inputindex = (viewX+e[3])-x
  271.             --cursorX = e[3]-x
  272.             --drawstr()
  273.         end
  274.     end
  275. end
  276. function getInput()
  277.     return str
  278. end
  279. function resetInput()
  280.     str = ""
  281.     inputindex = #str
  282.     cursorX = #str
  283. end
  284. function setInput(nstr)
  285.     str = nstr
  286.     inputindex = #str
  287.     cursorX = #str
  288. end
  289. function setActive(act)
  290.     active = act
  291. end
  292. function getActive()
  293.     return active
  294. end
  295.  
  296. function readEx(mlen,scroll,startw)
  297.     setActive(false)
  298.     if(startw == nil)then startw = "" end
  299.     setInput(startw)
  300.     local x, y = term.getCursorPos()
  301.     local readxoff = x
  302.     if(startw ~= "")then
  303.         scp(readxoff,y)
  304.         write(getInput())
  305.     end
  306.     local oinp = getInput()
  307.     local ininp = true
  308.     if(scroll)then
  309.         mslen = 1000
  310.     else
  311.         mslen = mlen+1
  312.     end
  313.     term.setCursorBlink(true)
  314.     while ininp do
  315.         local e = {os.pullEvent()}
  316.         local inp = novaread(e,mslen,mlen-1,readxoff,y)
  317.         setActive(true)
  318.         if(inp)then
  319.             ininp = false
  320.             setActive(false)
  321.             local inp = getInput()
  322.             setInput(oinp)
  323.             if(inp == startw)then
  324.                 inp = ""
  325.             end
  326.             return inp
  327.         end
  328.         -- Dont let the user out of the read!
  329.         if(getActive() == "false")then setActive(true) end
  330.     end
  331. end
  332.  
  333.  
  334.  
  335. ------------------------------------------------
  336. --]] Utils - API
  337. ------------------------------------------------
  338.  
  339. function init(nshell)
  340.     shell = nshell
  341. end
  342.  
  343. function openReadDialog(title,clrfunc,startread)
  344.     local bw, bh = 30,0
  345.     local sx, sy = w/2-math.ceil(bw/2), (h/2)-math.ceil(bh/2)-1
  346.     local ex, ey = w/2+math.ceil(bw/2), (h/2)+math.floor(bh/2)-1
  347.     paintutils.drawFilledBox(sx+1,sy,ex+2,ey+2,colors.black)
  348.     paintutils.drawFilledBox(sx,sy,ex,ey,colors.lightGray)
  349.     paintutils.drawBox(sx-1,sy-1,ex+1,ey+1,colors.gray)
  350.     scp(sx,sy-1)
  351.     stc(colors.white)
  352.     write(title)
  353.     scp(sx,sy)
  354.     sbc(colors.lightGray)
  355.     local inp = readEx(30,true,startread)
  356.     clrfunc()
  357.     return inp
  358. end
  359.  
  360. function notify(title,txt,clrfunc)
  361.     local bw, bh = 30,5
  362.     local sx, sy = w/2-math.ceil(bw/2), (h/2)-math.ceil(bh/2)+2
  363.     local ex, ey = w/2+math.ceil(bw/2), (h/2)+math.floor(bh/2)+1
  364.     paintutils.drawLine(sx,sy-1,ex,sy-1,colors.gray)
  365.     paintutils.drawFilledBox(sx+1,sy+1,ex+1,ey+1,colors.black)
  366.     paintutils.drawFilledBox(sx,sy,ex,ey,colors.lightGray)
  367.     scp(sx,sy-1)
  368.     stc(colors.white)
  369.     sbc(colors.gray)
  370.     write(title)
  371.     sbc(colors.lightGray)
  372.     local msg = {}
  373.      for str in string.gmatch(txt, "([^*]+)") do
  374.          msg[#msg+1] = str  
  375.      end
  376.      for i = 1, #msg do
  377.         sbc(colors.lightGray)
  378.         colorwrite(" " .. msg[i],45,sx,sy+i)
  379.      end
  380.      colorwrite("&4Click&r to close. ",45,sx+8,sy+#msg+2)
  381.     os.pullEvent("mouse_click")
  382.     clrfunc()
  383. end
  384. function openYesNo(title,txt,clrfunc,y,n)
  385.     if(y == nil or n == nil)then
  386.          y = "Yes"
  387.          n = "No"
  388.     end
  389.     local ynm = {y, n}
  390.     local inynm = true
  391.     local bw, bh = 30,5
  392.     local opinc = 9
  393.     local sx, sy = w/2-math.ceil(bw/2), (h/2)-math.ceil(bh/2)+2
  394.     local ex, ey = w/2+math.ceil(bw/2), (h/2)+math.floor(bh/2)+1
  395.     paintutils.drawLine(sx,sy-1,ex,sy-1,colors.gray)
  396.     paintutils.drawFilledBox(sx+1,sy+1,ex+1,ey+1,colors.black)
  397.     paintutils.drawFilledBox(sx,sy,ex,ey,colors.lightGray)
  398.     scp(sx,sy-1)
  399.     stc(colors.white)
  400.     sbc(colors.gray)
  401.     write(title)
  402.     sbc(colors.lightGray)
  403.      local msg = {}
  404.      for str in string.gmatch(txt, "([^*]+)") do
  405.          msg[#msg+1] = str  
  406.      end
  407.      for i = 1, #msg do
  408.         sbc(colors.lightGray)
  409.         colorwrite(" " .. msg[i],45,sx,sy+i)
  410.      end
  411.     stc(colors.white)
  412.     local function drawm()
  413.           for i = 1, #ynm do
  414.                 sbc(colors.red)
  415.                 if(i==1)then
  416.                     sbc(colors.green)
  417.                 end
  418.                 scp(sx+(i*opinc),ey-1)
  419.                 write(ynm[i])
  420.           end
  421.     end
  422.     local function drawmopt(id,clk)
  423.          sbc(colors.red)
  424.          if(i==1)then
  425.             sbc(colors.green)
  426.          end
  427.          if(clk)then sbc(colors.gray) end
  428.          scp(sx+(id*opinc),ey-1)
  429.          write(ynm[id])
  430.          sleep(0.2)
  431.     end
  432.     local function mupdate()
  433.         while inynm do
  434.             local ev = {os.pullEvent()}
  435.             if(ev[1] == "mouse_click")then
  436.                 local x, y = ev[3], ev[4]
  437.                 for i = 1, #ynm do
  438.                     if( x >= sx+(i*opinc)-1 and x <= sx+(i*opinc)+#ynm[i] and y == math.floor(ey-1) )then
  439.                         inynm = false
  440.                         drawmopt(i,true)
  441.                         return i
  442.                     end
  443.                 end
  444.             end
  445.         end
  446.     end
  447.     drawm()
  448.     local res = mupdate()
  449.     clrfunc()
  450.     return res
  451. end
  452.  
  453. function isFileImage(file)
  454.     local isImg = false
  455.     local f = fs.open(file,"r")
  456.     if(f)then
  457.         if(tonumber(f.readAll():gsub("%s+",""),16) ~= nil) then
  458.              isImg = true
  459.         end
  460.         f.close()
  461.     end
  462.     return isImg
  463. end
  464.  
  465. function getApisFrom(loc,apis)
  466.     local inloc = false
  467.     if(fs.isDir(loc))then
  468.         inloc = true
  469.         for i = 1, #apis do
  470.                 if(fs.exists("CrossBow/apis/"..apis[i]))then
  471.                     apis[i] = "CrossBow/apis/" ..apis[i]
  472.  
  473.                 else
  474.                     error("Program had to Quit: CrossBow install outdated or malformed. ")
  475.                 end
  476.         end
  477.     end
  478.  
  479.     for i = 1, #apis do
  480.         if(inloc)then
  481.             os.loadAPI((apis[i]))
  482.         else
  483.             os.loadAPI(shell.resolveProgram((apis[i])))
  484.         end
  485.     end
  486.  
  487.     return inloc
  488. end
  489.  
  490. function colorwrite(str,smax,x,y,special)
  491.     scp(x,y)
  492.         local colorencode = {
  493.         ['&r'] = "black",
  494.         ['&1'] = "blue",
  495.         ['&2'] = "green",
  496.         ['&3'] = "cyan",
  497.         ['&4'] = "red",
  498.         ['&5'] = "purple",
  499.         ['&6'] = "brown",
  500.         ['&7'] = "lightGray",
  501.         ['&8'] = "gray",
  502.         ['&9'] = "lightBlue",
  503.         ['&a'] = "lime",
  504.         ['&b'] = "orange",
  505.         ['&c'] = "pink",
  506.         ['&d'] = "magenta",
  507.         ['&e'] = "yellow",
  508.         ['&f'] = "white",
  509.     }
  510.     if(special)then sbc(special) end
  511.     for a = 1, #str do
  512.         if(string.sub(str,a,a) == "&")then
  513.             if(colorencode[string.sub(str,a,a+1)] ~= nil)then
  514.                 stc(colors[colorencode[string.sub(str,a,a+1)]])
  515.             end
  516.             str = string.sub(str,1,a-1) .. string.sub(str,a+1,#str)
  517.         else
  518.             write(string.sub(str,a,a))
  519.         end
  520.     end  
  521.     sbc(colors.white)
  522. end
  523.  
  524. ------------------------------------------------
  525. --]] Zip - API
  526. ------------------------------------------------
  527.  
  528. local function formatpath(path)
  529.     local pathtbl={}
  530.     local s=""
  531.     local pathsize=0
  532.     -- Divide string and count the number of
  533.     -- divisions.
  534.      for str in string.gmatch(path, "([^/]+)") do
  535.          pathtbl[#pathtbl+1] = str  
  536.      end
  537.      for k, v in pairs(pathtbl) do
  538.          pathsize=k
  539.      end
  540.      pathsize = pathsize - 1
  541.     -- Based on how large the user wants the string to be
  542.     -- add only the string bits that led up to the user defined
  543.     -- size.
  544.     for k, v in pairs(pathtbl) do
  545.         if(k <= pathsize)then s = s..pathtbl[k].."/" end
  546.     end
  547.     return s
  548. end
  549. local function pathlen(path)
  550.     local pathtbl={}
  551.     local s=""
  552.     local pathsize=0
  553.     -- Divide string and count the number of
  554.     -- divisions.
  555.      for str in string.gmatch(path, "([^/]+)") do
  556.          pathtbl[#pathtbl+1] = str  
  557.      end
  558.      return #pathtbl
  559. end
  560. local function filterdirpath(dir,path)
  561.     local pathtbl={}
  562.     local s=""
  563.     local pathsize=0
  564.     -- Divide string and count the number of
  565.     -- divisions.
  566.      local la = 0
  567.      for str in string.gmatch(path, "([^/]+)") do
  568.         if(la >= pathlen(dir))then
  569.             pathtbl[#pathtbl+1] = str  
  570.         end
  571.         la = la + 1
  572.      end
  573.         for i = 1, #pathtbl do
  574.             s  = s .. pathtbl[i] .. "/"
  575.         end
  576.     return s
  577. end
  578. local function comparesubpath(flpath,subpath)
  579.     return (formatpath(subpath) == flpath) or (subpath:find(flpath) and pathlen(formatpath(subpath)) == pathlen(flpath)+1 )
  580. end
  581. local function comparefolderpath(flpath,subpath)
  582.     return
  583. end
  584. local function getend(path)
  585.     local pathtbl={}
  586.     local s=""
  587.     local pathsize=0
  588.     -- Divide string and count the number of
  589.     -- divisions.
  590.      for str in string.gmatch(path, "([^/]+)") do
  591.          pathtbl[#pathtbl+1] = str  
  592.      end
  593.      return pathtbl[#pathtbl]
  594. end
  595. function iszip(file)
  596.     local f = fs.open(file,"r")
  597.     local c = f.readAll()
  598.     f.close()
  599.     return type(c) == "table"
  600. end
  601. local function intable(tbl,am)
  602.     for i = 1, #tbl do
  603.         if(tbl[i].n == am)then
  604.             return true
  605.         end
  606.     end
  607.     return false
  608. end
  609. function ziplist(zip,dir)
  610.     local folders = {}
  611.     local files = {}
  612.     local list = {}
  613.     local startls = false
  614.     local f = fs.open(zip,"r")
  615.     local c = (f.readAll())
  616.     c = textutils.unserialize(c)
  617.     f.close()
  618.     for k, v in pairs(c) do
  619.         if(comparesubpath(dir,k))then
  620.             if(pathlen(formatpath(k)) == pathlen(dir))then
  621.                 files[getend(k)] = {t="file",c=v.content}
  622.                 --print("File:" .. getend(k))
  623.                 --print("------------------")
  624.                 --os.pullEvent("key")
  625.             elseif(pathlen(formatpath(k)) < 2+pathlen(dir) and
  626.             not intable(folders,filterdirpath(dir,formatpath(k))))then
  627.                 folders[#folders+1] = {n=filterdirpath(dir,formatpath(k)),t="folder",c=v.content}
  628.                 --print("Folder: " .. filterdirpath(dir,formatpath(k)))
  629.                 --os.pullEvent("key")
  630.             end
  631.         end
  632.     end
  633.     for k, v in pairs(files) do
  634.         folders[#folders+1] = {n=k,type=v.t,data=v.c}
  635.     end
  636.     for i = 1, #folders do
  637.         list[i] = {n=folders[i].n,type=folders[i].t,data=folders[i].c}
  638.     end
  639.     return list
  640. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement