bigtwisty

db-old

Aug 19th, 2013
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.08 KB | None | 0 0
  1. local appName = "db"
  2. local appVersion = "3.0a"
  3. local appLink = "https://www.dropbox.com/s/sik9hektcwy20jo/db.lua"
  4.  
  5. args = {...}
  6. apps = {}
  7. apis = {}
  8. webApps = {}
  9. selection = 1
  10. page = 1
  11. displayCount = 10
  12.  
  13. local function LoadData()
  14.   apps = {}
  15.  
  16.   local handle = fs.open("db-data","r")
  17.   if handle == nil then
  18.     return
  19.   end
  20.   local data = handle.readAll()
  21.   handle.close()
  22.  
  23.   for name,version,link in string.gmatch(data, "<app name=\"(.-)\" version=\"(.-)\">(.-)</app>") do
  24.     apps[name] = {}
  25.     apps[name].version = version
  26.     apps[name].link = link
  27.   end
  28. end
  29.  
  30. local function SaveData()
  31.   local handle = fs.open("db-data","w")
  32.   for k,v in pairs(apps) do
  33.     handle.writeLine("<app name=\""..k.."\" version=\""..v.version.."\">"..v.link.."</app>")
  34.   end
  35.   handle.close()
  36. end
  37.  
  38. -- Download a program from Dropbox
  39. local function Download(link)
  40.   -- Ensure direct download link
  41.   link = string.gsub(link,"(//www.)","//dl.",1)
  42.  
  43.   -- Open the file
  44.   local handle = http.get(link)
  45.   assert(handle ~= nil, "Invalid link ("..link..")")
  46.   local code = handle.readAll()
  47.   handle.close()
  48.  
  49.   -- Try to get name from code, default to name from link
  50.   local name = string.match(code, "appName[%s*]=[%s*]\"(.-)\"")
  51.   if name == nil then
  52.     for word in string.gmatch(link, "/(%w+)") do
  53.       name = word
  54.     end
  55.   end
  56.  
  57.   -- Try to get version from code, default to N/A
  58.   local version = string.match(code, "appVersion[%s*]=[%s*]\"(.-)\"")
  59.   if version == nil then
  60.     version = "N/A"
  61.   end
  62.  
  63.   -- If no label on computer, set label to program name
  64.   if not os.getComputerLabel() then
  65.     os.setComputerLabel(name)
  66.   end
  67.  
  68.   return code,name,version,link
  69. end
  70.  
  71. local function Save(name, content)
  72.   local handle = fs.open(name, "w")
  73.   assert(handle ~= nil, "Save: could not open ("..name..") for write")
  74.   handle.write(content)
  75.   handle.close()
  76. end
  77.  
  78. local function LoadWebData()
  79.   webApps = {}
  80.   code = Download("https://www.dropbox.com/s/v8ahxi3ilb6v637/index.xml")
  81.   local index = 1
  82.   for name,version,data in string.gmatch(code, "<app name=\"(.-)\" version=\"(.-)\">(.-)</app>") do
  83.     local app = {}
  84.     app.name = name
  85.     app.version = version
  86.     app.link = string.match(data, "<link>(.-)</link>")
  87.     app.description = string.match(data, "<description>(.-)</description>")
  88.     if app.link ~= nil then
  89.       webApps[index] = app
  90.       index = index + 1
  91.     end
  92.   end
  93. end
  94.  
  95. local function UpdateApps()
  96.   local newApps = {}
  97.   for k,v in pairs(apps) do
  98.     local code,name,version,link = Download(v.link)
  99.     assert(name ~= nil, "Invalid link: "..v.link)
  100.     newApps[name] = {}
  101.     newApps[name].version = version
  102.     newApps[name].link = link
  103.     Save(name,code)
  104.     print("App: "..name.." (v"..version..")")
  105.     for name,link in code.gmatch(code,"os.loadAPI%(\"(%w+)\"%)%-%-<link>(.-)</link>") do
  106.       apis[name] = {}
  107.       apis[name].link = link
  108.       print("  Uses: "..name)
  109.     end
  110.   end
  111.   apps = newApps
  112. end
  113.  
  114. local function UpdateApis()
  115.   local newApis = {}
  116.   for k,v in pairs(apis) do
  117.     local code,name,version,link = Download(v.link)
  118.     assert(name ~= nil, "Invalid link: "..v.link)
  119.     newApis[k] = {}
  120.     newApis[k].version = version
  121.     newApis[k].link = link
  122.     os.unloadAPI(k)
  123.     Save(k,code)
  124.     print("API: "..k.." (v"..version..")")
  125.   end
  126.   apis = newApis
  127. end
  128.  
  129. local function drawScreen()
  130.   local width, height = term.getSize()
  131.   term.clear()
  132.   term.setCursorPos(1,1)
  133.   print("Dropbox Interface (v"..appVersion..")")
  134.   print("--------------------")
  135.   print("Name:    "..webApps[getIndex()].name)
  136.   if webApps[getIndex()].version ~= nil then
  137.     print("Version: ", webApps[getIndex()].version)
  138.   end
  139.   if webApps[getIndex()].description ~= nil then
  140.     print("Description:\n")
  141.     print("  "..webApps[getIndex()].description)
  142.   end
  143.  
  144.   term.setCursorPos(1,height - displayCount - 1)
  145.   print("--------------------")
  146.   for i = 1,displayCount do
  147.     if getIndex(i) <= #webApps then
  148.       if i == selection then
  149.         write("--> ")
  150.       else
  151.         write("    ")
  152.       end
  153.       print(webApps[i].name)
  154.     end
  155.   end
  156. end
  157.  
  158. local function add(link)
  159.   LoadData()
  160.   apps["added_file"] = {}
  161.   apps["added_file"].version = "N/A"
  162.   apps["added_file"].link = link
  163.   UpdateApps()
  164.   UpdateApis()
  165.   SaveData()
  166. end
  167.  
  168. function self()
  169.   code = Download(appLink)
  170.   handle = fs.open("db", "w")
  171.   handle.write(code)
  172.   handle.close()
  173. end
  174.  
  175. function getIndex(index)
  176.   if index == nil then
  177.     index = selection
  178.   end
  179.   return (page - 1) * displayCount + index
  180. end
  181.  
  182. local function pageCount()
  183.   return math.ceil(#webApps / displayCount)
  184. end
  185.  
  186. local function interface()
  187.   print("Loading index from web...")
  188.   LoadWebData()
  189.   drawScreen()
  190.   local running = true
  191.   while running do
  192.     event, p1 = os.pullEvent("key")
  193.     if p1 == 200 then
  194.       if getIndex() > 1 then
  195.         if selection == 1 then
  196.           page = page - 1
  197.         else
  198.           selection = selection - 1
  199.         end
  200.       end
  201.     elseif p1 == 208 then
  202.       if getIndex() < #webApps then
  203.         if selection == displayCount then
  204.           page = page + 1
  205.         else
  206.           selection = selection + 1
  207.         end
  208.       end
  209.     elseif p1 == 201 then
  210.       if page > 1 then
  211.         page = page - 1
  212.       end
  213.     elseif p1 == 209 then
  214.       if page < pageCount() then
  215.         page = page + 1
  216.         selection = math.min(selection, #webApps - ((pageCount() - 1) * displayCount))
  217.       end
  218.     elseif p1 == 28 then
  219.       print()
  220.       print("Adding "..webApps[getIndex()].name.." to applications and updating all...")
  221.       add(webApps[getIndex()].link)
  222.       running = false
  223.     elseif p1 == 16 then
  224.       running = false
  225.     end
  226.     if running then drawScreen() end
  227.   end
  228. end
  229.  
  230. if args[1] == "update" then
  231.   if (not fs.exists("db-data")) then
  232.     print("No existing db data.  Run \"db get\" first.")
  233.   else
  234.     print("Updating:")
  235.     LoadData()
  236.     UpdateApps()
  237.     UpdateApis()
  238.     SaveData()
  239.   end
  240. elseif (args[1] == "add") and (#args == 2) then
  241.   add(args[2])
  242. elseif args[1] == "self" then
  243.   self()
  244. else
  245.   interface()
  246. end
Advertisement
Add Comment
Please, Sign In to add comment