protected internal void ProcessMessageReplyWhoReply(IrcMessage message)
{
Debug.Assert(message.Parameters[0] == localUser.NickName);
Debug.Assert(message.Parameters[1] != null);
var channel = message.Parameters[1] == "*" ? null : GetChannelFromName(message.Parameters[1]);
Debug.Assert(message.Parameters[5] != null);
var user = GetUserFromNickName(message.Parameters[5]);
Debug.Assert(message.Parameters[2] != null);
var userName = message.Parameters[2];
Debug.Assert(message.Parameters[3] != null);
user.HostName = message.Parameters[3];
Debug.Assert(message.Parameters[4] != null);
user.ServerName = message.Parameters[4];
Debug.Assert(message.Parameters[6] != null);
var userModeFlags = message.Parameters[6];
Debug.Assert(userModeFlags.Length > 0);
if (userModeFlags.Contains('H'))
user.IsAway = false;
else if (userModeFlags.Contains('G'))
user.IsAway = true;
user.IsOperator = userModeFlags.Contains('*');
if (channel != null)
{
// Add user to channel if it does not already exist in it.
var channelUser = channel.GetChannelUser(user);
if (channelUser == null)
{
channelUser = new IrcChannelUser(user);
channel.HandleUserJoined(channelUser);
}
// Set modes on user corresponding to given mode flags (prefix characters).
foreach (var c in userModeFlags)
{
char mode;
if (channelUserModesPrefixes.TryGetValue(c, out mode))
channelUser.HandleModeChanged(true, mode);
else
break;
}
}
Debug.Assert(message.Parameters[7] != null);
var lastParamParts = message.Parameters[7].SplitIntoPair(" ");
user.HopCount = int.Parse(lastParamParts.Item1);
if (lastParamParts.Item2 != null)
user.RealName = lastParamParts.Item2;
}