Comparison

plugins/muc/affiliation_notify.lib.lua @ 6394:fe034fa564ee

plugins/muc: Add affiliation_notify config option to send out status code 101
author daurnimator <quae@daurnimator.com>
date Fri, 05 Sep 2014 12:16:53 -0400
child 6991:84e01dbb739e
comparison
equal deleted inserted replaced
6393:fff6ca13cb0f 6394:fe034fa564ee
1 -- Prosody IM
2 -- Copyright (C) 2014 Daurnimator
3 --
4 -- This project is MIT/X11 licensed. Please see the
5 -- COPYING file in the source package for more information.
6 --
7
8 --[[
9 Out of courtesy, a MUC service MAY send an out-of-room <message/>
10 if a user's affiliation changes while the user is not in the room;
11 the message SHOULD be sent from the room to the user's bare JID,
12 MAY contain a <body/> element describing the affiliation change,
13 and MUST contain a status code of 101.
14 ]]
15
16
17 local st = require "util.stanza";
18
19 local function get_affiliation_notify(room)
20 return room._data.affiliation_notify;
21 end
22
23 local function set_affiliation_notify(room, affiliation_notify)
24 affiliation_notify = affiliation_notify and true or nil;
25 if room._data.affiliation_notify == affiliation_notify then return false; end
26 room._data.affiliation_notify = affiliation_notify;
27 if room.save then room:save(true); end
28 return true;
29 end
30
31 module:hook("muc-config-form", function(event)
32 table.insert(event.form, {
33 name = "muc#roomconfig_affiliationnotify";
34 type = "boolean";
35 label = "Notify users when their affiliation changes when they are not in the room?";
36 value = get_affiliation_notify(event.room);
37 });
38 end);
39
40 module:hook("muc-config-submitted", function(event)
41 local new = event.fields["muc#roomconfig_affiliationnotify"];
42 if new ~= nil and set_affiliation_notify(event.room, new) then
43 event.status_codes["104"] = true;
44 end
45 end);
46
47 module:hook("muc-set-affiliation", function(event)
48 local room = event.room;
49 if not event.in_room and get_affiliation_notify(room) then
50 local body = string.format("Your affiliation in room %s is now %s.", room.jid, event.affiliation);
51 local stanza = st.message({
52 type = "headline";
53 from = room.jid;
54 to = event.jid;
55 }, body)
56 :tag("x", {xmlns = "http://jabber.org/protocol/muc#user"})
57 :tag("status", {code="101"}):up()
58 :up();
59 room:route_stanza(stanza);
60 end
61 end);
62
63 return {
64 get = get_affiliation_notify;
65 set = set_affiliation_notify;
66 };