# HG changeset patch # User Waqas Hussain # Date 1234981833 -18000 # Node ID 4dda65cd140565da8b3588e36163114692ae16f1 # Parent e3e3919b6c7e02f9efa858a5223f3d5eff5e869c MUC: Various fixes diff -r e3e3919b6c7e -r 4dda65cd1405 plugins/mod_muc.lua --- a/plugins/mod_muc.lua Tue Feb 17 02:48:06 2009 +0500 +++ b/plugins/mod_muc.lua Wed Feb 18 23:30:33 2009 +0500 @@ -116,7 +116,7 @@ if subject == "" then subject = nil; end rooms_info:set(room, 'subject', subject); save_room(); - local msg = st.message({type='groupchat', from=from}) + local msg = st.message({type='groupchat', from=current_nick}) :tag('subject'):text(subject):up(); broadcast_message_stanza(room, msg, false); --broadcast_message(current_nick, room, subject or "", nil); @@ -231,30 +231,35 @@ pr.attr.from = to; if type == "error" then -- error, kick em out! if current_nick then - local data = rooms:get(room, to); + local data = rooms:get(room, current_nick); data.role = 'none'; local pr = st.presence({type='unavailable', from=current_nick}):tag('status'):text('This participant is kicked from the room because he sent an error presence'):up() - :tag("x", {xmlns='http://jabber.org/protocol/muc#user'}) - :tag("item", {affiliation=data.affiliation, role=data.role}):up(); + --:tag("x", {xmlns='http://jabber.org/protocol/muc#user'}) + --:tag("item", {affiliation=data.affiliation, role=data.role}):up(); broadcast_presence_stanza(room, pr); - --broadcast_presence('unavailable', to, room); -- TODO also add This participant is kicked from the room because he sent an error presence: badformed error stanza - rooms:remove(room, to); + --broadcast_presence('unavailable', current_nick, room); -- TODO also add This participant is kicked from the room because he sent an error presence: badformed error stanza + rooms:remove(room, current_nick); jid_nick:remove(from, room); end elseif type == "unavailable" then -- unavailable if current_nick then - local data = rooms:get(room, to); + local data = rooms:get(room, current_nick); data.role = 'none'; broadcast_presence_stanza(room, pr); - --broadcast_presence('unavailable', to, room); - rooms:remove(room, to); + --broadcast_presence('unavailable', current_nick, room); + rooms:remove(room, current_nick); jid_nick:remove(from, room); end elseif not type then -- available if current_nick then if current_nick == to then -- simple presence - broadcast_presence_stanza(room, pr); - -- FIXME check if something was filtered. if it was, then user may be rejoining + if #pr == #stanza then + broadcast_presence_stanza(room, pr); + else -- possible rejoin + local pr_ = st.presence({type='unavailable', from=from, to=current_nick}):tag('status'):text('Replaced by new connection'); + handle_to_occupant(origin, pr_); -- send unavailable + handle_to_occupant(origin, pr); -- resend available + end else -- change nick if rooms:get(room, to) then origin.send(st.error_reply(stanza, "cancel", "conflict"));