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; package net.java.sip.communicator.impl.protocol.irc;
import java.util.*;
import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
/** /**
* Represents a chat room member. * Represents a chat room member.
@ -18,6 +21,12 @@
public class ChatRoomMemberIrcImpl public class ChatRoomMemberIrcImpl
implements ChatRoomMember implements ChatRoomMember
{ {
/**
* Logger.
*/
private static final Logger LOGGER = Logger
.getLogger(ChatRoomMemberIrcImpl.class);
/** /**
* The ChatRoom. * The ChatRoom.
*/ */
@ -32,11 +41,12 @@ public class ChatRoomMemberIrcImpl
* The provider that created us. * The provider that created us.
*/ */
private final ProtocolProviderService parentProvider; 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 * Creates an instance of <tt>ChatRoomMemberIrcImpl</tt>, by specifying the
@ -68,7 +78,7 @@ public ChatRoomMemberIrcImpl(ProtocolProviderService parentProvider,
this.contactID = contactID; this.contactID = contactID;
if (chatRoomMemberRole == null) if (chatRoomMemberRole == null)
throw new IllegalArgumentException("member role cannot be 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() public ChatRoomMemberRole getRole()
{ {
return this.chatRoomMemberRole; return this.roles.first();
} }
/** /**
@ -149,9 +159,31 @@ public ChatRoomMemberRole getRole()
*/ */
public void setRole(ChatRoomMemberRole chatRoomMemberRole) public void setRole(ChatRoomMemberRole chatRoomMemberRole)
{ {
if (chatRoomMemberRole == null) // Ignore explicit set role operations, since we only allow
throw new IllegalArgumentException("role cannot be null"); // modifications from the IRC server.
this.chatRoomMemberRole = chatRoomMemberRole; 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(); final IRCTopic topic = channel.getTopic();
chatRoom.updateSubject(topic.getValue()); chatRoom.updateSubject(topic.getValue());
OperationSetPersistentPresenceIrcImpl opSetPersistentPresence =
this.provider.getPersistentPresence();
ContactGroupIrcImpl nonPersistentGroup =
opSetPersistentPresence.getNonPersistentGroup();
for (IRCUser user : channel.getUsers()) 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; ChatRoomMemberRole role = ChatRoomMemberRole.SILENT_MEMBER;
ChatRoomMemberIrcImpl member =
new ChatRoomMemberIrcImpl(this.provider, chatRoom,
user.getNick(), role);
for (IRCUserStatus status : channel.getStatusesForUser(user)) for (IRCUserStatus status : channel.getStatusesForUser(user))
{ {
role = convertMemberMode(status.getChanModeType().charValue()); role = convertMemberMode(status.getChanModeType().charValue());
member.addRole(role);
} }
if (this.getNick().equals(user.getNick())) 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); 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()); ModeParser parser = new ModeParser(msg.getModeStr());
for (ModeEntry mode : parser.getModes()) for (ModeEntry mode : parser.getModes())
{ {
String targetNick = mode.getParams()[0];
ChatRoomMemberIrcImpl targetMember =
(ChatRoomMemberIrcImpl) this.chatroom
.getChatRoomMember(targetNick);
ChatRoomMemberRole originalRole = targetMember.getRole();
switch (mode.getMode()) switch (mode.getMode())
{ {
case OWNER: 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: case OPERATOR:
String opUserName = mode.getParams()[0]; case HALFOP:
if (isMe(opUserName)) case VOICE:
if (mode.isAdded())
{ {
ChatRoomLocalUserRoleChangeEvent event; targetMember.addRole(mode.getMode().getRole());
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);
} }
ChatRoomMember op = else
this.chatroom.getChatRoomMember(opUserName);
if (op != null)
{ {
if (mode.isAdded()) targetMember.removeRole(mode.getMode().getRole());
{
this.chatroom.fireMemberRoleEvent(op,
ChatRoomMemberRole.ADMINISTRATOR);
}
else
{
this.chatroom.fireMemberRoleEvent(op,
ChatRoomMemberRole.SILENT_MEMBER);
}
} }
break; ChatRoomMemberRole newRole = targetMember.getRole();
case VOICE: if (newRole != originalRole)
String voiceUserName = mode.getParams()[0];
if (isMe(voiceUserName))
{ {
ChatRoomLocalUserRoleChangeEvent event; // Mode change actually caused a role change.
if (mode.isAdded()) ChatRoomLocalUserRoleChangeEvent event =
new ChatRoomLocalUserRoleChangeEvent(this.chatroom,
originalRole, newRole, false);
if (isMe(targetMember.getContactAddress()))
{ {
event = this.chatroom.fireLocalUserRoleChangedEvent(event);
new ChatRoomLocalUserRoleChangeEvent(
this.chatroom,
ChatRoomMemberRole.SILENT_MEMBER,
ChatRoomMemberRole.MEMBER, false);
} }
else else
{ {
event = this.chatroom.fireMemberRoleEvent(targetMember,
new ChatRoomLocalUserRoleChangeEvent( newRole);
this.chatroom, ChatRoomMemberRole.MEMBER,
ChatRoomMemberRole.SILENT_MEMBER, false);
} }
this.chatroom.fireLocalUserRoleChangedEvent(event);
} }
ChatRoomMember voice = else
this.chatroom.getChatRoomMember(voiceUserName);
if (voice != null)
{ {
if (mode.isAdded()) // Mode change did not cause an immediate role change.
{ // Display a system message for the mode change.
this.chatroom.fireMemberRoleEvent(voice, String text =
ChatRoomMemberRole.MEMBER); sourceMember.getName()
} + (mode.isAdded() ? " gives "
else + mode.getMode().name().toLowerCase()
{ + " to " : " removes "
this.chatroom.fireMemberRoleEvent(voice, + mode.getMode().name().toLowerCase()
ChatRoomMemberRole.SILENT_MEMBER); + " 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; break;
case LIMIT: case LIMIT:

@ -112,7 +112,8 @@ public List<ChatRoom> getCurrentlyJoinedChatRooms()
public List<String> getCurrentlyJoinedChatRooms( public List<String> getCurrentlyJoinedChatRooms(
ChatRoomMember chatRoomMember) 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: * According to the RFC:
* *

@ -28,7 +28,8 @@ public class OperationSetPersistentPresenceIrcImpl extends AbstractOperationSetP
/** /**
* Root contact group for IRC contacts. * 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. * IRC implementation for OperationSetPersistentPresence.
@ -41,7 +42,7 @@ protected OperationSetPersistentPresenceIrcImpl(
super(parentProvider); super(parentProvider);
} }
ContactIrcImpl createVolatileContact(String id) private ContactIrcImpl createVolatileContact(String id)
{ {
// Check whether a volatile group already exists and if not create // Check whether a volatile group already exists and if not create
// one // one
@ -71,7 +72,7 @@ ContactIrcImpl createVolatileContact(String id)
return newVolatileContact; return newVolatileContact;
} }
ContactGroupIrcImpl getNonPersistentGroup() private ContactGroupIrcImpl getNonPersistentGroup()
{ {
String groupName String groupName
= IrcActivator.getResources().getI18NString( = IrcActivator.getResources().getI18NString(
@ -199,7 +200,7 @@ public void publishPresenceStatus(PresenceStatus status,
OperationFailedException OperationFailedException
{ {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
@ -258,7 +259,6 @@ public String getCurrentStatusMessage()
@Override @Override
public Contact createUnresolvedContact(String address, String persistentData) public Contact createUnresolvedContact(String address, String persistentData)
{ {
// TODO Auto-generated method stub
return null; return null;
} }
} }

Loading…
Cancel
Save