local cqueues = require'cqueues' local class = require'r.class' local config = require'config' local Channel = require'channel' local pprint = require'pprint' local pylon_classes = { irc = require'irc.pylon', xmpp = require'xmpp.pylon', discord = require'discord.pylon', nanochat = require'nanochat.pylon', } local Wilson = class() function Wilson.make(cls, conf) local self = setmetatable({ pylons={}, busses={}, cq = cqueues.new(), }, Wilson) for name, pylon_conf in pairs(conf.pylon) do pylon_conf.name = name local pylon_class = pylon_classes[pylon_conf.type] assert(pylon_class, "no such pylon type "..pylon_conf.type) self.pylons[name] = pylon_class:make(self, pylon_conf) print("constructed pylon",name,pylon_conf.type) end for name, bus_conf in pairs(conf.bus) do local bus = {} for _, item in ipairs(bus_conf) do local pylon_name, channel_descriptor = item[1], item[2] local pylon = self.pylons[pylon_name] assert(pylon,"no such pylon named "..pylon_name) table.insert(bus, Channel(pylon, channel_descriptor)) end print("constructed bus ",name,'with '..#bus_conf..' channels') self.busses[name] = bus end return self end -- find bus containing given channel function Wilson._find_bus(self, channel) for name, bus in pairs(self.busses) do for _, q in ipairs(bus) do if q == channel then return bus end end end print("warning: unfound bus for",channel) end function Wilson.deliver(self, source_channel, message) local bus = self:_find_bus(source_channel) if bus then for _, dest_channel in ipairs(bus) do if source_channel ~= dest_channel then pprint(source_channel, "-->", dest_channel, message) dest_channel.pylon:post(dest_channel, message) end end end end function Wilson.run(self) for pylonname, pylon in pairs(self.pylons) do self.cq:wrap(pylon.run, pylon) print("now running pylon", pylonname) end print('toplevel',self.cq:loop()) cqueues.sleep(2) end local config_file = assert(io.open("wilson.ini","r")) local conf = config.parse(config_file) config_file:close() local wilson = Wilson:make(conf) wilson:run()