From b51ffd97a5ec084ad2e4e7804cb047b464a2b58b Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Fri, 28 Jun 2024 18:40:28 +0200 Subject: [PATCH] respond to whispers --- app/Console/Commands/TwitchAuth.php | 2 +- app/TwitchBot/IRCMessage.php | 11 ++++++++++ app/TwitchBot/TwitchBot.php | 33 +++++++++++++++++++++++++++++ app/TwitchBot/TwitchChatBot.php | 5 +++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/Console/Commands/TwitchAuth.php b/app/Console/Commands/TwitchAuth.php index 4b185c6..94d8ada 100644 --- a/app/Console/Commands/TwitchAuth.php +++ b/app/Console/Commands/TwitchAuth.php @@ -33,7 +33,7 @@ class TwitchAuth extends Command { if (!$token) { $token = new TwitchToken(); $token->nick = $this->argument('nick'); - $token->scope = ['chat:read', 'chat:edit', 'whispers:read', 'whispers:edit']; + $token->scope = ['chat:read', 'chat:edit', 'whispers:read', 'user:manage:whispers']; } $url = $token->getAuthUrl(); $this->line('Please visit '.$url); diff --git a/app/TwitchBot/IRCMessage.php b/app/TwitchBot/IRCMessage.php index 0f73c06..b986847 100644 --- a/app/TwitchBot/IRCMessage.php +++ b/app/TwitchBot/IRCMessage.php @@ -140,6 +140,13 @@ class IRCMessage { return TokenizedMessage::fromIRC($this); } + public static function capReq($cap) { + $msg = new IRCMessage(); + $msg->command = 'CAP REQ'; + $msg->params[] = $cap; + return $msg; + } + public static function join($channels) { $msg = new IRCMessage(); $msg->command = 'JOIN'; @@ -199,6 +206,10 @@ class IRCMessage { return $this->command == 'PRIVMSG'; } + public function isWhisper() { + return $this->command == 'WHISPER'; + } + public function isOwner() { return substr($this->getPrivMsgTarget(), 1) == $this->nick; } diff --git a/app/TwitchBot/TwitchBot.php b/app/TwitchBot/TwitchBot.php index 63f4236..242ac92 100644 --- a/app/TwitchBot/TwitchBot.php +++ b/app/TwitchBot/TwitchBot.php @@ -118,6 +118,10 @@ class TwitchBot { $this->handlePrivMsg($msg); return; } + if ($msg->isWhisper()) { + $this->handleWhisper($msg); + return; + } if ($msg->isNotice() && $msg->getText() == 'Login authentication failed') { $this->logger->notice('login failed, refreshing access token'); $this->token->refresh(); @@ -130,6 +134,11 @@ class TwitchBot { $this->ready = true; return; } + if ($msg->command == 'GLOBALUSERSTATE') { + // receive own user metadata + $this->handleUserState($msg); + return; + } } public function getMessageChannel(IRCMessage $msg) { @@ -146,6 +155,15 @@ class TwitchBot { public function handlePrivMsg(IRCMessage $msg) { } + public function handleUserState(IRCMessage $msg) { + if (isset($msg->tags['user-id'])) { + $this->user_id = $msg->tags['user-id']; + } + } + + public function handleWhisper(IRCMessage $msg) { + } + public function login() { $this->ws->send('PASS oauth:'.$this->token->access); $this->ws->send('NICK '.$this->nick); @@ -172,6 +190,20 @@ class TwitchBot { $this->last_contact = time(); } + public function sendWhisper($to, $msg) { + $this->logger->info('sending whisper to '.$to.': '.$msg); + try { + $response = $this->token->request()->post('/whispers?from_user_id='.$this->user_id.'&to_user_id='.$to, [ + 'message' => $msg, + ]); + if (!$response->successful()) { + $this->logger->error('sending whisper to '.$to.': '.$response->status()); + } + } catch (\Exception $e) { + $this->logger->error('sending whisper to '.$to.': '.$e->getMessage()); + } + } + protected function listenCommands() { $this->getLoop()->addPeriodicTimer(1, function () { @@ -191,6 +223,7 @@ class TwitchBot { private $nick; private $token; + private $user_id = ''; private $connector; private $ws; diff --git a/app/TwitchBot/TwitchChatBot.php b/app/TwitchBot/TwitchChatBot.php index 700de25..7151b2b 100644 --- a/app/TwitchBot/TwitchChatBot.php +++ b/app/TwitchBot/TwitchChatBot.php @@ -46,6 +46,11 @@ class TwitchChatBot extends TwitchBot { $this->tagChannelRead($channel, $msg); } + public function handleWhisper(IRCMessage $msg) { + $text = $this->chatlib->generate($msg->getText()); + $this->sendWhisper($msg->tags['user-id'], $text); + } + public function getChatlibDatabase(Channel $channel) { return $this->chatlib; } -- 2.39.2