Advertisement
Archer2o2x

Eventred

Nov 28th, 2023
685
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.42 KB | None | 0 0
  1. function on(self, name, callback)
  2.  
  3.     local record = { name = name, func = callback }
  4.  
  5.     table.insert(self.rednetCallbacks, record)
  6.  
  7. end
  8.  
  9. function remove(self, name)
  10.  
  11.     for i, name in ipairs(self.rednetCallbacks) do
  12.  
  13.         if name == event then
  14.  
  15.             table.remove(self.rednetCallbacks, i)
  16.  
  17.         end
  18.  
  19.     end
  20.  
  21. end
  22.  
  23. function onEvent(self, name, callback)
  24.  
  25.     local record = { name = name, func = callback }
  26.  
  27.     table.insert(self.eventCallbacks, record)
  28.  
  29. end
  30.  
  31. function removeEvent(self, name)
  32.  
  33.     for i, name in ipairs(self.eventCallbacks) do
  34.  
  35.         if name == event then
  36.  
  37.             table.remove(self.eventCallbacks, i)
  38.  
  39.         end
  40.  
  41.     end
  42.  
  43. end
  44.  
  45. function send(self, name, data)
  46.  
  47.     local payload = {name = name, value = data}
  48.  
  49.     rednet.broadcast(payload)
  50.  
  51. end
  52.  
  53. function handle_rednet(self, id, data)
  54.  
  55.     for _, callback in ipairs(self.rednetCallbacks) do
  56.  
  57.         if callback.name == data.name then
  58.  
  59.             callback.func(data.value, data.name, id)
  60.  
  61.         end
  62.  
  63.     end
  64.  
  65. end
  66.  
  67. function handle_event(self, name, args)
  68.  
  69.     for i, record in ipairs(self.eventCallbacks) do
  70.  
  71.         if record.name == name then
  72.  
  73.             if record.func(table.unpack(args)) == self.unsubscribe then
  74.  
  75.                 table.remove(self.eventCallbacks, i)
  76.  
  77.             end
  78.  
  79.         end
  80.  
  81.     end
  82.  
  83. end
  84.  
  85. function listen(self, pullRaw)
  86.  
  87.     self.running = true
  88.  
  89.     while self.running do
  90.  
  91.         local eventPull = os.pullEvent
  92.  
  93.         if pullRaw then eventPull = os.pullEventRaw end
  94.  
  95.         local args = {eventPull()}
  96.  
  97.         local eventName = args[1]
  98.  
  99.         table.remove(args, 1)
  100.  
  101.         self:handle_event(eventName, args)
  102.  
  103.         if eventName == "rednet_message" then
  104.  
  105.             self:handle_rednet(args[1], args[2])
  106.  
  107.         end
  108.  
  109.     end
  110.  
  111. end
  112.  
  113. function stopListening(self)
  114.  
  115.     self.running = false
  116.  
  117. end
  118.  
  119. function create()
  120.  
  121.     if not rednet.isOpen() then peripheral.find("modem", rednet.open) end
  122.  
  123.     return {
  124.         rednetCallbacks = {},
  125.         eventCallbacks = {},
  126.  
  127.         handle_rednet = handle_rednet,
  128.         handle_event = handle_event,
  129.  
  130.         unsubscribe = {unsubscribe=true},
  131.  
  132.         on = on,
  133.         remove = remove,
  134.         onEvent = onEvent,
  135.         removeEvent = removeEvent,
  136.  
  137.         send = send,
  138.  
  139.         listen = listen,
  140.         stopListening = stopListening
  141.     }
  142.  
  143. end
  144.  
  145. return { create = create }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement