view mod_muc_notifications/mod_muc_notifications.lua @ 4575:5b4f43b90766

mod_measure_malloc: port to most recent trunk statistics API
author Jonas Schäfer <>
date Tue, 25 May 2021 19:01:54 +0200
parents ef752c5115f7
line wrap: on
line source

-- mod_muc_notifications
-- Copyright (C) 2019 Marcos de Vera Piquero <>
-- This file is MIT/X11 licensed.
-- A module to notify non-present members of messages in a group chat

local id = require""
local st = require"util.stanza"

local use_invite = module:get_option_boolean("muc_notification_invite", false)

-- Given a stanza, compute if it qualifies as important (notifiable)
-- return true for message stanzas with non-empty body
-- Should probably use something similar to muc-message-is-historic event
local function is_important(stanza)
	local body = stanza:find("body#")
	return body and #body

local function handle_muc_message(event)
	-- and event.stanza are available
	local room =
	local stanza = event.stanza
	for jid, aff in pairs(room._affiliations) do
		if aff ~= "outcast" then
			local is_occupant = false
			for _, occupant in pairs(room._occupants) do
				if occupant.bare_jid == jid then
					is_occupant = true
			if not is_occupant and is_important(stanza) then
				-- send notification to jid
				local attrs = {
					to = jid,
					id = id.short(),
					from = room.jid,
				local not_attrs = {
					xmlns = "",
					jid = room.jid,
				local reason = "You have messages in group chat "..(room:get_name() or room.jid)
				local notification = st.message(attrs)
					:tag("notification", not_attrs):up()
					:tag("no-store", {xmlns = "urn:xmpp:hints"})
				local invite = st.message(attrs):tag("x", {xmlns = ""})
					:tag("invite", {from = stanza.attr.from})
					:tag("notification", not_attrs):up()
					:tag("no-store", {xmlns = "urn:xmpp:hints"})
				module:log("debug", "notifying with %s", tostring(use_invite and invite or notification))
				module:send(use_invite and invite or notification)
				module:log("debug", "sent notification of MUC message %s", use_invite and invite or notification)

module:hook("muc-broadcast-message", handle_muc_message)

module:log("debug", "Module loaded")