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

uk.org.retep.xmpp.muc.room.NicknameChangedBroadcast 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 uk.org.retep.util.messaging.MessageException;
import uk.org.retep.xmpp.JID;
import uk.org.retep.xmpp.XMPPServer;
import uk.org.retep.xmpp.builder.PresenceBuilder;
import uk.org.retep.xmpp.logic.XMPPLogic;
import uk.org.retep.xmpp.message.Presence;
import uk.org.retep.xmpp.muc.MucFeature;
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.muc.MucUtil;
import uk.org.retep.xmpp.util.Role;
import static uk.org.retep.xmpp.XMPPConstants.*;

/**
 * {@link XMPPLogic} implementation created by another to generate responses
 * for when a user joins a chat room
 * 
 * @author peter
 */
public class NicknameChangedBroadcast
        extends AbstractRoomBroadcast
{

    private final JID chatRoomJid;
    private final MucRoomMember joiningMember;
    private final JID userJid;
    private final String requestedNickName;
    private final String nickName;
    private final String oldNick;

    public NicknameChangedBroadcast( final JID chatRoomJid,
                                     final MucRoomMember joiningMember,
                                     final JID userJid,
                                     final String requestedNickName,
                                     final String nickName,
                                     final String oldNick )
    {
        this.chatRoomJid = chatRoomJid;
        this.joiningMember = joiningMember;
        this.userJid = userJid;
        this.requestedNickName = requestedNickName;
        this.nickName = nickName;
        this.oldNick = oldNick;
    }

    @Override
    public  XMPPLogic process( final XMPPServer server,
                                  final MucService service,
                                  final MucRoom room,
                                  final Presence presence )
            throws MessageException
    {
        // 7.3 ex42 Changing nickname, so send unavailable to members for old nickname
        getLog().info( "%s entered %s and changed nick from %s to %s",
                       userJid,
                       chatRoomJid,
                       oldNick,
                       nickName );

        final JID oldJid = oldNick == null ? null : chatRoomJid.copyWithoutResource().setResource(
                oldNick );

        final boolean roomNonAnon = room.hasFeature( MucFeature.MUC_NONANONYMOUS );
        PresenceBuilder response = null;

        // Send unavailable presence for the old nick with the new nick in the item
        for( MucRoomMember member : room.getMembers() )
        {
            if( !member.equals( joiningMember ) )
            {
                response = createMembershipPresence( presence,
                                                     joiningMember,
                                                     roomNonAnon,
                                                     nickName ).
                        setFrom( oldJid ).
                        setTo( member.getJID() ).
                        setType( UNAVAILABLE );

                response.getChildOrCreate(
                        org.jabber.protocol.muc_user.XBuilder.class ).
                        addStatus( MEMBER_NICK_CHANGED );

                server.send( response );
            }
        }

        // Send the users own unavailable presence last
        response = createMembershipPresence( presence,
                                             joiningMember,
                                             roomNonAnon,
                                             nickName ).
                setFrom( oldJid ).
                setTo( joiningMember.getJID() ).
                setType( UNAVAILABLE );

        response.getChildOrCreate( org.jabber.protocol.muc_user.XBuilder.class ).
                addStatus( MEMBER_NICK_CHANGED ).
                addStatus( PRESENCE_OWN_PRESENCE );

        server.send( response );

        // Send available presence with the new nick
        for( MucRoomMember member : room.getMembers() )
        {
            if( !member.equals( joiningMember ) )
            {
                response = createMembershipPresence( presence,
                                                     joiningMember,
                                                     roomNonAnon,
                                                     null ).
                        setFrom( chatRoomJid ).
                        setTo( member.getJID() );

                server.send( response );
            }
        }

        // Send users own available presence last
        response = createMembershipPresence( presence,
                                             joiningMember,
                                             roomNonAnon,
                                             null ).
                setFrom( chatRoomJid ).
                setTo( joiningMember.getJID() );

        response.getChildOrCreate( org.jabber.protocol.muc_user.XBuilder.class ).
                addStatus( PRESENCE_OWN_PRESENCE );

        server.send( response );

        return null;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy