Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local args = {...}
- local pName = fs.getName(shell.getRunningProgram())
- local apiDevKey = "2b21312f8f437a991738112286ea1649"
- local apiPage = "https://pastebin.com/api/api_post.php"
- local urlenc = textutils.urlEncode
- local settingsFile = fs.open("/.pastebin+settings",'r')
- local tSettings
- if settingsFile then
- tSettings = textutils.unserialize(settingsFile.readAll())
- settingsFile.close()
- else
- tSettings = {}
- end
- local putErrors = {
- ["api_paste_code was empty"] = "Error: File is empty.",
- ["IP blocked"] = "Error: Your IP address has been blocked.",
- ["maximum paste size exceeded"] = "Error: Paste too long",
- ["maximum number of 25 unlisted pastes for your free account"] = "Error: Unlisted paste limit reached",
- ["maximum number of 10 private pastes for your free account"] = "Error: Private paste limit reached",
- ["invalid api_expire_date"] = "Error: Invalid expire time. Valid values are:\nN, 10M, 1H, 1D, 1W, 2W, 1M",
- ["invalid api_paste_private"] = "Error: Exposure must be either public, unlisted or private",
- ["invalid api_paste_format"] = "Error: Invalid paste syntax language."
- }
- local function handle2byteChars(str)
- return string.gsub(str, ".", function(c)
- if string.byte(c) > 191 then
- return "?"
- else
- return c
- end
- end)
- end
- local function getProp(list,prop)
- return string.match(list,"<"..prop..">(.-)</"..prop..">")
- end
- local function strftime(timestamp)
- local webH = http.get("http://www.convert-unix-time.com/api?format="..(tSettings.timeformat or "iso8601").."×tamp="..timestamp)
- local json = webH.readAll()
- webH.close()
- date = string.match(json,"\"localDate\":\"(.-)\"")
- return date
- end
- local function printUsage(func)
- local usages = {}
- usages[1]="login <username>\nDO NOT ENTER PASSWORD ON COMMAND LINE!"
- usages["login"]=usages[1]
- usages[2]="get <PB id> <filename>"
- usages["get"]=usages[2]
- usages[3]="read <id>"
- usages["read"]=usages[3]
- usages[4]="run <id>"
- usages["run"]=usages[4]
- 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"
- usages["put"]=usages[5]
- usages[6]="delete <PB id>"
- usages["delete"]=usages[6]
- usages[7]="list"
- usages["list"]=usages[7]
- usages[8]="trending"
- usages["trending"]=usages[8]
- usages[9]="settings"
- usages["settings"]=usages[9]
- if not func then
- print("Usages:\n"..pName..' '..table.concat(usages,'\n'..pName.." "))
- else
- print("Usage: "..pName.." "..usages[func])
- end
- end
- local function parseList(list)
- if not list:find("^<paste>") then
- return false
- else
- local pastes = {}
- string.gsub(list,"<paste>(.-)</paste>", function(pasteText)
- local paste = {}
- paste.key = getProp(pasteText,"paste_key")
- paste.unixdate = tonumber(getProp(pasteText,"paste_date"))
- paste.date = strftime(paste.unixdate)
- paste.title = handle2byteChars(getProp(pasteText,"paste_title"))
- paste.size = tonumber(getProp(pasteText,"paste_size"))
- paste.expire_date_unix = tonumber(getProp(pasteText,"paste_expire_date"))
- if paste.expire_date_unix~="0" then
- paste.expire_date = strftime(paste.expire_date_unix)
- else
- paste.expire_date = false
- end
- paste.private = getProp(pasteText,"paste_private")
- paste.format_long = getProp(pasteText,"paste_format_long")
- paste.format_short = getProp(pasteText,"paste_format_short")
- paste.url = getProp(pasteText,"paste_url")
- paste.hits = tonumber(getProp(pasteText,"paste_hits"))
- table.insert(pastes,paste)
- end)
- return pastes
- end
- end
- local function parseUser(list)
- if not list:find("^<user>") then
- return false
- else
- local user = {}
- user.name=handle2byteChars(getProp(list,"user_name"))
- user.format_short=getProp(list,"user_format_short")
- user.expiration=getProp(list,"user_expiration")
- user.avatar_url=getProp(list,"user_avatar_url")
- user.private=tonumber(getProp(list,"user_private"))
- user.website=handle2byteChars(getProp(list,"user_website"))
- user.email=handle2byteChars(getProp(list,"user_email"))
- user.location=handle2byteChars(getProp(list,"user_location"))
- user.is_pro=getProp(list,"user_account_type")=="1"
- return user
- end
- end
- local function login(user)
- if not user then
- printUsage("login")
- else
- term.write("Password: ")
- local password = read(tSettings.passMask or '*')
- local params = {}
- table.insert(params,"api_dev_key="..apiDevKey)
- table.insert(params,"&api_user_name="..urlenc(user))
- table.insert(params,"&api_user_password="..urlenc(password))
- local webH = http.post("https://pastebin.com/api/api_login.php",table.concat(params))
- PBUserKey = webH.readAll()
- webH.close()
- end
- end
- local function getAsText(id)
- local webH = http.get("http://pastebin.com/raw/"..id)
- local text = webH.readAll()
- webH.close()
- return text
- end
- local function get(id,name)
- if not id or not name then
- printUsage("get")
- return
- end
- file = fs.open(shell.resolve(name),'w')
- file.write(getAsText(id))
- file.close()
- end
- local function run(id)
- if not id then
- printUsage("run")
- else
- get(id,"/."..id)
- shell.run("/"..id)
- fs.delete("/"..id)
- end
- end
- local function view(id)
- if not id then
- printUsage("read")
- else
- textutils.pagedPrint(getAsText(id))
- end
- end
- local function delete(id)
- if not id then
- printUsage("delete")
- return
- end
- if PBUserKey then
- local params = {}
- table.insert(params,"api_dev_key="..apiDevKey)
- table.insert(params,"&api_user_key="..PBUserKey)
- table.insert(params,"&api_option=delete")
- table.insert(params,"&api_paste_key="..id)
- local webH = http.post(apiPage,table.concat(params))
- local output = webH.readAll()
- webH.close()
- if output == "Bad API request, invalid permission to remove paste" then
- print("You are not the owner of that paste.")
- else
- print("Paste "..id.." removed.")
- end
- else
- print("Must be logged in to delete pastes")
- end
- end
- local function list(pastes,isTrends)
- if pastes then
- pastes = parseList(pastes)
- for _,paste in ipairs(pastes) do
- if not isTrends then
- if paste.private=="0" then term.blit(" ","0","3")
- elseif paste.private=="1" then term.blit(" ","0","d")
- elseif paste.private=="2" then term.blit(" ","0","1")
- end
- term.write(" ")
- end
- term.setBackgroundColor(1)
- term.setTextColor(32768)
- if paste.title=="" then
- term.write("Untitled")
- else
- term.write(paste.title)
- end
- term.setBackgroundColor(32768)
- term.setTextColor(1)
- local text = '\n'..paste.size.." B, "..paste.date..", "..paste.key..", "..paste.hits.." hits"
- if paste.expire_date then
- text = text .. ", expires on "..paste.expire_date
- end
- textutils.pagedPrint(text)
- end
- end
- end
- local function listRaw()
- if PBUserKey then
- local params = {}
- table.insert(params,"api_dev_key="..apiDevKey)
- table.insert(params,"&api_user_key="..PBUserKey)
- table.insert(params,"&api_option=list")
- local webH = http.post(apiPage,table.concat(params))
- local text = webH.readAll()
- webH.close()
- return text
- else
- print("Must be logged in to list pastes")
- end
- end
- local function trending()
- local webH = http.post(apiPage,"api_dev_key="..apiDevKey.."&api_option=trends")
- local text = webH.readAll()
- webH.close()
- list(text,true)
- end
- local function settings()
- if PBUserKey then
- local webH = http.post(apiPage,"api_dev_key="..apiDevKey.."&api_option=userdetails&api_user_key="..PBUserKey)
- local text = webH.readAll()
- webH.close()
- return text
- else
- return ""
- end
- end
- local function listSettings()
- local user = parseUser(settings())
- if user then
- term.write("Name: "..user.name..' ')
- if user.is_pro then
- if term.isColor() then
- term.blit("PRO","000","111")
- else
- term.blit("PRO","000","888")
- end
- end
- print("\nWebsite: "..user.website)
- print("Email: "..user.email)
- print("Location: "..user.location)
- else
- print("Must be logged in to list settings")
- end
- end
- local function put(file,expo,format,expire,name)
- if not file then
- printUsage("put")
- return
- end
- if fs.exists(shell.resolve(file)) then
- local currsettings
- if PBUserKey then
- currsettings = settings()
- end
- if not expo and PBUserKey then
- expo = getProp(currsettings,"user_private")
- elseif not expo then
- expo = tSettings.exposure or "public"
- end
- if expo=="public" or expo=="0" then
- expo = "0"
- elseif expo=="unlisted" or expo=="1" then
- expo = "1"
- elseif expo=="private" or expo=="2" then
- expo = "2"
- end
- if not format then
- if PBUserKey then
- format = getProp(currsettings,"user_format_short")
- else
- format = tSettings.format or "text"
- end
- end
- if not expire then
- if PBUserKey then
- expire = getProp(currsettings,"user_expiration")
- else
- expire = tSettings.expiration or "N"
- end
- end
- local file = fs.open(shell.resolve(file),'r')
- local fileText = file.readAll()
- file.close()
- local params = {}
- table.insert(params,"api_dev_key="..apiDevKey)
- table.insert(params,"&api_option=paste")
- if PBUserKey then table.insert(params,"&api_user_key="..PBUserKey) end
- if name then table.insert(params,"&api_paste_name="..urlenc(name)) end
- table.insert(params,"&api_paste_format="..format)
- if expo then table.insert(params,"&api_paste_private="..expo) end
- table.insert(params,"&api_paste_expire_date="..expire)
- table.insert(params,"&api_paste_code="..urlenc(fileText))
- local webH = http.post(apiPage,table.concat(params))
- local output = webH.readAll()
- local notOk, err = string.match(output, "(Bad API request), (.*)")
- if notOk then
- print(putErrors[err])
- else
- print("Success! Pastebin id: "..output:sub(21,#output))
- end
- else
- print("Error: File does not exist.")
- end
- end
- if #args == 0 then
- printUsage()
- else
- local arg = table.remove(args,1)
- if arg == "login" then
- login(args[1])
- elseif arg == "get" then
- get(table.unpack(args))
- elseif arg == "read" then
- view(args[1])
- elseif arg == "run" then
- run(args[1])
- elseif arg == "put" then
- put(table.unpack(args))
- elseif arg == "delete" then
- delete(args[1])
- elseif arg == "list" then
- list(listRaw())
- sleep(0)
- elseif arg == "trending" then
- trending()
- elseif arg == "settings" then
- listSettings()
- else
- printUsage()
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment