plugins/muc/muc.lib.lua
changeset 6105 68f53b9a186e
parent 6104 260a18062cb2
child 6106 4b15cfae2d11
--- a/plugins/muc/muc.lib.lua	Tue Mar 18 15:15:14 2014 -0400
+++ b/plugins/muc/muc.lib.lua	Tue Mar 18 15:15:28 2014 -0400
@@ -1067,6 +1067,29 @@
 	end
 end
 
+function room_mt:handle_mediated_decline(origin, stanza, payload)
+	local declinee = jid_prep(payload.attr.to);
+	if declinee then
+		local from, to = stanza.attr.from, stanza.attr.to;
+		-- TODO: Validate declinee
+		local reason = payload:get_child_text("reason")
+		local decline = st.message({from = to, to = declinee, id = stanza.attr.id})
+			:tag('x', {xmlns='http://jabber.org/protocol/muc#user'})
+				:tag('decline', {from=from})
+					:tag('reason'):text(reason or ""):up()
+				:up()
+			:up()
+			:tag('body') -- Add a plain message for clients which don't support declines
+				:text(from..' declined your invite to the room '..to..(reason and (' ('..reason..')') or ""))
+			:up();
+		self:_route_stanza(decline);
+		return true;
+	else
+		origin.send(st.error_reply(stanza, "cancel", "jid-malformed"));
+		return true;
+	end
+end
+
 function room_mt:handle_message_to_room(origin, stanza)
 	local type = stanza.attr.type;
 	if type == "groupchat" then
@@ -1081,6 +1104,8 @@
 				-- fallthrough
 			elseif payload.name == "invite" and payload.attr.to then
 				return self:handle_mediated_invite(origin, stanza, payload)
+			elseif payload.name == "decline" and payload.attr.to then
+				return self:handle_mediated_decline(origin, stanza, payload)
 			end
 			origin.send(st.error_reply(stanza, "cancel", "bad-request"));
 			return true;