pedrosgali

OC net API

Jun 6th, 2014
639
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