--[[ 4eyes ]] -- ============================================================================= -- apis local component = require("component") local computer = require("computer") local event = require("event") local class = require("30log") local bridge = component.openperipheral_bridge -- ============================================================================= -- variables local api = {} api.User = class("User") api.Bridge = class("Bridge") api.Event = class("Event") -- ============================================================================= -- classes do -- Event function api.Event:init(handler) self.handler = handler self.posthandler = nil end function api.Event:setPostHandler(posthandler) self.posthandler = posthandler or nil end function api.Event:setHandler(posthandler) self.handler = handler or nil end function api.Event:handle(...) self.handler(...) if type(self.posthandler) == "function" then self.posthandler(...) end end end do -- User function api.User:init(name, uuid) self.uuid = uuid self.name = name self.captured = false self.surface = bridge.getSurfaceByName(self.name) self.capture_control = bridge.getCaptureControl(uuid) self.objects = {} end function api.User:addObject(index, obj) self.objects[index] = obj end function api.User:removeObject(index) self.objects[index] = obj end function api.User:getObject(index) return self.objects[index] and self.objects[index] or false end function api.User:getAllObjects() return self.objects end function api.User:renderObjects(br) for k, v in pairs(self.objects) do if type(v.render) == "function" then v:render(br, self) end end end function api.User:handleEvents(br, e) for k, v in pairs(self.objects) do if type(v.event) == "function" then v:event(br, self, e) end end end function api.User:getSurface() return self.surface end function api.User:getCaptureControl() return self.capture_control end function api.User:clear() self.surface.clear() end end do -- Bridge function api.Bridge:init() self.users = {} self.pulling = true self.events = { glasses_attach = api.Event(function(br, ev) br:addUser(ev[3], ev[4]) end), glasses_detach = api.Event(function(br, ev) br:removeUser(ev[3]) end), glasses_capture = api.Event(function(br, ev) br:getUser(ev[3]).captured = true end), glasses_release = api.Event(function(br, ev) br:getUser(ev[3]).captured = false end) } end function api.Bridge:getUser(name) return self.users[name] and self.users[name] or false end function api.Bridge:addUser(name, uuid) self.users[name] = api.User(name, uuid) end function api.Bridge:removeUser(name) self.users[name] = nil end function api.Bridge:addEvent(name, ev) self.events[name] = ev end function api.Bridge:removeEvent(name) self.events[name] = nil end function api.Bridge:getEvent(name) return self.events[name] and self.events[name] or false end function api.Bridge:eachUser(func) for k, v in pairs(self.users) do func(self, v) end end function api.Bridge:pull() for k,v in pairs(bridge.getUsers()) do computer.pushSignal("glasses_attach", bridge.address, v.name, v.uuid) end while self.pulling do local e = {event.pull()} if self.events[e[1]] then self.events[e[1]]:handle(self, e) end self:eachUser(function (br, us) us:handleEvents(br, e) end) bridge.sync() end end end -- ============================================================================= -- return library return api