Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local channel = settings.get "basenet.channel" or 23032
- local modem = peripheral.find "modem"
- if not modem then error "modem required" end
- modem.open(channel)
- local name = settings.get "basenet.name" or _G.basenet_name or error "name required"
- local basenet = {
- listening_to = {},
- tasks = {}
- }
- function basenet.listen(fn, from)
- if type(from) ~= "string" then error "from must be a string" end
- basenet.listening_to[from] = true
- basenet.run_task(function()
- while true do
- local _, ufrom, data = os.pullEvent "update"
- if ufrom == from then
- fn(data)
- end
- end
- end)
- end
- function basenet.update(data)
- modem.transmit(channel, channel, { type = "update", from = name, data = data })
- end
- local task_ID = 0
- function basenet.run_task(fn, ...)
- local args = {...}
- task_ID = task_ID + 1
- basenet.tasks[task_ID] = { coroutine = coroutine.create(fn), init_args = args, ID = task_ID }
- os.queueEvent "dummy"
- return task_ID
- end
- function basenet.interval(fn, time)
- if not time then error "time required" end
- basenet.run_task(function()
- while true do
- fn()
- sleep(time)
- end
- end)
- end
- local function process_message(msg)
- if msg.type == "update" and type(msg.from) == "string" then
- if basenet.listening_to[msg.from] then
- os.queueEvent("update", msg.from, msg.data)
- end
- end
- end
- basenet.run_task(function()
- while true do
- local _, _, c, rc, msg, distance = os.pullEvent "modem_message"
- if c == channel and type(msg) == "table" then
- process_message(msg)
- end
- end
- end)
- local function tick_task(task, evt)
- if task.init_args then
- local init = task.init_args
- task.init_args = nil
- local ok = tick_task(task, init)
- if not ok then return end
- end
- if coroutine.status(task.coroutine) == "dead" then
- basenet.tasks[task.ID] = nil
- else
- if task.filter == nil or task.filter == evt[1] then
- local ok, result = coroutine.resume(task.coroutine, unpack(evt))
- if ok then
- task.filter = result
- else
- printError(("TASK %d ERROR: %s"):format(task.ID, result))
- basenet.tasks[task.ID] = nil
- end
- return ok
- end
- end
- end
- function basenet.run()
- while true do
- local evt = {os.pullEvent()}
- for ID, task in pairs(basenet.tasks) do
- tick_task(task, evt)
- end
- end
- end
- return basenet
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement