summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrebecca <ubq323@ubq323.website>2026-09-17 22:13:53 +0100
committerrebecca <ubq323@ubq323.website>2026-09-17 22:13:53 +0100
commitaf8cd453bf63bea136d2b4a71c783ef5542a05ed (patch)
treed56193fa78b856bbc61228260666a27ead2cc39c
parent82b1755a1e99c9a45bbf4f29b72af33b5868817e (diff)
implement rudimentary message storing systemstore
-rw-r--r--main.lua4
-rw-r--r--store.lua59
2 files changed, 63 insertions, 0 deletions
diff --git a/main.lua b/main.lua
index 2d46f70..4efa82e 100644
--- a/main.lua
+++ b/main.lua
@@ -5,6 +5,7 @@ local pprint = require'pprint'
local config = require'config'
local Channel = require'channel'
local Log = require 'log'
+local Store = require 'store'
local pylon_classes = {
irc = require'irc.pylon',
@@ -22,6 +23,7 @@ function Wilson.make(cls, conf)
busses={},
cq = cqueues.new(),
log = Log('(toplevel)',tlc.loglevel or 'info'),
+ store = Store(),
}, Wilson)
for name, pylon_conf in pairs(conf.pylon) do
pylon_conf.name = name
@@ -54,6 +56,7 @@ end
function Wilson.deliver(self, message)
local bus = self:_find_bus(assert(message.source_channel))
if bus then
+ self.store:store(message)
for _, dest_channel in ipairs(bus) do
if message.source_channel ~= dest_channel then
self.log:debug(message.source_channel, "-->", dest_channel, message)
@@ -67,6 +70,7 @@ function Wilson.run(self)
self.cq:wrap(pylon.run, pylon)
self.log("now running pylon", pylonname)
end
+ self.cq:wrap(self.store.run, self.store)
self.log:loop(self.cq)
end
diff --git a/store.lua b/store.lua
new file mode 100644
index 0000000..a970fcb
--- /dev/null
+++ b/store.lua
@@ -0,0 +1,59 @@
+local cqueues = require'cqueues'
+local db = require'r.db'
+local qw = require'r.qw'
+local html = require'r.html'
+local T = html.T
+local class = require'r.class'
+local App = require'r.web.app'
+local server = require'r.web.server'
+
+local Queue = require'queue'
+local Log = require'log'
+
+local Store = class() -- we only have 1 instance of this, but, ough,
+function Store.make(cls) return setmetatable({
+ q = Queue(),
+ log = Log"store",
+},cls) end
+
+function Store.storing(self)
+ local conn = db.conn()
+ for msg in self.q:iter() do
+ -- needs to go in its own coro
+ -- so we don't gum up the works while waiting on the db
+ conn:exec("insert into messages (ts, body) values (?,?);",
+ os.time(), msg.body)
+ self.log("stored",msg.body)
+ assert(conn:commit()) end end
+function Store.store(self, msg) self.q:enqueue(msg) end
+
+local function view(req)
+ local conn <close> = db.conn()
+ local rows = conn:fetch"select * from messages order by ts asc;"
+ local fields = qw"id ts body"
+ -- list comprehensions? WHAT ARE THOSE?????
+ local ths={} for i,v in ipairs(fields) do ths[i]=T.th(v) end
+ local trs={} for ri,r in ipairs(rows) do
+ local tds = {} for i,v in ipairs(fields) do tds[i]=T.td(r[v]) end
+ trs[ri] = T.tr(tds) end
+ local tab = T.table{
+ T.thead(T.tr(ths)),
+ T.tbody(trs),
+ }
+ return html.html {
+ T.h1'the messages',
+ tab
+ } end
+local app = App{ view = view }
+function Store.serving(self)
+ return server.run(self.cq, app) end
+
+function Store.run(self)
+ self.cq = cqueues.new()
+ self.cq:wrap(self.storing, self)
+ self.cq:wrap(self.serving, self)
+ self.log("now running")
+ self.log:loop(self.cq)
+end
+
+return Store