Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local event = require("event")
- local serial = require("serialization")
- local fs = require("filesystem")
- local term = require("term")
- local comp = require("component")
- local modem = comp.modem
- function register(name, portId)
- modem.open(portId)
- if serverAddress == nil then
- myName = name
- myPort = portId
- modem.broadcast(1, "register", name, portId)
- while true do
- local ev, la, sa, po, di, msg = event.pull(.2, "modem_message", ev, la, sa, po, di, msg)
- serverAddress = sa
- if msg == "DNS registered as "..name then
- return msg
- elseif msg == name.." online." then
- return
- end
- end
- end
- end
- function unregister(name)
- end
- function send(receiver, msg, opt1, opt2)
- if op2 ~= nil then
- modem.send(serverAddress, 1, "send", msg, opt1, opt2)
- elseif opt1 ~= nil then
- modem.send(serverAddress, 1, "send", msg, opt1)
- else
- modem.send(serverAddress, 1, "send", msg)
- end
- end
- function pull(destName, filename)
- for i = 1, 5 do
- modem.send(serverAddress, 1, "file_request", destName, filename)
- end
- msg, filepath, data = listen()
- print(msg)
- if msg == "file_transfer" then
- if not fs.isDirectory(filepath) then fs.makeDirectory(filepath.."/") end
- file = io.open(filepath.."/"..filename, "w")
- file:write(data)
- file:close()
- return true
- elseif msg == "init_transfer" then
- term.clear()
- print("Multi packet transfer.")
- print("Checking for "..filepath)
- if not fs.isDirectory(filepath) then
- fs.makeDirectory(filepath)
- print("Making directory ("..filepath..").")
- end
- packetCount = tonumber(data)
- for i = 1, packetCount do
- print("Waiting for packet "..i)
- msg, filepath, data = listen("packet_transfer_"..i)
- print(msg)
- if msg == "packet_transfer_"..i then
- if i == 1 then
- print("First packet recieved, making file.")
- dataStream = data
- else
- print("Packet "..i.." recieved, appending to file.")
- dataStream = dataStream..data
- end
- end
- end
- file = io.open(filepath.."/"..filename, "w")
- file:write(dataStream)
- file:close()
- print("Transfer complete.")
- end
- end
- function push(filepath, filename, version, installDir)
- print("Pushing "..filename.." to the server")
- filesize = fs.size(filepath)
- print("Checking filesize... "..filename.." "..filesize.." bytes.")
- transferTab = nil
- if filesize > 8000 then
- print("File too large for 1 packet... Assembling table.")
- transferTab = {}
- tCount = 0
- data = assert(io.open(filepath, "r"))
- while filesize > 0 do
- tCount = tCount + 1
- transferTab[tCount] = data:read(8000)
- filesize = filesize - 8000
- print("Packet "..tCount.." ready.")
- end
- data:close()
- print("File table complete.")
- else
- data = assert(io.open(filepath, "r"))
- dataPacket = data:read("*all")
- data:close()
- end
- print("Sending Data:")
- print("Contacting the server.")
- for i = 1, 5 do
- modem.send(serverAddress, 1, "file_transfer", filename)
- end
- msg = listen("transfer_details")
- print("Server response... Sending file details.")
- if transferTab == nil then
- for i = 1, 5 do
- modem.send(serverAddress, 1, "single", version, installDir)
- os.sleep(.2)
- end
- else
- for i = 1, 5 do
- modem.send(serverAddress, 1, "multi_"..#transferTab, version, installDir)
- os.sleep(.2)
- end
- end
- print("File details sent... Init packet transfer.")
- if transferTab ~= nil then
- print("Multi packet transfer...")
- for h = 1, #transferTab do
- for i = 1, 5 do
- modem.send(serverAddress, 1, "data_packet_"..h, transferTab[h])
- os.sleep(.2)
- end
- print("Packet "..h.." sent.")
- end
- else
- print("Sending packet.")
- for i = 1, 5 do
- modem.send(serverAddress, 1, "data_packet", dataPacket)
- end
- end
- print("File sent.")
- end
- function getRepoList()
- modem.send(serverAddress, 1, "directory_request", myName)
- msg, fileTable = listen("directory_transfer")
- if fileTable ~= nil then
- fileTable = serial.unserialize(fileTable)
- return fileTable
- end
- end
- function listen(target)
- msg = nil
- opt1 = nil
- opt2 = nil
- if not modem.isOpen(myPort) then modem.open(myPort) end
- while true do
- local ev, la, sa, po, di, msg, opt1, opt2 = event.pull(.2, "modem_message", ev, la, sa, po, di, msg, opt1, opt2)
- if target ~= nil then
- if msg == target then
- if opt2 ~= nil then
- return msg, opt1, opt2
- elseif opt1 ~= nil then
- return msg, opt1
- else
- return msg
- end
- end
- else
- if msg ~= nil then
- if opt2 ~= nil then
- return msg, opt1, opt2
- elseif opt1 ~= nil then
- return msg, opt1
- else
- return msg
- end
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement