Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }