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);
}