Store multiple modes for IRC member and select strongest.

fix-message-formatting
Danny van Heumen 11 years ago
parent 3c27dc71c6
commit 5c0a6aafdf

@ -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<ChatRoomMemberRole> roles =
new TreeSet<ChatRoomMemberRole>();
/**
* Creates an instance of <tt>ChatRoomMemberIrcImpl</tt>, 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);
}
/**

@ -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:

@ -112,7 +112,8 @@ public List<ChatRoom> getCurrentlyJoinedChatRooms()
public List<String> 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:
*

@ -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;
}
}
}

Loading…
Cancel
Save