aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/muc/affiliation_notify.lib.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/muc/affiliation_notify.lib.lua')
-rw-r--r--plugins/muc/affiliation_notify.lib.lua66
1 files changed, 66 insertions, 0 deletions
diff --git a/plugins/muc/affiliation_notify.lib.lua b/plugins/muc/affiliation_notify.lib.lua
new file mode 100644
index 00000000..e2ecbc3b
--- /dev/null
+++ b/plugins/muc/affiliation_notify.lib.lua
@@ -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;
+};