mod_muc_notifications/mod_muc_notifications.lua
author Matthew Wild <mwild1@gmail.com>
Tue, 27 Sep 2022 18:23:42 +0100
changeset 5064 bc491065c221
parent 4093 ef752c5115f7
permissions -rw-r--r--
mod_sasl2_bind2, mod_sasl2_sm: Remove bind2 <features/> wrapper element This was dropped from the spec. It's more consistent with SASL2.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3502
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
				}
4093
ef752c5115f7 mod_muc_notifications: adapt to MUC get_name() API changes
marc0s <marcos@tenak.net>
parents: 3502
diff changeset
    47
				local reason = "You have messages in group chat "..(room:get_name() or room.jid)
3502
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")