local cqueues = require'cqueues' local config = require'config' local Channel = require'channel' local pylon_classes = { irc = require'irc', xmpp = require'xmpp', } local Wilson = {} function Wilson.make(config) local self = { pylons={}, busses={}, cq = cqueues.new(), } for name, pylon_conf in pairs(config.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(config.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 setmetatable(self, {__index=Wilson}) 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 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()) end local config_file = io.open("wilson.ini","r") local conf = config.parse(config_file) config_file:close() local wilson = Wilson.make(conf) wilson:run() -- local pylon_confs = { -- xmpp_ubq323 = { -- type='xmpp', -- jid='wilson@ubq323.website', -- server='localhost', -- component='wilson.ubq323.website', -- component_secret='super_secret_wilson_password', -- resource='wilson', -- }, -- irc_local = { -- type='irc', -- host='localhost', -- port=6667, -- password='mypassword', -- nodename='wilson.ubq323', -- }, -- } -- local bus_confs = { -- d = { -- {'xmpp_ubq323', 'd@conference.ubq323.website'}, -- {'irc_local', '#test'}, -- }, -- } -- local the_network = Wilson.make(pylon_confs, bus_confs) -- the_network:run()