plugins/muc: Add affiliation_notify config option to send out status code 101
authordaurnimator <quae@daurnimator.com>
Fri, 05 Sep 2014 12:16:53 -0400
changeset 6394 fe034fa564ee
parent 6393 fff6ca13cb0f
child 6399 e26176bf1334
plugins/muc: Add affiliation_notify config option to send out status code 101
plugins/muc/affiliation_notify.lib.lua
plugins/muc/muc.lib.lua
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/muc/affiliation_notify.lib.lua	Fri Sep 05 12:16:53 2014 -0400
@@ -0,0 +1,66 @@
+-- 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 <message/>
+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 <body/> 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;
+};
--- a/plugins/muc/muc.lib.lua	Fri Sep 05 11:28:28 2014 -0400
+++ b/plugins/muc/muc.lib.lua	Fri Sep 05 12:16:53 2014 -0400
@@ -1111,6 +1111,8 @@
 	return true;
 end
 
+local affiliation_notify = module:require "muc/affiliation_notify";
+
 local name = module:require "muc/name";
 room_mt.get_name = name.get;
 room_mt.set_name = name.set;