Exemple #1
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 4)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            if (e.User.Level != Authorizations.Connecting || e.User.HasSessionFlag("PassedUser"))
            {
                e.User.ErrorAlreadyRegistered(CMD);
                return;
            }

            e.User.Mask.Username = e.User.MakeUsername(e.Arguments[0]);

            e.User.Gecos = e.Arguments[3];

            if (!e.User.HasSessionFlag("PassedNick") || e.User.HasSessionFlag("WaitForCap"))
            {
                e.User.SetSessionFlag("PassedUser");
                return;
            }

            e.User.ClearSessionFlag("PassedNick");
            e.User.OnConnected();
        }
Exemple #2
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 4)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            if (e.User.Level != Authorizations.Connecting || e.User.HasSessionFlag("PassedUser"))
            {
                e.User.ErrorAlreadyRegistered(CMD);
                return;
            }

            e.User.Mask.Username = e.User.MakeUsername(e.Arguments[0]);

            e.User.Gecos = e.Arguments[3];

            if (!e.User.HasSessionFlag("PassedNick") || e.User.HasSessionFlag("WaitForCap"))
            {
                e.User.SetSessionFlag("PassedUser");
                return;
            }

            e.User.ClearSessionFlag("PassedNick");
            e.User.OnConnected();
        }
Exemple #3
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }
            else if (e.Arguments.Length < 2)
            {
                ChannelBase channel = e.User.GetChannel(e.Arguments[0]);
                if (channel == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, e.Arguments[0], ":You are not on that channel.");
                    return;
                }

                e.User.SendNumeric(Numerics.RPL_CHANNELMODEIS, channel.Name, channel.GetModeString());
                return;
            }

            string args;
            if (e.Arguments.Length > 2)
            {
                args = string.Join(" ", e.Arguments, 2, e.Arguments.Length - 2);
            }
            else
            {
                args = string.Empty;
            }

            foreach (string t in e.Arguments[0].Split(','))
            {
                try
                {
                    if (".!#&".Contains(t[0]))
                    {
                        ChannelBase channel = e.User.GetChannel(t);
                        if (channel == null)
                        {
                            e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, t, ":You are not on that channel.");
                            return;
                        }

                        channel.SetModes(e.User, e.Arguments[1], args);
                    }
                    else if (t.ToLower() != e.User.Id)
                    {
                        e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, ":You can only set user mode flags on yourself.");
                    }
                    else
                    {
                        e.User.SetModes(e.User, e.Arguments[1], args);
                    }
                }
                catch (Exception ex)
                {
                    e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":Error setting mode:", ex.Message);
                }
            }
        }
Exemple #4
0
 protected virtual void OnReceivedCommand(ReceivedCommandEventArgs e)
 {
     if (ReceivedCommand != null)
     {
         ReceivedCommand(this, e);
     }
 }
Exemple #5
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     if (e.User.Level >= Authorizations.Unregistered)
     {
         e.User.BroadcastInclusive(CMD, e.User.Mask, "Client quit.");
     }
     e.User.Dispose("Client quit.");
 }
Exemple #6
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     if (e.User.Level >= Authorizations.Unregistered)
     {
         e.User.BroadcastInclusive(CMD, e.User.Mask, "Client quit.");
     }
     e.User.Dispose("Client quit.");
 }
Exemple #7
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
            }

            e.User.Names(e.Arguments[0]);
        }
Exemple #8
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
            }

            e.User.Names(e.Arguments[0]);
        }
Exemple #9
0
        private void EventReceivedCommand(List <string> iCommand)
        {
            //返すデータの設定
            ReceivedCommandEventArgs e = new ReceivedCommandEventArgs();

            e.Command = iCommand;
            //イベントの発生
            OnReceivedCommand(e);
        }
Exemple #10
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 2)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            ChannelBase channel = e.Server.GetChannel(e.Arguments[0]);

            if (channel == null)
            {
                char c = e.Arguments[0][0];
                if (c == '#' || c == '&' || c == '+')
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel does not exist.");
                    return;
                }

                UserBase user = e.Server.GetUser(e.Arguments[0]);
                if (user == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHNICK, e.Arguments[0], ":That user does not exist.");
                    return;
                }

                user.SendCommand(CMD, e.User.Mask, user.Mask.Nickname, e.Arguments[1]);
            }
            else
            {
                if (!e.User.IsVoice(channel) && !e.User.CanSendToChannel(channel, false, "talk"))
                {
                    return;
                }

                if (channel.HasFlag("NoColors") && e.Arguments[1].Contains(((char)3).ToString()))
                {
                    e.User.SendNumeric(Numerics.ERR_CANNOTSENDTOCHAN, CMD, channel.Name, ":Colors are disallowed on this channel.  Your message was blocked.");
                    return;
                }

                if (channel.HasFlag("NoCtcps") && e.Arguments[1][0] == 1 && !e.Arguments[1].StartsWith("\x0001ACTION"))
                {
                    e.User.SendNumeric(Numerics.ERR_CANNOTSENDTOCHAN, CMD, channel.Name, ":CTCPs are disallowed on this channel.  Your message was blocked.");
                    return;
                }

                if (channel.HasFlag("NoActions") && e.Arguments[1].StartsWith("\x0001ACTION"))
                {
                    e.User.SendNumeric(Numerics.ERR_CANNOTSENDTOCHAN, CMD, channel.Name, ":Actions are disallowed on this channel.  Your message was blocked.");
                    return;
                }

                channel.BroadcastExclusive(CMD, e.User, channel.Name, e.Arguments[1]);
            }
        }
Exemple #11
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            e.User.SendCommand("PONG", e.Server.Id, e.Server.Id, e.Arguments[0]);
        }
