fCraft.IRC.IrcThread.IoThread C# (CSharp) Method

IoThread() private method

private IoThread ( ) : void
return void
            void IoThread() {
                lastMessageSent = DateTime.UtcNow;

                do {
                    try {
                        ActualBotNick = desiredBotNick;
                        reconnect = false;
                        Logger.Log(LogType.IrcStatus,
                                   "Connecting to {0}:{1} as {2}",
                                   hostName,
                                   port,
                                   ActualBotNick);
                        Connect();

                        // register
                        Send(IRCCommands.Nick(ActualBotNick));
                        Send(IRCCommands.User(ActualBotNick, 8, ConfigKey.ServerName.GetString()));
                        lastNickAttempt = DateTime.UtcNow;
                        nickTry = 0;

                        while (isConnected && !reconnect) {
                            Thread.Sleep(20);

                            DateTime now = DateTime.UtcNow;
                            if (now.Subtract(lastMessageSent) >= SendDelay) {
                                string outputLine;
                                if (localQueue.TryDequeue(out outputLine)) {
#if DEBUG_IRC
                                    Logger.Log( LogType.IrcStatus, "[Out.Local] {0}", outputLine );
#endif
                                    writer.Write(outputLine);
                                    writer.Write('\r');
                                    writer.Write('\n');
                                    lastMessageSent = now;
                                    writer.Flush();
                                    if (outputLine.StartsWith("QUIT")) {
                                        isConnected = false;
                                        reconnect = false;
                                        break;
                                    }
                                } else if (OutputQueue.TryDequeue(out outputLine)) {
#if DEBUG_IRC
                                    Logger.Log( LogType.IrcStatus, "[Out.Global] {0}", outputLine );
#endif
                                    writer.Write(outputLine);
                                    writer.Write('\r');
                                    writer.Write('\n');
                                    lastMessageSent = now;
                                    writer.Flush();
                                } else if (ActualBotNick != desiredBotNick &&
                                           now.Subtract(lastNickAttempt) >= NickRetryDelay) {
                                    RetryForDesiredNick();
                                }
                            }

                            if (client.Client.Available > 0) {
                                string line = reader.ReadLine();
                                if (line == null) {
                                    reconnect = true;
                                    break;
                                }
                                HandleMessage(line);
                            }
                        }
                    } catch (SocketException ex) {
                        LogDisconnectWarning(ex);
                        reconnect = true;
                    } catch (IOException ex) {
                        LogDisconnectWarning(ex);
                        reconnect = true;
                    } catch (ThreadAbortException) {
                        Logger.Log(LogType.Warning, "IRC: Aborted");
                        return;
#if !DEBUG
                    } catch( Exception ex ) {
                        Logger.LogAndReportCrash( "IRC bot crashed", "fCraft", ex, false );
                        reconnect = true;
#endif
                    }

                    if (reconnect) Thread.Sleep(ReconnectDelay);
                } while (reconnect);
            }