Aselia.UserCommands.JoinHandler.Handler C# (CSharp) Метод

Handler() публичный Метод

public Handler ( object sender, ReceivedCommandEventArgs e ) : void
sender object
e ReceivedCommandEventArgs
Результат void
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            string[] channels = e.Arguments[0].Split(',');
            int key = 0;
            for (int i = 0; i < channels.Length; i++)
            {
                try
                {
                    ChannelBase channel = e.Server.GetChannel(channels[i]);
                    if (channel == null)
                    {
                        if (e.Server.GetRegisteredChannel(channels[i]) != null)
                        {
                            channel = e.Server.CreateChannel(channels[i], e.User);
                        }
                        else
                        {
                            e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, ":That channel does not exist.  Did you mean to create/register a new channel?  If so, use /cjoin " + channels[i] + " or /quote cjoin " + channels[i] + ".");
                            continue;
                        }
                    }

                    if (channel.HasFlag("RegisteredOnly") && e.User.Level < Authorizations.Registered)
                    {
                        e.User.SendNumeric(Numerics.ERR_NOLOGIN, ":Only registered users can join that channel.");
                        Forward(e, channel);
                        continue;
                    }

                    if (channel.Properties.ContainsKey("Key"))
                    {
                        if (e.Arguments.Length <= ++key)
                        {
                            e.User.SendNumeric(Numerics.ERR_KEYSET, CMD, channels[i], ":Key not specified for channel.");
                            Forward(e, channel);
                            continue;
                        }
                        else if (e.Arguments[key] != (string)channel.Properties["Key"])
                        {
                            e.User.SendNumeric(Numerics.ERR_BADCHANNELKEY, CMD, channels[i], ":Incorrect channel key specified.");
                            Forward(e, channel);
                            continue;
                        }
                    }

                    if (channel.HasFlag("InviteOnly"))
                    {
                        if (!e.User.HasSessionFlag("Invite:" + channel.Name)
                            && !e.User.IsVoice(channel))
                        {
                            bool inviteExcept = false;
                            for (int m = 0; m < channel.InviteExcepts.Count; m++)
                            {
                                if (e.User.Mask.Matches(channel.InviteExcepts[m]))
                                {
                                    inviteExcept = true;
                                    break;
                                }
                            }
                            if (!inviteExcept)
                            {
                                e.User.SendNumeric(Numerics.ERR_INVITEONLYCHAN, CMD, channels[i], ":That channel is marked invite-only.");
                                Forward(e, channel);
                                continue;
                            }
                        }
                    }

                    if (!e.User.IsVoice(channel))
                    {
                        if (e.User.IsBanned(channel))
                        {
                            e.User.SendNumeric(Numerics.ERR_BANNEDFROMCHAN, channels[i], ":You are banned from that channel.");
                            Forward(e, channel);
                            continue;
                        }
                    }

                    if (!e.User.AddToChannel(channel))
                    {
                        e.User.SendNumeric(Numerics.ERR_USERONCHANNEL, e.User.Mask.Nickname, channel.Name, ":You are already on that channel.");
                        return;
                    }

                    OnJoin(channel, e.User);
                }
                catch (Exception ex)
                {
                    e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":Error joining channel:", ex.Message);
                }
            }
        }