Exemple #12
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 2)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            ChannelBase channel = e.Server.GetChannel(e.Arguments[0]);
            if (channel == null)
            {
                char c = e.Arguments[0][0];
                if (c == '#' || c == '&' || c == '+')
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel does not exist.");
                    return;
                }

                UserBase user = e.Server.GetUser(e.Arguments[0]);
                if (user == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHNICK, e.Arguments[0], ":That user does not exist.");
                    return;
                }

                user.SendCommand(CMD, e.User.Mask, user.Mask.Nickname, e.Arguments[1]);
            }
            else
            {
                if (!e.User.IsVoice(channel) && !e.User.CanSendToChannel(channel, false, "talk"))
                {
                    return;
                }

                if (channel.HasFlag("NoColors") && e.Arguments[1].Contains(((char)3).ToString()))
                {
                    e.User.SendNumeric(Numerics.ERR_CANNOTSENDTOCHAN, CMD, channel.Name, ":Colors are disallowed on this channel.  Your message was blocked.");
                    return;
                }

                if (channel.HasFlag("NoCtcps") && e.Arguments[1][0] == 1 && !e.Arguments[1].StartsWith("\x0001ACTION"))
                {
                    e.User.SendNumeric(Numerics.ERR_CANNOTSENDTOCHAN, CMD, channel.Name, ":CTCPs are disallowed on this channel.  Your message was blocked.");
                    return;
                }

                if (channel.HasFlag("NoActions") && e.Arguments[1].StartsWith("\x0001ACTION"))
                {
                    e.User.SendNumeric(Numerics.ERR_CANNOTSENDTOCHAN, CMD, channel.Name, ":Actions are disallowed on this channel.  Your message was blocked.");
                    return;
                }

                channel.BroadcastExclusive(CMD, e.User, channel.Name, e.Arguments[1]);
            }
        }
Exemple #13
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            UserBase user = e.Server.GetUser(e.Arguments[0]);

            e.User.SendNumeric(Numerics.RPL_ISON, ":ison:", user == null ? "no such user" : user.Mask.Nickname);
        }
Exemple #14
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     e.User.SendNumeric(Numerics.RPL_COMMITSTART, ":Committing cache...");
     try
     {
         e.Server.CommitCache();
         e.User.SendNumeric(Numerics.RPL_COMMITSUCCESS, ":The cache was successfully committed.");
     }
     catch (Exception ex)
     {
         e.User.SendNumeric(Numerics.ERR_COMMITFAIL, ":The commit failed:", ex.Message);
     }
 }
Exemple #15
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     e.User.SendNumeric(Numerics.RPL_COMMITSTART, ":Committing cache...");
     try
     {
         e.Server.CommitCache();
         e.User.SendNumeric(Numerics.RPL_COMMITSUCCESS, ":The cache was successfully committed.");
     }
     catch (Exception ex)
     {
         e.User.SendNumeric(Numerics.ERR_COMMITFAIL, ":The commit failed:", ex.Message);
     }
 }
Exemple #16
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            string[] channels = e.Arguments[0].Split(',');
            for (int i = 0; i < channels.Length; i++)
            {
                try
                {
                    ChannelBase channel = e.Server.GetChannel(channels[i]);
                    if (channel == null)
                    {
                        if (!e.Server.IsValidChannel(channels[i]))
                        {
                            e.User.SendNumeric(Numerics.ERR_BADCHANMASK, channels[i], ":That is an invalid channel name.");
                            continue;
                        }

                        channel = e.Server.CreateChannel(channels[i], e.User);
                        if (channel == null)
                        {
                            continue;
                        }

                        if (!e.User.AddToChannel(channel))
                        {
                            e.User.SendNumeric(Numerics.ERR_CONCURRENCY, ":A concurrency error occurred while joining the channel.");
                            return;
                        }

                        channel.BroadcastInclusive("JOIN", e.User, channel.Name);
                        e.User.Names(channel);
                        e.Server.Channels[channel.Name] = channel;
                    }
                    else
                    {
                        e.User.SendNumeric(Numerics.ERR_CHANNELEXISTS, channels[i], ":That channel already exists.");
                    }
                }
                catch (Exception ex)
                {
                    e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":Error joining channel:", ex.Message);
                }
            }
        }
Exemple #17
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            string[] channels = e.Arguments[0].Split(',');
            for (int i = 0; i < channels.Length; i++)
            {
                try
                {
                    ChannelBase channel = e.Server.GetChannel(channels[i]);
                    if (channel == null)
                    {
                        if (!e.Server.IsValidChannel(channels[i]))
                        {
                            e.User.SendNumeric(Numerics.ERR_BADCHANMASK, channels[i], ":That is an invalid channel name.");
                            continue;
                        }

                        channel = e.Server.CreateChannel(channels[i], e.User);
                        if (channel == null)
                        {
                            continue;
                        }

                        if (!e.User.AddToChannel(channel))
                        {
                            e.User.SendNumeric(Numerics.ERR_CONCURRENCY, ":A concurrency error occurred while joining the channel.");
                            return;
                        }

                        channel.BroadcastInclusive("JOIN", e.User, channel.Name);
                        e.User.Names(channel);
                        e.Server.Channels[channel.Name] = channel;
                    }
                    else
                    {
                        e.User.SendNumeric(Numerics.ERR_CHANNELEXISTS, channels[i], ":That channel already exists.");
                    }
                }
                catch (Exception ex)
                {
                    e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":Error joining channel:", ex.Message);
                }
            }
        }
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            if (!e.User.ClearSessionFlag("SaslRequested"))
            {
                e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, ":CAP AUTHENTICATE can only be issued after requesting \"sasl\" via CAP REQ.");
                return;
            }

            switch (e.Arguments[0])
            {
            case "*":
                e.User.SendNumeric(Numerics.ERR_SASLABORTED, ":Client aborted SASL authentication.");
                break;

            case "-":
                e.User.SendNumeric(Numerics.ERR_SASLABORTED, ":Client sent blank SASL authentication code.");
                break;

            case "PLAIN":
                if (e.User.HasSessionFlag("SaslPlain"))
                {
                    e.User.SendNumeric(Numerics.ERR_SASLABORTED, ":You have already chosen an authentication method.");
                }
                else
                {
                    e.User.SetSessionFlag("SaslPlain");
                    e.User.SendCommand(CMD, e.User.Server.Id, e.User.Mask.Nickname, "AUTHENTICATE +");
                }
                break;

            default:
                if (e.User.ClearSessionFlag("SaslPlain"))
                {
                    AuthenticatePlain(e.User, e.Arguments[0]);
                }
                else
                {
                    e.User.SendNumeric(Numerics.ERR_SASLABORTED, ":That SASL authentication method is not supported.  Use PLAIN instead.");
                }
                break;
            }
        }
Exemple #19
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
            }

            UserBase user = e.Server.GetUser(e.Arguments[0]);
            if (user == null)
            {
                e.User.SendNumeric(Numerics.RPL_USERHOST, ":no such user");
            }
            else
            {
                e.User.SendNumeric(Numerics.RPL_USERHOST, ":" + user.Mask.Nickname + "=+" + user.Mask.Username + "@" + user.Mask.Hostname);
            }
        }
Exemple #20
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 2)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            ChannelBase channel;

            if (e.User.Level >= Authorizations.NetworkOperator)
            {
                channel = e.Server.GetChannel(e.Arguments[0]);
                if (channel == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel does not exist.");
                    return;
                }

                if (!e.User.IsOperator(channel))
                {
                    e.User.SendNumeric(Numerics.ERR_CHANOPPRIVSNEEDED, channel.Name, ":You need to be a channel operator or IRCop to kick from that channel.");
                    return;
                }
            }
            else
            {
                channel = e.User.GetChannel(e.Arguments[0]);
                if (channel == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, e.Arguments[0], ":You are not on that channel.");
                    return;
                }
            }

            UserBase target = channel.GetUser(e.Arguments[1]);

            if (target == null)
            {
                e.User.SendNumeric(Numerics.ERR_USERNOTINCHANNEL, e.Arguments[1], channel.Name, ":That user is not in the specified channel.");
                return;
            }

            channel.BroadcastInclusive(CMD, e.User, channel.Name, target.Mask.Nickname, e.Arguments.Length > 2 ? e.Arguments[2] : "User kicked from channel.");
            channel.RemoveUser(target);
        }
Exemple #21
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
            }

            UserBase user = e.Server.GetUser(e.Arguments[0]);

            if (user == null)
            {
                e.User.SendNumeric(Numerics.RPL_USERHOST, ":no such user");
            }
            else
            {
                e.User.SendNumeric(Numerics.RPL_USERHOST, ":" + user.Mask.Nickname + "=+" + user.Mask.Username + "@" + user.Mask.Hostname);
            }
        }
Exemple #22
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            ChannelBase channel = e.User.GetChannel(e.Arguments[0]);
            if (channel == null)
            {
                e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, e.Arguments[0], ":You cannot leave a channel before joining it.");
                return;
            }

            channel.BroadcastInclusive(CMD, e.User, channel.Name, "Leaving.");
            channel.RemoveUser(e.User);
        }
Exemple #23
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 2)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            ChannelBase channel;
            if (e.User.Level >= Authorizations.NetworkOperator)
            {
                channel = e.Server.GetChannel(e.Arguments[0]);
                if (channel == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel does not exist.");
                    return;
                }

                if (!e.User.IsOperator(channel))
                {
                    e.User.SendNumeric(Numerics.ERR_CHANOPPRIVSNEEDED, channel.Name, ":You need to be a channel operator or IRCop to kick from that channel.");
                    return;
                }
            }
            else
            {
                channel = e.User.GetChannel(e.Arguments[0]);
                if (channel == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, e.Arguments[0], ":You are not on that channel.");
                    return;
                }
            }

            UserBase target = channel.GetUser(e.Arguments[1]);
            if (target == null)
            {
                e.User.SendNumeric(Numerics.ERR_USERNOTINCHANNEL, e.Arguments[1], channel.Name, ":That user is not in the specified channel.");
                return;
            }

            channel.BroadcastInclusive(CMD, e.User, channel.Name, target.Mask.Nickname, e.Arguments.Length > 2 ? e.Arguments[2] : "User kicked from channel.");
            channel.RemoveUser(target);
        }
Exemple #24
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            ChannelBase channel = e.User.GetChannel(e.Arguments[0]);

            if (channel == null)
            {
                e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, e.Arguments[0], ":You cannot leave a channel before joining it.");
                return;
            }

            channel.BroadcastInclusive(CMD, e.User, channel.Name, "Leaving.");
            channel.RemoveUser(e.User);
        }
Exemple #25
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            UserSurrogate user = e.Server.GetRegisteredUser(e.Arguments[0]);
            if (user == null)
            {
                e.User.SendNumeric(Numerics.ERR_NOSUCHACCOUNT, e.Arguments[0].ToLower(), ":That account is not registered.");
                return;
            }

            user.Level = Authorizations.NetworkOperator;
            user.Commit();
            e.User.SendNumeric(Numerics.RPL_DEMOTED, user.Mask.Account, ":That user is no longer an IRCop.");
        }
Exemple #26
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.SendNumeric(Numerics.ERR_NEEDMOREPARAMS, CMD, ":Syntax: /login [account] <password>");
                return;
            }

            string account, password;

            if (e.Arguments.Length > 1)
            {
                account  = e.Arguments[0].ToLower();
                password = e.Arguments[1];
            }
            else
            {
                account  = e.User.Mask.Nickname.ToLower();
                password = e.Arguments[0];
            }

            byte[] hash = Password.Hash(password);
            if (hash == null)
            {
                e.User.SendNumeric(Numerics.ERR_COMPUTEHASH, CMD, ":Unable to compute password hash.");
                return;
            }

            if (e.Server.LogIn(e.User, account, hash))
            {
                e.User.SendNumeric(Numerics.RPL_IDENTIFIED, CMD, e.User.Mask.Account, ":You are now logged in as " + e.User.Mask.Account + ".");

                if (e.User.Level == Authorizations.NetworkOperator && !e.Server.NetworkOperators.Contains(e.User))
                {
                    e.Server.NetworkOperators.Add(e.User);
                }
            }
            else
            {
                e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":Invalid credentials.");
            }
        }
Exemple #27
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            UserSurrogate user = e.Server.GetRegisteredUser(e.Arguments[0]);

            if (user == null)
            {
                e.User.SendNumeric(Numerics.ERR_NOSUCHACCOUNT, e.Arguments[0].ToLower(), ":That account is not registered.");
                return;
            }

            user.Level = Authorizations.NetworkOperator;
            user.Commit();
            e.User.SendNumeric(Numerics.RPL_DEMOTED, user.Mask.Account, ":That user is no longer an IRCop.");
        }
Exemple #28
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            UserBase user = e.Server.GetUser(e.Arguments[0]);
            if (user == null)
            {
                e.User.SendNumeric(Numerics.ERR_NOSUCHNICK, e.Arguments[0], ":That nickname does not exist.");
                return;
            }

            string reason = e.Arguments.Length > 1 ? "Killed: " + e.Arguments[1] : "Killed by network operator.";

            e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, reason);
            e.User.Dispose(reason);
        }
Exemple #29
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     e.User.SendNumeric(Numerics.RPL_LISTSTART, "Channels", ":" + e.User.Mask.Nickname);
     foreach (ChannelBase c in e.Server.Channels.Values)
     {
         if (c.HasFlag("Secret") && e.User.Level < Authorizations.NetworkOperator && !e.User.IsVoice(c) && !e.User.Channels.ContainsKey(c.Id))
         {
             e.User.SendNumeric(Numerics.RPL_LIST, "*", c.Users.Count);
         }
         else if (c.Properties.ContainsKey("Topic"))
         {
             e.User.SendNumeric(Numerics.RPL_LIST, c.Name, c.Users.Count, ":" + c.Properties["Topic"]);
         }
         else
         {
             e.User.SendNumeric(Numerics.RPL_LIST, c.Name, c.Users.Count);
         }
     }
     e.User.SendNumeric(Numerics.RPL_LISTEND, ":End of channel list.");
 }
Exemple #30
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.SendNumeric(Numerics.ERR_NEEDMOREPARAMS, CMD, ":Syntax: /login [account] <password>");
                return;
            }

            string account, password;
            if (e.Arguments.Length > 1)
            {
                account = e.Arguments[0].ToLower();
                password = e.Arguments[1];
            }
            else
            {
                account = e.User.Mask.Nickname.ToLower();
                password = e.Arguments[0];
            }

            byte[] hash = Password.Hash(password);
            if (hash == null)
            {
                e.User.SendNumeric(Numerics.ERR_COMPUTEHASH, CMD, ":Unable to compute password hash.");
                return;
            }

            if (e.Server.LogIn(e.User, account, hash))
            {
                e.User.SendNumeric(Numerics.RPL_IDENTIFIED, CMD, e.User.Mask.Account, ":You are now logged in as " + e.User.Mask.Account + ".");

                if (e.User.Level == Authorizations.NetworkOperator && !e.Server.NetworkOperators.Contains(e.User))
                {
                    e.Server.NetworkOperators.Add(e.User);
                }
            }
            else
            {
                e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":Invalid credentials.");
            }
        }
Exemple #31
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            UserBase user = e.Server.GetUser(e.Arguments[0]);

            if (user == null)
            {
                e.User.SendNumeric(Numerics.ERR_NOSUCHNICK, e.Arguments[0], ":That nickname does not exist.");
                return;
            }

            string reason = e.Arguments.Length > 1 ? "Killed: " + e.Arguments[1] : "Killed by network operator.";

            e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, reason);
            e.User.Dispose(reason);
        }
Exemple #32
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 2)
            {
                e.User.SendNumeric(Numerics.ERR_NEEDMOREPARAMS, CMD, ":Syntax: /register <password> <e-mail>");
                return;
            }

            if (e.Arguments[0].Length < 7)
            {
                e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":Your password must be at least seven characters in length.");
                return;
            }

            if (!Email.IsMatch(e.Arguments[1]))
            {
                e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":The specified e-mail address is invalid.");
                return;
            }

            byte[] password = Password.Hash(e.Arguments[0]);
            if (password == null)
            {
                e.User.SendNumeric(Numerics.ERR_COMPUTEHASH, CMD, ":Unable to computer password hash.");
                return;
            }

            if (!e.User.Register(password, e.Arguments[1]))
            {
                e.User.SendNumeric(Numerics.ERR_ALREADYREGISTERED, ":You are already registered.");
                return;
            }

            if (e.User.Level == Authorizations.NetworkOperator && !e.Server.NetworkOperators.Contains(e.User))
            {
                e.Server.NetworkOperators.Add(e.User);
            }
        }
Exemple #33
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 2)
            {
                e.User.SendNumeric(Numerics.ERR_NEEDMOREPARAMS, CMD, ":Syntax: /register <password> <e-mail>");
                return;
            }

            if (e.Arguments[0].Length < 7)
            {
                e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":Your password must be at least seven characters in length.");
                return;
            }

            if (!Email.IsMatch(e.Arguments[1]))
            {
                e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":The specified e-mail address is invalid.");
                return;
            }

            byte[] password = Password.Hash(e.Arguments[0]);
            if (password == null)
            {
                e.User.SendNumeric(Numerics.ERR_COMPUTEHASH, CMD, ":Unable to computer password hash.");
                return;
            }

            if (!e.User.Register(password, e.Arguments[1]))
            {
                e.User.SendNumeric(Numerics.ERR_ALREADYREGISTERED, ":You are already registered.");
                return;
            }

            if (e.User.Level == Authorizations.NetworkOperator && !e.Server.NetworkOperators.Contains(e.User))
            {
                e.Server.NetworkOperators.Add(e.User);
            }
        }
Exemple #34
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            string id = e.Arguments[0].ToLower();
            if ("#&".Contains(id[0]))
            {
                e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":You cannot drop an unregistered channel.");
                return;
            }
            else if (".!".Contains(id[0]))
            {
                ChannelSurrogate channel = e.Server.GetRegisteredChannel(id);
                if (channel == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, id, ":That channel is not registered.");
                    return;
                }

                if (e.User.Level < Authorizations.NetworkOperator)
                {
                    e.User.SendNumeric(Numerics.ERR_CHANOPPRIVSNEEDED, channel.Name, ":You must be a channel owner or IRCop to drop a channel.");
                    return;
                }

                if (channel is ChannelBase)
                {
                    ChannelBase cb = (ChannelBase)channel;
                    foreach (UserBase u in cb.Users.Values)
                    {
                        u.SendCommand("KICK", e.User.Mask, cb.Name, u.Mask.Nickname, "Channel dropped.");
                    }
                    cb.Dispose();
                }

                e.Server.Cache.Channels.Remove(id);

                e.User.SendNumeric(Numerics.RPL_CHANNELDROPPED, id, ":That channel was dropped.");
            }
            else if (id != e.User.Mask.Account && e.User.Level < Authorizations.NetworkOperator)
            {
                e.User.SendNumeric(Numerics.ERR_NOPRIVILEGES, ":You need to be logged in as that user or be an IRCop to drop that account.");
                return;
            }
            else
            {
                UserSurrogate user = e.Server.GetRegisteredUser(id);
                if (user == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHACCOUNT, id, ":That account does not exist.");
                    return;
                }

                user.Level = Authorizations.Unregistered;
                user.Commit();

                if (user is UserBase)
                {
                    e.User.SendNumeric(Numerics.RPL_ACCOUNTDROPPED, id, ":Your account was dropped.");
                }

                if (user != e.User)
                {
                    e.User.SendNumeric(Numerics.RPL_ACCOUNTDROPPED, id, ":That account was dropped.");
                }
            }
        }
Exemple #35
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            if (!e.Server.IsValidChannel(e.Arguments[0]))
            {
                e.User.SendNumeric(Numerics.ERR_BADCHANMASK, e.Arguments[0], ":That is an invalid channel mask.");
                return;
            }

            ChannelBase channel = e.Server.GetChannel(e.Arguments[0]);
            if (channel == null || (channel.HasFlag("Secret") && !e.User.IsVoice(channel) && e.User.GetChannel(channel.Name) == null))
            {
                e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel does not exist.");
                return;
            }

            if (e.Arguments.Length > 1)
            {
                if (!e.User.IsOperator(channel))
                {
                    if (channel.HasFlag("TopicLock"))
                    {
                        e.User.SendNumeric(Numerics.ERR_CHANOPPRIVSNEEDED, channel.Name, ":You must be an operator or higher to change the topic.");
                        return;
                    }
                    else if (!e.User.CanSendToChannel(channel, false, "change the topic"))
                    {
                        return;
                    }
                }

                string topic = e.Arguments[1];
                if (string.IsNullOrWhiteSpace(topic) || topic == "-")
                {
                    topic = string.Empty;
                    if (channel.Properties.ContainsKey("Topic"))
                    {
                        channel.Properties.Remove("Topic");
                        channel.Commit();
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    int max = e.Server.Settings.MaximumTopicLength;
                    if (topic.Length > max)
                    {
                        topic = topic.Remove(max);
                    }

                    channel.Properties["Topic"] = topic;
                    channel.Commit();
                }

                channel.BroadcastInclusive(CMD, e.User, channel.Name, topic);
            }
            else
            {
                if (channel.Properties.ContainsKey("Topic"))
                {
                    e.User.SendNumeric(Numerics.RPL_TOPIC, channel.Name, ":" + (string)channel.Properties["Topic"]);
                }
                else
                {
                    e.User.SendNumeric(Numerics.RPL_NOTOPIC, channel.Name, ":No topic set.");
                }
            }
        }
Exemple #36
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     // TODO: Implement SUMMON.
     e.User.SendNumeric(Numerics.ERR_SUMMONDISABLED, e.Command, ":SUMMON is disabled on this server.");
 }
Exemple #37
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            if (e.User.Level != Authorizations.Connecting)
            {
                e.User.ErrorAlreadyRegistered(CMD);
            }

            e.User.SetSessionFlag("WaitForCap");

            switch (e.Arguments[0].ToUpper())
            {
            case "LS":
                e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, "LS", SUPPORTED_STRING);
                break;

            case "REQ":
                if (e.Arguments.Length < 2)
                {
                    e.User.ErrorNeedMoreParams(CMD);
                    break;
                }
                for (int i = 1; i < e.Arguments.Length; i++)
                {
                    string[] tok = e.Arguments[i].ToLower().Split(' ');
                    for (int n = 0; n < tok.Length; n++)
                    {
                        if (SUPPORTED_ARRAY.Contains(tok[n]))
                        {
                            e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, "ACK", ":" + tok[n]);
                            switch (tok[n])
                            {
                            case "multi-prefix":
                                e.User.SetSessionFlag("MultiPrefix");
                                break;

                            case "sasl":
                                e.User.SetSessionFlag("SaslRequested");
                                break;
                            }
                        }
                        else
                        {
                            e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, "NAK", ":" + tok[n]);
                        }
                    }
                }
                break;

            case "END":
                if (e.User.Level == Authorizations.Connecting || e.User.ClearSessionFlag("SaslWaitForCapEnd"))
                {
                    e.User.ClearSessionFlag("WaitForCap");
                    if (e.User.HasSessionFlag("PassedUser") && e.User.HasSessionFlag("PassedNick"))
                    {
                        e.User.ClearSessionFlag("PassedUser");
                        e.User.ClearSessionFlag("PassedNick");
                        e.User.OnConnected();
                    }
                }
                else
                {
                    e.User.ErrorAlreadyRegistered(CMD);
                }
                break;
            }
        }
Exemple #38
0
 private void EventReceivedCommand(List<string> iCommand)
 {
     //返すデータの設定
     ReceivedCommandEventArgs e = new ReceivedCommandEventArgs();
     e.Command = iCommand;
     //イベントの発生
     OnReceivedCommand(e);
 }
Exemple #39
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     e.User.ReplyUsers();
 }
Exemple #40
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            UserBase user = e.Server.GetUser(e.Arguments[0]);

            if (user == null)
            {
                e.User.SendNumeric(Numerics.ERR_NOSUCHNICK, e.Arguments[0], ":That user is not online.");
                return;
            }

            e.User.SendNumeric(Numerics.RPL_WHOISUSER, user.Mask.Nickname, user.Mask.Username, user.Mask.Hostname, "*", ":" + user.Gecos);

            // TODO: RPL_WHOISSERVER

            switch (e.User.Level)
            {
            case Authorizations.NetworkOperator:
                e.User.SendNumeric(Numerics.RPL_WHOISOPERATOR, user.Mask.Nickname, ":is a network operator.");
                break;

            case Authorizations.Service:
                e.User.SendNumeric(Numerics.RPL_WHOISOPERATOR, user.Mask.Nickname, ":is a network service.");
                break;
            }

            StringBuilder channels = new StringBuilder();

            foreach (ChannelBase c in user.Channels.Values)
            {
                if (e.User.Level < Authorizations.NetworkOperator && c.HasFlag("Secret") && !e.User.IsVoice(c) && !e.User.Channels.ContainsKey(c.Id))
                {
                    continue;
                }

                if (channels.Length > 0)
                {
                    channels.Append(' ');
                }

                string prefix = c.GetPrefix(user);
                if (!string.IsNullOrEmpty(prefix))
                {
                    if (e.User.HasSessionFlag("MultiPrefix"))
                    {
                        channels.Append(prefix);
                    }
                    else
                    {
                        channels.Append(prefix[0]);
                    }
                }

                channels.Append(c.Name);
            }
            if (channels.Length > 0)
            {
                e.User.SendNumeric(Numerics.RPL_WHOISCHANNELS, user.Mask.Nickname, ":" + channels.ToString());
            }

            if (user.Level >= Authorizations.Registered)
            {
                e.User.SendNumeric(Numerics.RPL_WHOISACCOUNT, user.Mask.Nickname, user.Mask.Account, ":is logged in as");
            }

            e.User.SendNumeric(Numerics.RPL_ENDOFWHOIS, user.Mask.Nickname, ":End of user information.");
        }
Exemple #41
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            if (e.User.Level != Authorizations.Connecting)
            {
                e.User.ErrorAlreadyRegistered(CMD);
            }

            e.User.SetSessionFlag("WaitForCap");

            switch (e.Arguments[0].ToUpper())
            {
            case "LS":
                e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, "LS", SUPPORTED_STRING);
                break;

            case "REQ":
                if (e.Arguments.Length < 2)
                {
                    e.User.ErrorNeedMoreParams(CMD);
                    break;
                }
                for (int i = 1; i < e.Arguments.Length; i++)
                {
                    string[] tok = e.Arguments[i].ToLower().Split(' ');
                    for (int n = 0; n < tok.Length; n++)
                    {
                        if (SUPPORTED_ARRAY.Contains(tok[n]))
                        {
                            e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, "ACK", ":" + tok[n]);
                            switch (tok[n])
                            {
                            case "multi-prefix":
                                e.User.SetSessionFlag("MultiPrefix");
                                break;

                            case "sasl":
                                e.User.SetSessionFlag("SaslRequested");
                                break;
                            }
                        }
                        else
                        {
                            e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, "NAK", ":" + tok[n]);
                        }
                    }
                }
                break;

            case "END":
                if (e.User.Level == Authorizations.Connecting || e.User.ClearSessionFlag("SaslWaitForCapEnd"))
                {
                    e.User.ClearSessionFlag("WaitForCap");
                    if (e.User.HasSessionFlag("PassedUser") && e.User.HasSessionFlag("PassedNick"))
                    {
                        e.User.ClearSessionFlag("PassedUser");
                        e.User.ClearSessionFlag("PassedNick");
                        e.User.OnConnected();
                    }
                }
                else
                {
                    e.User.ErrorAlreadyRegistered(CMD);
                }
                break;
            }
        }
Exemple #42
0
        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);
                }
            }
        }
Exemple #43
0
        private void Forward(ReceivedCommandEventArgs e, ChannelBase from)
        {
            if (from.Properties.ContainsKey("Forward"))
            {
                ChannelBase channel = e.Server.GetChannel((string)from.Properties["Forward"]);
                if (channel == null)
                {
                    return;
                }
                else
                {
                    e.User.SendNumeric(Numerics.RPL_SUMMONING, CMD, from.Name, ":Forwarding to", channel.Name, "due to restricted access.");

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

                    if (channel.Properties.ContainsKey("Key"))
                    {
                        e.User.SendNumeric(Numerics.ERR_KEYSET, CMD, channel.Name, ":Key not specified for channel.");
                        return;
                    }

                    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, channel.Name, ":That channel is marked invite-only.");
                                return;
                            }
                        }
                    }

                    if (!e.User.IsVoice(channel))
                    {
                        bool except = false;
                        for (int m = 0; m < channel.Exceptions.Count; m++)
                        {
                            if (e.User.Mask.Matches(channel.Exceptions[m]))
                            {
                                except = true;
                                break;
                            }
                        }
                        if (!except)
                        {
                            bool banned = false;
                            for (int m = 0; m < channel.Bans.Count; m++)
                            {
                                if (e.User.Mask.Matches(channel.Bans[m]))
                                {
                                    banned = true;
                                    break;
                                }
                            }
                            if (banned)
                            {
                                e.User.SendNumeric(Numerics.ERR_BANNEDFROMCHAN, CMD, channel.Name, ":You are banned from that channel.");
                                return;
                            }
                        }
                    }
                }

                if (!e.User.AddToChannel(channel))
                {
                    e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, CMD, channel.Name, ":Unknown error occurred while joining channel.");
                }

                OnJoin(channel, e.User);
            }
        }
Exemple #44
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            if (!e.Server.IsValidChannel(e.Arguments[0]))
            {
                e.User.SendNumeric(Numerics.ERR_BADCHANMASK, e.Arguments[0], ":That is an invalid channel mask.");
                return;
            }

            ChannelBase channel = e.Server.GetChannel(e.Arguments[0]);

            if (channel == null || (channel.HasFlag("Secret") && !e.User.IsVoice(channel) && e.User.GetChannel(channel.Name) == null))
            {
                e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel does not exist.");
                return;
            }

            if (e.Arguments.Length > 1)
            {
                if (!e.User.IsOperator(channel))
                {
                    if (channel.HasFlag("TopicLock"))
                    {
                        e.User.SendNumeric(Numerics.ERR_CHANOPPRIVSNEEDED, channel.Name, ":You must be an operator or higher to change the topic.");
                        return;
                    }
                    else if (!e.User.CanSendToChannel(channel, false, "change the topic"))
                    {
                        return;
                    }
                }

                string topic = e.Arguments[1];
                if (string.IsNullOrWhiteSpace(topic) || topic == "-")
                {
                    topic = string.Empty;
                    if (channel.Properties.ContainsKey("Topic"))
                    {
                        channel.Properties.Remove("Topic");
                        channel.Commit();
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    int max = e.Server.Settings.MaximumTopicLength;
                    if (topic.Length > max)
                    {
                        topic = topic.Remove(max);
                    }

                    channel.Properties["Topic"] = topic;
                    channel.Commit();
                }

                channel.BroadcastInclusive(CMD, e.User, channel.Name, topic);
            }
            else
            {
                if (channel.Properties.ContainsKey("Topic"))
                {
                    e.User.SendNumeric(Numerics.RPL_TOPIC, channel.Name, ":" + (string)channel.Properties["Topic"]);
                }
                else
                {
                    e.User.SendNumeric(Numerics.RPL_NOTOPIC, channel.Name, ":No topic set.");
                }
            }
        }
Exemple #45
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     // TODO: Implement SUMMON.
     e.User.SendNumeric(Numerics.ERR_SUMMONDISABLED, e.Command, ":SUMMON is disabled on this server.");
 }
Exemple #46
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     e.User.SendCommand("NOTICE", e.Server.Id, e.User.Mask.Nickname, "Hotswapping core and all modules.");
     e.Server.Domains.Reload();
 }
Exemple #47
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     // TODO: Implement command
     e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":That command is not yet implemented.");
 }
Exemple #48
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }
            string nickname = e.Arguments[0];

            if (e.User.Mask.Nickname != "*")
            {
                e.User.ErrorAlreadyRegistered(CMD);
                return;
            }

            if (!e.User.ValidateNickname(nickname))
            {
                // ValidateNickname will send the numeric.
                return;
            }

            if (e.Server.IsQLined(nickname))
            {
                e.User.SendNumeric(Numerics.ERR_NICKCOLLISION, nickname, ":That nickname is invalid.");
                return;
            }

            string id = nickname.ToLower();
            if (e.Server.UsersById.ContainsKey(id))
            {
                e.User.SendNumeric(Numerics.ERR_NICKNAMEINUSE, nickname, ":That nickname is already in use.");
                return;
            }

            if (e.User.Level != Authorizations.Connecting)
            {
                e.User.BroadcastInclusive("NICK", e.User.Mask.Nickname, nickname);

                e.User.Mask.Nickname = nickname;

                e.Server.UsersById.Remove(e.User.Id);
                e.User.Id = id;
                e.Server.UsersById.Add(e.User.Id, e.User);
            }
            else
            {
                foreach (ChannelBase c in e.User.Channels.Values)
                {
                    if (!e.User.CanSendToChannel(c, true, "change your nickname"))
                    {
                        return;
                    }
                }

                e.User.Mask.Nickname = nickname;
                e.User.Id = id;

                if (e.User.HasSessionFlag("PassedUser") && !e.User.HasSessionFlag("WaitForCap"))
                {
                    e.User.ClearSessionFlag("PassedUser");
                    e.User.OnConnected();
                }
                else
                {
                    e.User.SetSessionFlag("PassedNick");
                }
            }
        }
Exemple #49
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }
            string nickname = e.Arguments[0];

            if (e.User.Mask.Nickname != "*")
            {
                e.User.ErrorAlreadyRegistered(CMD);
                return;
            }

            if (!e.User.ValidateNickname(nickname))
            {
                // ValidateNickname will send the numeric.
                return;
            }

            if (e.Server.IsQLined(nickname))
            {
                e.User.SendNumeric(Numerics.ERR_NICKCOLLISION, nickname, ":That nickname is invalid.");
                return;
            }

            string id = nickname.ToLower();

            if (e.Server.UsersById.ContainsKey(id))
            {
                e.User.SendNumeric(Numerics.ERR_NICKNAMEINUSE, nickname, ":That nickname is already in use.");
                return;
            }

            if (e.User.Level != Authorizations.Connecting)
            {
                e.User.BroadcastInclusive("NICK", e.User.Mask.Nickname, nickname);

                e.User.Mask.Nickname = nickname;

                e.Server.UsersById.Remove(e.User.Id);
                e.User.Id = id;
                e.Server.UsersById.Add(e.User.Id, e.User);
            }
            else
            {
                foreach (ChannelBase c in e.User.Channels.Values)
                {
                    if (!e.User.CanSendToChannel(c, true, "change your nickname"))
                    {
                        return;
                    }
                }

                e.User.Mask.Nickname = nickname;
                e.User.Id            = id;

                if (e.User.HasSessionFlag("PassedUser") && !e.User.HasSessionFlag("WaitForCap"))
                {
                    e.User.ClearSessionFlag("PassedUser");
                    e.User.OnConnected();
                }
                else
                {
                    e.User.SetSessionFlag("PassedNick");
                }
            }
        }
Exemple #50
0
 protected virtual void OnReceivedCommand(ReceivedCommandEventArgs e)
 {
     if (ReceivedCommand != null)
     {
         ReceivedCommand(this, e);
     }
 }
Exemple #51
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.SendNumeric(Numerics.ERR_NEEDMOREPARAMS, CMD, SYNTAX);
                return;
            }

            if (Protocol.CHANNEL_PREFIX_CHARS.Contains(e.Arguments[0][0]))
            {
                ChannelSurrogate target = e.Server.GetRegisteredChannel(e.Arguments[0]);
                if (target == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel is not registered.");
                    return;
                }

                if (e.Arguments.Length < 2)
                {
                    SendMeta(e.User, target.Name, e.User.IsOwner(target) || e.User.Level >= Authorizations.NetworkOperator, target.Flags, target.Properties);
                }
                else
                {
                    char   dir = e.Arguments[1][0];
                    string key;
                    if ((dir != '-' && dir != '+') || e.Arguments[1].Length < 2)
                    {
                        key = e.Arguments[1];
                        dir = '+';
                    }
                    else
                    {
                        key = e.Arguments[1].Substring(1);
                    }
                    if (key[0] != ':')
                    {
                        key = ":" + key;
                    }

                    if (e.Arguments.Length < 3)
                    {
                        SetFlag(e.User, dir, key, target.Flags, target.Properties);
                    }
                    else
                    {
                        SetProperty(e.User, dir, key, target.Flags, target.Properties, e.Arguments[2]);
                    }
                    target.Commit();
                }
            }
            else
            {
                UserSurrogate target = e.Server.GetRegisteredUser(e.Arguments[0]);
                if (target == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHACCOUNT, e.Arguments[0], ":That account is not registered.");
                    return;
                }

                if (e.Arguments.Length < 2)
                {
                    SendMeta(e.User, target.Mask.Account, e.User.Mask.Account == e.Arguments[0].ToLower() || e.User.Level >= Authorizations.NetworkOperator, target.Flags, target.Properties);
                }
                else
                {
                    char   dir = e.Arguments[1][0];
                    string key;
                    if ((dir != '-' && dir != '+') || e.Arguments[1].Length < 2)
                    {
                        key = e.Arguments[1];
                        dir = '+';
                    }
                    else
                    {
                        key = e.Arguments[1].Substring(1);
                    }
                    if (key[0] != ':')
                    {
                        key = ":" + key;
                    }

                    if (e.Arguments.Length < 3)
                    {
                        SetFlag(e.User, dir, key, target.Flags, target.Properties);
                    }
                    else
                    {
                        SetProperty(e.User, dir, key, target.Flags, target.Properties, e.Arguments[2]);
                    }
                    target.Commit();
                }
            }
        }
