1
0
mirror of https://github.com/kepler155c/opus synced 2025-01-07 06:10:27 +00:00

pastebin rework round 3

This commit is contained in:
kepler155c@gmail.com 2019-04-12 08:33:41 -04:00
parent f011e7b14f
commit a77d55e33f
3 changed files with 157 additions and 135 deletions

View File

@ -1,150 +1,128 @@
--- Parse the pastebin code from the given code or URL
local function parseCode(paste)
local patterns = {
"^([%a%d]+)$",
"^https?://pastebin.com/([%a%d]+)$",
"^pastebin.com/([%a%d]+)$",
"^https?://pastebin.com/raw/([%a%d]+)$",
"^pastebin.com/raw/([%a%d]+)$",
}
--- Attempts to guess the pastebin ID from the given code or URL for i = 1, #patterns do
local function extractId(paste) local code = paste:match(patterns[i])
local patterns = { if code then
"^([%a%d]+)$", return code
"^https?://pastebin.com/([%a%d]+)$", end
"^pastebin.com/([%a%d]+)$", end
"^https?://pastebin.com/raw/([%a%d]+)$",
"^pastebin.com/raw/([%a%d]+)$",
}
for i = 1, #patterns do return nil
local code = paste:match( patterns[i] )
if code then return code end
end
return nil
end end
function download(url) -- Download the contents of a paste
if type( url ) ~= "string" then local function download(url)
error( "bad argument #1 (expected string, got " .. type( url ) .. ")", 2 ) if type(url) ~= "string" then
end error("bad argument #1 (expected string, got " .. type(url) .. ")", 2)
end
if not http then if not http then
return false, "Pastebin requires http API" return false, "Pastebin requires http API"
end end
local paste = extractId( url ) -- Add a cache buster so that spam protection is re-checked
if not paste then local cacheBuster = ("%x"):format(math.random(0, 2 ^ 30))
return false, "Invalid pastebin code. The code is the ID at the end of the pastebin.com URL." local response, err = http.get(
end "https://pastebin.com/raw/" .. textutils.urlEncode(paste) .. "?cb=" .. cacheBuster
)
-- Add a cache buster so that spam protection is re-checked if not response then
local cacheBuster = ("%x"):format(math.random(0, 2^30)) return response, err
local response, err = http.get( end
"https://pastebin.com/raw/"..textutils.urlEncode( paste ).."?cb="..cacheBuster
)
if not response then -- If spam protection is activated, we get redirected to /paste with Content-Type: text/html
return response, err local headers = response.getResponseHeaders()
end if not headers["Content-Type"] or not headers["Content-Type"]:find("^text/plain") then
return false, "Pastebin blocked due to spam protection"
end
-- If spam protection is activated, we get redirected to /paste with Content-Type: text/html local contents = response.readAll()
local headers = response.getResponseHeaders() response.close()
if not headers["Content-Type"] or not headers["Content-Type"]:find( "^text/plain" ) then return contents
return false, "Pastebin blocked the download due to spam protection. Please complete the captcha in a web browser: https://pastebin.com/" .. textutils.urlEncode( paste )
end
local sResponse = response.readAll()
response.close()
return sResponse
end end
local function put(sPath) -- Upload text to pastebin
if type( sPath ) ~= "string" then local function upload(name, text)
error( "bad argument #1 (expected string, got " .. type( sPath ) .. ")", 2 ) if not http then
end return false, "Pastebin requires http API"
end
if not http then -- POST the contents to pastebin
return false, "Pastebin requires http API" local key = "0ec2eb25b6166c0c27a394ae118ad829"
end local response = http.post(
"https://pastebin.com/api/api_post.php",
"api_option=paste&" ..
"api_dev_key=" .. key .. "&" ..
"api_paste_format=lua&" ..
"api_paste_name=" .. textutils.urlEncode(name) .. "&" ..
"api_paste_code=" .. textutils.urlEncode(text)
)
-- Upload a file to pastebin.com if not response then
-- Determine file to upload return false, "Failed."
if not fs.exists( sPath ) or fs.isDir( sPath ) then end
return false, "No such file"
end
-- Read in the file local contents = response.readAll()
local sName = fs.getName( sPath ) response.close()
local file = fs.open( sPath, "r" )
local sText = file.readAll()
file.close()
-- POST the contents to pastebin return string.match(contents, "[^/]+$")
local key = "0ec2eb25b6166c0c27a394ae118ad829"
local response = http.post(
"https://pastebin.com/api/api_post.php",
"api_option=paste&"..
"api_dev_key="..key.."&"..
"api_paste_format=lua&"..
"api_paste_name="..textutils.urlEncode(sName).."&"..
"api_paste_code="..textutils.urlEncode(sText)
)
if response then
local sResponse = response.readAll()
response.close()
return string.match( sResponse, "[^/]+$" )
end
return false, "Failed."
end end
local function get(sCode, sPath) -- Download the contents to a file from pastebin
if type( sCode ) ~= "string" then local function get(code, path)
error( "bad argument #1 (expected string, got " .. type( sCode ) .. ")", 2 ) if type(code) ~= "string" then
end error( "bad argument #1 (expected string, got " .. type(code) .. ")", 2)
end
if type( sPath ) ~= "string" then if type(path) ~= "string" then
error( "bad argument #2 (expected string, got " .. type( sPath ) .. ")", 2 ) error("bad argument #2 (expected string, got " .. type(path) .. ")", 2)
end end
if not http then local res, msg = download(code)
return false, "Pastebin requires http API" if not res then
end return res, msg
end
if fs.exists( sPath ) then local file = fs.open(path, "w")
return false, "File already exists" file.write(res)
end file.close()
-- GET the contents from pastebin return true
local res, msg = download(sCode)
if not res then
return res, msg
end
local file = fs.open( sPath, "w" )
file.write( res )
file.close()
return sPath
end end
local function run(sCode, ...) -- Upload a file to pastebin.com
if not http then local function put(path)
return false, "Pastebin requires http API" if type(path) ~= "string" then
end error("bad argument #1 (expected string, got " .. type(path) .. ")", 2)
end
if type( sCode ) ~= "string" then -- Determine file to upload
error( "bad argument #1 (expected string, got " .. type( sCode ) .. ")", 2 ) if not fs.exists(path) or fs.isDir(path) then
end return false, "No such file"
end
local res, msg = download(sCode) -- Read in the file
if not res then local name = fs.getName(path)
return res, msg local file = fs.open(path, "r")
end local text = file.readAll()
local func, err = load(res, sCode, "t", _ENV) file.close()
if not func then
return func, err return upload(name, text)
end
return pcall(func, ...)
end end
return { return {
get = get, download = download,
put = put, upload = upload,
run = run, get = get,
put = put,
parseCode = parseCode,
} }

