Software /
code /
prosody
Comparison
plugins/muc/muc.lib.lua @ 7410:45f543c82893
MUC: Split out handling of the room-creating presence into its own method
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 28 Apr 2016 22:57:02 +0200 |
parent | 7409:9a3ce6da3256 |
child | 7411:f385cd6127b2 |
comparison
equal
deleted
inserted
replaced
7409:9a3ce6da3256 | 7410:45f543c82893 |
---|---|
382 event.origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); | 382 event.origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); |
383 return true; | 383 return true; |
384 end | 384 end |
385 end, -10); | 385 end, -10); |
386 | 386 |
387 function room_mt:handle_first_presence(origin, stanza) | |
388 local real_jid = stanza.attr.from; | |
389 local dest_jid = stanza.attr.to; | |
390 local bare_jid = jid_bare(real_jid); | |
391 if module:fire_event("muc-room-pre-create", { | |
392 room = self; | |
393 origin = origin; | |
394 stanza = stanza; | |
395 }) then return true; end | |
396 local is_first_dest_session = true; | |
397 local dest_occupant = self:new_occupant(bare_jid, dest_jid); | |
398 | |
399 -- TODO Handle this case sensibly | |
400 if not stanza:get_child("x", "http://jabber.org/protocol/muc") then | |
401 module:log("debug", "Room creation without <x>, possibly desynced"); | |
402 end | |
403 | |
404 if module:fire_event("muc-occupant-pre-join", { | |
405 room = self; | |
406 origin = origin; | |
407 stanza = stanza; | |
408 is_first_session = is_first_dest_session; | |
409 is_new_room = true; | |
410 occupant = dest_occupant; | |
411 }) then return true; end | |
412 | |
413 dest_occupant:set_session(real_jid, stanza); | |
414 local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); | |
415 dest_x:tag("status", {code = "201"}):up(); | |
416 if self:get_whois() == "anyone" then | |
417 dest_x:tag("status", {code = "100"}):up(); | |
418 end | |
419 self:save_occupant(dest_occupant); | |
420 | |
421 self:publicise_occupant_status(dest_occupant, dest_x); | |
422 | |
423 module:fire_event("muc-occupant-joined", { | |
424 room = self; | |
425 nick = dest_occupant.nick; | |
426 occupant = dest_occupant; | |
427 stanza = stanza; | |
428 origin = origin; | |
429 }); | |
430 module:fire_event("muc-occupant-session-new", { | |
431 room = self; | |
432 nick = dest_occupant.nick; | |
433 occupant = dest_occupant; | |
434 stanza = stanza; | |
435 origin = origin; | |
436 jid = real_jid; | |
437 }); | |
438 return true; | |
439 end | |
440 | |
387 function room_mt:handle_normal_presence(origin, stanza) | 441 function room_mt:handle_normal_presence(origin, stanza) |
388 local type = stanza.attr.type; | 442 local type = stanza.attr.type; |
389 local real_jid = stanza.attr.from; | 443 local real_jid = stanza.attr.from; |
390 local bare_jid = jid_bare(real_jid); | 444 local bare_jid = jid_bare(real_jid); |
391 local orig_occupant, dest_occupant; | 445 local orig_occupant = self:get_occupant_by_real_jid(real_jid); |
392 local is_new_room = next(self._affiliations) == nil; | 446 if type == "unavailable" and orig_occupant == nil then return true; end -- Unavailable from someone not in the room |
393 if is_new_room then | |
394 if type == "unavailable" then return true; end -- Unavailable from someone not in the room | |
395 if module:fire_event("muc-room-pre-create", { | |
396 room = self; | |
397 origin = origin; | |
398 stanza = stanza; | |
399 }) then return true; end | |
400 else | |
401 orig_occupant = self:get_occupant_by_real_jid(real_jid); | |
402 if type == "unavailable" and orig_occupant == nil then return true; end -- Unavailable from someone not in the room | |
403 end | |
404 local is_first_dest_session; | 447 local is_first_dest_session; |
448 local dest_occupant; | |
405 if type == "unavailable" then -- luacheck: ignore 542 | 449 if type == "unavailable" then -- luacheck: ignore 542 |
406 -- FIXME Why the empty if branch? | 450 -- FIXME Why the empty if branch? |
407 -- dest_occupant = nil | 451 -- dest_occupant = nil |
408 elseif orig_occupant and orig_occupant.nick == stanza.attr.to then -- Just a presence update | 452 elseif orig_occupant and orig_occupant.nick == stanza.attr.to then -- Just a presence update |
409 log("debug", "presence update for %s from session %s", orig_occupant.nick, real_jid); | 453 log("debug", "presence update for %s from session %s", orig_occupant.nick, real_jid); |
441 is_first_session = is_first_dest_session; | 485 is_first_session = is_first_dest_session; |
442 is_last_session = is_last_orig_session; | 486 is_last_session = is_last_orig_session; |
443 }; | 487 }; |
444 if orig_occupant == nil then | 488 if orig_occupant == nil then |
445 event_name = "muc-occupant-pre-join"; | 489 event_name = "muc-occupant-pre-join"; |
446 event.is_new_room = is_new_room; | |
447 event.occupant = dest_occupant; | 490 event.occupant = dest_occupant; |
448 elseif dest_occupant == nil then | 491 elseif dest_occupant == nil then |
449 event_name = "muc-occupant-pre-leave"; | 492 event_name = "muc-occupant-pre-leave"; |
450 event.occupant = orig_occupant; | 493 event.occupant = orig_occupant; |
451 else | 494 else |
521 end | 564 end |
522 | 565 |
523 if dest_occupant ~= nil then | 566 if dest_occupant ~= nil then |
524 dest_occupant:set_session(real_jid, stanza); | 567 dest_occupant:set_session(real_jid, stanza); |
525 local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); | 568 local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); |
526 if is_new_room then | |
527 dest_x:tag("status", {code = "201"}):up(); | |
528 end | |
529 if orig_occupant == nil and self:get_whois() == "anyone" then | 569 if orig_occupant == nil and self:get_whois() == "anyone" then |
530 dest_x:tag("status", {code = "100"}):up(); | 570 dest_x:tag("status", {code = "100"}):up(); |
531 end | 571 end |
532 self:save_occupant(dest_occupant); | 572 self:save_occupant(dest_occupant); |
533 | 573 |