commit 857e8780e0133566f375c18fe274c410ee1d9967 from: noodle date: Wed Jan 7 19:22:31 2026 UTC refactor ping-pong and make ping check timer start after last message from server 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; - } } }