summaryrefslogtreecommitdiff
path: root/nanochat/pylon.lua
diff options
context:
space:
mode:
authorrebecca <ubq323@ubq323.website>2026-09-12 20:01:32 +0100
committerrebecca <ubq323@ubq323.website>2026-09-12 20:01:32 +0100
commit1f9192f9d6639dedd243532616fb034f0e5bb14a (patch)
treea4b2bf1a20db9ddf625fffa090744b91f3511900 /nanochat/pylon.lua
parentdfd4fbf869e57d67f807b1ea476ecb391329c09e (diff)
rename nanochat_send -> nanochat
Diffstat (limited to 'nanochat/pylon.lua')
-rw-r--r--nanochat/pylon.lua74
1 files changed, 74 insertions, 0 deletions
diff --git a/nanochat/pylon.lua b/nanochat/pylon.lua
new file mode 100644
index 0000000..7dae58b
--- /dev/null
+++ b/nanochat/pylon.lua
@@ -0,0 +1,74 @@
+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