commit 857e8780e0133566f375c18fe274c410ee1d9967
parent 182fcdb4dc02479e7748c872f6a8d5a0b0fd540b
Author: noodle <noodle@pastanoggin.com>
Date: Wed, 7 Jan 2026 19:22:31 +0000
refactor ping-pong and make ping check timer start after last message from server
Diffstat:
1 file changed, 19 insertions(+), 16 deletions(-)
diff --git a/mata_bot.pl b/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;
- }
}
}