From 1e6aa2a522df366dea13b6dd117eaea33c048595 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Wed, 10 Jul 2013 04:16:21 +0200 Subject: CatOut/LogBot: Test server connection from main loop: Send PING each 1min, and act when last-timestamp is > PONG_TIMEOUT (3min) - Do not reconnect automatically, since we use main-loop connection test incl. reconnect --- src/org/jogamp/jabot/irc/CatOut.java | 115 +++++++++++++++++++++++------------ src/org/jogamp/jabot/irc/LogBot.java | 45 ++++++++++---- 2 files changed, 108 insertions(+), 52 deletions(-) (limited to 'src') diff --git a/src/org/jogamp/jabot/irc/CatOut.java b/src/org/jogamp/jabot/irc/CatOut.java index 07e4ae5..5e4c9de 100644 --- a/src/org/jogamp/jabot/irc/CatOut.java +++ b/src/org/jogamp/jabot/irc/CatOut.java @@ -19,10 +19,9 @@ import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Locale; -import org.jibble.pircbot.PircBot; import org.jogamp.jabot.util.TimeTool; -public class CatOut extends PircBot { +public class CatOut { private static final String HASH = "#"; @@ -43,7 +42,8 @@ public class CatOut extends PircBot { final long logrotate, logrotateStart; final String logprefix, urlprefix; final boolean htmlOut; - final File htmlHeader, htmlFooter; + final File htmlHeader, htmlFooter; + final boolean testPongTO; { String _joinMessage = "This channel is logged"; String _login=null, _nick=null, _nickPwd=null, _server=null, _channelNoHash=null; @@ -52,6 +52,7 @@ public class CatOut extends PircBot { String _logprefix="", _urlprefix=""; boolean _htmlOut = false; String _htmlHeader = null, _htmlFooter=null; + boolean _testPongTO = false; for(int i=0; i nextLogrotate ) { nextLogrotate += logrotate; } + System.err.println("verbose : "+verbose); + System.err.println("testPongTO : "+testPongTO); System.err.println("Now : "+logCal.getTime()); logCal.setTimeInMillis(logrotateStart); System.err.println("Logrotate Start : "+logCal.getTime()); @@ -145,44 +151,69 @@ public class CatOut extends PircBot { System.err.println("Next Logrotate-2: "+logCal.getTime()); } - final LogBot bot = new LogBot(showHostname, joinMessage, htmlOut); - bot.setVerbose(verbose); - bot.setLoginAndNick(login, nick); - - LogStream logOut; - if ( 0 < logrotate ) { - logOut = new LogStream(bot, logprefix, urlprefix, server, channelNoHash, htmlHeader); - bot.setOut(logOut.out, true); - bot.setJoinMessage(joinMessage+" @ "+logOut.urlString); - bot.logNotice(bot.getJoinMessage()); - } else { - logOut = null; - } - if( null != nickPwd && nickPwd.length() > 0 ) { - bot.setPostConnectAction(new Runnable() { - public void run() { - bot.identify(nickPwd); - } - }); - } - bot.connect(server); - bot.joinChannel(HASH+channelNoHash); - if( 0 < logrotate ) { - while(true) { // forever ! - final long now = System.currentTimeMillis(); + LogBot bot = null; + LogStream logOut = null; + final long t0 = System.currentTimeMillis(); + boolean testPongTODone = false; - if( now >= nextLogrotate ) { + while(true) { // forever ! + final long now = System.currentTimeMillis(); + final long lastTS = null != bot ? bot.getLastTS() : now; + final boolean pongTO = ( now - lastTS ) >= PONG_TIMEOUT || + ( testPongTO && !testPongTODone && ( now - t0 ) >= PONG_TIMEOUT ) ; + final boolean newBOT = null == bot || pongTO; + + if( pongTO ) { + testPongTODone = testPongTO; + System.err.println("Probably lost connection, lastTS is "+(now - lastTS)+" ms old, now: "+logCal.getTime()+" / "+now+" ms [testTS2Late "+testPongTO+", done "+testPongTODone+"]"); + bot.disconnect(); + bot.dispose(); + bot = null; + } + if( null == bot ) { + bot = new LogBot(showHostname, joinMessage, htmlOut, false /* reconnectOnDisconnect */); + bot.setVerbose(verbose); + bot.setLoginAndNick(login, nick); + if( null != nickPwd && nickPwd.length() > 0 ) { + final LogBot fbot = bot; + bot.setPostConnectAction(new Runnable() { + public void run() { + fbot.identify(nickPwd); + } + }); + } + try { + bot.connect(server); + bot.joinChannel(HASH+channelNoHash); + } catch (Exception e) { + System.err.println("Catched "+e.getClass().getName()+": "+e.getMessage()); + e.printStackTrace(); + try { + bot.disconnect(); + bot.dispose(); + } catch (Exception e2) {} + bot = null; + } + } + if( null != bot ) { + if( newBOT || ( 0 < logrotate && now >= nextLogrotate ) ) { // Swap Logfiles: Open and set new logfile, then close old one. final LogStream _logOut = new LogStream(bot, logprefix, urlprefix, server, channelNoHash, htmlHeader); bot.logNotice("Continue @ "+_logOut.urlString); bot.setOut(_logOut.out, true); - bot.logNotice("Previous @ "+ logOut.urlString); + if( null != logOut ) { + bot.logNotice("Previous @ "+ logOut.urlString); + } bot.setJoinMessage(joinMessage+" @ "+_logOut.urlString); - bot.sendLoggedNotice(HASH+channelNoHash, bot.getJoinMessage()); - if(htmlOut) { - logOut.cat(htmlFooter); + if( !newBOT ) { + bot.sendLoggedNotice(HASH+channelNoHash, bot.getJoinMessage()); + } + if( null != logOut ) { + if( htmlOut ) { + logOut.cat(htmlFooter); + } + logOut.close(); // implies flush } - logOut.close(); // implies flush logOut = _logOut; nextLogrotate += logrotate; logCal.setTimeInMillis(now); @@ -190,16 +221,20 @@ public class CatOut extends PircBot { logCal.setTimeInMillis(nextLogrotate); System.err.println("Next Logrotate: "+logCal.getTime()); } - try { - Thread.sleep(FLUSH_INTERVAL); - } catch (Exception e) { } - if(null != logOut) { - logOut.flush(); + } + try { + Thread.sleep(FLUSH_INTERVAL); + if( null != bot ) { + bot.sendPing(); } + } catch (Exception e) { } + if(null != logOut) { + logOut.flush(); } } } - public static final long FLUSH_INTERVAL = 60*1000; // flush every minute + public static final long FLUSH_INTERVAL = 1*60*1000; // flush every minute + public static final long PONG_TIMEOUT = 3*60*1000; // server pong timeout (we send one ping each FLUSH_TIMEOUT) static class LogStream { public final PrintStream out; diff --git a/src/org/jogamp/jabot/irc/LogBot.java b/src/org/jogamp/jabot/irc/LogBot.java index 3f76f61..80a6591 100644 --- a/src/org/jogamp/jabot/irc/LogBot.java +++ b/src/org/jogamp/jabot/irc/LogBot.java @@ -40,18 +40,20 @@ public class LogBot extends PircBot { private final Calendar calendar; private final Object timeSync = new Object(); + private final boolean reconnectOnDisconnect; private final boolean xmlOut; private final Object outSync = new Object(); private PrintStream out; private int lineCount; + private long lastTS; private Runnable postConnectAction; - public LogBot(boolean showHostname, String joinMessage, boolean xmlOut) { - this(showHostname, joinMessage, TimeTool.getNearZuluTimeZone(), Locale.getDefault(), System.out, xmlOut); + public LogBot(boolean showHostname, String joinMessage, boolean xmlOut, boolean reconnectOnDisconnect) { + this(showHostname, joinMessage, TimeTool.getNearZuluTimeZone(), Locale.getDefault(), System.out, xmlOut, reconnectOnDisconnect); } - public LogBot(boolean showHostname, String joinMessage, TimeZone timeZone, Locale locale, PrintStream out, boolean xmlOut) { + public LogBot(boolean showHostname, String joinMessage, TimeZone timeZone, Locale locale, PrintStream out, boolean xmlOut, boolean reconnectOnDisconnect) { this.showHostname = showHostname; this.calendar = new GregorianCalendar(timeZone, locale); this.xmlOut = xmlOut; @@ -59,6 +61,23 @@ public class LogBot extends PircBot { this.joinMessage = joinMessage; this.lineCount = 0; this.postConnectAction = null; + this.lastTS = System.currentTimeMillis(); + this.reconnectOnDisconnect = reconnectOnDisconnect; + } + + @Override + protected void handleLine(String line) { + lastTS = System.currentTimeMillis(); + super.handleLine(line); + } + + public void sendPing() { + this.sendRawLine("PING :" + getNick()); + } + + /** Returns the last timestamp as set by ctor or receiving a line from server. */ + public final long getLastTS() { + return lastTS; } public final void setJoinMessage(String joinMessage) { @@ -67,7 +86,7 @@ public class LogBot extends PircBot { public final String getJoinMessage() { return joinMessage; } - + /** *

* Sets the internal login of the Bot. This should be set before joining @@ -272,16 +291,18 @@ public class LogBot extends PircBot { @Override public void onDisconnect() { append(NAVY, "* Disconnected."); - while (!isConnected()) { - try { - reconnect(); - } - catch (Exception e) { + if( reconnectOnDisconnect ) { + while (!isConnected()) { try { - Thread.sleep(10000); + reconnect(); } - catch (Exception anye) { - // Do nothing. + catch (Exception e) { + try { + Thread.sleep(10000); + } + catch (Exception anye) { + // Do nothing. + } } } } -- cgit v1.2.3