Mercurial > prosody-modules
annotate mod_muc_notifications/mod_muc_notifications.lua @ 4421:94805a7e7b30
mod_invites: rework CLI parsing to support groups
To make this sensible, the code had to move from rather simple
parsing to something which looks more like getopt or your typical
shell script.
author | Jonas Schäfer <jonas@wielicki.name> |
---|---|
date | Sun, 31 Jan 2021 19:16:36 +0100 |
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") |