Mercurial > prosody-modules
view mod_map/mod_map.lua @ 5354:39d59d857bfb
mod_http_oauth2: Use new mod_cron API for periodic cleanup
Less frequent but this isn't that important after all since, as the
comment states, expired codes are not usable anyway. They're also not
that large so memory usage probably doesn't matter.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 22 Apr 2023 11:59:52 +0200 |
parents | d0c2f001735f |
children |
line wrap: on
line source
local st = require "util.stanza"; local jid_bare = require "util.jid".bare; local rsm = require "util.rsm"; local dataform = require "util.dataforms".new; local datetime = require "util.datetime".datetime; local archive = module:open_store("archive", "archive"); local query_form = dataform { { name = "with"; type = "jid-single"; }; { name = "start"; type = "text-single" }; { name = "end"; type = "text-single"; }; }; if not archive.summary then module:log("error", "The archive:summary() API is not supported by %s", archive._provided_by); return end module:hook("iq-get/self/xmpp:prosody.im/mod_map:summary", function(event) local origin, stanza = event.origin, event.stanza; local query = stanza.tags[1]; -- Search query parameters local qwith, qstart, qend; local form = query:get_child("x", "jabber:x:data"); if form then local err; form, err = query_form:data(form); if err then origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err)))); return true; end qwith, qstart, qend = form["with"], form["start"], form["end"]; qwith = qwith and jid_bare(qwith); -- dataforms does jidprep end local qset = rsm.get(query); local qmax = qset and qset.max; local before, after = qset and qset.before, qset and qset.after; if type(before) ~= "string" then before = nil; end local summary = archive:summary(origin.username, { start = qstart; ["end"] = qend; -- Time range with = qwith; limit = qmax; before = before; after = after; }); if not summary then module:send(st.error_reply(stanza, "wait", "internal-server-error")); return true; end local reply = st.reply(stanza); reply:tag("summary", { xmlns = "xmpp:prosody.im/mod_map" }); for jid, count in pairs(summary.counts) do reply:tag("item", { jid = jid }); if type(count) == "number" then reply:text_tag("count", ("%d"):format(count)); end if summary.earliest and summary.earliest[jid] then reply:text_tag("start", datetime(summary.earliest[jid])); end if summary.latest and summary.latest[jid] then reply:text_tag("end", datetime(summary.latest[jid])); end if summary.body and summary.body[jid] then reply:text_tag("body", summary.body[jid]); end reply:up(); end module:send(reply); return true; end);