forked from hkc/cc-stuff
1
0
Fork 0
cc-stuff/tapeget.lua

108 lines
2.2 KiB
Lua

local args = { ... }
local function n_to_kib(value)
return string.format("%6.1f kiB", value / 1024)
end
local function textProgress(p, c1, c2, fmt, ...)
p = math.min(p, 1)
local tw = term.getSize()
local str = string.format(fmt, ...)
local w1 = math.ceil(p * tw)
local w2 = tw - w1
local bg = term.getBackgroundColor()
term.setBackgroundColor(c1)
term.write(str:sub(1, w1))
local rem = w1 - #str
if rem > 0 then
term.write(string.rep(" ", rem))
end
term.setBackgroundColor(c2)
term.write(str:sub(w1 + 1, w1 + w2))
rem = math.min(tw - #str, w2)
if rem > 0 then
term.write(string.rep(" ", rem))
end
term.setBackgroundColor(bg)
end
local tape = { peripheral.find("tape_drive") }
if #tape == 0 then
print("tape where")
return
elseif #tape ~= 1 then
print("More than one drive found:")
for i = 1, #tape do
print(tape[i])
end
print("Input drive name:")
io.write("> ")
tape = peripheral.wrap(read())
if not tape then
printError("wrong name")
return
end
else
tape = tape[1]
end
if not http then
print("no http, check config")
return
end
local req, err = http.get(args[1], {}, true)
if not req then
print("oopsie: "..err)
return
end
local headers = req.getResponseHeaders()
local length = tonumber(headers["content-length"]) or 1
if length > tape.getSize() then
printError("Tape is smaller than the file you're trying to write")
printError("Are you sure?")
io.write("Write anyways? [y/N]: ")
local r = read()
if r ~= "y" and r ~= "Y" then
return
end
end
tape.stop()
tape.seek(-tape.getSize())
tape.stop()
local _, y = term.getCursorPos()
local written = 0
local i = 1
while true do
local chunk = req.read(256)
if not chunk then
break
end
written = written + #chunk
tape.write(chunk)
if i % 10 == 0 then
term.setCursorPos(1, y)
term.clearLine()
textProgress(written / length, colors.green, colors.gray, "%s / %s", n_to_kib(written), n_to_kib(length))
os.sleep(0.01)
end
end
term.setCursorPos(1, y)
term.clearLine()
print("Written "..n_to_kib(written))
tape.stop()
tape.seek(-tape.getSize())
tape.stop()