Fixed ident
[reactos.git] / irc / TechBot / TechBot.IRCLibrary / IrcClient.cs
index 68c7aa2..8d07e50 100644 (file)
@@ -16,6 +16,10 @@ namespace TechBot.IRCLibrary
        /// </summary>\r
        public delegate void ChannelUserDatabaseChangedHandler(IrcChannel channel);\r
 \r
+    public delegate void OnConnectHandler ();\r
+    public delegate void OnDisconnectHandler();\r
+    public delegate void OnConnectionLostHandler();\r
+\r
        /// <summary>\r
        /// An IRC client.\r
        /// </summary>\r
@@ -202,6 +206,10 @@ namespace TechBot.IRCLibrary
 \r
                public event ChannelUserDatabaseChangedHandler ChannelUserDatabaseChanged;\r
 \r
+        public event OnConnectHandler OnConnect;\r
+        public event OnConnectionLostHandler OnConnectionLost;\r
+        public event OnDisconnectHandler OnDisconnect;\r
+\r
                #endregion\r
 \r
                #region Public properties\r
@@ -291,20 +299,39 @@ namespace TechBot.IRCLibrary
                /// <param name="ar">IAsyncResult object.</param>\r
                private void ReadComplete(IAsyncResult ar)\r
                {\r
-                       StateObject stateObject = (StateObject) ar.AsyncState;\r
-                       if (stateObject.Stream.CanRead)\r
-                       {\r
-                               int bytesReceived = stateObject.Stream.EndRead(ar);\r
-                               if (bytesReceived > 0)\r
-                               {\r
-                                       messageStream.Write(Encoding.GetString(stateObject.Buffer, 0, bytesReceived));\r
-                                       while (messageStream.DataAvailable)\r
-                                       {\r
-                                               OnMessageReceived(new IrcMessage(messageStream.Read()));\r
-                                       }\r
-                               }\r
-                       }\r
-                       Receive();\r
+            try\r
+            {\r
+                StateObject stateObject = (StateObject)ar.AsyncState;\r
+                if (stateObject.Stream.CanRead)\r
+                {\r
+                    int bytesReceived = stateObject.Stream.EndRead(ar);\r
+                    if (bytesReceived > 0)\r
+                    {\r
+                        messageStream.Write(Encoding.GetString(stateObject.Buffer, 0, bytesReceived));\r
+                        while (messageStream.DataAvailable)\r
+                        {\r
+                            OnMessageReceived(new IrcMessage(messageStream.Read()));\r
+                        }\r
+                    }\r
+                }\r
+             \r
+                Receive();\r
+            }\r
+            catch (SocketException)\r
+            {\r
+                if (OnConnectionLost != null)\r
+                    OnConnectionLost();\r
+            }\r
+            catch (IOException)\r
+            {\r
+                if (OnConnectionLost != null)\r
+                    OnConnectionLost();\r
+            }\r
+            catch (Exception)\r
+            {\r
+                if (OnConnectionLost != null)\r
+                    OnConnectionLost();\r
+            } \r
                }\r
 \r
                /// <summary>\r
@@ -498,6 +525,9 @@ namespace TechBot.IRCLibrary
                                connected = false;\r
                                tcpClient.Close();\r
                                tcpClient = null;\r
+\r
+                if (OnDisconnect != null)\r
+                    OnDisconnect();\r
                        }\r
                }\r
 \r
@@ -507,19 +537,37 @@ namespace TechBot.IRCLibrary
                /// <param name="message">The message to be sent.</param>\r
                public void SendMessage(IrcMessage message)\r
                {\r
-                       if (!connected)\r
-                       {\r
-                               throw new NotConnectedException();\r
-                       }\r
-                       \r
-                       /* Serialize sending messages */\r
-                       lock (typeof(IrcClient))\r
-                       {\r
-                               NetworkStream networkStream = tcpClient.GetStream();\r
-                               byte[] bytes = Encoding.GetBytes(message.Line);\r
-                               networkStream.Write(bytes, 0, bytes.Length);\r
-                               networkStream.Flush();\r
-                       }\r
+            try\r
+            {\r
+                if (!connected)\r
+                {\r
+                    throw new NotConnectedException();\r
+                }\r
+\r
+                /* Serialize sending messages */\r
+                lock (typeof(IrcClient))\r
+                {\r
+                    NetworkStream networkStream = tcpClient.GetStream();\r
+                    byte[] bytes = Encoding.GetBytes(message.Line);\r
+                    networkStream.Write(bytes, 0, bytes.Length);\r
+                    networkStream.Flush();\r
+                }\r
+            }\r
+            catch (SocketException)\r
+            {\r
+                if (OnConnectionLost != null)\r
+                    OnConnectionLost();\r
+            }\r
+            catch (IOException)\r
+            {\r
+                if (OnConnectionLost != null)\r
+                    OnConnectionLost();\r
+            }\r
+            catch (Exception)\r
+            {\r
+                if (OnConnectionLost != null)\r
+                    OnConnectionLost();\r
+            } \r
                }\r
 \r
                /// <summary>\r
@@ -591,6 +639,8 @@ namespace TechBot.IRCLibrary
                        if (password != null)\r
                                SubmitPassword(password);\r
                        ChangeNick(nickname);\r
+                       /* Before we send our nickname, just ghost it */\r
+                       SendMessage(new IrcMessage(IRC.GHOST, nickname));\r
                        /* OLD: USER <username> <hostname> <servername> <realname> */\r
                        /* NEW: USER <user> <mode> <unused> <realname> */\r
                        SendMessage(new IrcMessage(IRC.USER, String.Format("{0} 0 * :{1}",\r