e708ae94e359ec26119105b2d9885a4ca7def0ad
[prosody.git] / plugins / muc / affiliation_notify.lib.lua
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         return true;
28 end
29
30 module:hook("muc-config-form", function(event)
31         table.insert(event.form, {
32                 name = "muc#roomconfig_affiliationnotify";
33                 type = "boolean";
34                 label = "Notify users when their affiliation changes when they are not in the room?";
35                 value = get_affiliation_notify(event.room);
36         });
37 end);
38
39 module:hook("muc-config-submitted/muc#roomconfig_affiliationnotify", function(event)
40         if set_affiliation_notify(event.room, event.value) then
41                 event.status_codes["104"] = true;
42         end
43 end);
44
45 module:hook("muc-set-affiliation", function(event)
46         local room = event.room;
47         if not event.in_room and get_affiliation_notify(room) then
48                 local body = string.format("Your affiliation in room %s is now %s.", room.jid, event.affiliation);
49                 local stanza = st.message({
50                                 type = "headline";
51                                 from = room.jid;
52                                 to = event.jid;
53                         }, body)
54                         :tag("x", {xmlns = "http://jabber.org/protocol/muc#user"})
55                                 :tag("status", {code="101"}):up()
56                         :up();
57                 room:route_stanza(stanza);
58         end
59 end);
60
61 return {
62         get = get_affiliation_notify;
63         set = set_affiliation_notify;
64 };