plugins/muc/muc.lib.lua
changeset 6202 64ed7f538f81
parent 6201 b9e8f5268c97
child 6203 b6ffce01e6cf
equal deleted inserted replaced
6201:b9e8f5268c97 6202:64ed7f538f81
  1002 		value = tostring(event.room:get_historylength())
  1002 		value = tostring(event.room:get_historylength())
  1003 	});
  1003 	});
  1004 end);
  1004 end);
  1005 
  1005 
  1006 function room_mt:process_form(origin, stanza)
  1006 function room_mt:process_form(origin, stanza)
  1007 	local query = stanza.tags[1];
  1007 	local form = stanza.tags[1]:get_child("x", "jabber:x:data");
  1008 	local form = query:get_child("x", "jabber:x:data")
  1008 	if form.attr.type == "cancel" then
  1009 	if not form then origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); return; end
  1009 		origin.send(st.reply(stanza));
  1010 	if form.attr.type == "cancel" then origin.send(st.reply(stanza)); return; end
  1010 	elseif form.attr.type == "submit" then
  1011 	if form.attr.type ~= "submit" then origin.send(st.error_reply(stanza, "cancel", "bad-request", "Not a submitted form")); return; end
  1011 		local fields = self:get_form_layout(stanza.attr.from):data(form);
  1012 
  1012 		if fields.FORM_TYPE ~= "http://jabber.org/protocol/muc#roomconfig" then
  1013 	local fields = self:get_form_layout(stanza.attr.from):data(form);
  1013 			origin.send(st.error_reply(stanza, "cancel", "bad-request", "Form is not of type room configuration"));
  1014 	if fields.FORM_TYPE ~= "http://jabber.org/protocol/muc#roomconfig" then origin.send(st.error_reply(stanza, "cancel", "bad-request", "Form is not of type room configuration")); return; end
  1014 			return true;
  1015 
  1015 		end
  1016 
  1016 
  1017 	local changed = {};
  1017 		local changed = {};
  1018 
  1018 
  1019 	local function handle_option(name, field, allowed)
  1019 		local function handle_option(name, field, allowed)
  1020 		local new = fields[field];
  1020 			local new = fields[field];
  1021 		if new == nil then return; end
  1021 			if new == nil then return; end
  1022 		if allowed and not allowed[new] then return; end
  1022 			if allowed and not allowed[new] then return; end
  1023 		if new == self["get_"..name](self) then return; end
  1023 			if new == self["get_"..name](self) then return; end
  1024 		changed[name] = true;
  1024 			changed[name] = true;
  1025 		self["set_"..name](self, new);
  1025 			self["set_"..name](self, new);
  1026 	end
  1026 		end
  1027 
  1027 
  1028 	local event = { room = self, fields = fields, changed = changed, stanza = stanza, origin = origin, update_option = handle_option };
  1028 		local event = { room = self, fields = fields, changed = changed, stanza = stanza, origin = origin, update_option = handle_option };
  1029 	module:fire_event("muc-config-submitted", event);
  1029 		module:fire_event("muc-config-submitted", event);
  1030 
  1030 
  1031 	handle_option("name", "muc#roomconfig_roomname");
  1031 		if self.save then self:save(true); end
  1032 	handle_option("description", "muc#roomconfig_roomdesc");
  1032 		if self:is_locked() then
  1033 	handle_option("persistent", "muc#roomconfig_persistentroom");
  1033 			self:unlock();
  1034 	handle_option("moderated", "muc#roomconfig_moderatedroom");
  1034 		end
  1035 	handle_option("members_only", "muc#roomconfig_membersonly");
  1035 		origin.send(st.reply(stanza));
  1036 	handle_option("public", "muc#roomconfig_publicroom");
  1036 
  1037 	handle_option("changesubject", "muc#roomconfig_changesubject");
  1037 		if next(changed) then
  1038 	handle_option("historylength", "muc#roomconfig_historylength");
  1038 			local msg = st.message({type='groupchat', from=self.jid})
  1039 	handle_option("whois", "muc#roomconfig_whois", valid_whois);
  1039 				:tag('x', {xmlns='http://jabber.org/protocol/muc#user'})
  1040 	handle_option("password", "muc#roomconfig_roomsecret");
  1040 					:tag('status', {code = '104'}):up()
  1041 
  1041 				:up();
  1042 	if self.save then self:save(true); end
  1042 			if changed.whois then
  1043 	if self:is_locked() then
  1043 				local code = (self:get_whois() == 'moderators') and "173" or "172";
  1044 		self:unlock();
  1044 				msg.tags[1]:tag('status', {code = code}):up();
  1045 	end
  1045 			end
  1046 	origin.send(st.reply(stanza));
  1046 			self:broadcast_message(msg, false)
  1047 
  1047 		end
  1048 	if next(changed) then
  1048 	else
  1049 		local msg = st.message({type='groupchat', from=self.jid})
  1049 		origin.send(st.error_reply(stanza, "cancel", "bad-request", "Not a submitted form"));
  1050 			:tag('x', {xmlns='http://jabber.org/protocol/muc#user'})
  1050 	end
  1051 				:tag('status', {code = '104'}):up()
  1051 	return true;
  1052 			:up();
  1052 end
  1053 		if changed.whois then
  1053 module:hook("muc-config-submitted", function(event)
  1054 			local code = (self:get_whois() == 'moderators') and "173" or "172";
  1054 	event.update_option("name", "muc#roomconfig_roomname");
  1055 			msg.tags[1]:tag('status', {code = code}):up();
  1055 end);
  1056 		end
  1056 module:hook("muc-config-submitted", function(event)
  1057 		self:broadcast_message(msg, false)
  1057 	event.update_option("description", "muc#roomconfig_roomdesc");
  1058 	end
  1058 end);
  1059 end
  1059 module:hook("muc-config-submitted", function(event)
       
  1060 	event.update_option("persistent", "muc#roomconfig_persistentroom");
       
  1061 end);
       
  1062 module:hook("muc-config-submitted", function(event)
       
  1063 	event.update_option("moderated", "muc#roomconfig_moderatedroom");
       
  1064 end);
       
  1065 module:hook("muc-config-submitted", function(event)
       
  1066 	event.update_option("members_only", "muc#roomconfig_membersonly");
       
  1067 end);
       
  1068 module:hook("muc-config-submitted", function(event)
       
  1069 	event.update_option("public", "muc#roomconfig_publicroom");
       
  1070 end);
       
  1071 module:hook("muc-config-submitted", function(event)
       
  1072 	event.update_option("changesubject", "muc#roomconfig_changesubject");
       
  1073 end);
       
  1074 module:hook("muc-config-submitted", function(event)
       
  1075 	event.update_option("historylength", "muc#roomconfig_historylength");
       
  1076 end);
       
  1077 module:hook("muc-config-submitted", function(event)
       
  1078 	event.update_option("whois", "muc#roomconfig_whois", valid_whois);
       
  1079 end);
       
  1080 module:hook("muc-config-submitted", function(event)
       
  1081 	event.update_option("password", "muc#roomconfig_roomsecret");
       
  1082 end);
  1060 
  1083 
  1061 -- Removes everyone from the room
  1084 -- Removes everyone from the room
  1062 function room_mt:clear(x)
  1085 function room_mt:clear(x)
  1063 	x = x or st.stanza("x", {xmlns='http://jabber.org/protocol/muc#user'});
  1086 	x = x or st.stanza("x", {xmlns='http://jabber.org/protocol/muc#user'});
  1064 	local occupants_updated = {};
  1087 	local occupants_updated = {};
  1186 		local reason = child:get_child_text("reason");
  1209 		local reason = child:get_child_text("reason");
  1187 		local password = child:get_child_text("password");
  1210 		local password = child:get_child_text("password");
  1188 		self:destroy(newjid, reason, password);
  1211 		self:destroy(newjid, reason, password);
  1189 		origin.send(st.reply(stanza));
  1212 		origin.send(st.reply(stanza));
  1190 		return true;
  1213 		return true;
       
  1214 	elseif child.name == "x" and child.attr.xmlns == "jabber:x:data" then
       
  1215 		return self:process_form(origin, stanza);
  1191 	else
  1216 	else
  1192 		self:process_form(origin, stanza);
  1217 		origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
  1193 		return true;
  1218 		return true;
  1194 	end
  1219 	end
  1195 end
  1220 end
  1196 
  1221 
  1197 function room_mt:handle_groupchat_to_room(origin, stanza)
  1222 function room_mt:handle_groupchat_to_room(origin, stanza)