Advertisement
1lann

snipt

Aug 25th, 2013
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.58 KB | None | 0 0
  1. local tArgs = {...}
  2.  
  3.  
  4. local dnt = false
  5. local data = {}
  6. local databaseLoc = "/.snipt-database"
  7. local function loadDatabase()
  8.     if not(fs.exists(databaseLoc)) or fs.isDir(databaseLoc) then
  9.         fs.delete(databaseLoc)
  10.         local f = io.open(databaseLoc,"w")
  11.         f:write(textutils.serialize({false,{}}))
  12.         f:close()
  13.     end
  14.  
  15.     local f = io.open(databaseLoc,"r")
  16.     local database = textutils.unserialize(f:read("*a"))
  17.     f:close()
  18.  
  19.     if database then
  20.         if type(database[1]) == "boolean" then
  21.             dnt = database[1]
  22.             data = database[2]
  23.         else
  24.             print("Database corrupted, resetting")
  25.             fs.delete(databaseLoc)
  26.             local f = io.open(databaseLoc,"w")
  27.             f:write(textutils.serialize({false,{}}))
  28.             f:close()
  29.         end
  30.     else
  31.         print("Database corrupted, resetting")
  32.         fs.delete(databaseLoc)
  33.         local f = io.open(databaseLoc,"w")
  34.         f:write(textutils.serialize({false,{}}))
  35.         f:close()
  36.     end
  37. end
  38.  
  39. local function betterGet(url)
  40.     http.request(url)
  41.     while true do
  42.         local e, rUrl, rmsg = os.pullEvent()
  43.         if (e == "http_success") and (rUrl == url) then
  44.             if rmsg then
  45.                 local data = rmsg.readAll()
  46.                 rmsg.close()
  47.                 if data then
  48.                     return "success", data
  49.                 else
  50.                     sleep(1)
  51.                     http.request(url)
  52.                 end
  53.             else
  54.                 sleep(1)
  55.                 http.request(url)
  56.             end
  57.         elseif (e == "http_failure") and (rUrl == url) then
  58.             return "failure"
  59.         end
  60.     end
  61. end
  62. local function track(file,url)
  63.     if not dnt then
  64.         data[shell.resolve(file)] = url
  65.         local f = io.open(databaseLoc,"w")
  66.         f:write(textutils.serialize({false,data}))
  67.         f:close()
  68.     end
  69. end
  70. local function retrieveSnipt(snipt,file)
  71.     loadDatabase()
  72.     if (#snipt < 10) then
  73.         local num = snipt:match("%d+")
  74.         if num then
  75.             local resp,data = betterGet("https://snipt.net/api/public/snipt/"..num.."/?format=xml")
  76.             if resp == "success" then
  77.                 local url = data:match("<raw_url>([^<]+)</raw_url>")
  78.                 if not url then
  79.                     print("Failed to retrieve snipt! [6]")
  80.                     return false
  81.                 else
  82.                     resp,data = betterGet(url)
  83.                     if resp == "success" then
  84.                         if fs.exists(file) then
  85.                             write("File exists, overwrite [Y/n]? ")
  86.                             local input = read()
  87.                             if input:lower():find("n") then
  88.                                 print("Cancelled!")
  89.                                 return false
  90.                             else
  91.                                 local f = io.open(file,"w")
  92.                                 f:write(data)
  93.                                 f:close()
  94.                                 track(file,url)
  95.                                 print("Snipt saved!")
  96.                                 return true
  97.                             end
  98.                         else
  99.                             local f = io.open(file,"w")
  100.                             f:write(data)
  101.                             f:close()
  102.                             track(file,url)
  103.                             print("Snipt saved!")
  104.                             return true
  105.                         end
  106.                     else
  107.                         print("Failed to retrieve snipt! [2]")
  108.                     end
  109.                 end
  110.             else
  111.                 print("Failed to retrieve snipt! [1]")
  112.                 return false
  113.             end
  114.         else
  115.             print("Invalid Snipt ID!")
  116.         end
  117.     elseif (#snipt >= 32) and (#snipt < 100) then
  118.         for word in string.gmatch(snipt,"/?([^/]+)/?") do
  119.             if #word == 32 then
  120.                 local resp,data = betterGet("https://snipt.net/raw/"..word.."/")
  121.                 if resp == "success" then
  122.                     if fs.exists(file) then
  123.                         write("File exists, overwrite [Y/n]? ")
  124.                         local input = read()
  125.                         if input:lower():find("n") then
  126.                             print("Cancelled!")
  127.                             return false
  128.                         else
  129.                             local f = io.open(file,"w")
  130.                             f:write(data)
  131.                             f:close()
  132.                             track(file,"https://snipt.net/raw/"..word.."/")
  133.                             print("Snipt saved!")
  134.                             return true
  135.                         end
  136.                     else
  137.                         local f = io.open(file,"w")
  138.                         f:write(data)
  139.                         f:close()
  140.                         track(file,"https://snipt.net/raw/"..word.."/")
  141.                         print("Snipt saved!")
  142.                         return true
  143.                     end
  144.                 else
  145.                     print("Failed to retrive snipt! [3]")
  146.                     return false
  147.                 end
  148.             end
  149.         end
  150.         print("Invalid Snipt ID!")
  151.         return false
  152.     else
  153.         print("Invalid Snipt ID!")
  154.         return false
  155.     end
  156. end
  157.  
  158. local function printUsage()
  159.     print("Usage:")
  160.     print("snipt <id> <filename>")
  161.     print("snipt wget <url> <filename>")
  162.     print("snipt <filename>")
  163.     print("snipt dnt (Toggles tracking)")
  164. end
  165.  
  166. if tArgs[1] == "dnt" then
  167.     loadDatabase()
  168.     if dnt then
  169.         local f = io.open(databaseLoc,"w")
  170.         dnt = false
  171.         f:write(textutils.serialize({dnt,data}))
  172.         f:close()
  173.         print("Tracking turned on")
  174.     else
  175.         local f = io.open(databaseLoc,"w")
  176.         dnt = true
  177.         f:write(textutils.serialize({dnt,data}))
  178.         f:close()
  179.         print("Tracking turned off")
  180.     end
  181. elseif (tArgs[1] == "wget") then
  182.     if tArgs[2] and tArgs[3] then
  183.         loadDatabase()
  184.         local resp,data = betterGet(tArgs[2])
  185.         if resp == "success" then
  186.             if fs.exists(tArgs[3]) then
  187.                 write("File exists, overwrite [Y/n]? ")
  188.                 local input = read()
  189.                 if input:lower():find("n") then
  190.                     print("Cancelled!")
  191.                     return false
  192.                 else
  193.                     local f = io.open(tArgs[3],"w")
  194.                     f:write(data)
  195.                     f:close()
  196.                     track(tArgs[3],tArgs[2])
  197.                     print("Snipt saved!")
  198.                     return true
  199.                 end
  200.             else
  201.                 local f = io.open(tArgs[3],"w")
  202.                 f:write(data)
  203.                 f:close()
  204.                 track(tArgs[3],tArgs[2])
  205.                 print("Snipt saved!")
  206.                 return true
  207.             end
  208.         else
  209.             print("Failed to retrive snipt! [5]")
  210.             return false
  211.         end
  212.     else
  213.         printUsage()
  214.     end
  215. elseif tArgs[1] and tArgs[2] then
  216.     retrieveSnipt(tArgs[1],tArgs[2])
  217. elseif tArgs[1] then
  218.     loadDatabase()
  219.     if data[shell.resolve(tArgs[1])] then
  220.         print("Retrieving:\n"..data[shell.resolve(tArgs[1])])
  221.         resp,data = betterGet(data[shell.resolve(tArgs[1])])
  222.         if resp == "success" then
  223.             local f = io.open(tArgs[1],"w")
  224.             f:write(data)
  225.             f:close()
  226.             print("Snipt saved!")
  227.             return true
  228.         else
  229.             print("Failed to retrieve snipt! [4]")
  230.         end
  231.     else
  232.         print("Could not find snipt URL in database!")
  233.         printUsage()
  234.     end
  235. else
  236.     printUsage()
  237. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement