58 events = events.new() }, room_mt); |
58 events = events.new() }, room_mt); |
59 self.rooms[jid] = room; |
59 self.rooms[jid] = room; |
60 local occupants = room.occupants; |
60 local occupants = room.occupants; |
61 room:hook("presence", function (presence) |
61 room:hook("presence", function (presence) |
62 local nick = presence.nick; |
62 local nick = presence.nick; |
63 if not occupants[nick] then |
63 if not occupants[nick] and presence.stanza.attr.type ~= "unavailable" then |
64 if presence.type ~= "unavailable" then |
64 occupants[nick] = { |
65 occupants[nick] = { |
65 nick = nick; |
66 nick = nick; |
66 jid = presence.stanza.attr.from; |
67 jid = presence.stanza.attr.from; |
67 presence = presence.stanza; |
68 presence = presence.stanza; |
68 }; |
69 }; |
69 if nick == room.nick then |
70 if nick == room.nick then |
70 room.bot:event("groupchat/joined", room); |
71 room.bot:event("groupchat/joined", room); |
|
72 else |
|
73 room:event("occupant-joined", occupants[nick]); |
|
74 end |
|
75 else |
71 else |
76 occupants[nick].presence = presence.stanza; |
72 room:event("occupant-joined", occupants[nick]); |
77 room:event("occupant-left", occupants[nick]); |
|
78 occupants[nick] = nil; |
|
79 end |
73 end |
|
74 elseif occupants[nick] and presence.stanza.attr.type == "unavailable" then |
|
75 occupants[nick].presence = presence.stanza; |
|
76 room:event("occupant-left", occupants[nick]); |
|
77 occupants[nick] = nil; |
80 end |
78 end |
81 end); |
79 end); |
82 self:send(st.presence({to = jid.."/"..nick})); |
80 self:send(st.presence({to = jid.."/"..nick})); |
83 self:event("groupchat/joining", room); |
81 self:event("groupchat/joining", room); |
84 return room; |
82 return room; |