public NamesMessage(Message msg) : base(msg) { Channel = msg.Client.ChannelFromName(msg.Parameters[2]); var users = msg.Parameters[3].Split(separator, StringSplitOptions.RemoveEmptyEntries); foreach (var user in users) { // Use IRCv3 multi-prefix? if (msg.Client.ActiveCapabilities.Contains(Capability.MultiPrefix)) { var ranks = user.TakeWhile(u => UserRank.FromPrefix(u) != UserRank.None) .Select(UserRank.FromPrefix) .Distinct() .ToArray(); var chanUser = msg.Client.UserFromNick(user); if (chanUser == null) //Add new users discovered in response. { //Create new user, remove rank characters from username var newUser = new User(ranks.Min() != UserRank.None ? user.Substring(ranks.Length) : user, Channel.Name, UserRank.None); msg.Client.Users.Add(newUser); Channel.AddUser(newUser); foreach (var rank in ranks) { newUser.AddRank(msg.Client, Channel.Name, rank); } } else //Update ranks of existing users (ourselves). { Channel.AddUser(chanUser); foreach (var rank in ranks) { chanUser.AddRank(msg.Client, Channel.Name, rank); } } } else { var rank = UserRank.FromPrefix(user[0]); var chanUser = msg.Client.UserFromNick(user); if (chanUser == null) //Add new users discovered in response. { var newUser = new User(rank != UserRank.None ? user.Substring(1) : user, Channel.Name, rank); Channel.AddUser(newUser); msg.Client.Users.Add(newUser); } else //Update ranks of existing users (ourselves). { Channel.AddUser(chanUser); chanUser.AddRank(msg.Client, Channel.Name, rank); } } } msg.Client.OnReplyNames(this); }
public WhoMessage(Message msg) : base(msg) { var info = BaseMessage.Parameters[BaseMessage.Parameters.Length - 1].Split(' '); if (info.Length > 1) { Realname = string.Join(" ", info.Skip(1)).Trim(); } var user = msg.Client.UserFromNick(Nick); if (user != null) //If the user is recognized (Because of a previous JOIN message), fill in their details. { user.Host = Host; user.RealName = Realname; user.Ident = Ident; var infoParams = msg.Parameters[6]; foreach (var character in infoParams) { switch (character) { case '*': user.IsOp = true; break; case 'G': //Handle gone/here user.SetIsAway(msg.Client, true); break; case 'H': user.SetIsAway(msg.Client, false); break; default: //Handle ranks var rank = UserRank.FromPrefix(character); if (rank != UserRank.None) { user.AddRank(msg.Client, Channel, rank); } break; } } } msg.Client.OnReplyWho(this); }