randomdude999

Pastebin+

Oct 23rd, 2015
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.84 KB | None | 0 0
  1. local args = {...}
  2. local pName = fs.getName(shell.getRunningProgram())
  3. local apiDevKey = "2b21312f8f437a991738112286ea1649"
  4. local apiPage = "https://pastebin.com/api/api_post.php"
  5. local urlenc = textutils.urlEncode
  6. local settingsFile = fs.open("/.pastebin+settings",'r')
  7. local tSettings
  8. if settingsFile then
  9.   tSettings = textutils.unserialize(settingsFile.readAll())
  10.   settingsFile.close()
  11. else
  12.   tSettings = {}
  13. end
  14. local putErrors = {
  15.   ["api_paste_code was empty"] = "Error: File is empty.",
  16.   ["IP blocked"] = "Error: Your IP address has been blocked.",
  17.   ["maximum paste size exceeded"] = "Error: Paste too long",
  18.   ["maximum number of 25 unlisted pastes for your free account"] = "Error: Unlisted paste limit reached",
  19.   ["maximum number of 10 private pastes for your free account"] = "Error: Private paste limit reached",
  20.   ["invalid api_expire_date"] = "Error: Invalid expire time. Valid values are:\nN, 10M, 1H, 1D, 1W, 2W, 1M",
  21.   ["invalid api_paste_private"] = "Error: Exposure must be either public, unlisted or private",
  22.   ["invalid api_paste_format"] = "Error: Invalid paste syntax language."
  23. }
  24. local function handle2byteChars(str)
  25.   return string.gsub(str, ".", function(c)
  26.     if string.byte(c) > 191 then
  27.       return "?"
  28.     else
  29.       return c
  30.     end
  31. end)
  32. end
  33. local function getProp(list,prop)
  34.   return string.match(list,"<"..prop..">(.-)</"..prop..">")
  35. end
  36. local function strftime(timestamp)
  37.   local webH = http.get("http://www.convert-unix-time.com/api?format="..(tSettings.timeformat or "iso8601").."&timestamp="..timestamp)
  38.   local json = webH.readAll()
  39.   webH.close()
  40.   date = string.match(json,"\"localDate\":\"(.-)\"")
  41.   return date
  42. end
  43. local function printUsage(func)
  44.   local usages = {}
  45.   usages[1]="login <username>\nDO NOT ENTER PASSWORD ON COMMAND LINE!"
  46.   usages["login"]=usages[1]
  47.   usages[2]="get <PB id> <filename>"
  48.   usages["get"]=usages[2]
  49.   usages[3]="read <id>"
  50.   usages["read"]=usages[3]
  51.   usages[4]="run <id>"
  52.   usages["run"]=usages[4]
  53.   usages[5]="put <filename> [private | unlisted | public] [format]* [expire date]** [paste name]\n*See http://pastebin.com/api \n**N=Never, 10M=10 minutes, 1H=1 hour, 1D=1 day, 1W=1 week, 2W = 2 weeks, 1M = 1 month"
  54.   usages["put"]=usages[5]
  55.   usages[6]="delete <PB id>"
  56.   usages["delete"]=usages[6]
  57.   usages[7]="list"
  58.   usages["list"]=usages[7]
  59.   usages[8]="trending"
  60.   usages["trending"]=usages[8]
  61.   usages[9]="settings"
  62.   usages["settings"]=usages[9]
  63.   if not func then
  64.     print("Usages:\n"..pName..' '..table.concat(usages,'\n'..pName.." "))
  65.   else
  66.     print("Usage: "..pName.." "..usages[func])
  67.   end
  68. end
  69. local function parseList(list)
  70.   if not list:find("^<paste>") then
  71.     return false
  72.   else
  73.     local pastes = {}
  74.     string.gsub(list,"<paste>(.-)</paste>", function(pasteText)
  75.       local paste = {}
  76.       paste.key = getProp(pasteText,"paste_key")
  77.       paste.unixdate = tonumber(getProp(pasteText,"paste_date"))
  78.       paste.date = strftime(paste.unixdate)
  79.       paste.title = handle2byteChars(getProp(pasteText,"paste_title"))
  80.       paste.size = tonumber(getProp(pasteText,"paste_size"))
  81.       paste.expire_date_unix = tonumber(getProp(pasteText,"paste_expire_date"))
  82.       if paste.expire_date_unix~="0" then
  83.         paste.expire_date = strftime(paste.expire_date_unix)
  84.       else
  85.         paste.expire_date = false
  86.       end
  87.       paste.private = getProp(pasteText,"paste_private")
  88.       paste.format_long = getProp(pasteText,"paste_format_long")
  89.       paste.format_short = getProp(pasteText,"paste_format_short")
  90.       paste.url = getProp(pasteText,"paste_url")
  91.       paste.hits = tonumber(getProp(pasteText,"paste_hits"))
  92.       table.insert(pastes,paste)
  93.     end)
  94.     return pastes
  95.   end
  96. end
  97. local function parseUser(list)
  98.   if not list:find("^<user>") then
  99.     return false
  100.   else
  101.     local user = {}
  102.     user.name=handle2byteChars(getProp(list,"user_name"))
  103.     user.format_short=getProp(list,"user_format_short")
  104.     user.expiration=getProp(list,"user_expiration")
  105.     user.avatar_url=getProp(list,"user_avatar_url")
  106.     user.private=tonumber(getProp(list,"user_private"))
  107.     user.website=handle2byteChars(getProp(list,"user_website"))
  108.     user.email=handle2byteChars(getProp(list,"user_email"))
  109.     user.location=handle2byteChars(getProp(list,"user_location"))
  110.     user.is_pro=getProp(list,"user_account_type")=="1"
  111.     return user
  112.   end
  113. end
  114. local function login(user)
  115.   if not user then
  116.     printUsage("login")
  117.   else
  118.     term.write("Password: ")
  119.     local password = read(tSettings.passMask or '*')
  120.     local params = {}
  121.     table.insert(params,"api_dev_key="..apiDevKey)
  122.     table.insert(params,"&api_user_name="..urlenc(user))
  123.     table.insert(params,"&api_user_password="..urlenc(password))
  124.     local webH = http.post("https://pastebin.com/api/api_login.php",table.concat(params))
  125.     PBUserKey = webH.readAll()
  126.     webH.close()
  127.   end
  128. end
  129. local function getAsText(id)
  130.   local webH = http.get("http://pastebin.com/raw/"..id)
  131.   local text = webH.readAll()
  132.   webH.close()
  133.   return text
  134. end
  135. local function get(id,name)
  136.   if not id or not name then
  137.     printUsage("get")
  138.     return
  139.   end
  140.   file = fs.open(shell.resolve(name),'w')
  141.   file.write(getAsText(id))
  142.   file.close()
  143. end
  144. local function run(id)
  145.   if not id then
  146.     printUsage("run")
  147.   else
  148.     get(id,"/."..id)
  149.     shell.run("/"..id)
  150.     fs.delete("/"..id)
  151.   end
  152. end
  153. local function view(id)
  154.   if not id then
  155.     printUsage("read")
  156.   else
  157.     textutils.pagedPrint(getAsText(id))
  158.   end
  159. end
  160. local function delete(id)
  161.   if not id then
  162.     printUsage("delete")
  163.     return
  164.   end
  165.   if PBUserKey then
  166.     local params = {}
  167.     table.insert(params,"api_dev_key="..apiDevKey)
  168.     table.insert(params,"&api_user_key="..PBUserKey)
  169.     table.insert(params,"&api_option=delete")
  170.     table.insert(params,"&api_paste_key="..id)
  171.     local webH = http.post(apiPage,table.concat(params))
  172.     local output = webH.readAll()
  173.     webH.close()
  174.     if output == "Bad API request, invalid permission to remove paste" then
  175.       print("You are not the owner of that paste.")
  176.     else
  177.       print("Paste "..id.." removed.")
  178.     end
  179.   else
  180.     print("Must be logged in to delete pastes")
  181.   end
  182. end
  183. local function list(pastes,isTrends)
  184.   if pastes then
  185.     pastes = parseList(pastes)
  186.     for _,paste in ipairs(pastes) do
  187.       if not isTrends then
  188.         if paste.private=="0" then term.blit(" ","0","3")
  189.           elseif paste.private=="1" then term.blit(" ","0","d")
  190.           elseif paste.private=="2" then term.blit(" ","0","1")
  191.         end
  192.         term.write(" ")
  193.       end
  194.       term.setBackgroundColor(1)
  195.       term.setTextColor(32768)
  196.       if paste.title=="" then
  197.         term.write("Untitled")
  198.       else
  199.         term.write(paste.title)
  200.       end
  201.       term.setBackgroundColor(32768)
  202.       term.setTextColor(1)
  203.       local text = '\n'..paste.size.." B, "..paste.date..", "..paste.key..", "..paste.hits.." hits"
  204.       if paste.expire_date then
  205.         text = text .. ", expires on "..paste.expire_date
  206.       end
  207.       textutils.pagedPrint(text)
  208.     end
  209.   end
  210. end
  211. local function listRaw()
  212.   if PBUserKey then
  213.     local params = {}
  214.     table.insert(params,"api_dev_key="..apiDevKey)
  215.     table.insert(params,"&api_user_key="..PBUserKey)
  216.     table.insert(params,"&api_option=list")
  217.     local webH = http.post(apiPage,table.concat(params))
  218.     local text = webH.readAll()
  219.     webH.close()
  220.     return text
  221.   else
  222.     print("Must be logged in to list pastes")
  223.   end
  224. end
  225. local function trending()
  226.   local webH = http.post(apiPage,"api_dev_key="..apiDevKey.."&api_option=trends")
  227.   local text = webH.readAll()
  228.   webH.close()
  229.   list(text,true)
  230. end
  231. local function settings()
  232.   if PBUserKey then
  233.     local webH = http.post(apiPage,"api_dev_key="..apiDevKey.."&api_option=userdetails&api_user_key="..PBUserKey)
  234.     local text = webH.readAll()
  235.     webH.close()
  236.     return text
  237.   else
  238.     return ""
  239.   end
  240. end
  241. local function listSettings()
  242.   local user = parseUser(settings())
  243.   if user then
  244.     term.write("Name: "..user.name..' ')
  245.     if user.is_pro then
  246.       if term.isColor() then
  247.         term.blit("PRO","000","111")
  248.       else
  249.         term.blit("PRO","000","888")
  250.       end
  251.     end
  252.     print("\nWebsite: "..user.website)
  253.     print("Email: "..user.email)
  254.     print("Location: "..user.location)
  255.   else
  256.     print("Must be logged in to list settings")
  257.   end
  258. end
  259. local function put(file,expo,format,expire,name)
  260.   if not file then
  261.     printUsage("put")
  262.     return
  263.   end
  264.   if fs.exists(shell.resolve(file)) then
  265.     local currsettings
  266.     if PBUserKey then
  267.       currsettings = settings()
  268.     end
  269.     if not expo and PBUserKey then
  270.       expo = getProp(currsettings,"user_private")
  271.     elseif not expo then
  272.       expo = tSettings.exposure or "public"
  273.     end
  274.     if expo=="public" or expo=="0" then
  275.       expo = "0"
  276.     elseif expo=="unlisted" or expo=="1" then
  277.       expo = "1"
  278.     elseif expo=="private" or expo=="2" then
  279.       expo = "2"
  280.     end
  281.     if not format then
  282.       if PBUserKey then
  283.         format = getProp(currsettings,"user_format_short")
  284.       else
  285.         format = tSettings.format or "text"
  286.       end
  287.     end
  288.     if not expire then
  289.       if PBUserKey then
  290.         expire = getProp(currsettings,"user_expiration")
  291.       else
  292.         expire = tSettings.expiration or "N"
  293.       end
  294.     end
  295.     local file = fs.open(shell.resolve(file),'r')
  296.     local fileText = file.readAll()
  297.     file.close()
  298.     local params = {}
  299.     table.insert(params,"api_dev_key="..apiDevKey)
  300.     table.insert(params,"&api_option=paste")
  301.     if PBUserKey then table.insert(params,"&api_user_key="..PBUserKey) end
  302.     if name then table.insert(params,"&api_paste_name="..urlenc(name)) end
  303.     table.insert(params,"&api_paste_format="..format)
  304.     if expo then table.insert(params,"&api_paste_private="..expo) end
  305.     table.insert(params,"&api_paste_expire_date="..expire)
  306.     table.insert(params,"&api_paste_code="..urlenc(fileText))
  307.     local webH = http.post(apiPage,table.concat(params))
  308.  
  309.     local output = webH.readAll()
  310.     local notOk, err = string.match(output, "(Bad API request), (.*)")
  311.     if notOk then
  312.        print(putErrors[err])
  313.     else
  314.       print("Success! Pastebin id: "..output:sub(21,#output))
  315.     end
  316.   else
  317.     print("Error: File does not exist.")
  318.   end
  319. end
  320. if #args == 0 then
  321.   printUsage()
  322. else
  323.   local arg = table.remove(args,1)
  324.   if arg == "login" then
  325.     login(args[1])
  326.   elseif arg == "get" then
  327.     get(table.unpack(args))
  328.   elseif arg == "read" then
  329.     view(args[1])
  330.   elseif arg == "run" then
  331.     run(args[1])
  332.   elseif arg == "put" then
  333.     put(table.unpack(args))
  334.   elseif arg == "delete" then
  335.     delete(args[1])
  336.   elseif arg == "list" then
  337.     list(listRaw())
  338.     sleep(0)
  339.   elseif arg == "trending" then
  340.     trending()
  341.   elseif arg == "settings" then
  342.     listSettings()
  343.   else
  344.     printUsage()
  345.   end
  346. end
Advertisement
Add Comment
Please, Sign In to add comment