diff options
| -rw-r--r-- | main.lua | 4 | ||||
| -rw-r--r-- | store.lua | 59 |
2 files changed, 63 insertions, 0 deletions
@@ -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 |
