Commit Diff


commit - 182fcdb4dc02479e7748c872f6a8d5a0b0fd540b
commit + 857e8780e0133566f375c18fe274c410ee1d9967
blob - 7064dd99184f74c346e04d9b781961f6d14493e5
blob + 4e398b8cfdd56171f14756b42a7dbf0872ffd5fc
--- mata_bot.pl
+++ mata_bot.pl
@@ -294,19 +294,31 @@ sub recvmsg {
 
 sub evasdrop {
 	my ($s, $host, $chan, $lists) = @_;
-	my ($checkping, $msgmax, $pingtime, $pongtime, $prefixlen, $priv);
+	my ($msgtime, $msgmax, $pingsent, $pingtime, $prefixlen, $priv);
 
-	$checkping = 1;
+	$pingsent = 0;
 	$priv = "PRIVMSG ${chan} :";
-	$pongtime = $pingtime = time;
+	$msgtime = $pingtime = time;
 	while (1) {
+		if ($pingsent) {
+			if (time - $pingtime > MAX_LAG) {
+				# leave if we don't get ponged back on time
+				logger(LOG_WARN, 'server pong reply timed out');
+				return;
+			}
+		} elsif (time - $msgtime > LAG_CHECK_TIME) {
+			# ping server every once in a while
+			sendmsg($s, "PING :${host}");
+			$pingsent = 1;
+			$pingtime = time;
+		}
 		defined($_ = recvmsg($s)) or return;
-		if(not length) {
-		} elsif (/^PING :([^ ]+)$/) {
+		next if not length;
+		$msgtime = time;
+		if (/^PING :([^ ]+)$/) {
 			sendmsg($s, 'PONG :' . $1);
 		} elsif (/^:[^ ]+ PONG/) {
-			$pongtime = $pingtime = time;
-			$checkping = 1;
+			$pingsent = 0;
 		} elsif (/^:[^ ]+ 352 [^ ]+ [^ ]+ [^ ]+ ([^ ]+)/) {
 			# the extra 2 bytes account for \r\n
 			$msgmax = IRCMAX - length($1) - length($priv) - 2;
@@ -321,15 +333,6 @@ sub evasdrop {
 			$r = respond($1, $2, @$lists);
 			sendmsg($s, $priv . substr($r,0,$msgmax)) if length($r);
 		}
-		if ($checkping and time-$pingtime > LAG_CHECK_TIME) {
-			# ping server every once in a while and wait for pong
-			sendmsg($s, "PING :${host}");
-			$checkping = 0;
-		} elsif (not $checkping and time-$pongtime > MAX_LAG) {
-			# we're leaving if we don't get ponged back on time
-			logger(LOG_WARN, 'server PONG response timed out');
-			return;
-		}
 	}
 }