Refactored large methods.

fix-message-formatting
Danny van Heumen 11 years ago
parent e592fd1a06
commit c63dc31896

@ -492,7 +492,8 @@ public List<String> getServerChatRoomList()
{
try
{
irc.addListener(new ChannelListListener(irc, listSignal));
irc.addListener(
new ChannelListListener(irc, listSignal));
irc.rawMessage("LIST");
while (!listSignal.isDone())
{
@ -1160,8 +1161,8 @@ public void onServerNumericMessage(final ServerNumericMessage msg)
channel =
IrcStack.this.connectionState
.getChannelByName(channelName);
chatRoom =
new ChatRoomIrcImpl(channelName, IrcStack.this.provider);
chatRoom = new ChatRoomIrcImpl(
channelName, IrcStack.this.provider);
IrcStack.this.joined.put(channelName, chatRoom);
}
this.irc.addListener(new ChatRoomListener(this.irc, chatRoom));
@ -1218,7 +1219,8 @@ public void onServerNumericMessage(final ServerNumericMessage msg)
.fireMessageDeliveryFailed(
message,
to,
MessageDeliveryFailedEvent.OFFLINE_MESSAGES_NOT_SUPPORTED);
MessageDeliveryFailedEvent
.OFFLINE_MESSAGES_NOT_SUPPORTED);
break;
default:
@ -1269,7 +1271,7 @@ public void onUserPrivMessage(final UserPrivMsg msg)
{
final String user = msg.getSource().getNick();
final String text = Utils.formatMessage(Utils.parse(msg.getText()));
MessageIrcImpl message =
final MessageIrcImpl message =
new MessageIrcImpl(text,
OperationSetBasicInstantMessaging.HTML_MIME_TYPE,
OperationSetBasicInstantMessaging.DEFAULT_MIME_ENCODING,
@ -1312,12 +1314,12 @@ public void onUserNotice(final UserNotice msg)
final String user = msg.getSource().getNick();
final String text =
Utils.formatNotice(Utils.parse(msg.getText()), user);
MessageIrcImpl message =
final MessageIrcImpl message =
new MessageIrcImpl(text,
OperationSetBasicInstantMessaging.HTML_MIME_TYPE,
OperationSetBasicInstantMessaging.DEFAULT_MIME_ENCODING,
null);
Contact from =
final Contact from =
IrcStack.this.provider.getPersistentPresence()
.findOrCreateContactByID(user);
IrcStack.this.provider.getBasicInstantMessaging()
@ -1336,12 +1338,12 @@ public void onUserAction(final UserActionMsg msg)
final String user = msg.getSource().getNick();
final String text =
Utils.formatAction(Utils.parse(msg.getText()), user);
MessageIrcImpl message =
final MessageIrcImpl message =
new MessageIrcImpl(text,
OperationSetBasicInstantMessaging.HTML_MIME_TYPE,
OperationSetBasicInstantMessaging.DEFAULT_MIME_ENCODING,
null);
Contact from =
final Contact from =
IrcStack.this.provider.getPersistentPresence().findContactByID(
user);
IrcStack.this.provider.getBasicInstantMessaging()
@ -1514,8 +1516,8 @@ public void onChannelJoin(final ChanJoinMessage msg)
return;
}
String user = msg.getSource().getNick();
ChatRoomMemberIrcImpl member =
final String user = msg.getSource().getNick();
final ChatRoomMemberIrcImpl member =
new ChatRoomMemberIrcImpl(IrcStack.this.provider,
this.chatroom, user, ChatRoomMemberRole.SILENT_MEMBER);
this.chatroom.fireMemberPresenceEvent(member, null,
@ -1617,10 +1619,10 @@ public void onChannelKick(final ChannelKick msg)
return;
}
String kickedUser = msg.getKickedNickname();
ChatRoomMember kickedMember =
final String kickedUser = msg.getKickedNickname();
final ChatRoomMember kickedMember =
this.chatroom.getChatRoomMember(kickedUser);
String user = msg.getSource().getNick();
final String user = msg.getSource().getNick();
if (kickedMember != null)
{
ChatRoomMember kicker = this.chatroom.getChatRoomMember(user);
@ -1628,15 +1630,17 @@ public void onChannelKick(final ChannelKick msg)
ChatRoomMemberPresenceChangeEvent.MEMBER_KICKED,
msg.getText());
}
if (isMe(kickedUser))
{
LOGGER.debug(
"Local user is kicked. Removing chat room listener.");
this.irc.deleteListener(this);
IrcStack.this.joined.remove(this.chatroom.getIdentifier());
IrcStack.this.provider.getMUC().fireLocalUserPresenceEvent(
this.chatroom,
LocalUserChatRoomPresenceChangeEvent.LOCAL_USER_KICKED,
msg.getText());
// FIXME Kicks of local user does not close the chat room window
}
}
@ -1763,13 +1767,13 @@ public void onChannelNotice(final ChannelNotice msg)
return;
}
String userNick = msg.getSource().getNick();
ChatRoomMemberIrcImpl member =
final String userNick = msg.getSource().getNick();
final ChatRoomMemberIrcImpl member =
new ChatRoomMemberIrcImpl(IrcStack.this.provider,
this.chatroom, userNick, ChatRoomMemberRole.MEMBER);
String text =
final String text =
Utils.formatNotice(Utils.parse(msg.getText()), userNick);
MessageIrcImpl message =
final MessageIrcImpl message =
new MessageIrcImpl(text, "text/html", "UTF-8", null);
this.chatroom.fireMessageReceivedEvent(message, member, new Date(),
ChatRoomMessageReceivedEvent.CONVERSATION_MESSAGE_RECEIVED);
@ -1796,9 +1800,8 @@ private void leaveChatRoom()
*/
private void processModeMessage(final ChannelModeMessage msg)
{
ChatRoomMemberIrcImpl sourceMember = extractChatRoomMember(msg);
ModeParser parser = new ModeParser(msg.getModeStr());
final ChatRoomMemberIrcImpl source = extractChatRoomMember(msg);
final ModeParser parser = new ModeParser(msg.getModeStr());
for (ModeEntry mode : parser.getModes())
{
switch (mode.getMode())
@ -1807,11 +1810,75 @@ private void processModeMessage(final ChannelModeMessage msg)
case OPERATOR:
case HALFOP:
case VOICE:
String targetNick = mode.getParams()[0];
ChatRoomMemberIrcImpl targetMember =
processRoleChange(source, mode);
break;
case LIMIT:
processLimitChange(source, mode);
break;
case BAN:
processBanChange(source, mode);
break;
case UNKNOWN:
if (LOGGER.isInfoEnabled())
{
LOGGER.info("Unknown mode: "
+ (mode.isAdded() ? "+" : "-")
+ mode.getParams()[0] + ". Original mode string: '"
+ msg.getModeStr() + "'");
}
break;
default:
if (LOGGER.isInfoEnabled())
{
LOGGER.info("Unsupported mode '"
+ (mode.isAdded() ? "+" : "-") + mode.getMode()
+ "' (from modestring '" + msg.getModeStr() + "')");
}
break;
}
}
}
/**
* Process changes for ban patterns.
*
* @param sourceMember the originating member
* @param mode the ban mode change
*/
private void processBanChange(final ChatRoomMemberIrcImpl sourceMember,
final ModeEntry mode)
{
final MessageIrcImpl banMessage =
new MessageIrcImpl(
"channel ban mask was "
+ (mode.isAdded() ? "added" : "removed")
+ ": "
+ mode.getParams()[0]
+ " by "
+ (sourceMember.getContactAddress().length() == 0
? "server"
: sourceMember.getContactAddress()),
MessageIrcImpl.DEFAULT_MIME_TYPE,
MessageIrcImpl.DEFAULT_MIME_ENCODING, null);
this.chatroom.fireMessageReceivedEvent(banMessage, sourceMember,
new Date(),
ChatRoomMessageReceivedEvent.SYSTEM_MESSAGE_RECEIVED);
}
/**
* Process mode changes resulting in role manipulation.
*
* @param sourceMember the originating member
* @param mode the mode change
*/
private void processRoleChange(
final ChatRoomMemberIrcImpl sourceMember, final ModeEntry mode)
{
final String targetNick = mode.getParams()[0];
final ChatRoomMemberIrcImpl targetMember =
(ChatRoomMemberIrcImpl) this.chatroom
.getChatRoomMember(targetNick);
ChatRoomMemberRole originalRole = targetMember.getRole();
final ChatRoomMemberRole originalRole = targetMember.getRole();
if (mode.isAdded())
{
targetMember.addRole(mode.getMode().getRole());
@ -1820,11 +1887,11 @@ private void processModeMessage(final ChannelModeMessage msg)
{
targetMember.removeRole(mode.getMode().getRole());
}
ChatRoomMemberRole newRole = targetMember.getRole();
final ChatRoomMemberRole newRole = targetMember.getRole();
if (newRole != originalRole)
{
// Mode change actually caused a role change.
ChatRoomLocalUserRoleChangeEvent event =
final ChatRoomLocalUserRoleChangeEvent event =
new ChatRoomLocalUserRoleChangeEvent(this.chatroom,
originalRole, newRole, false);
if (isMe(targetMember.getContactAddress()))
@ -1841,14 +1908,14 @@ private void processModeMessage(final ChannelModeMessage msg)
{
// Mode change did not cause an immediate role change.
// Display a system message for the mode change.
String text =
final String text =
sourceMember.getName()
+ (mode.isAdded() ? " gives "
+ mode.getMode().name().toLowerCase()
+ " to " : " removes "
+ mode.getMode().name().toLowerCase()
+ " from ") + targetMember.getName();
MessageIrcImpl message =
final MessageIrcImpl message =
new MessageIrcImpl(text,
MessageIrcImpl.DEFAULT_MIME_TYPE,
MessageIrcImpl.DEFAULT_MIME_ENCODING, null);
@ -1859,19 +1926,30 @@ private void processModeMessage(final ChannelModeMessage msg)
new Date(),
ChatRoomMessageReceivedEvent.SYSTEM_MESSAGE_RECEIVED);
}
break;
case LIMIT:
MessageIrcImpl limitMessage;
}
/**
* Process mode change that represents a channel limit modification.
*
* @param sourceMember the originating member
* @param mode the limit mode change
*/
private void processLimitChange(
final ChatRoomMemberIrcImpl sourceMember, final ModeEntry mode)
{
final MessageIrcImpl limitMessage;
if (mode.isAdded())
{
try
{
limitMessage =
new MessageIrcImpl("channel limit set to "
new MessageIrcImpl(
"channel limit set to "
+ Integer.parseInt(mode.getParams()[0])
+ " by "
+ (sourceMember.getContactAddress()
.length() == 0 ? "server"
.length() == 0
? "server"
: sourceMember.getContactAddress()),
"text/plain", "UTF-8", null);
}
@ -1879,7 +1957,7 @@ private void processModeMessage(final ChannelModeMessage msg)
{
LOGGER.warn("server sent incorrect limit: "
+ "limit is not a number", e);
break;
return;
}
}
else
@ -1891,51 +1969,14 @@ private void processModeMessage(final ChannelModeMessage msg)
limitMessage =
new MessageIrcImpl(
"channel limit removed by "
+ (sourceMember.getContactAddress()
.length() == 0 ? "server"
+ (sourceMember.getContactAddress().length() == 0
? "server"
: sourceMember.getContactAddress()),
"text/plain", "UTF-8", null);
}
this.chatroom.fireMessageReceivedEvent(limitMessage,
sourceMember, new Date(),
ChatRoomMessageReceivedEvent.SYSTEM_MESSAGE_RECEIVED);
break;
case BAN:
MessageIrcImpl banMessage =
new MessageIrcImpl(
"channel ban mask was "
+ (mode.isAdded() ? "added" : "removed")
+ ": "
+ mode.getParams()[0]
+ " by "
+ (sourceMember.getContactAddress()
.length() == 0 ? "server"
: sourceMember.getContactAddress()),
MessageIrcImpl.DEFAULT_MIME_TYPE,
MessageIrcImpl.DEFAULT_MIME_ENCODING, null);
this.chatroom.fireMessageReceivedEvent(banMessage,
sourceMember, new Date(),
this.chatroom.fireMessageReceivedEvent(limitMessage, sourceMember,
new Date(),
ChatRoomMessageReceivedEvent.SYSTEM_MESSAGE_RECEIVED);
break;
case UNKNOWN:
if (LOGGER.isInfoEnabled())
{
LOGGER.info("Unknown mode: "
+ (mode.isAdded() ? "+" : "-")
+ mode.getParams()[0] + ". Original mode string: '"
+ msg.getModeStr() + "'");
}
break;
default:
if (LOGGER.isInfoEnabled())
{
LOGGER.info("Unsupported mode '"
+ (mode.isAdded() ? "+" : "-") + mode.getMode()
+ "' (from modestring '" + msg.getModeStr() + "')");
}
break;
}
}
}
/**
@ -2020,6 +2061,21 @@ private boolean isMe(final String name)
private static final class ChannelListListener
extends VariousMessageListenerAdapter
{
/**
* Start of an IRC server channel listing reply.
*/
private static final int RPL_LISTSTART = 321;
/**
* Continuation of an IRC server channel listing reply.
*/
private static final int RPL_LIST = 322;
/**
* End of an IRC server channel listing reply.
*/
private static final int RPL_LISTEND = 323;
/**
* Reference to the IRC API instance.
*/
@ -2028,15 +2084,16 @@ private static final class ChannelListListener
/**
* Reference to the provided list instance.
*/
private Result<List<String>, Exception> signal;
private final Result<List<String>, Exception> signal;
/**
* Constructor for channel list listener.
*
* @param api irc-api library instance
* @param list signal for sync signaling
* @param signal signal for sync signaling
*/
private ChannelListListener(final IRCApi api,
final Result<List<String>, Exception> list)
final Result<List<String>, Exception> signal)
{
if (api == null)
{
@ -2044,7 +2101,7 @@ private ChannelListListener(final IRCApi api,
"IRC api instance cannot be null");
}
this.api = api;
this.signal = list;
this.signal = signal;
}
/**
@ -2067,13 +2124,13 @@ public void onServerNumericMessage(final ServerNumericMessage msg)
switch (msg.getNumericCode())
{
case 321:
case RPL_LISTSTART:
synchronized (this.signal)
{
this.signal.getValue().clear();
}
break;
case 322:
case RPL_LIST:
String channel = parse(msg.getText());
if (channel != null)
{
@ -2083,7 +2140,7 @@ public void onServerNumericMessage(final ServerNumericMessage msg)
}
}
break;
case 323:
case RPL_LISTEND:
synchronized (this.signal)
{
// Done collecting channels. Remove listener and then we're
@ -2124,6 +2181,21 @@ private String parse(final String text)
private static final class ServerParameters
implements IServerParameters
{
/**
* Number of increments to try for alternative nick names.
*/
private static final int NUM_INCREMENTS_FOR_ALTERNATIVES = 10;
/**
* Reserved symbols. These symbols have special meaning and cannot be
* used to start nick names.
*/
private static final Set<Character> RESERVED = new HashSet<Character>();
static {
RESERVED.add('#');
RESERVED.add('&');
}
/**
* Nick name.
@ -2165,7 +2237,7 @@ private ServerParameters(final String nickName, final String realName,
this.alternativeNicks.add(nickName + "__");
this.alternativeNicks.add(nickName + "___");
this.alternativeNicks.add(nickName + "____");
for (int i = 1; i < 10; i++)
for (int i = 1; i < NUM_INCREMENTS_FOR_ALTERNATIVES; i++)
{
this.alternativeNicks.add(nickName + i);
}
@ -2208,7 +2280,8 @@ private String checkNick(final String nick)
throw new IllegalArgumentException(
"a nick name must be provided");
}
if (nick.startsWith("#") || nick.startsWith("&"))
// TODO Add '+' and '!' to reserved symbols too?
if (RESERVED.contains(nick.charAt(0)))
{
throw new IllegalArgumentException(
"the nick name must not start with '#' or '&' "

Loading…
Cancel
Save