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

uk.org.retep.xmpp.muc.room.EnteredRoomBroadcast 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 EnteredRoomBroadcast
        extends AbstractRoomBroadcast
{

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

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

    @Override
    public  XMPPLogic process( final XMPPServer server,
                                  final MucService service,
                                  final MucRoom room,
                                  final Presence presence )
            throws MessageException
    {
        getLog().info( "%s entered %s", userJid, chatRoomJid );

        final boolean nicknameRewritten = !requestedNickName.equals( nickName );

        final boolean joiningMod = joiningMember.getRole() == Role.MODERATOR;

        // Cache semiAnon state
        final boolean roomSemiAnon = room.hasFeature(
                MucFeature.MUC_SEMIANONYMOUS );

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

        if( roomNonAnon || roomSemiAnon )
        {
            for( MucRoomMember member : room.getMembers() )
            {
                if( !member.equals( joiningMember ) )
                {
                    if( roomNonAnon || joiningMod )
                    {
                        // 7.1.3 ex19 Send broadcast to joining member of who is in the room
                        final JID from = chatRoomJid.copyWithoutResource().setResource(
                                member.getNickname() );

                        server.send( createMembershipPresence( presence,
                                                               member,
                                                               roomNonAnon,
                                                               null ).
                                // Sent from members to joining user
                                setFrom( from ).
                                setTo( userJid ) );
                    }

                    // FIXME 7.3 on the change should the presence showing the new nick to everyone go regardless of anonimity etc?
                    if( roomNonAnon || joiningMod || member.getRole() == Role.MODERATOR )
                    {
                        // 7.1.3 ex20 send presence of joining member to all occupants
                        // 7.1.6 but only moderators in semi-anonymous rooms
                        server.send( createMembershipPresence( presence,
                                                               joiningMember,
                                                               roomNonAnon,
                                                               null ).
                                setFrom( chatRoomJid ).
                                setTo( member.getJID() ) );
                    }
                }
            }
        }

        // Send the users own response last as PRESENCE_OWN_PRESENCE marks the end of the list for some clients
        final PresenceBuilder response = createMembershipPresence( presence,
                                                                   joiningMember,
                                                                   roomNonAnon,
                                                                   null );

        final org.jabber.protocol.muc_user.XBuilder xb = response.getChildOrCreate(
                org.jabber.protocol.muc_user.XBuilder.class );

        xb.addStatus( PRESENCE_OWN_PRESENCE );

        // 7.1.3 ex21 inform of nick changed
        if( nicknameRewritten )
        {
            xb.addStatus( PRESENCE_NICK_CHANGED );
        }

        // 7.1.5 non-anonymous room - warn the joining user that there's no anonymity
        if( room.hasFeature( MucFeature.MUC_NONANONYMOUS ) )
        {
            xb.addStatus( PRESENCE_NOT_ANONYMOUS );
        }

        // TODO 7.1.14 Room Logging
        //if( room.hasFeature( MucFeature.PUBLIC_LOG))
        //{
        //    MucUtil.addMucUserStatus( response, PRESENCE_ROOM_PUBLIC_LOG_ARCHIVE );
        //}

        server.send( response );

        // TODO 7.1.15 Discussion History
        // TODO 7.1.16 Managing Discussion History

        return null;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy