From 5c0a6aafdf36be6184c922afeda4cdb3062d24a6 Mon Sep 17 00:00:00 2001 From: Danny van Heumen Date: Sun, 13 Jul 2014 19:19:56 +0200 Subject: [PATCH] Store multiple modes for IRC member and select strongest. --- .../protocol/irc/ChatRoomMemberIrcImpl.java | 48 ++++- .../impl/protocol/irc/IrcStack.java | 164 +++++------------- .../irc/OperationSetMultiUserChatIrcImpl.java | 3 +- ...OperationSetPersistentPresenceIrcImpl.java | 12 +- 4 files changed, 95 insertions(+), 132 deletions(-) diff --git a/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImpl.java b/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImpl.java index da3952dfa..f79de9630 100644 --- a/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/irc/ChatRoomMemberIrcImpl.java @@ -6,7 +6,10 @@ */ package net.java.sip.communicator.impl.protocol.irc; +import java.util.*; + import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.util.*; /** * Represents a chat room member. @@ -18,6 +21,12 @@ public class ChatRoomMemberIrcImpl implements ChatRoomMember { + /** + * Logger. + */ + private static final Logger LOGGER = Logger + .getLogger(ChatRoomMemberIrcImpl.class); + /** * The ChatRoom. */ @@ -32,11 +41,12 @@ public class ChatRoomMemberIrcImpl * The provider that created us. */ private final ProtocolProviderService parentProvider; - + /** - * The role of this member. + * Set of active roles. */ - private ChatRoomMemberRole chatRoomMemberRole; + private final SortedSet roles = + new TreeSet(); /** * Creates an instance of ChatRoomMemberIrcImpl, by specifying the @@ -68,7 +78,7 @@ public ChatRoomMemberIrcImpl(ProtocolProviderService parentProvider, this.contactID = contactID; if (chatRoomMemberRole == null) throw new IllegalArgumentException("member role cannot be null"); - this.chatRoomMemberRole = chatRoomMemberRole; + this.roles.add(chatRoomMemberRole); } /** @@ -139,7 +149,7 @@ public void setName(String newName) */ public ChatRoomMemberRole getRole() { - return this.chatRoomMemberRole; + return this.roles.first(); } /** @@ -149,9 +159,31 @@ public ChatRoomMemberRole getRole() */ public void setRole(ChatRoomMemberRole chatRoomMemberRole) { - if (chatRoomMemberRole == null) - throw new IllegalArgumentException("role cannot be null"); - this.chatRoomMemberRole = chatRoomMemberRole; + // Ignore explicit set role operations, since we only allow + // modifications from the IRC server. + LOGGER.debug("Ignoring request to set role to " + + chatRoomMemberRole.getRoleName()); + return; + } + + /** + * Add a role. + * + * @param role the new role + */ + void addRole(ChatRoomMemberRole role) + { + this.roles.add(role); + } + + /** + * Remove a role. + * + * @param role the revoked role + */ + void removeRole(ChatRoomMemberRole role) + { + this.roles.remove(role); } /** 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 0978fada8..2a483567a 100644 --- a/src/net/java/sip/communicator/impl/protocol/irc/IrcStack.java +++ b/src/net/java/sip/communicator/impl/protocol/irc/IrcStack.java @@ -833,36 +833,23 @@ private void prepareChatRoom(final ChatRoomIrcImpl chatRoom, final IRCTopic topic = channel.getTopic(); chatRoom.updateSubject(topic.getValue()); - OperationSetPersistentPresenceIrcImpl opSetPersistentPresence = - this.provider.getPersistentPresence(); - ContactGroupIrcImpl nonPersistentGroup = - opSetPersistentPresence.getNonPersistentGroup(); for (IRCUser user : channel.getUsers()) { - // TODO Correctly gather active member statuses and choose strongest - // normal + voice + half-ops (a.k.a. moderator) + ops ChatRoomMemberRole role = ChatRoomMemberRole.SILENT_MEMBER; + ChatRoomMemberIrcImpl member = + new ChatRoomMemberIrcImpl(this.provider, chatRoom, + user.getNick(), role); for (IRCUserStatus status : channel.getStatusesForUser(user)) { role = convertMemberMode(status.getChanModeType().charValue()); + member.addRole(role); } if (this.getNick().equals(user.getNick())) { - chatRoom.prepUserRole(role); + chatRoom.prepUserRole(member.getRole()); } - ChatRoomMemberIrcImpl member = - new ChatRoomMemberIrcImpl(this.provider, chatRoom, - user.getNick(), role); chatRoom.addChatRoomMember(member.getContactAddress(), member); - - // FIXME working on persistent presence - // Prepare Contact and MetaContact - // ContactIrcImpl sourceContact = - // opSetPersistentPresence.createVolatileContact( - // member.getContactAddress(), true); - // opSetPersistentPresence.fireSubscriptionEvent(sourceContact, - // nonPersistentGroup, SubscriptionEvent.SUBSCRIPTION_CREATED); } } @@ -1403,121 +1390,64 @@ private void processModeMessage(ChannelModeMessage msg) ModeParser parser = new ModeParser(msg.getModeStr()); for (ModeEntry mode : parser.getModes()) { + String targetNick = mode.getParams()[0]; + ChatRoomMemberIrcImpl targetMember = + (ChatRoomMemberIrcImpl) this.chatroom + .getChatRoomMember(targetNick); + ChatRoomMemberRole originalRole = targetMember.getRole(); + switch (mode.getMode()) { case OWNER: - String ownerUserName = mode.getParams()[0]; - if (isMe(ownerUserName)) - { - ChatRoomLocalUserRoleChangeEvent event; - if (mode.isAdded()) - { - event = - new ChatRoomLocalUserRoleChangeEvent( - this.chatroom, - ChatRoomMemberRole.SILENT_MEMBER, - ChatRoomMemberRole.OWNER, false); - } - else - { - event = - new ChatRoomLocalUserRoleChangeEvent( - this.chatroom, ChatRoomMemberRole.OWNER, - ChatRoomMemberRole.SILENT_MEMBER, false); - } - this.chatroom.fireLocalUserRoleChangedEvent(event); - } - ChatRoomMember owner = - this.chatroom.getChatRoomMember(mode.getParams()[0]); - if (owner != null) - { - if (mode.isAdded()) - { - this.chatroom.fireMemberRoleEvent(owner, - ChatRoomMemberRole.OWNER); - } - else - { - this.chatroom.fireMemberRoleEvent(owner, - ChatRoomMemberRole.SILENT_MEMBER); - } - } - break; case OPERATOR: - String opUserName = mode.getParams()[0]; - if (isMe(opUserName)) + case HALFOP: + case VOICE: + if (mode.isAdded()) { - ChatRoomLocalUserRoleChangeEvent event; - if (mode.isAdded()) - { - event = - new ChatRoomLocalUserRoleChangeEvent( - this.chatroom, - ChatRoomMemberRole.SILENT_MEMBER, - ChatRoomMemberRole.ADMINISTRATOR, false); - } - else - { - event = - new ChatRoomLocalUserRoleChangeEvent( - this.chatroom, - ChatRoomMemberRole.ADMINISTRATOR, - ChatRoomMemberRole.SILENT_MEMBER, false); - } - this.chatroom.fireLocalUserRoleChangedEvent(event); + targetMember.addRole(mode.getMode().getRole()); } - ChatRoomMember op = - this.chatroom.getChatRoomMember(opUserName); - if (op != null) + else { - if (mode.isAdded()) - { - this.chatroom.fireMemberRoleEvent(op, - ChatRoomMemberRole.ADMINISTRATOR); - } - else - { - this.chatroom.fireMemberRoleEvent(op, - ChatRoomMemberRole.SILENT_MEMBER); - } + targetMember.removeRole(mode.getMode().getRole()); } - break; - case VOICE: - String voiceUserName = mode.getParams()[0]; - if (isMe(voiceUserName)) + ChatRoomMemberRole newRole = targetMember.getRole(); + if (newRole != originalRole) { - ChatRoomLocalUserRoleChangeEvent event; - if (mode.isAdded()) + // Mode change actually caused a role change. + ChatRoomLocalUserRoleChangeEvent event = + new ChatRoomLocalUserRoleChangeEvent(this.chatroom, + originalRole, newRole, false); + if (isMe(targetMember.getContactAddress())) { - event = - new ChatRoomLocalUserRoleChangeEvent( - this.chatroom, - ChatRoomMemberRole.SILENT_MEMBER, - ChatRoomMemberRole.MEMBER, false); + this.chatroom.fireLocalUserRoleChangedEvent(event); } else { - event = - new ChatRoomLocalUserRoleChangeEvent( - this.chatroom, ChatRoomMemberRole.MEMBER, - ChatRoomMemberRole.SILENT_MEMBER, false); + this.chatroom.fireMemberRoleEvent(targetMember, + newRole); } - this.chatroom.fireLocalUserRoleChangedEvent(event); } - ChatRoomMember voice = - this.chatroom.getChatRoomMember(voiceUserName); - if (voice != null) + else { - if (mode.isAdded()) - { - this.chatroom.fireMemberRoleEvent(voice, - ChatRoomMemberRole.MEMBER); - } - else - { - this.chatroom.fireMemberRoleEvent(voice, - ChatRoomMemberRole.SILENT_MEMBER); - } + // Mode change did not cause an immediate role change. + // Display a system message for the mode change. + String text = + sourceMember.getName() + + (mode.isAdded() ? " gives " + + mode.getMode().name().toLowerCase() + + " to " : " removes " + + mode.getMode().name().toLowerCase() + + " from ") + targetMember.getName(); + MessageIrcImpl message = + new MessageIrcImpl(text, + MessageIrcImpl.DEFAULT_MIME_TYPE, + MessageIrcImpl.DEFAULT_MIME_TYPE, ""); + this.chatroom + .fireMessageReceivedEvent( + message, + sourceMember, + new Date(), + ChatRoomMessageReceivedEvent.SYSTEM_MESSAGE_RECEIVED); } break; case LIMIT: diff --git a/src/net/java/sip/communicator/impl/protocol/irc/OperationSetMultiUserChatIrcImpl.java b/src/net/java/sip/communicator/impl/protocol/irc/OperationSetMultiUserChatIrcImpl.java index 18f74fcda..fa6bf1af4 100644 --- a/src/net/java/sip/communicator/impl/protocol/irc/OperationSetMultiUserChatIrcImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/irc/OperationSetMultiUserChatIrcImpl.java @@ -112,7 +112,8 @@ public List getCurrentlyJoinedChatRooms() public List getCurrentlyJoinedChatRooms( ChatRoomMember chatRoomMember) { - //TODO: Implement "who is" for the IRC stack. + // Implement "who is" for the IRC stack. + // (currently not in use) /* * According to the RFC: * diff --git a/src/net/java/sip/communicator/impl/protocol/irc/OperationSetPersistentPresenceIrcImpl.java b/src/net/java/sip/communicator/impl/protocol/irc/OperationSetPersistentPresenceIrcImpl.java index 2f9b2a6b0..9560b6e62 100644 --- a/src/net/java/sip/communicator/impl/protocol/irc/OperationSetPersistentPresenceIrcImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/irc/OperationSetPersistentPresenceIrcImpl.java @@ -28,7 +28,8 @@ public class OperationSetPersistentPresenceIrcImpl extends AbstractOperationSetP /** * Root contact group for IRC contacts. */ - private final ContactGroupIrcImpl rootGroup = new ContactGroupIrcImpl(this.parentProvider); + private final ContactGroupIrcImpl rootGroup = new ContactGroupIrcImpl( + this.parentProvider); /** * IRC implementation for OperationSetPersistentPresence. @@ -41,7 +42,7 @@ protected OperationSetPersistentPresenceIrcImpl( super(parentProvider); } - ContactIrcImpl createVolatileContact(String id) + private ContactIrcImpl createVolatileContact(String id) { // Check whether a volatile group already exists and if not create // one @@ -71,7 +72,7 @@ ContactIrcImpl createVolatileContact(String id) return newVolatileContact; } - ContactGroupIrcImpl getNonPersistentGroup() + private ContactGroupIrcImpl getNonPersistentGroup() { String groupName = IrcActivator.getResources().getI18NString( @@ -199,7 +200,7 @@ public void publishPresenceStatus(PresenceStatus status, OperationFailedException { // TODO Auto-generated method stub - + } @Override @@ -258,7 +259,6 @@ public String getCurrentStatusMessage() @Override public Contact createUnresolvedContact(String address, String persistentData) { - // TODO Auto-generated method stub return null; - } + } }