All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uk.org.retep.xmpp.muc.room.RoomLeaveBroadcast Maven / Gradle / Ivy

There is a newer version: 10.6
Show newest version
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uk.org.retep.xmpp.muc.room;

import javax.xml.bind.JAXBElement;
import org.jabber.protocol.muc_user.Item;
import org.jabber.protocol.muc_user.Status;
import org.jabber.protocol.muc_user.X;
import uk.org.retep.util.messaging.MessageException;
import uk.org.retep.xmpp.JID;
import uk.org.retep.xmpp.XMPPServer;
import uk.org.retep.xmpp.logic.AbstractXMPPLogic;
import uk.org.retep.xmpp.logic.XMPPLogic;
import uk.org.retep.xmpp.util.MessageFactory;
import uk.org.retep.xmpp.message.Presence;
import uk.org.retep.xmpp.muc.MucRoom;
import uk.org.retep.xmpp.muc.MucRoomMember;
import uk.org.retep.xmpp.muc.MucService;
import uk.org.retep.xmpp.util.Role;
import static uk.org.retep.xmpp.XMPPConstants.*;

/**
 *
 * @author peter
 */
public class RoomLeaveBroadcast
        extends AbstractXMPPLogic
{

    private final JID jidInRoom;
    private final MucRoomMember leavingMember;

    public RoomLeaveBroadcast( final JID jidInRoom,
                               final MucRoomMember leavingMember )
    {
        this.jidInRoom = jidInRoom;
        this.leavingMember = leavingMember;
    }

    @Override
    public  XMPPLogic process( final XMPPServer server,
                                  final MucService service,
                                  final MucRoom room,
                                  final Presence presence )
            throws MessageException
    {
        // Send response to the user leaving
        Presence response = createResponse( jidInRoom, presence, leavingMember );
        response.setTo( presence.getFrom() );

        X x = createX( response, leavingMember );

        Status s = new Status();
        s.setCode( PRESENCE_OWN_PRESENCE );
        x.getContent().add( s );

        server.send( response );

        // send to all remaining users
        for( JID to : room.getMemberJids() )
        {
            response = createResponse( jidInRoom,
                                       presence,
                                       leavingMember );
            response.setTo( to );

            createX( response, leavingMember );
            server.send( response );
        }

        return null;
    }

    protected Presence createResponse( final JID jidInRoom,
                                       final Presence presence,
                                       final MucRoomMember leavingMember )
            throws MessageException
    {
        final Presence response = MessageFactory.newInstance( presence );
        response.setFrom( jidInRoom );
        response.setType( UNAVAILABLE );

        // This actually enables custom exit messages as per ex40
        response.getContent().addAll( presence.getContent() );

        // XEP-0172 Persistent Nickname support
        // FIXME: What to do if the user provides a nick in the leave and we
        // then add the existing one, there will be 2 here

        // XEP-0172 persistent Nickname support
        final String persistentNickname = leavingMember.getPersistentNickname();
        if( persistentNickname != null )
        {
            // FIXME
            response.getContent().add( persistentNickname );
        }

        return response;
    }

    protected X createX( final Presence response, final MucRoomMember member )
    {
        final Item item = new Item();
        item.setAffiliation( member.getAffiliation() );
        item.setRole( Role.NONE );

        final X x = new X();
        x.getContent().add( item );

        response.getContent().add( x );

        return x;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy