-- Prosody IM -- Copyright (C) 2014 Daurnimator -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- --[[ Out of courtesy, a MUC service MAY send an out-of-room if a user's affiliation changes while the user is not in the room; the message SHOULD be sent from the room to the user's bare JID, MAY contain a element describing the affiliation change, and MUST contain a status code of 101. ]] local st = require "util.stanza"; local function get_affiliation_notify(room) return room._data.affiliation_notify; end local function set_affiliation_notify(room, affiliation_notify) affiliation_notify = affiliation_notify and true or nil; if room._data.affiliation_notify == affiliation_notify then return false; end room._data.affiliation_notify = affiliation_notify; if room.save then room:save(true); end return true; end module:hook("muc-config-form", function(event) table.insert(event.form, { name = "muc#roomconfig_affiliationnotify"; type = "boolean"; label = "Notify users when their affiliation changes when they are not in the room?"; value = get_affiliation_notify(event.room); }); end); module:hook("muc-config-submitted", function(event) local new = event.fields["muc#roomconfig_affiliationnotify"]; if new ~= nil and set_affiliation_notify(event.room, new) then event.status_codes["104"] = true; end end); module:hook("muc-set-affiliation", function(event) local room = event.room; if not event.in_room and get_affiliation_notify(room) then local body = string.format("Your affiliation in room %s is now %s.", room.jid, event.affiliation); local stanza = st.message({ type = "headline"; from = room.jid; to = event.jid; }, body) :tag("x", {xmlns = "http://jabber.org/protocol/muc#user"}) :tag("status", {code="101"}):up() :up(); room:route_stanza(stanza); end end); return { get = get_affiliation_notify; set = set_affiliation_notify; };