All pastes #499403 Raw Edit

MooseBot 6.0

public text v1 · immutable
·published 2007-05-21 01:23 UTC
rendered paste body
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
using System.Runtime.InteropServices;
using Meebey.SmartIrc4net;

namespace MooseBot
{
    class Program
    {
        // Client Initialization

        public static IrcClient Client = new IrcClient();
        public static List<Command> BotCommands = new List<Command>();
        public static List<Command> ChanCommands = new List<Command>();

        // Connection Settings

        public static readonly string Address = "irc.freenode.net";
        public static readonly int Port = 6667;

        // Bot Settings

        public static string Nick = "MooseBot";
        public static string[] Channels =
            { "#chemistry" };

        // Window Settigs

        public static readonly string WindowTitle = "MooseBot v7.0A - Ownerarium Software";

        [DllImport("user32.dll")]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        // Database Settings

        public static readonly string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=Database.mdb";

        static void Main()
        {
            Console.WriteLine(WindowTitle);
            Console.WriteLine("Library Loaded {0}", Client.VersionString);

            // Setting up bot commands
            BotCommands.Add(new Commands.BroadcastCommand());
            BotCommands.Add(new Commands.DisconnectCommand());
            BotCommands.Add(new Commands.JoinCommand());
            BotCommands.Add(new Commands.MessageCommand());
            BotCommands.Add(new Commands.PartCommand());
            BotCommands.Add(new Commands.QuitCommand());
            BotCommands.Add(new Commands.WindowPropertyCommand());
            Console.WriteLine("Finished loading bot commands");
            
            // Setting up channel commands
            ChanCommands.Add(new Commands.MD5Command());
            ChanCommands.Add(new Commands.SHA1Command());
            ChanCommands.Add(new Commands.Base64Command());
            ChanCommands.Add(new Commands.FactoidLookupCommand());
            ChanCommands.Add(new Commands.AddFactoidCommand());
            ChanCommands.Add(new Commands.DeleteFactoidCommand());
            ChanCommands.Add(new Commands.AddUserCommand());
            ChanCommands.Add(new Commands.DeleteUserCommand());
            ChanCommands.Add(new Commands.UserInfoCommand());
            Console.WriteLine("Finished loading channel commands");
            Console.WriteLine();

            // Loading users from database

            #region Users Database Access
            OleDbConnection dbConn = new OleDbConnection(ConnectionString);
            OleDbCommand dbCommand = new OleDbCommand("SELECT * FROM Users", dbConn);

            try
            {
                dbConn.Open();
            }
            catch (OleDbException ex)
            {
                Console.WriteLine("Database failed to load properly!");
                ErrorExit("DB", ex.Message);
            }

            OleDbDataReader dbReader = dbCommand.ExecuteReader();

            while (dbReader.Read())
            {
                string nick = Convert.ToString(dbReader["Nick"]);
                string host = Convert.ToString(dbReader["Host"]);
                User.AccessLevel access = User.ParseAccessLevel(Convert.ToString(dbReader["Access"]));
                DateTime creationDate = DateTime.Parse(Convert.ToString(dbReader["CreationDate"]));

                User.Users.Add(new User(nick, host, access, creationDate));
                Console.WriteLine("Added User: {0}", nick);
            }

            dbConn.Close();
            Console.WriteLine("{0} users successfully loaded", User.Count);
            Console.WriteLine();
            #endregion

            // Loading factoids from database

            #region Factoid Database Access
            //dbConn = new OleDbConnection(ConnectionString);
            dbCommand = new OleDbCommand("SELECT * FROM Factoids", dbConn);

            try
            {
                dbConn.Open();
            }
            catch (OleDbException ex)
            {
                Console.WriteLine("Database failed to load properly!");
                ErrorExit("DB", ex.Message);
            }

            dbReader = dbCommand.ExecuteReader();

            while (dbReader.Read())
            {
                string name = Convert.ToString(dbReader["Name"]);
                string response = Convert.ToString(dbReader["Response"]);

                FactoidHandler.Add(name, response, false);
                Console.WriteLine("Added Factoid: {0}", name);
            }

            dbConn.Close();
            Console.WriteLine("{0} factoids successfully loaded", Factoid.Count);
            Console.WriteLine();
            #endregion

            Client.OnError += new ErrorEventHandler(Client_OnError);
            Client.OnConnected += new EventHandler(Client_OnConnected);
            Client.OnJoin += new JoinEventHandler(Client_OnJoin);
            Client.OnPart += new PartEventHandler(Client_OnPart);
            Client.OnQueryMessage += new IrcEventHandler(Client_OnQueryMessage);
            Client.OnChannelMessage += new IrcEventHandler(Client_OnChannelMessage);
            Client.OnNickChange += new NickChangeEventHandler(Client_OnNickChange);

            try
            {
                Client.Connect(Address, Port);
            }
            catch (ConnectionException ex)
            {
                ErrorExit("IRC", ex.Message);
            }
            catch (Exception ex)
            {
                ErrorExit("App", ex.Message);
            }

            Console.WriteLine("Listening mode active");
            Client.Listen();

            Console.WriteLine("[{0}] Listening mode disabled",
                DateTime.Now.ToShortTimeString());
            // Making our window minimized, but visible
            ShowWindow(FindWindow(null, WindowTitle), 2);
            Console.ReadLine();
            Environment.Exit(0);
        }

        static void Client_OnNickChange(object sender, NickChangeEventArgs e)
        {
            Console.WriteLine("[{0}] {1} is now known as {2}",
                DateTime.Now.ToShortTimeString(), e.OldNickname, e.NewNickname);
        }

        static void Client_OnChannelMessage(object sender, IrcEventArgs e)
        {
            Console.WriteLine("[{0}] [{1}] {2}: {3}",
                DateTime.Now.ToShortTimeString(), e.Data.Channel, e.Data.Nick, e.Data.Message);

            string tCmdName = e.Data.MessageArray[0].ToLower();

            foreach (Command cmd in ChanCommands)
            {
                if (cmd.Name == tCmdName)
                {
                    string[] args = new string[e.Data.MessageArray.Length - 1];
                    for (int i = 1; i != e.Data.MessageArray.Length; i++)
                    {
                        args[i - 1] = e.Data.MessageArray[i];
                    }

                    try
                    {
                        cmd.Execute(Client, new Message(e.Data.Nick + ":" + e.Data.Host, e.Data.Channel, e.Data.Message));
                    }
                    catch (ArgumentException ex)
                    {
                        Client.RfcNotice(e.Data.Nick, ex.Message);
                    }
                }
            }
        }

        static void Client_OnQueryMessage(object sender, IrcEventArgs e)
        {
            Console.WriteLine("[{0}] [PM] {1}: {2}",
                DateTime.Now.ToShortTimeString(), e.Data.Nick, e.Data.Message);

            foreach (Command cmd in BotCommands)
            {
                if (cmd.Name.ToLower() == e.Data.MessageArray[0].ToLower())
                {
                    string[] args = new string[e.Data.MessageArray.Length - 1];
                    for (int i = 1; i != e.Data.MessageArray.Length; i++)
                    {
                        args[i - 1] = e.Data.MessageArray[i];
                    }

                    try
                    {
                        cmd.Execute(Client, new Message(e.Data.Nick, "PM", e.Data.Message));
                    }
                    catch (ArgumentException ex)
                    {
                        Client.RfcPrivmsg(e.Data.Nick, ex.Message);
                    }
                }
            }
        }

        static void Client_OnPart(object sender, PartEventArgs e)
        {
            Console.WriteLine("[{0}] {1} has parted {2}",
                DateTime.Now.ToShortTimeString(), e.Data.Nick, e.Channel);
        }

        static void Client_OnJoin(object sender, JoinEventArgs e)
        {
            Console.WriteLine("[{0}] {1} has joined {2}",
                DateTime.Now.ToShortTimeString(), e.Data.Nick, e.Channel);
        }

        static void Client_OnError(object sender, ErrorEventArgs e)
        {
            Console.WriteLine("[{0}] [IRCD] Error: {1}",
                DateTime.Now.ToShortTimeString(), e.ErrorMessage);
        }

        static void Client_OnConnected(object sender, EventArgs e)
        {
            Console.WriteLine("[{0}] Connection established",
                DateTime.Now.ToShortTimeString());

            Client.Login(Nick, "MooseBot IRC Services");

            Client.RfcJoin(Channels);
        }

        static void ErrorExit(string type, string message)
        {
            Console.Beep();

            Console.WriteLine("[{0}] [{1}] Error: {2}",
                DateTime.Now.ToShortTimeString(), type, message);

            Console.Beep();

            Console.ReadLine();
            Environment.Exit(0);
        }
    }
}