protected override void PrivateHandle(UserInfo info, List <string> args) { if (args[0] == "0") { PartAll(info); return; } foreach (var channel in from temp in GetSubArgument(args[0]) where info.UserPerChannelInfos.All(upci => upci.ChannelInfo.Name != temp) select temp) { ChannelInfo chan; if (IrcDaemon.Channels.ContainsKey(channel)) { chan = IrcDaemon.Channels[channel]; if (!chan.Modes.HandleEvent(this, chan, info, args)) { continue; } } else { if (IrcDaemon.ValidChannel(channel)) { chan = new ChannelInfo(channel, IrcDaemon); IrcDaemon.Channels.Add(chan.Name, chan); } else { IrcDaemon.Replies.SendBadChannelMask(info, channel); return; } } var chanuser = new UserPerChannelInfo(info, chan); // ToDo: this probably should get delegated to the Channel Type specific "NormalChannel" class, because it depends on the channel type. if (!chan.Users.Any()) { chanuser.Modes.Add(IrcDaemon.ModeFactory.GetChannelRank('o')); } chan.UserPerChannelInfos.Add(info.Nick, chanuser); info.UserPerChannelInfos.Add(chanuser); Send(new JoinArgument(info, chan, chan)); SendTopic(info, chan); IrcDaemon.Replies.SendNamesReply(chanuser.UserInfo, chan); IrcDaemon.Replies.SendEndOfNamesReply(info, chan); } }
protected override void PrivateHandle(UserInfo info, List <string> args) { if (args[0] == "0") { PartAll(info); return; } // Тестовый вывод подключения к чату //IrcDaemon.SendToAll($@"{info.Nick} присоединился к комнате {string.Join(" ", args)}"); // info($@"{info.Nick} {string.Join(" подключение ", args)}"); foreach (var channel in from temp in GetSubArgument(args[0]) where info.UserPerChannelInfos.All(upci => upci.ChannelInfo.Name != temp) select temp) { if (IrcDaemon.Channels.TryGetValue(channel, out ChannelInfo chan)) { if (!chan.Modes.HandleEvent(this, chan, info, args)) { continue; } } else { if (IrcDaemon.ValidChannel(channel)) { chan = new ChannelInfo(channel, IrcDaemon); IrcDaemon.Channels[chan.Name] = chan; } else { IrcDaemon.Replies.SendBadChannelMask(info, channel); return; } } var chanuser = new UserPerChannelInfo(info, chan); // ToDo: this probably should get delegated to the Channel Type specific "NormalChannel" class, because it depends on the channel type. if (!chan.Users.Any()) { chanuser.Modes.Add(IrcDaemon.ModeFactory.GetChannelRank('o')); } chan.UserPerChannelInfos[info.Nick] = chanuser; info.UserPerChannelInfos.Add(chanuser); Send(new JoinArgument(info, chan, chan)); SendTopic(info, chan); IrcDaemon.Replies.SendNamesReply(chanuser.UserInfo, chan); IrcDaemon.Replies.SendEndOfNamesReply(info, chan); } }