Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- ThunderNet - network interfaces.
- -- (c) ProgramCrafter
- -- Last patch: Stem support (06.04.2021)
- local function err(msg)
- return function() error(msg) end
- end
- local NYIMSG = 'Not yet implemented'
- local NULLMSG = 'Receiving data from /dev/null'
- local NULLADDR = '00000000-0000-0000-0000-000000000000'
- local evt = require 'event'
- -- Event callbacks (`parsers`)
- -- Input: event
- -- Output: thundernet::data, answer_info (such as network card address)
- local function parse_null(proxy)
- return function(event) end
- end
- local function parse_modem(proxy)
- -- Use this function only to create MODEM parsers!
- -- TUNNEL parsers are below in parse_tunnel.
- return function(event)
- -- Event format: modem_message(receiverAddress: string, senderAddress: string, port: number, distance: number, ...)
- if not event then return end
- if event[1] ~= 'modem_message' then return end
- if event[2] ~= proxy.address then return end
- if event[6] then
- return event[6], event[3]
- end
- end
- end
- local function parse_tunnel(proxy)
- return function(event)
- -- Event format: modem_message(receiverAddress: string, senderAddress: string, port: number, distance: number, ...)
- if not event then return end
- if event[1] ~= 'modem_message' then return end
- if event[2] ~= proxy.address then return end
- if event[6] then
- return event[6], event[3]
- end
- end
- end
- local stem_inited = false
- return {
- ['null'] = function() return {
- send = function() end, broadcast = function() end,
- recv = parse_null(), addr = NULLADDR
- } end,
- ['modem'] = function(proxy) return {
- send = proxy.send, broadcast = proxy.broadcast,
- recv = parse_modem(proxy), addr = proxy.address
- } end,
- ['tunnel'] = function(proxy) return {
- send = err(NYIMSG), broadcast = err(NYIMSG),
- recv = parse_tunnel(proxy), addr = proxy.address
- } end,
- ['internet'] = function(proxy, uid)
- local stem_installed, stem = pcall(require, 'stem')
- local stem_channel = 'thunderlib~06042021161759~'
- if stem_inited or not stem_installed then
- if not stem_installed then
- print('[Thunderlib interfaces] Install Stem library for connecting to Internet.')
- end
- return {send = parse_null(), broadcast = parse_null(),
- recv = parse_null(), addr = proxy.address}
- else
- stem_inited = true
- local server = stem.connect()
- server:subscribe(stem_channel)
- return {
- send = function(addr, port, msg)
- server:send(stem_channel, uid .. 'D' .. addr .. '\0' .. msg)
- end,
- broadcast = function(port, msg)
- server:send(stem_channel, uid .. 'B' .. msg)
- end,
- recv = function(event)
- if not event then return end
- if event[1] == 'stem_message' then
- local d = event[3]
- local sender = d:sub(1, #uid)
- local _type = d:sub(#uid + 1, #uid + 1)
- if d:sub(#uid + 1, #uid + 1) == 'B' then
- return d:sub(#uid + 2), sender
- end
- if d:sub(#uid + 2, #uid * 2 + 1) ~= uid then return end
- return d:sub(#uid * 2 + 2), sender
- end
- end,
- stop = function() server:disconnect() end,
- addr = proxy.address
- }
- end
- end,
- ['combine'] = function(connections)
- return {
- send = function(routes, addr, ...)
- if not routes[addr] then return false end
- return routes[addr][1].send(routes[addr][2], ...)
- end,
- broadcast = function(...)
- for _, connection in pairs(connections) do
- connection.broadcast(...)
- end
- end,
- recv = function(is_timeout)
- is_timeout = is_timeout or function() end
- while not is_timeout() do
- local e = {evt.pull(0.05)}
- if e[1] then
- for _, connection in pairs(connections) do
- local flag, info = connection.recv(e)
- if flag then return {connection, info}, flag end
- end
- end
- end
- end
- }
- end
- }
Add Comment
Please, Sign In to add comment