From a6b354ce83a87ee03b70bd069a55840c6d4b103e Mon Sep 17 00:00:00 2001 From: Danny van Heumen Date: Sun, 4 May 2014 01:10:38 +0200 Subject: [PATCH] Include local user in chat room member list operations. --- .../impl/protocol/irc/ChatRoomIrcImpl.java | 1 + .../impl/protocol/irc/IrcStack.java | 209 ++++++++---------- 2 files changed, 97 insertions(+), 113 deletions(-) diff --git a/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomIrcImpl.java b/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomIrcImpl.java index 7b61157a8..8c47d7208 100644 --- a/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomIrcImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomIrcImpl.java @@ -20,6 +20,7 @@ * @author Stephane Remy * @author Loic Kempf * @author Yana Stamcheva + * @author Danny van Heumen */ public class ChatRoomIrcImpl extends AbstractChatRoom diff --git a/src/net/java/sip/communicator/impl/protocol/irc/IrcStack.java b/src/net/java/sip/communicator/impl/protocol/irc/IrcStack.java index eac212e72..5a57d6211 100644 --- a/src/net/java/sip/communicator/impl/protocol/irc/IrcStack.java +++ b/src/net/java/sip/communicator/impl/protocol/irc/IrcStack.java @@ -527,8 +527,9 @@ public void onSuccess(IRCChannel channel) + "of channel '" + chatroom.getIdentifier() + "'."); } + String chatRoomId = chatroom.getIdentifier(); boolean isRequestedChatRoom = channel.getName() - .equalsIgnoreCase(chatroom.getIdentifier()); + .equalsIgnoreCase(chatRoomId); synchronized (joinSignal) { if (!isRequestedChatRoom) @@ -541,7 +542,7 @@ public void onSuccess(IRCChannel channel) .trace("Callback for successful join " + "finished prematurely since we " + "got forwarded from '" - + chatroom.getIdentifier() + + chatRoomId + "' to '" + channel.getName() + "'. Joining of forwarded channel " @@ -549,8 +550,7 @@ public void onSuccess(IRCChannel channel) + "since that channel was not " + "announced."); } - IrcStack.this.joining.remove(chatroom - .getIdentifier()); + IrcStack.this.joining.remove(chatRoomId); IrcStack.this.provider .getMUC() .fireLocalUserPresenceEvent( @@ -570,10 +570,8 @@ public void onSuccess(IRCChannel channel) try { - IrcStack.this.joined.put( - chatroom.getIdentifier(), chatroom); - IrcStack.this.joining.remove(chatroom - .getIdentifier()); + IrcStack.this.joined.put(chatRoomId, chatroom); + IrcStack.this.joining.remove(chatRoomId); IrcStack.this.irc .addListener(new ChatRoomListener( chatroom)); @@ -599,7 +597,7 @@ public void onSuccess(IRCChannel channel) LOGGER .trace("Finished successful join " + "callback for channel '" - + chatroom.getIdentifier() + + chatRoomId + "'. Waking up original thread."); } // Notify waiting threads of finished @@ -616,12 +614,12 @@ public void onFailure(Exception e) LOGGER.trace("Started callback for failed attempt to " + "join channel '" + chatroom.getIdentifier() + "'."); + String chatRoomId = chatroom.getIdentifier(); synchronized (joinSignal) { try { - IrcStack.this.joining.remove(chatroom - .getIdentifier()); + IrcStack.this.joining.remove(chatRoomId); IrcStack.this.provider .getMUC() .fireLocalUserPresenceEvent( @@ -637,7 +635,7 @@ public void onFailure(Exception e) LOGGER .trace("Finished callback for failed " + "attempt to join channel '" - + chatroom.getIdentifier() + + chatRoomId + "'. Waking up original thread."); } // Notify waiting threads of finished @@ -806,13 +804,10 @@ private void prepareChatRoom(final ChatRoomIrcImpl chatRoom, { chatRoom.prepUserRole(role); } - else - { - ChatRoomMemberIrcImpl member = - new ChatRoomMemberIrcImpl(this.provider, chatRoom, - user.getNick(), role); - chatRoom.addChatRoomMember(member.getContactAddress(), member); - } + ChatRoomMemberIrcImpl member = + new ChatRoomMemberIrcImpl(this.provider, chatRoom, + user.getNick(), role); + chatRoom.addChatRoomMember(member.getContactAddress(), member); } } @@ -1018,18 +1013,22 @@ private void deliverReceivedMessageToPrivateChat( /** * Create a private chat room if one does not exist yet. * - * @param user private chat room for this user + * @param userName private chat room for this user * @return returns the private chat room */ - private ChatRoomIrcImpl initiatePrivateChatRoom(String user) + private ChatRoomIrcImpl initiatePrivateChatRoom(String userName) { OperationSetMultiUserChatIrcImpl muc = IrcStack.this.provider.getMUC(); - ChatRoomIrcImpl chatroom = muc.findOrCreateRoom(user); + ChatRoomIrcImpl chatroom = muc.findOrCreateRoom(userName); IrcStack.this.joined.put(chatroom.getIdentifier(), chatroom); - ChatRoomMemberIrcImpl member = + final ChatRoomMemberIrcImpl user = new ChatRoomMemberIrcImpl(IrcStack.this.provider, chatroom, - user, ChatRoomMemberRole.MEMBER); + IrcStack.this.getNick(), ChatRoomMemberRole.MEMBER); + chatroom.addChatRoomMember(user.getContactAddress(), user); + final ChatRoomMemberIrcImpl member = + new ChatRoomMemberIrcImpl(IrcStack.this.provider, chatroom, + userName, ChatRoomMemberRole.MEMBER); chatroom.addChatRoomMember(member.getContactAddress(), member); IrcStack.this.provider.getMUC().fireLocalUserPresenceEvent( chatroom, @@ -1046,13 +1045,17 @@ private ChatRoomIrcImpl initiatePrivateChatRoom(String user) * chat room listener updates chat room data and fires events based on IRC * messages that report state changes for the specified channel. * - * @author danny + * @author Danny van Heumen * */ private class ChatRoomListener extends VariousMessageListenerAdapter { + /** + * IRC error code for case where user is not joined to that channel. + */ private static final int IRC_ERR_NOTONCHANNEL = 442; + /** * Chat room for which this listener is working. */ @@ -1104,19 +1107,12 @@ public void onChannelJoin(ChanJoinMessage msg) if (!isThisChatRoom(msg.getChannelName())) return; - if (isMe(msg.getSource())) - { - // I think that this should not happen. - } - else - { - String user = msg.getSource().getNick(); - ChatRoomMemberIrcImpl member = - new ChatRoomMemberIrcImpl(IrcStack.this.provider, - this.chatroom, user, ChatRoomMemberRole.SILENT_MEMBER); - this.chatroom.fireMemberPresenceEvent(member, null, - ChatRoomMemberPresenceChangeEvent.MEMBER_JOINED, null); - } + String user = msg.getSource().getNick(); + ChatRoomMemberIrcImpl member = + new ChatRoomMemberIrcImpl(IrcStack.this.provider, + this.chatroom, user, ChatRoomMemberRole.SILENT_MEMBER); + this.chatroom.fireMemberPresenceEvent(member, null, + ChatRoomMemberPresenceChangeEvent.MEMBER_JOINED, null); } /** @@ -1128,28 +1124,28 @@ public void onChannelPart(ChanPartMessage msg) if (!isThisChatRoom(msg.getChannelName())) return; - if (isMe(msg.getSource())) + IRCUser user = msg.getSource(); + if (isMe(user)) { leaveChatRoom(); + return; } - else + + String userNick = msg.getSource().getNick(); + ChatRoomMember member = this.chatroom.getChatRoomMember(userNick); + try { - String user = msg.getSource().getNick(); - ChatRoomMember member = this.chatroom.getChatRoomMember(user); - try - { - // Possibility that 'member' is null (should be fixed now - // that race condition in irc-api is fixed) - this.chatroom.fireMemberPresenceEvent(member, null, - ChatRoomMemberPresenceChangeEvent.MEMBER_LEFT, - msg.getPartMsg()); - } - catch (NullPointerException e) - { - LOGGER.warn( - "This should not have happened. Please report this " - + "as it is a bug.", e); - } + // Possibility that 'member' is null (should be fixed now + // that race condition in irc-api is fixed) + this.chatroom.fireMemberPresenceEvent(member, null, + ChatRoomMemberPresenceChangeEvent.MEMBER_LEFT, + msg.getPartMsg()); + } + catch (NullPointerException e) + { + LOGGER.warn( + "This should not have happened. Please report this " + + "as it is a bug.", e); } } @@ -1196,6 +1192,17 @@ public void onChannelKick(ChannelKick msg) return; String kickedUser = msg.getKickedNickname(); + ChatRoomMember kickedMember = + this.chatroom.getChatRoomMember(kickedUser); + String user = msg.getSource().getNick(); + if (kickedMember != null) + { + ChatRoomMember kicker = this.chatroom.getChatRoomMember(user); + this.chatroom.fireMemberPresenceEvent(kickedMember, kicker, + ChatRoomMemberPresenceChangeEvent.MEMBER_KICKED, + msg.getText()); + } + if (isMe(kickedUser)) { IrcStack.this.irc.deleteListener(this); @@ -1205,20 +1212,6 @@ public void onChannelKick(ChannelKick msg) LocalUserChatRoomPresenceChangeEvent.LOCAL_USER_KICKED, msg.getText()); } - else - { - ChatRoomMember kickedMember = - this.chatroom.getChatRoomMember(kickedUser); - String user = msg.getSource().getNick(); - if (kickedMember != null) - { - ChatRoomMember kicker = - this.chatroom.getChatRoomMember(user); - this.chatroom.fireMemberPresenceEvent(kickedMember, kicker, - ChatRoomMemberPresenceChangeEvent.MEMBER_KICKED, - msg.getText()); - } - } } /** @@ -1333,23 +1326,19 @@ private void processModeMessage(ChannelModeMessage msg) } this.chatroom.fireLocalUserRoleChangedEvent(event); } - else + ChatRoomMember owner = + this.chatroom.getChatRoomMember(mode.getParams()[0]); + if (owner != null) { - ChatRoomMember owner = - this.chatroom - .getChatRoomMember(mode.getParams()[0]); - if (owner != null) + if (mode.isAdded()) { - if (mode.isAdded()) - { - this.chatroom.fireMemberRoleEvent(owner, - ChatRoomMemberRole.OWNER); - } - else - { - this.chatroom.fireMemberRoleEvent(owner, - ChatRoomMemberRole.SILENT_MEMBER); - } + this.chatroom.fireMemberRoleEvent(owner, + ChatRoomMemberRole.OWNER); + } + else + { + this.chatroom.fireMemberRoleEvent(owner, + ChatRoomMemberRole.SILENT_MEMBER); } } break; @@ -1376,22 +1365,19 @@ private void processModeMessage(ChannelModeMessage msg) } this.chatroom.fireLocalUserRoleChangedEvent(event); } - else + ChatRoomMember op = + this.chatroom.getChatRoomMember(opUserName); + if (op != null) { - ChatRoomMember op = - this.chatroom.getChatRoomMember(opUserName); - if (op != null) + if (mode.isAdded()) { - if (mode.isAdded()) - { - this.chatroom.fireMemberRoleEvent(op, - ChatRoomMemberRole.ADMINISTRATOR); - } - else - { - this.chatroom.fireMemberRoleEvent(op, - ChatRoomMemberRole.SILENT_MEMBER); - } + this.chatroom.fireMemberRoleEvent(op, + ChatRoomMemberRole.ADMINISTRATOR); + } + else + { + this.chatroom.fireMemberRoleEvent(op, + ChatRoomMemberRole.SILENT_MEMBER); } } break; @@ -1417,22 +1403,19 @@ private void processModeMessage(ChannelModeMessage msg) } this.chatroom.fireLocalUserRoleChangedEvent(event); } - else + ChatRoomMember voice = + this.chatroom.getChatRoomMember(voiceUserName); + if (voice != null) { - ChatRoomMember voice = - this.chatroom.getChatRoomMember(voiceUserName); - if (voice != null) + if (mode.isAdded()) { - if (mode.isAdded()) - { - this.chatroom.fireMemberRoleEvent(voice, - ChatRoomMemberRole.MEMBER); - } - else - { - this.chatroom.fireMemberRoleEvent(voice, - ChatRoomMemberRole.SILENT_MEMBER); - } + this.chatroom.fireMemberRoleEvent(voice, + ChatRoomMemberRole.MEMBER); + } + else + { + this.chatroom.fireMemberRoleEvent(voice, + ChatRoomMemberRole.SILENT_MEMBER); } } break;