Software / code / prosody
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 }; |