diff options
author | Matthew Wild <mwild1@gmail.com> | 2015-03-27 22:24:57 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2015-03-27 22:24:57 +0000 |
commit | 315e3b3b937c22224c4530a194420f1b2fd77316 (patch) | |
tree | f7d0930c79494da535857eaf4f2a976bb052fa35 /plugins/muc/affiliation_notify.lib.lua | |
parent | 2f531bc782386106af9c8f297594a13c81ae660c (diff) | |
parent | 847f4204accf62ae15f623698c4842b08440a2cd (diff) | |
download | prosody-315e3b3b937c22224c4530a194420f1b2fd77316.tar.gz prosody-315e3b3b937c22224c4530a194420f1b2fd77316.zip |
Merge 0.10->trunk
Diffstat (limited to 'plugins/muc/affiliation_notify.lib.lua')
-rw-r--r-- | plugins/muc/affiliation_notify.lib.lua | 66 |
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; +}; |