Advertisement
pedrosgali

OC net API

Jun 6th, 2014
454
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.61 KB | None | 0 0
  1. local event = require("event")
  2. local serial = require("serialization")
  3. local fs = require("filesystem")
  4. local term = require("term")
  5. local comp = require("component")
  6. local modem = comp.modem
  7.  
  8. function register(name, portId)
  9.     modem.open(portId)
  10.     if serverAddress == nil then
  11.         myName = name
  12.         myPort = portId
  13.         modem.broadcast(1, "register", name, portId)
  14.         while true do
  15.             local ev, la, sa, po, di, msg = event.pull(.2, "modem_message", ev, la, sa, po, di, msg)
  16.             serverAddress = sa
  17.             if msg == "DNS registered as "..name then
  18.                 return msg
  19.             elseif msg == name.." online." then
  20.                 return
  21.             end
  22.         end
  23.     end
  24. end
  25.  
  26. function unregister(name)
  27.    
  28. end
  29.  
  30. function send(receiver, msg, opt1, opt2)
  31.     if op2 ~= nil then
  32.         modem.send(serverAddress, 1, "send", msg, opt1, opt2)
  33.     elseif opt1 ~= nil then
  34.         modem.send(serverAddress, 1, "send", msg, opt1)
  35.     else
  36.         modem.send(serverAddress, 1, "send", msg)
  37.     end
  38. end
  39.  
  40. function pull(destName, filename)
  41.     for i = 1, 5 do
  42.         modem.send(serverAddress, 1, "file_request", destName, filename)
  43.     end
  44.     msg, filepath, data = listen()
  45.     print(msg)
  46.     if msg == "file_transfer" then
  47.         if not fs.isDirectory(filepath) then fs.makeDirectory(filepath.."/") end
  48.         file = io.open(filepath.."/"..filename, "w")
  49.         file:write(data)
  50.         file:close()
  51.         return true
  52.     elseif msg == "init_transfer" then
  53.         term.clear()
  54.         print("Multi packet transfer.")
  55.         print("Checking for "..filepath)
  56.         if not fs.isDirectory(filepath) then
  57.             fs.makeDirectory(filepath)
  58.             print("Making directory ("..filepath..").")
  59.         end
  60.         packetCount = tonumber(data)
  61.         for i = 1, packetCount do
  62.             print("Waiting for packet "..i)
  63.             msg, filepath, data = listen("packet_transfer_"..i)
  64.             print(msg)
  65.             if msg == "packet_transfer_"..i then
  66.                 if i == 1 then
  67.                     print("First packet recieved, making file.")
  68.                     dataStream = data
  69.                 else
  70.                     print("Packet "..i.." recieved, appending to file.")
  71.                     dataStream = dataStream..data
  72.                 end
  73.             end
  74.         end
  75.         file = io.open(filepath.."/"..filename, "w")
  76.         file:write(dataStream)
  77.         file:close()
  78.         print("Transfer complete.")
  79.     end
  80. end
  81.  
  82. function push(filepath, filename, version, installDir)
  83.     print("Pushing "..filename.." to the server")
  84.     filesize = fs.size(filepath)
  85.     print("Checking filesize... "..filename.." "..filesize.." bytes.")
  86.     transferTab = nil
  87.     if filesize > 8000 then
  88.         print("File too large for 1 packet... Assembling table.")
  89.         transferTab = {}
  90.         tCount = 0
  91.         data = assert(io.open(filepath, "r"))
  92.         while filesize > 0 do
  93.             tCount = tCount + 1
  94.             transferTab[tCount] = data:read(8000)
  95.             filesize = filesize - 8000
  96.             print("Packet "..tCount.." ready.")
  97.         end
  98.         data:close()
  99.         print("File table complete.")
  100.     else
  101.         data = assert(io.open(filepath, "r"))
  102.         dataPacket = data:read("*all")
  103.         data:close()
  104.     end
  105.     print("Sending Data:")
  106.     print("Contacting the server.")
  107.     for i = 1, 5 do
  108.         modem.send(serverAddress, 1, "file_transfer", filename)
  109.     end
  110.     msg = listen("transfer_details")
  111.     print("Server response... Sending file details.")
  112.     if transferTab == nil then
  113.         for i = 1, 5 do
  114.             modem.send(serverAddress, 1, "single", version, installDir)
  115.             os.sleep(.2)
  116.         end
  117.     else
  118.         for i = 1, 5 do
  119.             modem.send(serverAddress, 1, "multi_"..#transferTab, version, installDir)
  120.             os.sleep(.2)
  121.         end
  122.     end
  123.     print("File details sent... Init packet transfer.")
  124.     if transferTab ~= nil then
  125.         print("Multi packet transfer...")
  126.         for h = 1, #transferTab do
  127.             for i = 1, 5 do
  128.                 modem.send(serverAddress, 1, "data_packet_"..h, transferTab[h])
  129.                 os.sleep(.2)
  130.             end
  131.             print("Packet "..h.." sent.")
  132.         end
  133.     else
  134.         print("Sending packet.")
  135.         for i = 1, 5 do
  136.             modem.send(serverAddress, 1, "data_packet", dataPacket)
  137.         end
  138.     end
  139.     print("File sent.")
  140. end
  141.  
  142. function getRepoList()
  143.     modem.send(serverAddress, 1, "directory_request", myName)
  144.     msg, fileTable = listen("directory_transfer")
  145.     if fileTable ~= nil then
  146.         fileTable = serial.unserialize(fileTable)
  147.         return fileTable
  148.     end
  149. end
  150.  
  151. function listen(target)
  152.     msg = nil
  153.     opt1 = nil
  154.     opt2 = nil
  155.     if not modem.isOpen(myPort) then modem.open(myPort) end
  156.     while true do
  157.         local ev, la, sa, po, di, msg, opt1, opt2 = event.pull(.2, "modem_message", ev, la, sa, po, di, msg, opt1, opt2)
  158.         if target ~= nil then
  159.             if msg == target then
  160.                 if opt2 ~= nil then
  161.                     return msg, opt1, opt2
  162.                 elseif opt1 ~= nil then
  163.                     return msg, opt1
  164.                 else
  165.                     return msg
  166.                 end
  167.             end
  168.         else
  169.             if msg ~= nil then
  170.                 if opt2 ~= nil then
  171.                     return msg, opt1, opt2
  172.                 elseif opt1 ~= nil then
  173.                     return msg, opt1
  174.                 else
  175.                     return msg
  176.                 end
  177.             end
  178.         end
  179.     end
  180. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement