Software /
code /
prosody-modules
Annotate
mod_muc_notifications/mod_muc_notifications.lua @ 3852:66f96b98d219
mod_rest: Allow returning an array of JID strings as disco#items
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 25 Jan 2020 00:30:14 +0100 |
parent | 3498:69219097aa85 |
child | 4089:ef752c5115f7 |
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 } |
69219097aa85
muc_notifications: notify non-present members of new messages
marc0s <marcos.devera@quobis.com>
parents:
diff
changeset
|
47 local reason = "You have messages in group chat "..room:get_name() |
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") |