daily pastebin goal
15%
SHARE
TWEET

update

legg0028 Sep 20th, 2018 (edited) 142 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local arg = { ... }
  2. if #arg < 2 then
  3.   -- Check to see if there are saved login details
  4.   if fs.exists("credentials") then
  5.     local h = fs.open("credentials", "r")
  6.     local data = h.readAll()
  7.     h.close()
  8.     local data = textutils.unserialize(data)
  9.     api_user_name = data[1]
  10.     api_user_password = data[2]
  11.   else
  12.     term.clear()
  13.     term.setCursorPos(1,1)
  14.     error("Login credentials not specified. Usage: update <username> <password> [-s:save credentials locally]", 0)
  15.   end
  16. else
  17.   api_user_name = arg[1]
  18.   api_user_password = arg[2]
  19.   if fs.exists("username") ~= true then
  20.     local h = fs.open("username", "w")
  21.     h.write(api_user_name)
  22.     h.close()
  23.   end
  24.   if arg[3] == "-s" then
  25.     local h = fs.open("credentials", "w")
  26.     h.write(textutils.serialize({api_user_name, api_user_password}))
  27.     h.close()
  28.   end
  29. end
  30.  
  31. -- You need to put your api_dev_key here
  32. local api_dev_key = "dfe49e216beea148e6acf8d5149d93f1" -- e.g., "cfe49e216beea143e6acf8h5149d93f1"
  33.  
  34. -- Authenticates with Pastebin.
  35. -- Example: local agente382 = pastebin.login("AgentE382", "thisisnotmypassword")
  36. --
  37. -- Returns user key for use with other API functions.
  38. function login(api_user_name, api_user_password)
  39.     assert(type(api_user_name) == "string" and type(api_user_password) == "string", "Both arguments are required and must be strings!")
  40.     return http.post(
  41.         "https://pastebin.com/api/api_login.php",
  42.         "api_dev_key="..api_dev_key.."&"..
  43.         "api_user_name="..textutils.urlEncode(api_user_name).."&"..
  44.         "api_user_password="..textutils.urlEncode(api_user_password)
  45.         ).readAll()
  46. end
  47.  
  48. -- Internal function that parses the pastebin XML response.
  49. local function parse(response)
  50.     local objs = {}
  51.     for prefix, objstr in string.gmatch(response, "<(.-)>(.-)</%1>") do
  52.         local obj = {}
  53.         for key, value in string.gmatch(objstr, "<"..prefix.."_(.-)>(.-)</"..prefix.."_%1>") do
  54.             obj[key] = value
  55.         end
  56.         objs[#objs+1] = obj
  57.     end
  58.     return objs
  59. end
  60.  
  61. -- Used to be a custom function, but I realized CC-Lua had one already.
  62. local url_encode = textutils.urlEncode
  63.  
  64. -- Fetches a paste from Pastebin.
  65. -- Example: local rc4 = pastebin.get("Rxe673BJ")
  66. --
  67. -- Returns requested paste as a string or an error message.
  68. function get(api_paste_key)
  69.     assert(type(api_paste_key) == "string", "Enter a valid paste key as a string!")
  70.     local response = http.get("https://pastebin.com/raw.php?i="..url_encode(api_paste_key))
  71.     return response and response.readAll()
  72. end
  73.  
  74. -- Lists data about all of a user's pastes. Uses user key from login(). Note that this makes it impossible to get data about random people's pastes.
  75. -- Example: local allpastes = pastebin.list(agente382, 1000)
  76. --
  77. -- Returns a list of data about all pastes associated with a user's account, using the table format described at the end of the document.
  78. function list(api_user_key, api_results_limit)
  79.     assert(type(api_user_key) == "string", "Enter a valid user key as a string!")
  80.     local urlstr = {"api_dev_key=", url_encode(api_dev_key), "&api_user_key=", url_encode(api_user_key), "&api_option=list"}
  81.     if api_results_limit then if type(api_results_limit) == "number" then if api_results_limit > 1000 then api_results_limit = 1000 elseif api_results_limit < 1 then api_results_limit = 1 end local len = #urlstr urlstr[len+1] = "&api_results_limit=" urlstr[len+2] = url_encode(api_results_limit) else io.stderr:write("Results limit must be a number!\n") end end
  82.     local response = http.post("https://pastebin.com/api/api_post.php", table.concat(urlstr)).readAll()
  83.     if string.find(response,"<") then
  84.         return parse(response)
  85.     else
  86.         return response
  87.     end
  88. end
  89.  
  90. -- Table Format:
  91. --      Pastes:
  92. --      {
  93. --          [1] = {
  94. --              date = "1297953260",
  95. --              format_short = "javascript",
  96. --              key = "0b42rwhf",
  97. --              size = "15",
  98. --              hits = "15",
  99. --              format_long = "JavaScript",
  100. --              url = "https://pastebin.com/0b42rwhf",
  101. --              title = "javascript test",
  102. --              private = "0",        -- 0:Public - 1:Unlisted - 2:Private
  103. --              expire_date = "1297956860"
  104. --          },
  105. --          [2] = {
  106. --              date = "1297694343",
  107. --              format_short = "text",
  108. --              key = "0C343n0d",
  109. --              size = "490",
  110. --              hits = "65",
  111. --              format_long = "None",
  112. --              url = "https://pastebin.com/0C343n0d",
  113. --              title = "Welcome To Pastebin V3",
  114. --              private = "0",        -- 0:Public - 1:Unlisted - 2:Private
  115. --              expire_date = "0"
  116. --          }
  117. --      }
  118. ------------------------
  119.  
  120. term.clear()
  121. term.setCursorPos(1,1)
  122. print("Preparing to update programs...")
  123.  
  124. user_data = login(api_user_name, api_user_password)
  125. local allPastes = list(user_data) --"put all pastes in a table"
  126. local folderName = api_user_name
  127. if peripheral.isPresent("bottom") and peripheral.getType("bottom") == "drive" then
  128.   print("Disk drive found, updating to disk.")
  129.   sleep(1)
  130.   if fs.exists("/disk/" ..folderName.. "/updates") then --"remove the old updates folder"
  131.     fs.delete("/disk/" ..folderName.. "/updates")
  132.   end
  133.   if fs.exists("/disk/" ..folderName) then --"remove the old folder"
  134.     fs.delete("/disk/" ..folderName)
  135.   end
  136.   fs.makeDir("disk/" ..folderName) --"make a new updates folder"
  137.   downloadDir = "disk/" ..folderName.. "/"
  138. else
  139.   print("Updating computer.")
  140.   sleep(1)
  141.   if fs.exists("/" ..folderName.. "/updates") then --"remove the old updates folder"
  142.     fs.delete("/" ..folderName.. "/updates")
  143.   end
  144.   fs.makeDir("/" ..folderName) --"make a new updates folder"
  145.   downloadDir = folderName.. "/"
  146. end
  147.  
  148. for i,v in ipairs(allPastes) do --"for each of my pastes download it and save it (with the name it has on pastebin)"
  149.   code = http.get("https://pastebin.com/raw.php?i="..allPastes[i]["key"])
  150.   if code then
  151.         h = fs.open(downloadDir..allPastes[i]["title"],"w")
  152.         h.write(code.readAll())
  153.         h.close()
  154.         term.setCursorPos(1,4)
  155.         print("\""..allPastes[i]["title"].."\" successfully downloaded                         ")
  156.   else
  157.         print(allPastes[i]["title"] "failed to download")
  158.   end
  159. end
  160.  
  161. term.setCursorPos(1,4)
  162. print("Successfully updated "..#allPastes.." programs.")
  163. if downloadDir == "disk/" ..folderName then
  164.   fs.delete("/" ..folderName)
  165.   fs.copy("disk/" ..folderName, folderName)
  166.   print("Successfully updated computer.")
  167. end
  168. if downloadDir == "disk/" ..folderName.. "/" then
  169.   print("Setting disk startup program.")
  170.   if fs.exists("/disk/startup") then
  171.     fs.delete("/disk/startup")
  172.   end
  173.   fs.copy("disk/" ..folderName.. "/refresh", "disk/startup")
  174.   if fs.exists("/disk/username") then
  175.     fs.delete("/disk/username")
  176.   end
  177.   fs.copy("username", "disk/username")
  178.   print("Done.")
  179. end
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top