protected internal void ProcessMessageKick(IrcMessage message)
{
Debug.Assert(message.Parameters[0] != null);
var channels = GetChannelsFromList(message.Parameters[0]);
Debug.Assert(message.Parameters[1] != null);
var users = GetUsersFromList(message.Parameters[1]).ToArray();
var comment = message.Parameters[2];
// Handle kick command for each user given in message.
foreach (var channelUser in channels.Zip(users,
(channel, user) => channel.GetChannelUser(user)))
{
if (channelUser.User == localUser)
{
// Local user was kicked from channel.
var channel = channelUser.Channel;
lock (((ICollection) Channels).SyncRoot)
this.channels.Remove(channel);
channelUser.Channel.HandleUserKicked(channelUser, comment);
localUser.HandleLeftChannel(channel);
// Local user has left channel. Do not process kicks of remote users.
break;
}
// Remote user was kicked from channel.
channelUser.Channel.HandleUserKicked(channelUser, comment);
}
}