local cqueues = require 'cqueues' local socket = require 'cqueues.socket' local pprint = require 'pprint' local class = require 'r.class' local BasePylon = require 'pylon' local Channel = require 'channel' local Nanochat = class.extend(BasePylon) function Nanochat:init() self:_check_fields "server port poll" end function Nanochat:_connect() self.sock = socket.connect(self.server, tonumber(self.port)) self.sock:write("LAST 0\n") self.sock:read("*l") -- discard count self.lastid = tonumber(assert(self.sock:read("*l"))) self.usids = {} end function Nanochat:add_channel(channel) -- don't need to do anything end function Nanochat:recving() while true do self.sock:write("SKIP "..self.lastid.."\n") local deliverables = {} local n = tonumber(assert(self.sock:read("*l"))) for i=1,n do local msg = assert(self.sock:read("*l")) local chan, msgi = msg:match("^([^ ]+) ()") if chan then if not deliverables[chan] then deliverables[chan] = {} end local sender, body = msg:match("^([^:]+): (.+)$", msgi) if sender then deliverables[chan][#deliverables[chan]+1] = { i=i, sender=sender, body=body } else deliverables[chan][#deliverables[chan]+1] = { i=i, sender=nil, body=msg:sub(msgi,-1) } end end end local s = self.sock:read("*l") self.lastid = tonumber(assert(s)) for chan,blorp in pairs(deliverables) do for _,d in ipairs(blorp) do local id = d.i - n + self.lastid d.i = nil if self.usids[id] then self.usids[id] = nil else self.wilson:deliver(Channel(self, chan), d) end end end cqueues.sleep(tonumber(self.poll)) end end function Nanochat:sending() for dest_channel, message in self.inbox:iter() do print('NNN',dest_channel,message.sender,message.body) assert(self.sock:write("SEND "..dest_channel.descriptor.." "..message.sender..": "..message.body.."\n")) local id = tonumber(assert(self.sock:read("*l"))) self.usids[id] = true end end return Nanochat