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