예제 #1
0
        private void HandleListChannels(string Sender, string[] Params)
        {
            MySqlCommand    Cmd          = new MySqlCommand("SELECT * FROM " + Config.SQLTablePrefix + "networks ORDER BY id", m_ParentServer.MyDBConn.Connection);
            MySqlDataReader DataReader   = Cmd.ExecuteReader();
            DataTable       NetworkTable = new DataTable();

            NetworkTable.Load(DataReader);
            DataReader.Close();
            Cmd        = new MySqlCommand("SELECT * FROM " + Config.SQLTablePrefix + "channels ORDER BY id", m_ParentServer.MyDBConn.Connection);
            DataReader = Cmd.ExecuteReader();
            DataTable ChannelTable = new DataTable();

            ChannelTable.Load(DataReader);
            DataReader.Close();
            m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List of Channels:"));
            foreach (DataRow CurNetwork in NetworkTable.Rows)
            {
                m_ParentServer.Send(
                    IRCFunctions.PrivMsg(
                        IRCFunctions.GetNickFromHostString(Sender),
                        String.Format("     Network {0} - {1} ({2}:{3}) as {4}/{5} ({6})",
                                      CurNetwork["id"], CurNetwork["name"], CurNetwork["server"], CurNetwork["port"], CurNetwork["nickname"], CurNetwork["altnickname"], CurNetwork["realname"]
                                      )));
                foreach (DataRow CurChannel in ChannelTable.Rows)
                {
                    if (Convert.ToInt32(CurChannel["network"]) == Convert.ToInt32(CurNetwork["id"]))
                    {
                        m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), String.Format("          Channel {0} - {1}", CurChannel["id"], CurChannel["name"])));
                    }
                }
            }
        }
예제 #2
0
        private void HandleAddChannel(string Sender, string[] Params)
        {
            // !add channel 1 #channel [Password]
            List <string> NewParamList = new List <string>();
            string        NewParams    = Functions.CombineAfterIndex(Params, " ", 2);

            if (NewParams.Length > 4)                                           // Shortest possible parameters. IE: "1 #A"
            // Parse through the parameters and populate NewParamList
            {
                NewParamList = Functions.Parameterize(NewParams);
                if (!((NewParamList.Count == 2) || (NewParamList.Count == 3)))
                {
                    NewParamList = null;
                }
                if (NewParamList == null)
                {
                    m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Invalid Command Syntax."));
                }
                else
                {
                    // Time to add the new network
                    MySqlCommand Cmd = new MySqlCommand("SELECT * FROM `" + Config.SQLTablePrefix + "networks` WHERE id = @netid", m_ParentServer.MyDBConn.Connection);
                    Cmd.Prepare();
                    Cmd.Parameters.AddWithValue("@netid", NewParamList[0]);
                    int MatchingNetworkIDs = Convert.ToInt32(Cmd.ExecuteScalar());
                    if (MatchingNetworkIDs > 0)
                    {
                        Cmd = new MySqlCommand("INSERT INTO `" + Config.SQLTablePrefix + "channels` (`networkid`, `name`, `password`, `autorejoin`, `statsenabled`, `lastscanid`) VALUES (@netid, @channame, @password, @autorejoin, @statsenabled, @lastscanid)", m_ParentServer.MyDBConn.Connection);
                        Cmd.Prepare();
                        Cmd.Parameters.AddWithValue("@netid", NewParamList[0]);
                        Cmd.Parameters.AddWithValue("@channame", NewParamList[1]);
                        if (NewParamList.Count == 3)
                        {
                            Cmd.Parameters.AddWithValue("@password", NewParamList[2]);
                        }
                        else
                        {
                            Cmd.Parameters.AddWithValue("@password", null);
                        }
                        Cmd.Parameters.AddWithValue("@autorejoin", 1);
                        Cmd.Parameters.AddWithValue("@statsenabled", 1);
                        Cmd.Parameters.AddWithValue("@lastscanid", 0);
                        int ReturnVal = Cmd.ExecuteNonQuery();
                        if (ReturnVal == 1)
                        {
                            m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Successfully added channel: " + NewParamList[1]));
                            m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "     Use \"!list channels\" to see more info."));
                        }
                        else
                        {
                            m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Something went wrong. :("));
                        }
                    }
                    else
                    {
                        m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Invalid Network ID. Use \"!list networks\" to see a list of networks and their IDs."));
                    }
                }
            }
        }
예제 #3
0
 public void Part(string Sender, string Message)
 {
     if (m_Users.Contains(IRCFunctions.GetNickFromHostString(Sender).ToLower()))
     {
         m_Users.Remove(IRCFunctions.GetNickFromHostString(Sender).ToLower());
     }
     LastMessageText = "PART: " + Sender; LastMessageTime = DateTime.UtcNow;
 }
예제 #4
0
 public void CheckAdminChange(string Sender, string NewNick)
 {
     if (m_Administrators.Contains(Sender))
     {
         m_Administrators.Remove(Sender);
         m_Administrators.Add(NewNick + "!" + IRCFunctions.GetUserFromHostString(Sender, false) + "@" + IRCFunctions.GetHostFromHostString(Sender));
     }
 }
예제 #5
0
 public void HandleNotice(string Sender, string[] Params)
 {
     if (IRCFunctions.GetNickFromHostString(Sender) == "NickServ")
     {
         // If it's NickServ and it looks like an identify request, then identify.
         if ((Array.IndexOf(Params, "nickname") > 0) && (Array.IndexOf(Params, "is") > 0) && ((Array.IndexOf(Params, "registered") > 0) || (Array.IndexOf(Params, "registered.") > 0)))
         {
             m_ParentServer.Send(IRCFunctions.PrivMsg("NickServ", "identify " + Config.NickPass));
         }
     }
 }
예제 #6
0
 private void HandleLogout(string Sender, string[] Params)
 {
     if (m_Administrators.Contains(Sender))
     {
         m_Administrators.Remove(Sender);
         m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "You have been logged out."));
     }
     else
     {
         m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "You are not logged in."));
     }
 }
예제 #7
0
        private void HandleAddNetwork(string Sender, string[] Params)
        {
            // !add network "Some Network Name" irc.somenetwork.net 6667 "Real Name" Nick1 Nick2 [Server Password]
            List <string> NewParamList = new List <string>();
            string        NewParams    = Functions.CombineAfterIndex(Params, " ", 2);

            if (NewParams.Length > 11)                                          // Shortest possible parameters. IE: "A B 1 C D E"
            // Parse through the parameters and populate NewParamList
            {
                NewParamList = Functions.Parameterize(NewParams);
                if (!((NewParamList.Count == 6) || (NewParamList.Count == 7)))
                {
                    NewParamList = null;
                }
                if (NewParamList == null)
                {
                    m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Invalid Command Syntax."));
                }
                else
                {
                    // Time to add the new network
                    MySqlCommand Cmd = new MySqlCommand("INSERT INTO `" + Config.SQLTablePrefix + "networks` (`name`, `server`, `port`, `password`, `realname`, `nickname`, `altnickname`) VALUES (@netname, @server, @port, @password, @realname, @nickname, @altnickname)", m_ParentServer.MyDBConn.Connection);
                    Cmd.Prepare();
                    Cmd.Parameters.AddWithValue("@netname", NewParamList[0]);
                    Cmd.Parameters.AddWithValue("@server", NewParamList[1]);
                    Cmd.Parameters.AddWithValue("@port", Convert.ToInt32(NewParamList[2]));
                    if (NewParamList.Count == 7)
                    {
                        Cmd.Parameters.AddWithValue("@password", NewParamList[6]);
                    }
                    else
                    {
                        Cmd.Parameters.AddWithValue("@password", null);
                    }
                    Cmd.Parameters.AddWithValue("@realname", NewParamList[3]);
                    Cmd.Parameters.AddWithValue("@nickname", NewParamList[4]);
                    Cmd.Parameters.AddWithValue("@altnickname", NewParamList[5]);
                    int ReturnVal = Cmd.ExecuteNonQuery();
                    if (ReturnVal == 1)
                    {
                        m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Successfully added network: " + NewParamList[0]));
                        m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "     Use \"!list networks\" to see more info."));
                    }
                    else
                    {
                        m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Something went wrong. :("));
                    }
                }
            }
        }
예제 #8
0
 private void HandleListAdmins(string Sender, string[] Params)
 {
     if (m_Administrators.Count == 0)
     {
         m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "No current Administrators."));
     }
     else
     {
         m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List of Administrators:"));
         foreach (string CurAdmin in m_Administrators)
         {
             m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "     " + CurAdmin));
         }
     }
 }
예제 #9
0
 public void Kick(string Sender, string PersonKicked, string KickMsg)
 {
     if (m_Users.Contains(PersonKicked.ToLower()))
     {
         m_Users.Remove(PersonKicked.ToLower());
     }
     LastMessageText = "KICK: " + Sender + " kicked " + PersonKicked + " (" + KickMsg + ")"; LastMessageTime = DateTime.UtcNow;
     if (PersonKicked == m_ParentServer.Nick)
     {
         if (m_AutoRejoin)
         {
             // If I was kicked and autorejoin is enabled.
             m_ParentServer.Send(IRCFunctions.Join(m_Name, m_Password));
         }
     }
 }
예제 #10
0
 public void Join(string Sender)
 {
     if (IRCFunctions.GetNickFromHostString(Sender) == m_ParentServer.Nick)
     {
         JoinMe();
     }
     if (!m_Users.Contains(IRCFunctions.GetNickFromHostString(Sender).ToLower()))
     {
         m_Users.Add(IRCFunctions.GetNickFromHostString(Sender).ToLower());
     }
     else
     {
         AppLog.WriteLine(1, "ERROR", "User " + Sender + " tried to join channel. IRC let it happen, but they're already in my userlist. Why?");
     }
     LastMessageText = "JOIN: " + Sender; LastMessageTime = DateTime.UtcNow;
 }
예제 #11
0
 public void Nick(string Sender, string NewNick)
 {
     if (m_Users.Contains(IRCFunctions.GetNickFromHostString(Sender).ToLower()))
     {
         m_Users.Remove(IRCFunctions.GetNickFromHostString(Sender).ToLower());
         if (!m_Users.Contains(NewNick.ToLower()))
         {
             m_Users.Add(NewNick.ToLower());
         }
         else
         {
             AppLog.WriteLine(1, "ERROR", "User " + Sender + " tried to change nick to " + NewNick + ". IRC let it happen, but it's still in my userlist. Why?");
         }
     }
     LastMessageText = "NICK: " + Sender + " => " + NewNick; LastMessageTime = DateTime.UtcNow;
 }
예제 #12
0
        public void ProcessLog(string Data)
        {
            TextReader LogTextReader = new StringReader(Data);
            string     CurLine;
            int        i          = 0;
            DateTime   StartOfDay = DateTime.MinValue;
            DateTime   Timestamp  = DateTime.MinValue;

            while ((CurLine = LogTextReader.ReadLine()) != null)
            {
                if (CurLine.Substring(0, 1) == "#")
                {
                    if (CurLine.Substring(0, 15) == "# Opened (UTC):")
                    {
                        string DayStr = CurLine.Substring(16);
                        StartOfDay = Convert.ToDateTime(DayStr.Substring(0, DayStr.IndexOf(' ')));
                    }
                    // Is a comment
                }
                else
                {
                    string TimeNum = CurLine.Substring(0, CurLine.IndexOf(' '));
                    Timestamp = StartOfDay.AddMilliseconds(Convert.ToDouble(TimeNum));
                    // The will return the number of whole Config.Resolution chunks that have passed since Jan 1 2014.
                    uint TimeframeID = (uint)(((Timestamp - new DateTime(2014, 1, 1)).TotalSeconds) / Config.Resolution);
                    CurLine = CurLine.Substring(TimeNum.Length + 1);
                    if (CurLine.Substring(0, 1) == ":")
                    {
                        CurLine = CurLine.Substring(1);
                        string[] ParameterSplit = CurLine.Split(" ".ToCharArray(), 3, StringSplitOptions.RemoveEmptyEntries);
                        Sender   Sender         = IRCFunctions.ParseSender(ParameterSplit[0]);
                        string   Command        = ParameterSplit[1];
                        string   Parameters     = ParameterSplit[2];
                        Network.Parse(Timestamp, TimeframeID, Sender, Command, Parameters);
                    }
                    else if (CurLine.Substring(0, 4) == "PING")
                    {
                        // Do anything here?
                    }
                    else
                    {
                        AppLog.WriteLine(5, "DEBUG", "Unknown Line Format: " + CurLine);
                    }
                }
                i++;
            }
        }
예제 #13
0
 private void HandleLogin(string Sender, string[] Params)
 {
     if (Params[1] == Config.AdminPass)
     {
         if (m_Administrators.Contains(Sender))
         {
             m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "You are already identified."));
         }
         else
         {
             m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "You are now an Administrator."));
             m_Administrators.Add(Sender);
         }
     }
     else
     {
         m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Invalid Password."));
     }
 }
예제 #14
0
 public void HandleChannels(string Sender, string[] Params)
 {
     foreach (Server CurServer in m_ParentServer.Servers)
     {
         m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Channels on " + CurServer.Hostname + ":"));
         foreach (KeyValuePair <string, Channel> CurChannel in CurServer.Channels)
         {
             if (CurChannel.Value.LastMessageTime == null)
             {
                 m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "     " + CurChannel.Value.Name + " - Never"));
             }
             else
             {
                 TimeSpan tempTS = DateTime.UtcNow.Subtract(CurChannel.Value.LastMessageTime);
                 m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "     " + CurChannel.Value.Name + " - " + Functions.MillisecondsToHumanReadable(tempTS.TotalMilliseconds) + " ago: " + CurChannel.Value.LastMessageText));
             }
         }
     }
 }
예제 #15
0
        public void Parse(string Sender, string Command, string Parameters)
        {
            //AppLog.WriteLine(5, "DEBUG", "\tSender: " + Sender);
            //AppLog.WriteLine(5, "DEBUG", "\tCommand: " + Command);
            //AppLog.WriteLine(5, "DEBUG", "\tParameters: " + Parameters);
            if (ConnectionWatchdog != null)
            {
                ConnectionWatchdog.Reset();
            }
            string[] ParamSplit = Parameters.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            switch (Command.ToUpper())
            {
            case "376":
                // RAW: 376 - RPL_ENDOFMOTD - ":End of /MOTD command"
                ConnectionWatchdog = new ConnectionWatchdog(this);
                JoinChannels();
                break;

            case "353":
                // 353 - RPL_NAMREPLY - "<channel> :[[@|+]<nick> [[@|+]<nick> [...]]]"
                for (int i = 0; i < ParamSplit.Length; i++)
                {
                    if (ParamSplit[i].Substring(0, 1) == "#")
                    {
                        // Skip to where we see the channel name.
                        string Chan = ParamSplit[i];
                        ParamSplit[i + 1] = ParamSplit[i + 1].Substring(1);
                        string[] NameArr = new string[ParamSplit.Length - i - 1];
                        Array.Copy(ParamSplit, i + 1, NameArr, 0, ParamSplit.Length - i - 1);
                        Channels[ParamSplit[i]].Names(NameArr);
                        break;
                    }
                }
                break;

            case "433":
                //433 - ERR_NICKNAMEINUSE - "<nick> :Nickname is already in use"
                Send("NICK " + m_AltNick);
                m_Nick = m_AltNick;
                break;

            case "470":
                // Channel Forward
                // :adams.freenode.net 470 SomethingKewl #windows ##windows :Forwarding to another channel
                Channel OldChannel;
                if (Channels.ContainsKey(ParamSplit[1]))
                {
                    OldChannel      = Channels[ParamSplit[1]];
                    OldChannel.Name = ParamSplit[2];
                    // Should we really remove the old channel? Does it hurt?
                    //m_Channels.Remove(ParamSplit[1]);
                    Channels.Add(OldChannel.Name, OldChannel);
                    // TODO: add code here to check for old channel and rename it.
                }
                else
                {
                    // Conceivably this could happen if you were forcejoined to a channel which then got moved.
                    OldChannel              = new Channel(this);
                    OldChannel.Name         = ParamSplit[2];
                    OldChannel.StatsEnabled = true;
                    throw new Exception("This should never happen. How is this happening? Case 470: Else");
                }
                break;

            case "JOIN":
                if (ParamSplit[0].Contains(":"))
                {
                    // Fix because some IRCds send "JOIN :#channel" instead of "JOIN #channel"
                    ParamSplit[0] = ParamSplit[0].Substring(1);
                }
                Channels[ParamSplit[0]].Join(Sender);
                break;

            case "PART":
                if (ParamSplit.Length >= 2)
                {
                    string PartMsg = Parameters.Substring(Parameters.IndexOf(":") + 1);
                    if (PartMsg.Length == 0)
                    {
                        Channels[ParamSplit[0]].Part(Sender, String.Empty);
                    }
                    else
                    {
                        if ((PartMsg.Substring(0, 1) == "\"") && (PartMsg.Substring(PartMsg.Length - 1, 1) == "\""))
                        {
                            PartMsg = PartMsg.Substring(1, PartMsg.Length - 2);
                        }
                    }
                    Channels[ParamSplit[0]].Part(Sender, PartMsg);
                }
                else
                {
                    Channels[ParamSplit[0]].Part(Sender, String.Empty);
                }
                break;

            case "KICK":
                Channels[ParamSplit[0]].Kick(Sender, ParamSplit[1], Functions.CombineAfterIndex(ParamSplit, " ", 2).Substring(1));
                break;

            case "INVITE":
                // TODO: Not sure how we want to handle this.
                break;

            case "NICK":
                if (IRCFunctions.GetNickFromHostString(Sender) == m_Nick)
                {
                    m_Nick = Parameters.Substring(1);
                }
                foreach (KeyValuePair <string, Channel> CurKVP in Channels)
                {
                    Channels[CurKVP.Key].Nick(Sender, Parameters.Substring(1));
                }
                BotCommands.CheckAdminChange(Sender, Parameters.Substring(1));
                break;

            case "QUIT":
                foreach (KeyValuePair <string, Channel> CurKVP in Channels)
                {
                    Channels[CurKVP.Key].Quit(Sender, Parameters.Substring(1));
                }
                break;

            case "TOPIC":
                string Topic = Parameters.Substring(Parameters.IndexOf(":") + 1);
                Channels[ParamSplit[0]].Topic(Sender, Topic);
                break;

            case "MODE":
                if (ParamSplit[0].Substring(0, 1) == "#")
                {
                    // Is a channel mode
                    Channels[ParamSplit[0]].Mode(Sender, Functions.CombineAfterIndex(ParamSplit, " ", 1));
                }
                else
                {
                    // Is not going to a channel. Probably me?
                }
                break;

            case "PRIVMSG":
                string MsgText = Parameters.Substring(Parameters.IndexOf(":") + 1);
                if (ParamSplit[0].Substring(0, 1) == "#")
                {
                    // Is going to a channel
                    if (MsgText.Substring(0, 1) == "\x1")
                    {
                        // If this is a special PRIVMSG, like an action or CTCP
                        MsgText = MsgText.Substring(1, MsgText.Length - 2);
                        string[] PrivMsgSplit = MsgText.Split(" ".ToCharArray(), 2);
                        switch (PrivMsgSplit[0].ToUpper())
                        {
                        case "ACTION":
                            Channels[ParamSplit[0]].Action(Sender, PrivMsgSplit[1]);
                            break;
                            // Maybe other stuff goes here like channel wide CTCPs?
                        }
                    }
                    else
                    {
                        // If this is just a normal PRIVMSG.
                        Channels[ParamSplit[0]].Message(Sender, MsgText);
                    }
                }
                else
                {
                    // Is not going to a channel. Probably just me?
                    if (MsgText.Substring(0, 1) == "\x1")
                    {
                        // If this is a special PRIVMSG, like an action or CTCP
                        MsgText = MsgText.Substring(1, MsgText.Length - 2);
                        string[] PrivMsgSplit = MsgText.Split(" ".ToCharArray(), 2);
                        switch (PrivMsgSplit[0].ToUpper())
                        {
                        case "ACTION":
                            // Not sure what to do here...
                            break;

                        case "VERSION":
                            Send(IRCFunctions.CTCPVersionReply(IRCFunctions.GetNickFromHostString(Sender)));
                            break;

                        case "TIME":
                            Send(IRCFunctions.CTCPTimeReply(IRCFunctions.GetNickFromHostString(Sender)));
                            break;

                        case "PING":
                            Send(IRCFunctions.CTCPPingReply(IRCFunctions.GetNickFromHostString(Sender), PrivMsgSplit[1]));
                            break;
                        }
                    }
                    else
                    {
                        // Private Message directly to me.
                        string[] MsgSplitPrv = MsgText.Split(" ".ToCharArray());
                        BotCommands.HandlePM(Sender, MsgSplitPrv);
                    }
                }
                break;

            case "NOTICE":
                // Needed for NickServ stuff
                string[] MsgSplitNtc = Parameters.Substring(Parameters.IndexOf(":") + 1).Split(" ".ToCharArray());
                BotCommands.HandleNotice(Sender, MsgSplitNtc);
                break;
            }
        }
예제 #16
0
        public void Parse(DateTime Timestamp, uint TimeframeID, Sender Sender, string Command, string Parameters)
        {
            string[] ParamSplit = Parameters.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            switch (Command.ToUpper())
            {
            case "353":
                // 353 - RPL_NAMREPLY - "<channel> :[[@|+]<nick> [[@|+]<nick> [...]]]"
                for (int i = 0; i < ParamSplit.Length; i++)
                {
                    if (ParamSplit[i].Substring(0, 1) == "#")
                    {
                        // Skip to where we see the channel name.
                        string Chan = ParamSplit[i].ToLower();
                        ParamSplit[i + 1] = ParamSplit[i + 1].Substring(1);
                        string[] NameArr = new string[ParamSplit.Length - i - 1];
                        Array.Copy(ParamSplit, i + 1, NameArr, 0, ParamSplit.Length - i - 1);
                        Channels[ParamSplit[i]].Names(NameArr);
                        break;
                    }
                }
                break;

            case "470":
            // Channel Forward
            // :adams.freenode.net 470 SomethingKewl #windows ##windows :Forwarding to another channel
            // Do we need to do anything here for stats? More code in IRCLogger.Server.Parse()
            case "JOIN":
                ParamSplit[0] = ParamSplit[0].ToLower();
                if (ParamSplit[0].Contains(":"))
                {
                    // Fix because some IRCds send "JOIN :#channel" instead of "JOIN #channel"
                    ParamSplit[0] = ParamSplit[0].Substring(1).ToLower();
                }
                Channels[ParamSplit[0]].Join(Timestamp, TimeframeID, Sender);
                break;

            case "PART":
                ParamSplit[0] = ParamSplit[0].ToLower();
                if (ParamSplit.Length >= 2)
                {
                    string PartMsg = Parameters.Substring(Parameters.IndexOf(":") + 1);
                    if (PartMsg.Length == 0)
                    {
                        Channels[ParamSplit[0]].Part(Timestamp, TimeframeID, Sender, String.Empty);
                    }
                    else
                    {
                        if ((PartMsg.Substring(0, 1) == "\"") && (PartMsg.Substring(PartMsg.Length - 1, 1) == "\""))
                        {
                            PartMsg = PartMsg.Substring(1, PartMsg.Length - 2);
                        }
                    }
                    Channels[ParamSplit[0]].Part(Timestamp, TimeframeID, Sender, PartMsg);
                }
                else
                {
                    Channels[ParamSplit[0]].Part(Timestamp, TimeframeID, Sender, String.Empty);
                }
                break;

            case "KICK":
                ParamSplit[0] = ParamSplit[0].ToLower();
                Channels[ParamSplit[0]].Kick(Timestamp, TimeframeID, Sender, ParamSplit[1], Functions.CombineAfterIndex(ParamSplit, " ", 2).Substring(1));
                break;

            case "INVITE":
                // TODO: Not sure how we want to handle this.
                break;

            case "NICK":
                if (IRCFunctions.GetNickFromHostString(Sender.SenderStr) == m_Nick)
                {
                    m_Nick = Parameters.Substring(1);
                }
                foreach (KeyValuePair <string, Channel> CurKVP in Channels)
                {
                    Channels[CurKVP.Key].Nick(Timestamp, TimeframeID, Sender, Parameters.Substring(1));
                }
                break;

            case "QUIT":
                foreach (KeyValuePair <string, Channel> CurKVP in Channels)
                {
                    Channels[CurKVP.Key].Quit(Timestamp, TimeframeID, Sender, Parameters.Substring(1));
                }
                break;

            case "TOPIC":
                ParamSplit[0] = ParamSplit[0].ToLower();
                string Topic = Parameters.Substring(Parameters.IndexOf(":") + 1);
                Channels[ParamSplit[0]].Topic(Timestamp, TimeframeID, Sender, Topic);
                break;

            case "MODE":
                ParamSplit[0] = ParamSplit[0].ToLower();
                if (ParamSplit[0].Substring(0, 1) == "#")
                {
                    // Is a channel mode
                    Channels[ParamSplit[0]].Mode(Timestamp, TimeframeID, Sender, Functions.CombineAfterIndex(ParamSplit, " ", 1));
                }
                else
                {
                    // Is not going to a channel. Probably me?
                }
                break;

            case "PRIVMSG":
                ParamSplit[0] = ParamSplit[0].ToLower();
                string MsgText = Parameters.Substring(Parameters.IndexOf(":") + 1);
                if (ParamSplit[0].Substring(0, 1) == "#")
                {
                    // Is going to a channel
                    if (MsgText.Substring(0, 1) == "\x1")
                    {
                        // If this is a special PRIVMSG, like an action or CTCP
                        MsgText = MsgText.Substring(1, MsgText.Length - 2);
                        string[] PrivMsgSplit = MsgText.Split(" ".ToCharArray(), 2);
                        switch (PrivMsgSplit[0].ToUpper())
                        {
                        case "ACTION":
                            Channels[ParamSplit[0]].Action(Timestamp, TimeframeID, Sender, PrivMsgSplit[1]);
                            break;
                            // Maybe other stuff goes here like channel wide CTCPs?
                        }
                    }
                    else
                    {
                        // If this is just a normal PRIVMSG.
                        Channels[ParamSplit[0]].Message(Timestamp, TimeframeID, Sender, MsgText);
                    }
                }
                else
                {
                    // Is not going to a channel. Probably just me?
                    if (MsgText.Substring(0, 1) == "\x1")
                    {
                        // If this is a special PRIVMSG, like an action or CTCP
                        MsgText = MsgText.Substring(1, MsgText.Length - 2);
                        string[] PrivMsgSplit = MsgText.Split(" ".ToCharArray(), 2);
                        switch (PrivMsgSplit[0].ToUpper())
                        {
                        case "ACTION":
                            // Not sure what to do here...
                            break;

                        case "VERSION":
                            //Send(IRCFunctions.CTCPVersionReply(IRCFunctions.GetNickFromHostString(Sender)));
                            break;

                        case "TIME":
                            //Send(IRCFunctions.CTCPTimeReply(IRCFunctions.GetNickFromHostString(Sender)));
                            break;

                        case "PING":
                            //Send(IRCFunctions.CTCPPingReply(IRCFunctions.GetNickFromHostString(Sender), PrivMsgSplit[1]));
                            break;
                        }
                    }
                    else
                    {
                        // Private Message directly to me.
                        string[] MsgSplitPrv = MsgText.Split(" ".ToCharArray());
                        //BotCommands.HandlePM(Sender, MsgSplitPrv);
                    }
                }
                break;

            case "NOTICE":
                // Needed for NickServ stuff
                string[] MsgSplitNtc = Parameters.Substring(Parameters.IndexOf(":") + 1).Split(" ".ToCharArray());
                //BotCommands.HandleNotice(Sender, MsgSplitNtc);
                break;
            }
        }
예제 #17
0
        public void HandlePM(string Sender, string[] Params)
        {
            if (Params[0].ToLower() == "!login")
            {
                HandleLogin(Sender, Params);
            }
            else if (Params[0].ToLower() == "!logout")
            {
                HandleLogout(Sender, Params);
            }
            else if (Params[0].ToLower() == "!help")
            {
                HandleHelp(Sender, Params);
            }
            else
            {
                if (m_Administrators.Contains(Sender))
                {
                    switch (Params[0].ToLower())
                    {
                    case "!list":
                        if (Params.Length >= 2)
                        {
                            if (Params[1].ToLower() == "networks")
                            {
                                HandleListNetworks(Sender, Params);
                            }
                            else if (Params[1].ToLower() == "channels")
                            {
                                HandleListChannels(Sender, Params);
                            }
                            else if ((Params[1].ToLower() == "admins") || (Params[1].ToLower() == "administrators"))
                            {
                                HandleListAdmins(Sender, Params);
                            }
                        }
                        break;

                    case "!add":
                        if (Params.Length >= 2)
                        {
                            if (Params[1].ToLower() == "network")
                            {
                                HandleAddNetwork(Sender, Params);
                            }
                            else if (Params[1].ToLower() == "channel")
                            {
                                HandleAddChannel(Sender, Params);
                            }
                        }
                        break;

                    case "!delete":
                        if (Params.Length >= 2)
                        {
                            if (Params[1].ToLower() == "network")
                            {
                                HandleDeleteNetwork(Sender, Params);
                            }
                            else if (Params[1].ToLower() == "channel")
                            {
                                HandleDeleteChannel(Sender, Params);
                            }
                        }
                        break;

                    case "!rehash":
                        // This may need to change in the future.
                        Program.ConnectToServers();
                        break;

                    case "!channels":
                        HandleChannels(Sender, Params);
                        break;
                    }
                }
                else
                {
                    m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "You are not an administrator."));
                }
            }
        }
예제 #18
0
        private void HandleHelp(string Sender, string[] Params)
        {
            if (Params.Length >= 2)
            {
                switch (Params[1].ToLower())
                {
                case "add":
                    if (Params.Length >= 3)
                    {
                        switch (Params[2].ToLower())
                        {
                        case "channel": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Add Channel Command: !add channel <Server ID> <Channel Name> [Channel Password]")); break;

                        case "network": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Add Network Command: !add network <Network Name> <IRC Server> <Server Port> <Real Name> <Nick> <Alternate Nick> [Server Password]")); break;
                        }
                    }
                    else
                    {
                        m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Add Command: !add <channel|network>"));
                    }
                    break;

                case "delete":
                    if (Params.Length >= 3)
                    {
                        switch (Params[2].ToLower())
                        {
                        case "channel": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Delete Channel Command: !delete channel <Channel ID> <Channel Name>")); break;

                        case "network": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Delete Network Command: !delete network <Network ID> <Network Name>")); break;
                        }
                    }
                    else
                    {
                        m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Add Command: !delete <channel|network>"));
                    }
                    break;

                case "help": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Help Command: !help")); break;

                case "list":
                    if (Params.Length >= 3)
                    {
                        switch (Params[2].ToLower())
                        {
                        case "admins": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List Admins Command: !list admins")); break;

                        case "channels": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List Channels Command: !list channels")); break;

                        case "networks": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List Networks Command: !list networks")); break;
                        }
                    }
                    else
                    {
                        m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "List Command: !list <admins|channels|networks>"));
                    }
                    break;

                case "login": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Login Command: !login <Password>")); break;

                case "logout": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Logout Command: !logout")); break;

                case "rehash": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Rehash Command: !rehash")); break;

                case "channels": m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Channels Command: !channels")); break;
                }
            }
            else
            {
                // All help commands
                m_ParentServer.Send(IRCFunctions.PrivMsg(IRCFunctions.GetNickFromHostString(Sender), "Help Command: !help [add|delete|channels|help|login|logout|rehash]"));
            }
        }
예제 #19
0
 public void JoinMe()
 {
     AppLog.WriteLine(3, "IRC", "Joining " + m_Name);
     m_ParentServer.Send(IRCFunctions.Join(m_Name, m_Password));
 }