protected override void PrivateHandle(UserInfo info, List<string> args) { var users = new List<UserInfo>(); foreach (var arg in args) { UserInfo user; if (IrcDaemon.Nicks.TryGetValue(arg, out user)) { users.Add(user); } } IrcDaemon.Replies.SendUserHost(info, users); }
private void PartAll(UserInfo info) { var command = new StringBuilder(); var partargs = new List<string>(); // this is a part all channels, it is plainly stupid to handle PARTS in a join message. // we won't handle that, we give it to the part handler! YO! why not defining a /part * instead of /join 0 command.Length = 0; bool first = true; foreach (var ci in info.Channels) { if (first) { first = false; } else { command.Append(","); } command.Append(ci.Name); } partargs.Add(command.ToString()); partargs.Add(IrcDaemon.Options.StandardPartMessage); IrcDaemon.Commands.Handle(info, info.Usermask, "PART", partargs, 0); }
/// <summary> /// Reply Code 005 /// </summary> /// <param name="info"></param> public void SendISupport(UserInfo info) { // ISUPPORT never went to an RFC, but this is based on draft03. const string version = "draft03"; var features = new List<string>(); var daemon = info.IrcDaemon; features.Add("STD=" + version); features.Add("PREFIX=" + daemon.SupportedRanks.ToPrefixList()); features.Add("CHANMODES=" + daemon.SupportedChannelModes.ToParameterList()); features.Add("CHANTYPES=" + daemon.SupportedChannelTypes.Select(type => type.Value.Prefix).Concatenate(string.Empty)); features.Add("CHANLIMIT=" + daemon.SupportedChannelTypes.Select(c => c.Value.Prefix + ":" + c.Value.MaxJoinedAllowed).Concatenate(",")); features.AddRange(daemon.SupportedChannelModes.SelectMany(m => m.Value.Support(info.IrcDaemon))); features.Add("NETWORK=" + daemon.Options.NetworkName); features.Add("CASEMAPPING=" + daemon.Options.IrcCaseMapping.ToDescription()); // TODO: Group by same MaxJoinedAllowed features.Add("CHANNELLEN=" + daemon.Options.MaxChannelLength); features.Add("NICKLEN=" + daemon.Options.MaxNickLength); features.Add("MAXNICKLEN=" + daemon.Options.MaxNickLength); features.Add("TOPICLEN=" + daemon.Options.MaxTopicLength); features.Add("KICKLEN=" + daemon.Options.MaxKickLength); features.Add("AWAYLEN=" + daemon.Options.MaxAwayLength); features.AddRange(daemon.Commands.Supported()); if (daemon.Options.IrcMode != IrcMode.Rfc1459) { features.Add("RFC2812"); } BuildMessageHeader(info, ReplyCode.ISupport); response.Append(" "); SendSplitted(response.ToString(), info, features, "are supported by this server"); }
/// <summary> /// Reply 302 /// </summary> /// <param name="info"></param> /// <param name="userInfos"></param> public void SendUserHost(UserInfo info, List<UserInfo> userInfos) { BuildMessageHeader(info, ReplyCode.UserHost); response.Append(" :"); var userHosts = new List<string>(); foreach (var userInfo in userInfos) { var userHost = new StringBuilder(); userHost.Append(userInfo.Nick); if (userInfo.Modes.Exist<ModeOperator>() || userInfo.Modes.Exist<ModeLocalOperator>()) { userHost.Append("*"); } userHost.Append("="); userHost.Append(userInfo.Modes.Exist<ModeAway>() ? "-" : "+"); userHost.Append(userInfo.User); userHost.Append("@"); userHost.Append(userInfo.Host); userHosts.Add(userHost.ToString()); } SendSplitted(response.ToString(), info, userHosts, null); }