From 31127000e16c18389129546b9aa652de565683fb Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Mon, 1 Jan 2024 14:14:39 +0100 Subject: [PATCH] actively ping IRC connection --- app/TwitchBot/IRCMessage.php | 11 +++++++++++ app/TwitchBot/TwitchBot.php | 22 ++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/TwitchBot/IRCMessage.php b/app/TwitchBot/IRCMessage.php index c730ef7..d127f9f 100644 --- a/app/TwitchBot/IRCMessage.php +++ b/app/TwitchBot/IRCMessage.php @@ -139,6 +139,13 @@ class IRCMessage { return $msg; } + public static function ping($token = 'localhorsttv') { + $msg = new IRCMessage(); + $msg->command = 'PING'; + $msg->params[] = $token; + return $msg; + } + public static function privmsg($target, $message) { $msg = new IRCMessage(); $msg->command = 'PRIVMSG'; @@ -169,6 +176,10 @@ class IRCMessage { return $this->command == 'PING'; } + public function isPong() { + return $this->command == 'PONG'; + } + public function isPrivMsg() { return $this->command == 'PRIVMSG'; } diff --git a/app/TwitchBot/TwitchBot.php b/app/TwitchBot/TwitchBot.php index ddc51fe..a45de87 100644 --- a/app/TwitchBot/TwitchBot.php +++ b/app/TwitchBot/TwitchBot.php @@ -26,6 +26,7 @@ class TwitchBot { $this->connector = new Connector(); $this->connect(); $this->listenCommands(); + $this->startPinger(); } public function getLogger() { @@ -86,8 +87,8 @@ class TwitchBot { $this->ready = false; $this->logger->info('websocket connection closed: '.$reason.' ['.$op.']'); if (!$this->shutting_down) { - $this->logger->info('reconnecting in 10 seconds'); - Loop::addTimer(10, [$this, 'connect']); + $this->logger->info('reconnecting in 5 seconds'); + Loop::addTimer(5, [$this, 'connect']); } } @@ -97,6 +98,7 @@ class TwitchBot { public function handleIRCMessage(IRCMessage $msg) { + $this->last_contact = time(); if ($msg->isPrivMsg()) { $this->handlePrivMsg($msg); return; @@ -105,6 +107,9 @@ class TwitchBot { $this->sendIRCMessage($msg->makePong()); return; } + if ($msg->isPong()) { + return; + } if ($msg->isNotice() && $msg->getText() == 'Login authentication failed') { $this->logger->notice('login failed, refreshing access token'); $this->token->refresh(); @@ -171,13 +176,24 @@ class TwitchBot { } } }); + } + private function startPinger() { + $this->getLoop()->addPeriodicTimer(15, function () { + if (!$this->ready) return; + if (time() - $this->last_contact < 60) return; + try { + $this->sendIRCMessage(IRCMessage::ping()); + } catch (\Exception $e) { + } + }); } public function sendIRCMessage(IRCMessage $msg) { $irc_message = $msg->encode(); $this->logger->info('sending IRC message '.$irc_message); $this->ws->send($irc_message); + $this->last_contact = time(); } @@ -190,6 +206,8 @@ class TwitchBot { private $ready = false; private $shutting_down = false; + private $last_contact; + } ?> -- 2.39.2