Mercurial > prosody-modules
annotate mod_muc_notifications/mod_muc_notifications.lua @ 5571:ca3c2d11823c
mod_pubsub_feeds: Track latest timestamp seen in feeds instead of last poll
This should ensure that an entry that has a publish timestmap after the
previously oldest post, but before the time of the last poll check, is
published to the node.
Previously if an entry would be skipped if it was published at 13:00
with a timestamp of 12:30, where the last poll was at 12:45.
For feeds that lack a timestamp, it now looks for the first post that is
not published, assuming that the feed is in reverse chronological order,
then iterates back up from there.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 25 Jun 2023 16:27:55 +0200 |
parents | ef752c5115f7 |
children |
rev | line source |
---|---|
3498
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
1 -- mod_muc_notifications |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
2 -- |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
3 -- Copyright (C) 2019 Marcos de Vera Piquero <marcos.devera@quobis.com> |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
4 -- |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
5 -- This file is MIT/X11 licensed. |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
6 -- |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
7 -- A module to notify non-present members of messages in a group chat |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
8 -- |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
9 |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
10 local id = require"util.id" |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
11 local st = require"util.stanza" |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
12 |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
13 local use_invite = module:get_option_boolean("muc_notification_invite", false) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
14 |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
15 -- Given a stanza, compute if it qualifies as important (notifiable) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
16 -- return true for message stanzas with non-empty body |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
17 -- Should probably use something similar to muc-message-is-historic event |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
18 local function is_important(stanza) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
19 local body = stanza:find("body#") |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
20 return body and #body |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
21 end |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
22 |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
23 local function handle_muc_message(event) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
24 -- event.room and event.stanza are available |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
25 local room = event.room |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
26 local stanza = event.stanza |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
27 for jid, aff in pairs(room._affiliations) do |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
28 if aff ~= "outcast" then |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
29 local is_occupant = false |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
30 for _, occupant in pairs(room._occupants) do |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
31 if occupant.bare_jid == jid then |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
32 is_occupant = true |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
33 break |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
34 end |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
35 end |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
36 if not is_occupant and is_important(stanza) then |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
37 -- send notification to jid |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
38 local attrs = { |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
39 to = jid, |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
40 id = id.short(), |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
41 from = room.jid, |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
42 } |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
43 local not_attrs = { |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
44 xmlns = "http://quobis.com/xmpp/muc#push", |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
45 jid = room.jid, |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
46 } |
4089
ef752c5115f7
mod_muc_notifications: adapt to MUC get_name() API changes
marc0s <marcos@tenak.net>
parents:
3498
diff
changeset
|
47 local reason = "You have messages in group chat "..(room:get_name() or room.jid) |
3498
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
48 local notification = st.message(attrs) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
49 :body(reason):up() |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
50 :tag("notification", not_attrs):up() |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
51 :tag("no-store", {xmlns = "urn:xmpp:hints"}) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
52 local invite = st.message(attrs):tag("x", {xmlns = "http://jabber.org/protocol/muc#user"}) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
53 :tag("invite", {from = stanza.attr.from}) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
54 :tag("reason"):text(reason):up():up():up() |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
55 :tag("notification", not_attrs):up() |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
56 :tag("no-store", {xmlns = "urn:xmpp:hints"}) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
57 module:log("debug", "notifying with %s", tostring(use_invite and invite or notification)) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
58 module:send(use_invite and invite or notification) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
59 module:log("debug", "sent notification of MUC message %s", use_invite and invite or notification) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
60 end |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
61 end |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
62 end |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
63 end |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
64 |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
65 module:hook("muc-broadcast-message", handle_muc_message) |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
66 |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
67 module:log("debug", "Module loaded") |