View File

@ -1,4 +1,3 @@
local function printUsage() local function printUsage()
print( "Usages:" ) print( "Usages:" )
print( "pastebin put <filename>" ) print( "pastebin put <filename>" )
@ -6,12 +5,6 @@ local function printUsage()
print( "pastebin run <code> <arguments>" ) print( "pastebin run <code> <arguments>" )
end end
local tArgs = { ... }
if #tArgs < 2 then
printUsage()
return
end
if not http then if not http then
printError( "Pastebin requires http API" ) printError( "Pastebin requires http API" )
printError( "Set http_enable to true in ComputerCraft.cfg" ) printError( "Set http_enable to true in ComputerCraft.cfg" )
@ -20,9 +13,17 @@ end
local pastebin = require('http.pastebin') local pastebin = require('http.pastebin')
local tArgs = { ... }
local sCommand = tArgs[1] local sCommand = tArgs[1]
if sCommand == "put" then if sCommand == "put" then
-- Upload a file to pastebin.com -- Upload a file to pastebin.com
if #tArgs < 2 then
printUsage()
return
end
-- Determine file to upload -- Determine file to upload
local sFile = tArgs[2] local sFile = tArgs[2]
local sPath = shell.resolve( sFile ) local sPath = shell.resolve( sFile )
@ -45,15 +46,18 @@ if sCommand == "put" then
elseif sCommand == "get" then elseif sCommand == "get" then
-- Download a file from pastebin.com -- Download a file from pastebin.com
if #tArgs < 3 then if #tArgs < 3 then
printUsage() printUsage()
return return
end end
print( "Connecting to pastebin.com... " ) local sCode = pastebin.parseCode(tArgs[2])
if not sCode then
return false, "Invalid pastebin code. The code is the ID at the end of the pastebin.com URL."
end
-- Determine file to download -- Determine file to download
local sCode = tArgs[2]
local sFile = tArgs[3] local sFile = tArgs[3]
local sPath = shell.resolve( sFile ) local sPath = shell.resolve( sFile )
if fs.exists( sPath ) then if fs.exists( sPath ) then
@ -61,21 +65,45 @@ elseif sCommand == "get" then
return return
end end
print( "Connecting to pastebin.com... " )
local resp, msg = pastebin.get(sCode, sPath) local resp, msg = pastebin.get(sCode, sPath)
if resp then if resp then
print( "Downloaded as "..resp ) print( "Downloaded as " .. sPath )
else else
printError( msg ) printError( msg )
end end
elseif sCommand == "run" then elseif sCommand == "run" then
local sCode = tArgs[2] -- Download and run a file from pastebin.com
if #tArgs < 2 then
printUsage()
return
end
local sCode = pastebin.parseCode(tArgs[2])
if not sCode then
return false, "Invalid pastebin code. The code is the ID at the end of the pastebin.com URL."
end
print( "Connecting to pastebin.com... " ) print( "Connecting to pastebin.com... " )
local resp, msg = pastebin.run(sCode, table.unpack(tArgs, 3)) local res, msg = pastebin.download(sCode)
if not resp then if not res then
printError( msg )
return res, msg
end
res, msg = load(res, sCode, "t", _ENV)
if not res then
printError( msg )
return res, msg
end
res, msg = pcall(res, table.unpack(tArgs, 3))
if not res then
printError( msg ) printError( msg )
end end
else else
@ -83,3 +111,4 @@ else
printUsage() printUsage()
return return
end end

15
sys/help/pastebin Normal file
View File

@ -0,0 +1,15 @@
pastebin is a program for uploading files to and downloading files from pastebin.com. This is useful for sharing programs with other players.
The HTTP API must be enabled in ComputerCraft.cfg to use this program.
ex:
"pastebin put foo" will upload the file "foo" to pastebin.com, and print the URL.
"pastebin get xq5gc7LB foo" will download the file from the URL http://pastebin.com/xq5gc7LB, and save it as "foo".
"pastebin run CxaWmPrX" will download the file from the URL http://pastebin.com/CxaWmPrX, and immediately run it.
Functions in the pastebin API:
pastebin.get( code, filepath )
pastebin.put( filepath )
pastebin.download( code )
pastebin.upload( pastename, text )
pastebin.parseCode( code )