using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using Meebey.SmartIrc4net; namespace IRCBotGUI { public partial class sIRCBotGUI : Form { delegate void SingleStringMethodInvoker(string s); private IrcClient irc; private Thread _connect; private static Options _options = new Options(); public sIRCBotGUI() { InitializeComponent(); UpdateButtons(false); } void Connect() { try { //Some options irc = new IrcClient(); irc.AutoRejoin = true; irc.SendDelay = 500; //Event Handlers irc.OnConnecting += new EventHandler(irc_OnConnecting); irc.OnConnected += new EventHandler(irc_OnConnected); irc.OnConnectionError += new EventHandler(irc_OnConnectionError); irc.OnDisconnected += new EventHandler(irc_OnDisconnected); irc.OnChannelMessage += new IrcEventHandler(irc_OnChannelMessage); irc.OnRawMessage += new IrcEventHandler(irc_OnRawMessage); irc.OnError += new ErrorEventHandler(irc_OnError); irc.OnErrorMessage += new IrcEventHandler(irc_OnErrorMessage); //Connect to server irc.Connect(Options._server, Options._port); irc.Login(Options._botnick, Options._botname); irc.RfcJoin(Options._channel); irc.Listen(); } catch (Exception ex) { OutputLine(" * Fatal Error: " + ex.Message); } } void irc_OnRawMessage(object sender, IrcEventArgs e) { if (e.Data.Channel == null && e.Data.Nick != null) { } } void OutputLine(string line) { try { if (richTextBox1.InvokeRequired) { richTextBox1.Invoke(new SingleStringMethodInvoker(richTextBox1.AppendText), line); richTextBox1.Invoke(new MethodInvoker(richTextBox1.ScrollToCaret)); Application.DoEvents(); } else { richTextBox1.AppendText(line); richTextBox1.ScrollToCaret(); } } catch (Exception ex) { MessageBox.Show(" * Error: " + ex.Message); } } void UpdateButtons(bool soonToBeConnected) { if (soonToBeConnected) { toolStripButtonConnect.Enabled = false; toolStripButtonDisconnect.Enabled = true; connectToolStripMenuItem.Enabled = false; disconnectToolStripMenuItem.Enabled = true; toolStripConnect.Enabled = false; toolStripDisconnect.Enabled = true; } else { toolStripButtonConnect.Enabled = true; toolStripButtonDisconnect.Enabled = false; connectToolStripMenuItem.Enabled = true; disconnectToolStripMenuItem.Enabled = false; toolStripConnect.Enabled = true; toolStripDisconnect.Enabled = false; } } void OutputMessage(string message) { OutputLine(message); OutputLine(Environment.NewLine); } void irc_OnChannelMessage(object sender, IrcEventArgs e) { OutputLine("<"); OutputLine(e.Data.Nick); OutputLine("> "); OutputLine(e.Data.Message); OutputLine(Environment.NewLine); } void irc_OnDisconnected(object sender, EventArgs e) { OutputMessage(" * Disconnected at " + DateTime.Now.ToShortTimeString()); } void irc_OnConnectionError(object sender, EventArgs e) { OutputMessage(" * Connection Error at " + DateTime.Now.ToShortTimeString()); } void irc_OnErrorMessage(object sender, IrcEventArgs e) { OutputLine(" * Error: "); OutputLine(e.Data.Message); OutputLine(" at " + DateTime.Now.ToShortTimeString()); OutputLine(Environment.NewLine); } void irc_OnError(object sender, ErrorEventArgs e) { OutputLine(" * Error: "); OutputLine(e.Data.Message); OutputLine(" at " + DateTime.Now.ToShortTimeString()); OutputLine(Environment.NewLine); } void irc_OnConnected(object sender, EventArgs e) { OutputMessage(" * Connected at " + DateTime.Now.ToShortTimeString()); } void irc_OnConnecting(object sender, EventArgs e) { OutputMessage(" * Connecting..."); } void OnPing (object sender, ReadLineEventArgs e) { if (e.Line.StartsWith("PING")) { OutputLine(" * PONG"); } } void OnDisconnected(object sender, EventArgs e) { irc.AutoRetry = true; irc.AutoRetryDelay = 5; irc.AutoReconnect = true; irc.AutoRejoin = true; try { irc.Connect(Options._server, Options._port); } catch (Exception ex) { OutputLine(" * Failed to reconnect: " + ex.Message + "\r\n"); } } void toolStripButtonConnect_Click(object sender, EventArgs e) { _connect = new Thread(new ThreadStart(Connect)); _connect.IsBackground = true; _connect.Start(); UpdateButtons(true); } void toolStripButtonDisconnect_Click(object sender, EventArgs e) { UpdateButtons(false); if (irc.IsConnected) irc.Disconnect(); } void connectToolStripMenuItem_Click(object sender, EventArgs e) { toolStripButtonConnect_Click(sender, e); } void disconnectToolStripMenuItem_Click(object sender, EventArgs e) { toolStripButtonDisconnect_Click(sender, e); } void exitToolStripMenuItem_Click(object sender, EventArgs e) { Environment.Exit(0); } void optionsToolStripMenuItem_Click(object sender, EventArgs e) { _options.Show(); } void toolStripConnect_Click(object sender, EventArgs e) { toolStripButtonConnect_Click(sender, e); } void toolStripDisconnect_Click(object sender, EventArgs e) { toolStripButtonDisconnect_Click(sender, e); } void toolStripExit_Click(object sender, EventArgs e) { Environment.Exit(0); } void sIRCBotGUI_Resize(object sender, EventArgs e) { if (FormWindowState.Minimized == WindowState) Hide(); } void notifyIcon1_DoubleClick(object sender, EventArgs e) { Show(); WindowState = FormWindowState.Normal; } } }