public virtual WhoResponse ParseResponse(Message message) { var channel = Server.LookUpChannel(message.Args[0]); var realName = message.Args[6]; var index = realName.IndexOf(' '); int hopCount = -1; if (-1 != index) { if (Int32.TryParse(realName.Substring(0, index), NumberStyles.Integer, CultureInfo.InvariantCulture, out hopCount)) { realName = realName.Substring(index + 1); } } var response = new WhoResponse { ChannelName = message.Args[0], UserName = message.Args[1], HostName = message.Args[2], ServerName = message.Args[3], NickName = message.Args[4], Flags = message.Args[5], HopCount = hopCount, RealName = realName, }; var user = Server.LookUpUser(response.NickName) ?? new User { NickName = response.NickName, ProtocolHandler = ProtocolHandler, Server = Server, }; user.UserName = response.UserName; user.HostName = response.HostName; user.RealName = response.RealName; if (null != channel) { try { user.Channels.AddIfMissing(message.Args[0], channel); channel.Users.Add(user); } catch (Exception e) { Debug.Print("WhoResponseParser.ParseResponse: caught exception:\n{0}", e); Debugger.Break( ); } } return(response); }
// // Event handlers // // Handler object events private void HandleNamesComplete(object sender, NamesCompleteEventArgs ev) { Debug.Print("Channel.HandleNamesComplete: typeof(sender)={0} sender={1} channel={2} nicks={3}", sender.GetType( ), sender, Name, string.Join(",", ev.NickNames)); if (null == Users) { Users = new Collection <User>( ); } else { Users.Clear( ); } if (null == UserFlags) { UserFlags = new Dictionary <User, string>( ); } else { UserFlags.Clear( ); } var flagList = string.IsNullOrEmpty(Server.Information.ChannelModes.StatusSigils) ? "@+" : Server.Information.ChannelModes.StatusSigils; foreach (var item in ev.NickNames) { var flags = string.Empty; for (var i = 0; i < item.Length; i++) { if (flagList.IndexOf(item[i]) > -1) { flags += item[i]; } else { var channelMember = new NickUserHost(item.Substring(i)); var user = Server.LookUpUser(channelMember.NickName) ?? new User { NickUserHost = channelMember, ProtocolHandler = ProtocolHandler, Server = Server, }; Users.Add(user); UserFlags.Add(user, flags); break; } } } }