diff -r 300f673fbbdc -r 2cfcd2801e5a enanobot.php --- a/enanobot.php Thu Dec 04 19:40:27 2008 -0500 +++ b/enanobot.php Sun Dec 07 01:55:03 2008 -0500 @@ -98,6 +98,7 @@ $irc = new Request_IRC($server); $irc->connect($nick, $user, $name, $pass); $irc->set_privmsg_handler('enanobot_privmsg_event'); +$irc->set_timeout_handlers(false, 'enanobot_timeout_event'); foreach ( $channels as $channel ) { @@ -191,6 +192,65 @@ } } +function enanobot_timeout_event($irc) +{ + // uh-oh. + $irc->close(); + if ( defined('LIBIRC_DEBUG') ) + { + $now = date('r'); + echo "!!! [$now] Connection timed out; waiting 10 seconds and reconnecting\n"; + } + + // re-init + global $server, $nick, $user, $name, $pass, $channels, $libirc_channels; + + // wait until we can get into the server + while ( true ) + { + sleep(10); + if ( defined('LIBIRC_DEBUG') ) + { + $now = date('r'); + echo "... [$now] Attempting reconnect\n"; + } + $conn = @fsockopen($server, 6667, $errno, $errstr, 5); + if ( $conn ) + { + if ( defined('LIBIRC_DEBUG') ) + { + $now = date('r'); + echo "!!! [$now] Reconnection succesful, ghosting old login\n"; + } + fclose($conn); + break; + } + else + { + if ( defined('LIBIRC_DEBUG') ) + { + $now = date('r'); + echo "!!! [$now] Still waiting for connection to come back up\n"; + } + } + } + + $libirc_channels = array(); + + // we were able to get back in; ask NickServ to GHOST the old nick + $irc->connect("$nick`gh", $user, $name, false); + $irc->privmsg('NickServ', "GHOST $nick $pass"); + $irc->change_nick($nick, $pass); + + foreach ( $channels as $channel ) + { + $libirc_channels[$channel] = $irc->join($channel, 'enanobot_channel_event'); + $channel_clean = preg_replace('/^[#&]/', '', $channel); + $libirc_channels[$channel_clean] =& $libirc_channels[$channel]; + $irc->privmsg('ChanServ', "OP $channel $nick"); + } +} + if ( $_shutdown ) { exit(2);