Exemple #52
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.SendNumeric(Numerics.ERR_NEEDMOREPARAMS, CMD, SYNTAX);
                return;
            }

            if (Protocol.CHANNEL_PREFIX_CHARS.Contains(e.Arguments[0][0]))
            {
                ChannelSurrogate target = e.Server.GetRegisteredChannel(e.Arguments[0]);
                if (target == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel is not registered.");
                    return;
                }

                if (e.Arguments.Length < 2)
                {
                    SendMeta(e.User, target.Name, e.User.IsOwner(target) || e.User.Level >= Authorizations.NetworkOperator, target.Flags, target.Properties);
                }
                else
                {
                    char dir = e.Arguments[1][0];
                    string key;
                    if ((dir != '-' && dir != '+') || e.Arguments[1].Length < 2)
                    {
                        key = e.Arguments[1];
                        dir = '+';
                    }
                    else
                    {
                        key = e.Arguments[1].Substring(1);
                    }
                    if (key[0] != ':')
                    {
                        key = ":" + key;
                    }

                    if (e.Arguments.Length < 3)
                    {
                        SetFlag(e.User, dir, key, target.Flags, target.Properties);
                    }
                    else
                    {
                        SetProperty(e.User, dir, key, target.Flags, target.Properties, e.Arguments[2]);
                    }
                    target.Commit();
                }
            }
            else
            {
                UserSurrogate target = e.Server.GetRegisteredUser(e.Arguments[0]);
                if (target == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHACCOUNT, e.Arguments[0], ":That account is not registered.");
                    return;
                }

                if (e.Arguments.Length < 2)
                {
                    SendMeta(e.User, target.Mask.Account, e.User.Mask.Account == e.Arguments[0].ToLower() || e.User.Level >= Authorizations.NetworkOperator, target.Flags, target.Properties);
                }
                else
                {
                    char dir = e.Arguments[1][0];
                    string key;
                    if ((dir != '-' && dir != '+') || e.Arguments[1].Length < 2)
                    {
                        key = e.Arguments[1];
                        dir = '+';
                    }
                    else
                    {
                        key = e.Arguments[1].Substring(1);
                    }
                    if (key[0] != ':')
                    {
                        key = ":" + key;
                    }

                    if (e.Arguments.Length < 3)
                    {
                        SetFlag(e.User, dir, key, target.Flags, target.Properties);
                    }
                    else
                    {
                        SetProperty(e.User, dir, key, target.Flags, target.Properties, e.Arguments[2]);
                    }
                    target.Commit();
                }
            }
        }
Exemple #53
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     // TODO: Implement command
     e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":That command is not yet implemented.");
 }
Exemple #54
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }
            else if (e.Arguments.Length < 2)
            {
                ChannelBase channel = e.User.GetChannel(e.Arguments[0]);
                if (channel == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, e.Arguments[0], ":You are not on that channel.");
                    return;
                }

                e.User.SendNumeric(Numerics.RPL_CHANNELMODEIS, channel.Name, channel.GetModeString());
                return;
            }

            string args;

            if (e.Arguments.Length > 2)
            {
                args = string.Join(" ", e.Arguments, 2, e.Arguments.Length - 2);
            }
            else
            {
                args = string.Empty;
            }

            foreach (string t in e.Arguments[0].Split(','))
            {
                try
                {
                    if (".!#&".Contains(t[0]))
                    {
                        ChannelBase channel = e.User.GetChannel(t);
                        if (channel == null)
                        {
                            e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, t, ":You are not on that channel.");
                            return;
                        }

                        channel.SetModes(e.User, e.Arguments[1], args);
                    }
                    else if (t.ToLower() != e.User.Id)
                    {
                        e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, ":You can only set user mode flags on yourself.");
                    }
                    else
                    {
                        e.User.SetModes(e.User, e.Arguments[1], args);
                    }
                }
                catch (Exception ex)
                {
                    e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":Error setting mode:", ex.Message);
                }
            }
        }
Exemple #55
0
 public void Handler(object sender, ReceivedCommandEventArgs e)
 {
     e.User.ReplyVersion();
 }
Exemple #56
0
        public void Handler(object sender, ReceivedCommandEventArgs e)
        {
            if (e.Arguments.Length < 1)
            {
                e.User.ErrorNeedMoreParams(CMD);
                return;
            }

            string id = e.Arguments[0].ToLower();

            if ("#&".Contains(id[0]))
            {
                e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":You cannot drop an unregistered channel.");
                return;
            }
            else if (".!".Contains(id[0]))
            {
                ChannelSurrogate channel = e.Server.GetRegisteredChannel(id);
                if (channel == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, id, ":That channel is not registered.");
                    return;
                }

                if (e.User.Level < Authorizations.NetworkOperator)
                {
                    e.User.SendNumeric(Numerics.ERR_CHANOPPRIVSNEEDED, channel.Name, ":You must be a channel owner or IRCop to drop a channel.");
                    return;
                }

                if (channel is ChannelBase)
                {
                    ChannelBase cb = (ChannelBase)channel;
                    foreach (UserBase u in cb.Users.Values)
                    {
                        u.SendCommand("KICK", e.User.Mask, cb.Name, u.Mask.Nickname, "Channel dropped.");
                    }
                    cb.Dispose();
                }

                e.Server.Cache.Channels.Remove(id);

                e.User.SendNumeric(Numerics.RPL_CHANNELDROPPED, id, ":That channel was dropped.");
            }
            else if (id != e.User.Mask.Account && e.User.Level < Authorizations.NetworkOperator)
            {
                e.User.SendNumeric(Numerics.ERR_NOPRIVILEGES, ":You need to be logged in as that user or be an IRCop to drop that account.");
                return;
            }
            else
            {
                UserSurrogate user = e.Server.GetRegisteredUser(id);
                if (user == null)
                {
                    e.User.SendNumeric(Numerics.ERR_NOSUCHACCOUNT, id, ":That account does not exist.");
                    return;
                }

                user.Level = Authorizations.Unregistered;
                user.Commit();

                if (user is UserBase)
                {
                    e.User.SendNumeric(Numerics.RPL_ACCOUNTDROPPED, id, ":Your account was dropped.");
                }

                if (user != e.User)
                {
                    e.User.SendNumeric(Numerics.RPL_ACCOUNTDROPPED, id, ":That account was dropped.");
                }
            }
        }