Advertisement
SirSheepe

Untitled

May 14th, 2023 (edited)
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. -- local Turtle = {}
  2. -- Turtle.__index = Turtle
  3.  
  4. local Network = {}
  5. Network.__index = Network
  6.  
  7. function Network.new(modem)
  8. local self = setmetatable({}, Network)
  9.  
  10. self.DEFAULT_CHANNEL = 42424
  11. self.expectedPackets = {}
  12. self.connectedTurtles = {}
  13. self.modems = { modem }
  14.  
  15. return self
  16. end
  17.  
  18. function Network:Listen()
  19. while true do
  20. local event, id, channel, reply, message = os.pullEvent()
  21.  
  22. if event == "network_disconnect" then
  23. self.expectedPackets = {}
  24. break
  25. end
  26.  
  27. if event == "timer" or event == "modem_message" then
  28. local closed = {}
  29.  
  30. for i = 1, #self.expectedPackets do
  31. local packet = self.expectedPackets[i]
  32.  
  33. if event == "timer" and id == packet.timeout then
  34. table.remove(self.expectedPackets, i)
  35. i = i - 1
  36. end
  37.  
  38. if event == "modem_message" and channel == packet.channel and message == packet.message then
  39. table.remove(self.expectedPackets, i)
  40. table.insert(closed, channel)
  41. os.queueEvent(packet.uuid)
  42. os.cancelTimer(packet.timout)
  43. i = i - 1
  44. end
  45. end
  46.  
  47. for i = 1, #closed do
  48. local required = false
  49.  
  50. for _, packet in pairs(self.expectedPackets) do
  51. local channel = closed[i]
  52.  
  53. if packet.channel == channel then
  54. required = true
  55. break
  56. end
  57. end
  58.  
  59. if not required then
  60. self:CloseChannel(channel)
  61. end
  62. end
  63. end
  64. end
  65. end
  66.  
  67. -- https://gist.github.com/jrus/3197011
  68. function Network:GenerateEventUUID()
  69. local template = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
  70. return string.gsub(template, "[xy]", function(c)
  71. local v = (c == "x") and math.random(0, 0xf) or math.random(8, 0xb)
  72. return string.format("%x", v)
  73. end)
  74. end
  75.  
  76. function Network:Stop()
  77. os.queueEvent("network_disconnect")
  78. end
  79.  
  80. function Network:WaitForBatch(batch, timeout)
  81. local events = {}
  82. local result = {}
  83.  
  84. for i, packet in pairs(batch) do
  85. table.insert(
  86. events,
  87. Network:Expect(packet.channel, packet.message, timeout, function(success)
  88. result[i] = success
  89. return packet.callback(success)
  90. end)
  91. )
  92. end
  93.  
  94. parallel.waitForAll(unpack(events))
  95.  
  96. return result
  97. end
  98.  
  99. function Network:Wait(channel, message, timeout, callback)
  100. return self:Expect(channel, message, timeout, callback)()
  101. end
  102.  
  103. function Network:Expect(channel, message, timeout, callback)
  104. local packetUUID = self:GenerateEventUUID()
  105. local timerID = timeout == false and -1 or os.startTimer(timeout or 30)
  106.  
  107. self:OpenChannel(channel)
  108.  
  109. table.insert(self.expectedPackets, {
  110. channel = channel,
  111. message = message,
  112. timeout = timerID,
  113. uuid = packetUUID,
  114. })
  115.  
  116. return function()
  117. while true do
  118. local event, id = os.pullEvent()
  119.  
  120. if event == "timer" and id == timerID then
  121. if callback then
  122. return callback(false)
  123. end
  124. return false
  125. end
  126.  
  127. if event == packetUUID then
  128. if callback then
  129. return callback(false)
  130. end
  131. return true
  132. end
  133. end
  134. end
  135. end
  136.  
  137. function Network:HasModem(otherModem)
  138. for i, modem in pairs(self.modems) do
  139. for channel = 1, 65535 do
  140. if not (modem.isOpen(channel) or otherModem.isOpen(channel)) then
  141. modem.open(channel)
  142.  
  143. local newOpen = otherModem.isOpen(channel)
  144. modem.close(channel)
  145.  
  146. return newOpen
  147. end
  148. end
  149. end
  150. return false
  151. end
  152.  
  153. function Network:AddModem(newModem)
  154. if self:HasModem(newModem) then
  155. return false
  156. end
  157.  
  158. table.insert(self.modems, newModem)
  159.  
  160. return true
  161. end
  162.  
  163. function Network:OpenChannel(channel)
  164. for i, v in pairs(self.modems) do
  165. if v.isOpen(channel) then
  166. return
  167. end
  168. end
  169.  
  170. for i, v in pairs(self.modems) do
  171. if pcall(v.open, channel) then
  172. return
  173. end
  174. end
  175.  
  176. error("Too many channels open, no modems available")
  177. end
  178.  
  179. function Network:Send() end
  180.  
  181. function Network:Connect() end
  182.  
  183. local remote = Network.new(peripheral.wrap("top"))
  184. print(remote:HasModem(peripheral.wrap("right")))
  185.  
  186. -- parallel.waitForAll(Network.Listen(Network), Network.Wait(Network, 30, "cats", 60))
  187.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement